diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2025-12-09 14:04:07 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2026-04-25 14:08:58 +0000 |
| commit | bb722a7d0f1642bff6487f943ad0427799a6e5bf (patch) | |
| tree | 757ceec42fb14e1f423da9f791b5933bd3c00464 | |
| parent | 8f6978f83cc64a2e644d9bdf380a6996d3acdc4b (diff) | |
| parent | 7f920884cd004f9e2e60b3efda5bd75f287faa9d (diff) | |
Adjust llvm-project main llvmorg-21-init-19288-gface93e724f4, part 3
This adjusts the llvmorg-21-init-19288-gface93e724f4 import: add more
items to the libc/ top-level directory.
PR: 292067
MFC after: 1 month
611 files changed, 170014 insertions, 0 deletions
diff --git a/contrib/llvm-project/libc/hdr/errno_macros.h b/contrib/llvm-project/libc/hdr/errno_macros.h new file mode 100644 index 000000000000..27ea49977d8c --- /dev/null +++ b/contrib/llvm-project/libc/hdr/errno_macros.h @@ -0,0 +1,28 @@ +//===-- Definition of macros from errno.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_ERRNO_MACROS_H +#define LLVM_LIBC_HDR_ERRNO_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#ifdef __linux__ +#include <linux/errno.h> + +#include "include/llvm-libc-macros/error-number-macros.h" +#else // __linux__ +#include "include/llvm-libc-macros/generic-error-number-macros.h" +#endif + +#else // Overlay mode + +#include <errno.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_ERRNO_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/fcntl_macros.h b/contrib/llvm-project/libc/hdr/fcntl_macros.h new file mode 100644 index 000000000000..3a1ddeb0a2da --- /dev/null +++ b/contrib/llvm-project/libc/hdr/fcntl_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from fcntl/fcntl.h ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FCNTL_MACROS_H +#define LLVM_LIBC_HDR_FCNTL_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/fcntl-macros.h" + +#else // Overlay mode + +#include "hdr/fcntl_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_FCNTL_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/fcntl_overlay.h b/contrib/llvm-project/libc/hdr/fcntl_overlay.h new file mode 100644 index 000000000000..17ae78b3d0ec --- /dev/null +++ b/contrib/llvm-project/libc/hdr/fcntl_overlay.h @@ -0,0 +1,47 @@ +//===-- Including fcntl.h in overlay mode ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FCNTL_OVERLAY_H +#define LLVM_LIBC_HDR_FCNTL_OVERLAY_H + +#ifdef LIBC_FULL_BUILD +#error "This header should only be included in overlay mode" +#endif + +// Overlay mode + +// glibc <fcntl.h> header might provide extern inline definitions for few +// functions, causing external alias errors. They are guarded by +// `__USE_FORTIFY_LEVEL`, which will be temporarily disabled +// with `_FORTIFY_SOURCE`. + +#ifdef _FORTIFY_SOURCE +#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE +#undef _FORTIFY_SOURCE +#endif + +#ifdef __USE_FORTIFY_LEVEL +#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL 0 +#endif + +#include <fcntl.h> + +#ifdef LIBC_OLD_FORTIFY_SOURCE +#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE +#undef LIBC_OLD_FORTIFY_SOURCE +#endif + +#ifdef LIBC_OLD_USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL +#undef LIBC_OLD_USE_FORTIFY_LEVEL +#endif + +#endif // LLVM_LIBC_HDR_FCNTL_OVERLAY_H diff --git a/contrib/llvm-project/libc/hdr/fenv_macros.h b/contrib/llvm-project/libc/hdr/fenv_macros.h new file mode 100644 index 000000000000..3f0bd89a6ea3 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/fenv_macros.h @@ -0,0 +1,61 @@ +//===-- Definition of macros from fenv.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FENV_MACROS_H +#define LLVM_LIBC_HDR_FENV_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/fenv-macros.h" + +#else // Overlay mode + +#include <fenv.h> + +// In some environment, FE_ALL_EXCEPT is set to 0 and the remaining exceptions +// FE_* are missing. +#ifndef FE_DIVBYZERO +#define FE_DIVBYZERO 0 +#endif // FE_DIVBYZERO + +#ifndef FE_INEXACT +#define FE_INEXACT 0 +#endif // FE_INEXACT + +#ifndef FE_INVALID +#define FE_INVALID 0 +#endif // FE_INVALID + +#ifndef FE_OVERFLOW +#define FE_OVERFLOW 0 +#endif // FE_OVERFLOW + +#ifndef FE_UNDERFLOW +#define FE_UNDERFLOW 0 +#endif // FE_UNDERFLOW + +// Rounding mode macros might be missing. +#ifndef FE_DOWNWARD +#define FE_DOWNWARD 0x400 +#endif // FE_DOWNWARD + +#ifndef FE_TONEAREST +#define FE_TONEAREST 0 +#endif // FE_TONEAREST + +#ifndef FE_TOWARDZERO +#define FE_TOWARDZERO 0xC00 +#endif // FE_TOWARDZERO + +#ifndef FE_UPWARD +#define FE_UPWARD 0x800 +#endif // FE_UPWARD + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_FENV_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/float_macros.h b/contrib/llvm-project/libc/hdr/float_macros.h new file mode 100644 index 000000000000..a0ef5e29b986 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/float_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from math.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FLOAT_MACROS_H +#define LLVM_LIBC_HDR_FLOAT_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/float-macros.h" + +#else // Overlay mode + +#include <float.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_FLOAT_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/func/aligned_alloc.h b/contrib/llvm-project/libc/hdr/func/aligned_alloc.h new file mode 100644 index 000000000000..b3436dfee1f2 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/func/aligned_alloc.h @@ -0,0 +1,22 @@ +//===-- Definition of the aligned_alloc.h proxy ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FUNC_ALIGNED_ALLOC_H +#define LLVM_LIBC_HDR_FUNC_ALIGNED_ALLOC_H + +#ifdef LIBC_FULL_BUILD +#include "hdr/types/size_t.h" +extern "C" void *aligned_alloc(size_t, size_t); + +#else // Overlay mode + +#include "hdr/stdlib_overlay.h" + +#endif + +#endif diff --git a/contrib/llvm-project/libc/hdr/func/free.h b/contrib/llvm-project/libc/hdr/func/free.h new file mode 100644 index 000000000000..316556b21e3b --- /dev/null +++ b/contrib/llvm-project/libc/hdr/func/free.h @@ -0,0 +1,22 @@ +//===-- Definition of the free.h proxy ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FUNC_FREE_H +#define LLVM_LIBC_HDR_FUNC_FREE_H + +#ifdef LIBC_FULL_BUILD + +extern "C" void free(void *) noexcept; + +#else // Overlay mode + +#include "hdr/stdlib_overlay.h" + +#endif + +#endif diff --git a/contrib/llvm-project/libc/hdr/func/malloc.h b/contrib/llvm-project/libc/hdr/func/malloc.h new file mode 100644 index 000000000000..8281021f7996 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/func/malloc.h @@ -0,0 +1,24 @@ +//===-- Definition of the malloc.h proxy ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FUNC_MALLOC_H +#define LLVM_LIBC_HDR_FUNC_MALLOC_H + +#ifdef LIBC_FULL_BUILD + +#include "hdr/types/size_t.h" + +extern "C" void *malloc(size_t) noexcept; + +#else // Overlay mode + +#include "hdr/stdlib_overlay.h" + +#endif + +#endif diff --git a/contrib/llvm-project/libc/hdr/func/realloc.h b/contrib/llvm-project/libc/hdr/func/realloc.h new file mode 100644 index 000000000000..ecb29541fe34 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/func/realloc.h @@ -0,0 +1,24 @@ +//===-- Definition of the realloc.h proxy ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_FUNC_REALLOC_H +#define LLVM_LIBC_HDR_FUNC_REALLOC_H + +#ifdef LIBC_FULL_BUILD + +#include "hdr/types/size_t.h" + +extern "C" void *realloc(void *ptr, size_t new_size) noexcept; + +#else // Overlay mode + +#include "hdr/stdlib_overlay.h" + +#endif + +#endif diff --git a/contrib/llvm-project/libc/hdr/limits_macros.h b/contrib/llvm-project/libc/hdr/limits_macros.h new file mode 100644 index 000000000000..2dc13b0cca60 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/limits_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from limits.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_LIMITS_MACROS_H +#define LLVM_LIBC_HDR_LIMITS_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/limits-macros.h" + +#else // Overlay mode + +#include <limits.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_LIMITS_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/link_macros.h b/contrib/llvm-project/libc/hdr/link_macros.h new file mode 100644 index 000000000000..8a78a864e6ce --- /dev/null +++ b/contrib/llvm-project/libc/hdr/link_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from link.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_LINK_MACROS_H +#define LLVM_LIBC_HDR_LINK_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/link-macros.h" + +#else // Overlay mode + +#include <link.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_LINK_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/locale_macros.h b/contrib/llvm-project/libc/hdr/locale_macros.h new file mode 100644 index 000000000000..7d94f6ddabe4 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/locale_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from locale.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_LOCALE_MACROS_H +#define LLVM_LIBC_HDR_LOCALE_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/locale-macros.h" + +#else // Overlay mode + +#error "macros not available in overlay mode" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_LOCALE_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/math_function_macros.h b/contrib/llvm-project/libc/hdr/math_function_macros.h new file mode 100644 index 000000000000..48dec8260ef8 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/math_function_macros.h @@ -0,0 +1,27 @@ +//===-- Definition of macros from math.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_MATH_FUNCTION_MACROS_H +#define LLVM_LIBC_HDR_MATH_FUNCTION_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/math-function-macros.h" + +#else // Overlay mode + +// GCC will include CXX headers when __cplusplus is defined. This behavior +// can be suppressed by defining _GLIBCXX_INCLUDE_NEXT_C_HEADERS. +#if defined(__GNUC__) && !defined(__clang__) +#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS +#endif +#include <math.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_MATH_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/math_macros.h b/contrib/llvm-project/libc/hdr/math_macros.h new file mode 100644 index 000000000000..863451123f3f --- /dev/null +++ b/contrib/llvm-project/libc/hdr/math_macros.h @@ -0,0 +1,48 @@ +//===-- Definition of macros from math.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_MATH_MACROS_H +#define LLVM_LIBC_HDR_MATH_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/math-macros.h" + +#else // Overlay mode + +// GCC will include CXX headers when __cplusplus is defined. This behavior +// can be suppressed by defining _GLIBCXX_INCLUDE_NEXT_C_HEADERS. +#if defined(__GNUC__) && !defined(__clang__) +#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS +#endif +#include <math.h> + +// Some older math.h header does not have FP_INT_* constants yet. +#ifndef FP_INT_UPWARD +#define FP_INT_UPWARD 0 +#endif // FP_INT_UPWARD + +#ifndef FP_INT_DOWNWARD +#define FP_INT_DOWNWARD 1 +#endif // FP_INT_DOWNWARD + +#ifndef FP_INT_TOWARDZERO +#define FP_INT_TOWARDZERO 2 +#endif // FP_INT_TOWARDZERO + +#ifndef FP_INT_TONEARESTFROMZERO +#define FP_INT_TONEARESTFROMZERO 3 +#endif // FP_INT_TONEARESTFROMZERO + +#ifndef FP_INT_TONEAREST +#define FP_INT_TONEAREST 4 +#endif // FP_INT_TONEAREST + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_MATH_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/offsetof_macros.h b/contrib/llvm-project/libc/hdr/offsetof_macros.h new file mode 100644 index 000000000000..42e853ffa92e --- /dev/null +++ b/contrib/llvm-project/libc/hdr/offsetof_macros.h @@ -0,0 +1,23 @@ +//===-- Definition of macros for offsetof ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_OFFSETOF_MACROS_H +#define LLVM_LIBC_HDR_OFFSETOF_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/offsetof-macro.h" + +#else // Overlay mode + +#define __need_offsetof +#include <stddef.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_OFFSETOF_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/sched_macros.h b/contrib/llvm-project/libc/hdr/sched_macros.h new file mode 100644 index 000000000000..cfeaa9979678 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/sched_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from sched.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_SCHED_MACROS_H +#define LLVM_LIBC_HDR_SCHED_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/sched-macros.h" + +#else // Overlay mode + +#include <sched.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_SCHED_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/signal_macros.h b/contrib/llvm-project/libc/hdr/signal_macros.h new file mode 100644 index 000000000000..867d17a4ca8c --- /dev/null +++ b/contrib/llvm-project/libc/hdr/signal_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from signal.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_SIGNAL_MACROS_H +#define LLVM_LIBC_HDR_SIGNAL_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/signal-macros.h" + +#else // Overlay mode + +#include <signal.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_SIGNAL_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/stdio_macros.h b/contrib/llvm-project/libc/hdr/stdio_macros.h new file mode 100644 index 000000000000..a4d6a972ec9a --- /dev/null +++ b/contrib/llvm-project/libc/hdr/stdio_macros.h @@ -0,0 +1,23 @@ +//===-- Definition of macros from stdio.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_STDIO_MACROS_H +#define LLVM_LIBC_HDR_STDIO_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/file-seek-macros.h" +#include "include/llvm-libc-macros/stdio-macros.h" + +#else // Overlay mode + +#include "stdio_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_STDIO_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/stdio_overlay.h b/contrib/llvm-project/libc/hdr/stdio_overlay.h new file mode 100644 index 000000000000..aef8c448fe49 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/stdio_overlay.h @@ -0,0 +1,69 @@ +//===-- Including stdio.h in overlay mode ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_STDIO_OVERLAY_H +#define LLVM_LIBC_HDR_STDIO_OVERLAY_H + +#ifdef LIBC_FULL_BUILD +#error "This header should only be included in overlay mode" +#endif + +// Overlay mode + +// glibc <stdio.h> header might provide extern inline definitions for few +// functions, causing external alias errors. They are guarded by +// `__USE_EXTERN_INLINES` macro. We temporarily disable `__USE_EXTERN_INLINES` +// macro by defining `__NO_INLINE__` before including <stdio.h>. +// And the same with `__USE_FORTIFY_LEVEL`, which will be temporarily disabled +// with `_FORTIFY_SOURCE`. + +#ifdef _FORTIFY_SOURCE +#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE +#undef _FORTIFY_SOURCE +#endif + +#ifdef __USE_EXTERN_INLINES +#define LIBC_OLD_USE_EXTERN_INLINES +#undef __USE_EXTERN_INLINES +#endif + +#ifdef __USE_FORTIFY_LEVEL +#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL 0 +#endif + +#ifndef __NO_INLINE__ +#define __NO_INLINE__ 1 +#define LIBC_SET_NO_INLINE +#endif + +#include <stdio.h> + +#ifdef LIBC_OLD_FORTIFY_SOURCE +#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE +#undef LIBC_OLD_FORTIFY_SOURCE +#endif + +#ifdef LIBC_SET_NO_INLINE +#undef __NO_INLINE__ +#undef LIBC_SET_NO_INLINE +#endif + +#ifdef LIBC_OLD_USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL +#undef LIBC_OLD_USE_FORTIFY_LEVEL +#endif + +#ifdef LIBC_OLD_USE_EXTERN_INLINES +#define __USE_EXTERN_INLINES +#undef LIBC_OLD_USE_EXTERN_INLINES +#endif + +#endif // LLVM_LIBC_HDR_STDIO_OVERLAY_H diff --git a/contrib/llvm-project/libc/hdr/stdlib_macros.h b/contrib/llvm-project/libc/hdr/stdlib_macros.h new file mode 100644 index 000000000000..3faeb3a8fe36 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/stdlib_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from stdlib.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_STDLIB_MACROS_H +#define LLVM_LIBC_HDR_STDLIB_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/stdlib-macros.h" + +#else // Overlay mode + +#include "stdlib_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_STDLIB_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/stdlib_overlay.h b/contrib/llvm-project/libc/hdr/stdlib_overlay.h new file mode 100644 index 000000000000..53c32ec0ae33 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/stdlib_overlay.h @@ -0,0 +1,46 @@ +//===-- Including stdlib.h in overlay mode --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_STDLIB_OVERLAY_H +#define LLVM_LIBC_HDR_STDLIB_OVERLAY_H + +#ifdef LIBC_FULL_BUILD +#error "This header should only be included in overlay mode" +#endif + +// Overlay mode + +// glibc <stdlib.h> header might provide extern inline definitions for few +// functions, causing external alias errors. They are guarded by +// `__USE_FORTIFY_LEVEL`, which will be temporarily disabled. + +#ifdef _FORTIFY_SOURCE +#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE +#undef _FORTIFY_SOURCE +#endif + +#ifdef __USE_FORTIFY_LEVEL +#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL 0 +#endif + +#include <stdlib.h> + +#ifdef LIBC_OLD_FORTIFY_SOURCE +#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE +#undef LIBC_OLD_FORTIFY_SOURCE +#endif + +#ifdef LIBC_OLD_USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL +#undef LIBC_OLD_USE_FORTIFY_LEVEL +#endif + +#endif diff --git a/contrib/llvm-project/libc/hdr/sys_auxv_macros.h b/contrib/llvm-project/libc/hdr/sys_auxv_macros.h new file mode 100644 index 000000000000..c04011baedb8 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/sys_auxv_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from sys/auxv.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_SYS_AUXV_MACROS_H +#define LLVM_LIBC_HDR_SYS_AUXV_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/sys-auxv-macros.h" + +#else // Overlay mode + +#include <sys/auxv.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_SYS_AUXV_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/sys_epoll_macros.h b/contrib/llvm-project/libc/hdr/sys_epoll_macros.h new file mode 100644 index 000000000000..db047f161634 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/sys_epoll_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from sys/epoll.h -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_SYS_EPOLL_MACROS_H +#define LLVM_LIBC_HDR_SYS_EPOLL_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/sys-epoll-macros.h" + +#else // Overlay mode + +#include <sys/epoll.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_SYS/EPOLL_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/sys_ioctl_macros.h b/contrib/llvm-project/libc/hdr/sys_ioctl_macros.h new file mode 100644 index 000000000000..935d43627346 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/sys_ioctl_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from sys/ioctl.h -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_SYS_IOCTL_MACROS_H +#define LLVM_LIBC_HDR_SYS_IOCTL_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/sys-ioctl-macros.h" + +#else // Overlay mode + +#include <sys/ioctl.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_SYS_IOCTL_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/sys_stat_macros.h b/contrib/llvm-project/libc/hdr/sys_stat_macros.h new file mode 100644 index 000000000000..cb58d62e1ffb --- /dev/null +++ b/contrib/llvm-project/libc/hdr/sys_stat_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from sys/stat.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_SYS_STAT_MACROS_H +#define LLVM_LIBC_HDR_SYS_STAT_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/sys-stat-macros.h" + +#else // Overlay mode + +#include <sys/stat.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_SYS_STAT_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/time_macros.h b/contrib/llvm-project/libc/hdr/time_macros.h new file mode 100644 index 000000000000..4488a24848c3 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/time_macros.h @@ -0,0 +1,28 @@ +//===-- Definition of macros from time.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TIME_MACROS_H +#define LLVM_LIBC_HDR_TIME_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/time-macros.h" + +#else // Overlay mode + +#include <time.h> + +#endif // LLVM_LIBC_FULL_BUILD + +// TODO: For now, on windows, let's always include the extension header. +// We will need to decide how to export this header. +#ifdef _WIN32 +#include "include/llvm-libc-macros/windows/time-macros-ext.h" +#endif // _WIN32 + +#endif // LLVM_LIBC_HDR_TIME_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/types/ACTION.h b/contrib/llvm-project/libc/hdr/types/ACTION.h new file mode 100644 index 000000000000..0b63521dff64 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/ACTION.h @@ -0,0 +1,22 @@ +//===-- Proxy header for ACTION -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_ACTION_H +#define LLVM_LIBC_HDR_TYPES_ACTION_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/ACTION.h" + +#else // Overlay mode + +#include <search.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_ACTION_H diff --git a/contrib/llvm-project/libc/hdr/types/ENTRY.h b/contrib/llvm-project/libc/hdr/types/ENTRY.h new file mode 100644 index 000000000000..5f4aee4b30fe --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/ENTRY.h @@ -0,0 +1,22 @@ +//===-- Proxy header for ENTRY --------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_ENTRY_H +#define LLVM_LIBC_HDR_TYPES_ENTRY_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/ENTRY.h" + +#else // Overlay mode + +#include <search.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_ENTRY_H diff --git a/contrib/llvm-project/libc/hdr/types/FILE.h b/contrib/llvm-project/libc/hdr/types/FILE.h new file mode 100644 index 000000000000..ecb52b7102cb --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/FILE.h @@ -0,0 +1,22 @@ +//===-- Proxy for FILE ----------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_FILE_H +#define LLVM_LIBC_HDR_TYPES_FILE_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/FILE.h" + +#else // Overlay mode + +#include "hdr/stdio_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_FILE_H diff --git a/contrib/llvm-project/libc/hdr/types/atexithandler_t.h b/contrib/llvm-project/libc/hdr/types/atexithandler_t.h new file mode 100644 index 000000000000..6d829fe60d27 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/atexithandler_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from atexithandler_t.h -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_ATEXITHANDLER_T_H +#define LLVM_LIBC_HDR_TYPES_ATEXITHANDLER_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/__atexithandler_t.h" + +#else // overlay mode + +#error // type not available in overlay mode + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_ATEXITHANDLER_T_H diff --git a/contrib/llvm-project/libc/hdr/types/char32_t.h b/contrib/llvm-project/libc/hdr/types/char32_t.h new file mode 100644 index 000000000000..94fe5747d341 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/char32_t.h @@ -0,0 +1,22 @@ +//===-- Definition of char32_t.h ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_CHAR32_T_H +#define LLVM_LIBC_HDR_TYPES_CHAR32_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/char32_t.h" + +#else // overlay mode + +#include "hdr/uchar_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_CHAR32_T_H diff --git a/contrib/llvm-project/libc/hdr/types/char8_t.h b/contrib/llvm-project/libc/hdr/types/char8_t.h new file mode 100644 index 000000000000..4d71e3dd8909 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/char8_t.h @@ -0,0 +1,14 @@ +//===-- Definition of char8_t.h -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_CHAR8_T_H +#define LLVM_LIBC_HDR_TYPES_CHAR8_T_H + +#include "include/llvm-libc-types/char8_t.h" + +#endif // LLVM_LIBC_HDR_TYPES_CHAR8_T_H diff --git a/contrib/llvm-project/libc/hdr/types/clock_t.h b/contrib/llvm-project/libc/hdr/types/clock_t.h new file mode 100644 index 000000000000..b0b658e96c3d --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/clock_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for clock_t -------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_CLOCK_T_H +#define LLVM_LIBC_HDR_TYPES_CLOCK_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/clock_t.h" + +#else // Overlay mode + +#include <sys/types.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_CLOCK_T_H diff --git a/contrib/llvm-project/libc/hdr/types/clockid_t.h b/contrib/llvm-project/libc/hdr/types/clockid_t.h new file mode 100644 index 000000000000..729e580aba43 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/clockid_t.h @@ -0,0 +1,23 @@ +//===-- Proxy for clockid_t -----------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_CLOCKID_T_H +#define LLVM_LIBC_HDR_TYPES_CLOCKID_T_H + +// TODO: we will need to decide how to export extension to windows. +#if defined(LIBC_FULL_BUILD) || defined(_WIN32) + +#include "include/llvm-libc-types/clockid_t.h" + +#else // Overlay mode + +#include <sys/types.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_CLOCKID_T_H diff --git a/contrib/llvm-project/libc/hdr/types/cookie_io_functions_t.h b/contrib/llvm-project/libc/hdr/types/cookie_io_functions_t.h new file mode 100644 index 000000000000..7323a05001c4 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/cookie_io_functions_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for cookie_io_functions_t -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_COOKIE_IO_FUNCTIONS_T_H +#define LLVM_LIBC_HDR_TYPES_COOKIE_IO_FUNCTIONS_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/cookie_io_functions_t.h" + +#else // Overlay mode + +#include "hdr/stdio_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_COOKIE_IO_FUNCTIONS_T_H diff --git a/contrib/llvm-project/libc/hdr/types/cpu_set_t.h b/contrib/llvm-project/libc/hdr/types/cpu_set_t.h new file mode 100644 index 000000000000..26aed7592fa2 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/cpu_set_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for cpu_set_t -----------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_CPU_SET_T_H +#define LLVM_LIBC_HDR_TYPES_CPU_SET_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/cpu_set_t.h" + +#else // Overlay mode + +#include <sched.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_CPU_SET_T_H diff --git a/contrib/llvm-project/libc/hdr/types/div_t.h b/contrib/llvm-project/libc/hdr/types/div_t.h new file mode 100644 index 000000000000..29c355f079e1 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/div_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from div_t.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_DIV_T_H +#define LLVM_LIBC_HDR_TYPES_DIV_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/div_t.h" + +#else // Overlay mode + +#include "hdr/stdlib_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_DIV_T_H diff --git a/contrib/llvm-project/libc/hdr/types/fenv_t.h b/contrib/llvm-project/libc/hdr/types/fenv_t.h new file mode 100644 index 000000000000..ddfb08c027bf --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/fenv_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from fenv_t.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_FENV_T_H +#define LLVM_LIBC_HDR_TYPES_FENV_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/fenv_t.h" + +#else // Overlay mode + +#include <fenv.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_FENV_T_H diff --git a/contrib/llvm-project/libc/hdr/types/fexcept_t.h b/contrib/llvm-project/libc/hdr/types/fexcept_t.h new file mode 100644 index 000000000000..761f125ae8cf --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/fexcept_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from fexcept_t.h -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_FEXCEPT_T_H +#define LLVM_LIBC_HDR_TYPES_FEXCEPT_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/fexcept_t.h" + +#else // Overlay mode + +#include <fenv.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_FEXCEPT_T_H diff --git a/contrib/llvm-project/libc/hdr/types/jmp_buf.h b/contrib/llvm-project/libc/hdr/types/jmp_buf.h new file mode 100644 index 000000000000..3fa1de816d70 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/jmp_buf.h @@ -0,0 +1,22 @@ +//===-- Definition of jmp_buf.h ------------------------------------------===// +// +// Part of the LLVM Project, under the Apahce License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_JMP_BUF_H +#define LLVM_LIBC_HDR_TYPES_JMP_BUF_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/jmp_buf.h" + +#else // overlay mode + +#include <setjmp.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_JMP_BUF_H diff --git a/contrib/llvm-project/libc/hdr/types/ldiv_t.h b/contrib/llvm-project/libc/hdr/types/ldiv_t.h new file mode 100644 index 000000000000..c7023f5077bd --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/ldiv_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from ldiv_t.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_LDIV_T_H +#define LLVM_LIBC_HDR_TYPES_LDIV_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/ldiv_t.h" + +#else // Overlay mode + +#include "hdr/stdlib_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_LDIV_T_H diff --git a/contrib/llvm-project/libc/hdr/types/lldiv_t.h b/contrib/llvm-project/libc/hdr/types/lldiv_t.h new file mode 100644 index 000000000000..cd41886674a1 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/lldiv_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from lldiv_t.h -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_LLDIV_T_H +#define LLVM_LIBC_HDR_TYPES_LLDIV_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/lldiv_t.h" + +#else // Overlay mode + +#include "hdr/stdlib_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_LLDIV_T_H diff --git a/contrib/llvm-project/libc/hdr/types/locale_t.h b/contrib/llvm-project/libc/hdr/types/locale_t.h new file mode 100644 index 000000000000..be12d12b4070 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/locale_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from locale_t.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_LOCALE_T_H +#define LLVM_LIBC_HDR_TYPES_LOCALE_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/locale_t.h" + +#else // overlay mode + +#error "type not available in overlay mode" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_LOCALE_T_H diff --git a/contrib/llvm-project/libc/hdr/types/mbstate_t.h b/contrib/llvm-project/libc/hdr/types/mbstate_t.h new file mode 100644 index 000000000000..d8fadceaaac8 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/mbstate_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from mbstate_t.h -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_MBSTATE_T_H +#define LLVM_LIBC_HDR_TYPES_MBSTATE_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/mbstate_t.h" + +#else // Overlay mode + +#error "Cannot overlay mbstate_t" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_MBSTATE_T_H diff --git a/contrib/llvm-project/libc/hdr/types/mode_t.h b/contrib/llvm-project/libc/hdr/types/mode_t.h new file mode 100644 index 000000000000..3f36a1961e62 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/mode_t.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from mode_t.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_MODE_T_H +#define LLVM_LIBC_HDR_TYPES_MODE_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/mode_t.h" + +#else // Overlay mode + +#include "hdr/fcntl_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_MODE_T_H diff --git a/contrib/llvm-project/libc/hdr/types/nfds_t.h b/contrib/llvm-project/libc/hdr/types/nfds_t.h new file mode 100644 index 000000000000..9143564c2333 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/nfds_t.h @@ -0,0 +1,23 @@ +//===-- Definition of nfds_t ----------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_NFDS_T_H +#define LLVM_LIBC_HDR_TYPES_NFDS_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/nfds_t.h" + +#else // overlay mode + +#include <poll.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_NFDS_T_H diff --git a/contrib/llvm-project/libc/hdr/types/off_t.h b/contrib/llvm-project/libc/hdr/types/off_t.h new file mode 100644 index 000000000000..52337e5b63e2 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/off_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for off_t ---------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_OFF_T_H +#define LLVM_LIBC_HDR_TYPES_OFF_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/off_t.h" + +#else // Overlay mode + +#include "hdr/stdio_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_OFF_T_H diff --git a/contrib/llvm-project/libc/hdr/types/pid_t.h b/contrib/llvm-project/libc/hdr/types/pid_t.h new file mode 100644 index 000000000000..34306fc4118c --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/pid_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for pid_t ---------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_PID_T_H +#define LLVM_LIBC_HDR_TYPES_PID_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/pid_t.h" + +#else // Overlay mode + +#include <sys/types.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_PID_T_H diff --git a/contrib/llvm-project/libc/hdr/types/sigset_t.h b/contrib/llvm-project/libc/hdr/types/sigset_t.h new file mode 100644 index 000000000000..695ec3029f68 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/sigset_t.h @@ -0,0 +1,21 @@ +//===-- Proxy for sigset_t ------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_SIGSET_T_H +#define LLVM_LIBC_HDR_TYPES_SIGSET_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/sigset_t.h" + +#else + +#include <signal.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_SIGSET_T_H diff --git a/contrib/llvm-project/libc/hdr/types/size_t.h b/contrib/llvm-project/libc/hdr/types/size_t.h new file mode 100644 index 000000000000..1d9f26db3bbb --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/size_t.h @@ -0,0 +1,23 @@ +//===-- Proxy for size_t --------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_SIZE_T_H +#define LLVM_LIBC_HDR_TYPES_SIZE_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/size_t.h" + +#else + +#define __need_size_t +#include <stddef.h> +#undef __need_size_t + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_SIZE_T_H diff --git a/contrib/llvm-project/libc/hdr/types/socklen_t.h b/contrib/llvm-project/libc/hdr/types/socklen_t.h new file mode 100644 index 000000000000..79a6b9c7dead --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/socklen_t.h @@ -0,0 +1,21 @@ +//===-- Proxy for socklen_t -----------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_SOCKLEN_T_H +#define LLVM_LIBC_HDR_TYPES_SOCKLEN_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/socklen_t.h" + +#else + +#include <signal.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_SOCKLEN_T_H diff --git a/contrib/llvm-project/libc/hdr/types/ssize_t.h b/contrib/llvm-project/libc/hdr/types/ssize_t.h new file mode 100644 index 000000000000..7eff98f33c2b --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/ssize_t.h @@ -0,0 +1,21 @@ +//===-- Proxy for ssize_t -------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_SSIZE_T_H +#define LLVM_LIBC_HDR_TYPES_SSIZE_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/ssize_t.h" + +#else + +#include <sys/types.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_SSIZE_T_H diff --git a/contrib/llvm-project/libc/hdr/types/stack_t.h b/contrib/llvm-project/libc/hdr/types/stack_t.h new file mode 100644 index 000000000000..42dad3aa80c1 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/stack_t.h @@ -0,0 +1,23 @@ +//===-- Definition of stack_t.h -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_STACK_T_H +#define LLVM_LIBC_HDR_TYPES_STACK_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/stack_t.h" + +#else // overlay mode + +#include <signal.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STACK_T_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_dl_phdr_info.h b/contrib/llvm-project/libc/hdr/types/struct_dl_phdr_info.h new file mode 100644 index 000000000000..0cfb3c1309bd --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_dl_phdr_info.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct dl_phdr_info -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_DL_PHDR_INFO_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_DL_PHDR_INFO_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_dl_phdr_info.h" + +#else + +#include <link.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_DL_PHDR_INFO_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_epoll_event.h b/contrib/llvm-project/libc/hdr/types/struct_epoll_event.h new file mode 100644 index 000000000000..5bb98ce05bb2 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_epoll_event.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct epoll_event --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_EPOLL_EVENT_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_EPOLL_EVENT_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_epoll_event.h" + +#else + +#include <sys/epoll.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_EPOLL_EVENT_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_f_owner_ex.h b/contrib/llvm-project/libc/hdr/types/struct_f_owner_ex.h new file mode 100644 index 000000000000..6e37cea6df84 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_f_owner_ex.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct f_owner_ex --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_F_OWNER_EX_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_F_OWNER_EX_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_f_owner_ex.h" + +#else + +#include "hdr/fcntl_overlay.h" + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_F_OWNER_EX_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_flock.h b/contrib/llvm-project/libc/hdr/types/struct_flock.h new file mode 100644 index 000000000000..6a6c928e6fa6 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_flock.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct flock -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_FLOCK_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_FLOCK_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_flock.h" + +#else + +#include "hdr/fcntl_overlay.h" + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_FLOCK_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_flock64.h b/contrib/llvm-project/libc/hdr/types/struct_flock64.h new file mode 100644 index 000000000000..fcfda59479a2 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_flock64.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct flock64 -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_FLOCK64_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_FLOCK64_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_flock64.h" + +#else + +#include "hdr/fcntl_overlay.h" + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_FLOCK64_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_iovec.h b/contrib/llvm-project/libc/hdr/types/struct_iovec.h new file mode 100644 index 000000000000..fc6174c6d487 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_iovec.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct iovec -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_IOVEC_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_IOVEC_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_iovec.h" + +#else + +#include <sys/uio.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_IOVEC_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_itimerval.h b/contrib/llvm-project/libc/hdr/types/struct_itimerval.h new file mode 100644 index 000000000000..b2281675b802 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_itimerval.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct itimerval ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_ITIMERVAL_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_ITIMERVAL_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_itimerval.h" + +#else + +#include <sys/time.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_ITIMERVAL_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_msghdr.h b/contrib/llvm-project/libc/hdr/types/struct_msghdr.h new file mode 100644 index 000000000000..6a36af791e21 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_msghdr.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct msghdr ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_MSGHDR_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_MSGHDR_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_msghdr.h" + +#else + +#include <sys/socket.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_MSGHDR_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_pollfd.h b/contrib/llvm-project/libc/hdr/types/struct_pollfd.h new file mode 100644 index 000000000000..efec6fc80ac1 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_pollfd.h @@ -0,0 +1,23 @@ +//===-- Definition of struct pollfd ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_POLLFD_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_POLLFD_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_pollfd.h" + +#else // overlay mode + +#include <poll.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_POLLFD_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_sigaction.h b/contrib/llvm-project/libc/hdr/types/struct_sigaction.h new file mode 100644 index 000000000000..60f6caeb4af1 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_sigaction.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct sigaction ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_SIGACTION_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_SIGACTION_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_sigaction.h" + +#else + +#include <signal.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_SIGACTION_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_sockaddr.h b/contrib/llvm-project/libc/hdr/types/struct_sockaddr.h new file mode 100644 index 000000000000..0fc31d537485 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_sockaddr.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct sockaddr ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_SOCKADDR_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_SOCKADDR_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_sockaddr.h" + +#else + +#include <sys/socket.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_SOCKADDR_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_timespec.h b/contrib/llvm-project/libc/hdr/types/struct_timespec.h new file mode 100644 index 000000000000..1f121f3d24d8 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_timespec.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct timespec ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_TIMESPEC_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_TIMESPEC_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_timespec.h" + +#else + +#include <time.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_TIMESPEC_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_timeval.h b/contrib/llvm-project/libc/hdr/types/struct_timeval.h new file mode 100644 index 000000000000..8fc321a52d71 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_timeval.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct timeval ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_TIMEVAL_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_TIMEVAL_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_timeval.h" + +#else + +#include <sys/time.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_TIMEVAL_H diff --git a/contrib/llvm-project/libc/hdr/types/struct_tm.h b/contrib/llvm-project/libc/hdr/types/struct_tm.h new file mode 100644 index 000000000000..96c23e2ce054 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/struct_tm.h @@ -0,0 +1,21 @@ +//===-- Proxy for struct tm ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_TM_H +#define LLVM_LIBC_HDR_TYPES_STRUCT_TM_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/struct_tm.h" + +#else + +#include <time.h> + +#endif // LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_STRUCT_TM_H diff --git a/contrib/llvm-project/libc/hdr/types/suseconds_t.h b/contrib/llvm-project/libc/hdr/types/suseconds_t.h new file mode 100644 index 000000000000..f60168c59fb8 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/suseconds_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for suseconds_t ---------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_SUSECONDS_T_H +#define LLVM_LIBC_HDR_TYPES_SUSECONDS_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/suseconds_t.h" + +#else // Overlay mode + +#include <sys/types.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // #ifndef LLVM_LIBC_HDR_TYPES_SUSECONDS_T_H diff --git a/contrib/llvm-project/libc/hdr/types/time_t.h b/contrib/llvm-project/libc/hdr/types/time_t.h new file mode 100644 index 000000000000..fc9a1506a2cd --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/time_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for time_t --------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_TIME_T_H +#define LLVM_LIBC_HDR_TYPES_TIME_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/time_t.h" + +#else // Overlay mode + +#include <time.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_TIME_T_H diff --git a/contrib/llvm-project/libc/hdr/types/uid_t.h b/contrib/llvm-project/libc/hdr/types/uid_t.h new file mode 100644 index 000000000000..a1eefb03228c --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/uid_t.h @@ -0,0 +1,22 @@ +//===-- Proxy for uid_t ---------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_UID_T_H +#define LLVM_LIBC_HDR_TYPES_UID_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/uid_t.h" + +#else // Overlay mode + +#include <sys/types.h> + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_UID_T_H diff --git a/contrib/llvm-project/libc/hdr/types/wchar_t.h b/contrib/llvm-project/libc/hdr/types/wchar_t.h new file mode 100644 index 000000000000..75e945239119 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/wchar_t.h @@ -0,0 +1,23 @@ +//===-- Definition of wchar_t.h -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_WCHAR_T_H +#define LLVM_LIBC_HDR_TYPES_WCHAR_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/wchar_t.h" + +#else // overlay mode + +#include "hdr/wchar_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_WCHAR_T_H diff --git a/contrib/llvm-project/libc/hdr/types/wint_t.h b/contrib/llvm-project/libc/hdr/types/wint_t.h new file mode 100644 index 000000000000..6b91859d35be --- /dev/null +++ b/contrib/llvm-project/libc/hdr/types/wint_t.h @@ -0,0 +1,23 @@ +//===-- Definition of wint_t.h --------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_TYPES_WINT_T_H +#define LLVM_LIBC_HDR_TYPES_WINT_T_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-types/wint_t.h" + +#else // overlay mode + +#include "hdr/wchar_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_TYPES_WINT_T_H diff --git a/contrib/llvm-project/libc/hdr/uchar_overlay.h b/contrib/llvm-project/libc/hdr/uchar_overlay.h new file mode 100644 index 000000000000..44ed3d48c6c1 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/uchar_overlay.h @@ -0,0 +1,69 @@ +//===-- Including uchar.h in overlay mode ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_UCHAR_OVERLAY_H +#define LLVM_LIBC_HDR_UCHAR_OVERLAY_H + +#ifdef LIBC_FULL_BUILD +#error "This header should only be included in overlay mode" +#endif + +// Overlay mode + +// glibc <uchar.h> header might provide extern inline definitions for few +// functions, causing external alias errors. They are guarded by +// `__USE_EXTERN_INLINES` macro. We temporarily disable `__USE_EXTERN_INLINES` +// macro by defining `__NO_INLINE__` before including <uchar.h>. +// And the same with `__USE_FORTIFY_LEVEL`, which will be temporarily disabled +// with `_FORTIFY_SOURCE`. + +#ifdef _FORTIFY_SOURCE +#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE +#undef _FORTIFY_SOURCE +#endif + +#ifndef __NO_INLINE__ +#define __NO_INLINE__ 1 +#define LIBC_SET_NO_INLINE +#endif + +#ifdef __USE_EXTERN_INLINES +#define LIBC_OLD_USE_EXTERN_INLINES +#undef __USE_EXTERN_INLINES +#endif + +#ifdef __USE_FORTIFY_LEVEL +#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL 0 +#endif + +#include <uchar.h> + +#ifdef LIBC_OLD_FORTIFY_SOURCE +#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE +#undef LIBC_OLD_FORTIFY_SOURCE +#endif + +#ifdef LIBC_SET_NO_INLINE +#undef __NO_INLINE__ +#undef LIBC_SET_NO_INLINE +#endif + +#ifdef LIBC_OLD_USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL +#undef LIBC_OLD_USE_FORTIFY_LEVEL +#endif + +#ifdef LIBC_OLD_USE_EXTERN_INLINES +#define __USE_EXTERN_INLINES +#undef LIBC_OLD_USE_EXTERN_INLINES +#endif + +#endif // LLVM_LIBC_HDR_UCHAR_OVERLAY_H diff --git a/contrib/llvm-project/libc/hdr/unistd_macros.h b/contrib/llvm-project/libc/hdr/unistd_macros.h new file mode 100644 index 000000000000..5c2b24354dd3 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/unistd_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from unistd.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_UNISTD_MACROS_H +#define LLVM_LIBC_HDR_UNISTD_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/unistd-macros.h" + +#else // Overlay mode + +#include "unistd_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_UNISTD_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/unistd_overlay.h b/contrib/llvm-project/libc/hdr/unistd_overlay.h new file mode 100644 index 000000000000..e3001e0cda08 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/unistd_overlay.h @@ -0,0 +1,69 @@ +//===-- Including unistd.h in overlay mode -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_UNISTD_OVERLAY_H +#define LLVM_LIBC_HDR_UNISTD_OVERLAY_H + +#ifdef LIBC_FULL_BUILD +#error "This header should only be included in overlay mode" +#endif + +// Overlay mode + +// glibc <unistd.h> header might provide extern inline definitions for few +// functions, causing external alias errors. They are guarded by +// `__USE_EXTERN_INLINES` macro. We temporarily disable `__USE_EXTERN_INLINES` +// macro by defining `__NO_INLINE__` before including <stdio.h>. +// And the same with `__USE_FORTIFY_LEVEL`, which will be temporarily disabled +// with `_FORTIFY_SOURCE`. + +#ifdef _FORTIFY_SOURCE +#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE +#undef _FORTIFY_SOURCE +#endif + +#ifdef __USE_EXTERN_INLINES +#define LIBC_OLD_USE_EXTERN_INLINES +#undef __USE_EXTERN_INLINES +#endif + +#ifdef __USE_FORTIFY_LEVEL +#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL 0 +#endif + +#ifndef __NO_INLINE__ +#define __NO_INLINE__ 1 +#define LIBC_SET_NO_INLINE +#endif + +#include <unistd.h> + +#ifdef LIBC_OLD_FORTIFY_SOURCE +#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE +#undef LIBC_OLD_FORTIFY_SOURCE +#endif + +#ifdef LIBC_SET_NO_INLINE +#undef __NO_INLINE__ +#undef LIBC_SET_NO_INLINE +#endif + +#ifdef LIBC_OLD_USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL +#undef LIBC_OLD_USE_FORTIFY_LEVEL +#endif + +#ifdef LIBC_OLD_USE_EXTERN_INLINES +#define __USE_EXTERN_INLINES +#undef LIBC_OLD_USE_EXTERN_INLINES +#endif + +#endif // LLVM_LIBC_HDR_UNISTD_OVERLAY_H diff --git a/contrib/llvm-project/libc/hdr/wchar_macros.h b/contrib/llvm-project/libc/hdr/wchar_macros.h new file mode 100644 index 000000000000..8b90768fc3ad --- /dev/null +++ b/contrib/llvm-project/libc/hdr/wchar_macros.h @@ -0,0 +1,22 @@ +//===-- Definition of macros from wchar.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_WCHAR_MACROS_H +#define LLVM_LIBC_HDR_WCHAR_MACROS_H + +#ifdef LIBC_FULL_BUILD + +#include "include/llvm-libc-macros/wchar-macros.h" + +#else // Overlay mode + +#include "hdr/wchar_overlay.h" + +#endif // LLVM_LIBC_FULL_BUILD + +#endif // LLVM_LIBC_HDR_WCHAR_MACROS_H diff --git a/contrib/llvm-project/libc/hdr/wchar_overlay.h b/contrib/llvm-project/libc/hdr/wchar_overlay.h new file mode 100644 index 000000000000..52d3a0cc6596 --- /dev/null +++ b/contrib/llvm-project/libc/hdr/wchar_overlay.h @@ -0,0 +1,69 @@ +//===-- Including wchar.h in overlay mode ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_HDR_WCHAR_OVERLAY_H +#define LLVM_LIBC_HDR_WCHAR_OVERLAY_H + +#ifdef LIBC_FULL_BUILD +#error "This header should only be included in overlay mode" +#endif + +// Overlay mode + +// glibc <wchar.h> header might provide extern inline definitions for few +// functions, causing external alias errors. They are guarded by +// `__USE_EXTERN_INLINES` macro. We temporarily disable `__USE_EXTERN_INLINES` +// macro by defining `__NO_INLINE__` before including <wchar.h>. +// And the same with `__USE_FORTIFY_LEVEL`, which will be temporarily disabled +// with `_FORTIFY_SOURCE`. + +#ifdef _FORTIFY_SOURCE +#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE +#undef _FORTIFY_SOURCE +#endif + +#ifndef __NO_INLINE__ +#define __NO_INLINE__ 1 +#define LIBC_SET_NO_INLINE +#endif + +#ifdef __USE_EXTERN_INLINES +#define LIBC_OLD_USE_EXTERN_INLINES +#undef __USE_EXTERN_INLINES +#endif + +#ifdef __USE_FORTIFY_LEVEL +#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL 0 +#endif + +#include <wchar.h> + +#ifdef LIBC_OLD_FORTIFY_SOURCE +#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE +#undef LIBC_OLD_FORTIFY_SOURCE +#endif + +#ifdef LIBC_SET_NO_INLINE +#undef __NO_INLINE__ +#undef LIBC_SET_NO_INLINE +#endif + +#ifdef LIBC_OLD_USE_FORTIFY_LEVEL +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL +#undef LIBC_OLD_USE_FORTIFY_LEVEL +#endif + +#ifdef LIBC_OLD_USE_EXTERN_INLINES +#define __USE_EXTERN_INLINES +#undef LIBC_OLD_USE_EXTERN_INLINES +#endif + +#endif // LLVM_LIBC_HDR_WCHAR_OVERLAY_H diff --git a/contrib/llvm-project/libc/include/__llvm-libc-common.h b/contrib/llvm-project/libc/include/__llvm-libc-common.h new file mode 100644 index 000000000000..c6fd33a55532 --- /dev/null +++ b/contrib/llvm-project/libc/include/__llvm-libc-common.h @@ -0,0 +1,98 @@ +//===-- Common definitions for LLVM-libc public header files --------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LLVM_LIBC_COMMON_H +#define _LLVM_LIBC_COMMON_H + +#define __LLVM_LIBC__ 1 + +#ifdef __cplusplus + +#undef __BEGIN_C_DECLS +#define __BEGIN_C_DECLS extern "C" { + +#undef __END_C_DECLS +#define __END_C_DECLS } + +// Standard C++ doesn't have C99 restrict but GNU C++ has it with __ spelling. +#undef __restrict +#ifndef __GNUC__ +#define __restrict +#endif + +#undef _Noreturn +#define _Noreturn [[noreturn]] + +#undef _Alignas +#define _Alignas alignas + +#undef _Static_assert +#define _Static_assert static_assert + +#undef _Alignof +#define _Alignof alignof + +#undef _Thread_local +#define _Thread_local thread_local + +#undef __NOEXCEPT +#if __cplusplus >= 201103L +#define __NOEXCEPT noexcept +#else +#define __NOEXCEPT throw() +#endif + +// This macro serves as a generic cast implementation for use in both C and C++, +// similar to `__BIONIC_CAST` in Android. +#undef __LLVM_LIBC_CAST +#define __LLVM_LIBC_CAST(cast, type, value) (cast<type>(value)) + +#else // not __cplusplus + +#undef __BEGIN_C_DECLS +#define __BEGIN_C_DECLS + +#undef __END_C_DECLS +#define __END_C_DECLS + +#undef __restrict +#if __STDC_VERSION__ >= 199901L +// C99 and above support the restrict keyword. +#define __restrict restrict +#elif !defined(__GNUC__) +// GNU-compatible compilers accept the __ spelling in all modes. +// Otherwise, omit the qualifier for pure C89 compatibility. +#define __restrict +#endif + +#undef _Noreturn +#if __STDC_VERSION__ >= 201112L +// In C11 and later, _Noreturn is a keyword. +#elif defined(__GNUC__) +// GNU-compatible compilers have an equivalent attribute. +#define _Noreturn __attribute__((__noreturn__)) +#else +#define _Noreturn +#endif + +#undef __NOEXCEPT +#ifdef __GNUC__ +#define __NOEXCEPT __attribute__((__nothrow__)) +#else +#define __NOEXCEPT +#endif + +#undef _Returns_twice +#define _Returns_twice __attribute__((returns_twice)) + +#undef __LLVM_LIBC_CAST +#define __LLVM_LIBC_CAST(cast, type, value) ((type)(value)) + +#endif // __cplusplus + +#endif // _LLVM_LIBC_COMMON_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/EFIAPI-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/EFIAPI-macros.h new file mode 100644 index 000000000000..cb854928d0ab --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/EFIAPI-macros.h @@ -0,0 +1,18 @@ +//===-- Definition of EFIAPI macro ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_EFIAPI_MACROS_H +#define LLVM_LIBC_MACROS_EFIAPI_MACROS_H + +#if defined(__x86_64__) && !defined(__ILP32__) +#define EFIAPI __attribute__((ms_abi)) +#else +#define EFIAPI +#endif + +#endif // LLVM_LIBC_MACROS_EFIAPI_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/assert-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/assert-macros.h new file mode 100644 index 000000000000..44e14543d856 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/assert-macros.h @@ -0,0 +1,14 @@ +//===-- Definition of macros to be used with assert functions -------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __LLVM_LIBC_MACROS_ASSERT_MACROS_H +#define __LLVM_LIBC_MACROS_ASSERT_MACROS_H + +#define __STDC_VERSION_ASSERT_H__ 202311L + +#endif // __LLVM_LIBC_MACROS_ASSERT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/baremetal/time-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/baremetal/time-macros.h new file mode 100644 index 000000000000..3537376c4bca --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/baremetal/time-macros.h @@ -0,0 +1,26 @@ +//===-- Definition of macros from time.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_BAREMETAL_TIME_MACROS_H +#define LLVM_LIBC_MACROS_BAREMETAL_TIME_MACROS_H + +#ifdef __CLK_TCK +#define CLOCKS_PER_SEC __CLK_TCK +#else +#if defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || \ + defined(__arm64__) || defined(_M_ARM64) +// This default implementation of this function shall use semihosting +// Semihosting measures time in centiseconds +// https://github.com/ARM-software/abi-aa/blob/main/semihosting/semihosting.rst#sys-clock-0x10 +#define CLOCKS_PER_SEC 100 +#else +#define CLOCKS_PER_SEC 1000000 +#endif +#endif + +#endif // LLVM_LIBC_MACROS_BAREMETAL_TIME_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/complex-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/complex-macros.h new file mode 100644 index 000000000000..427c68d289e0 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/complex-macros.h @@ -0,0 +1,24 @@ +//===-- Definition of macros to be used with complex functions ------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __LLVM_LIBC_MACROS_COMPLEX_MACROS_H +#define __LLVM_LIBC_MACROS_COMPLEX_MACROS_H + +#ifndef __STDC_NO_COMPLEX__ + +#define __STDC_VERSION_COMPLEX_H__ 202311L + +#define complex _Complex +#define _Complex_I ((_Complex float)1.0fi) +#define I _Complex_I + +// TODO: Add imaginary macros once GCC or Clang support _Imaginary builtin-type. + +#endif + +#endif // __LLVM_LIBC_MACROS_COMPLEX_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/containerof-macro.h b/contrib/llvm-project/libc/include/llvm-libc-macros/containerof-macro.h new file mode 100644 index 000000000000..debf441bf845 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/containerof-macro.h @@ -0,0 +1,20 @@ +//===-- Definition of the containerof macro -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_CONTAINEROF_MACRO_H +#define LLVM_LIBC_MACROS_CONTAINEROF_MACRO_H + +#include "offsetof-macro.h" + +#define __containerof(ptr, type, member) \ + ({ \ + const __typeof(((type *)0)->member) *__ptr = (ptr); \ + (type *)(void *)((const char *)__ptr - offsetof(type, member)); \ + }) + +#endif // LLVM_LIBC_MACROS_CONTAINEROF_MACRO_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/dlfcn-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/dlfcn-macros.h new file mode 100644 index 000000000000..dcd202b9ab43 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/dlfcn-macros.h @@ -0,0 +1,23 @@ +//===-- Definition of macros from dlfcn.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_DLFCN_MACROS_H +#define LLVM_LIBC_MACROS_DLFCN_MACROS_H + +#define RTLD_LAZY 0x00001 +#define RTLD_NOW 0x00002 +#define RTLD_GLOBAL 0x00100 +#define RTLD_LOCAL 0 + +// Non-standard stuff here +#define RTLD_BINDING_MASK 0x3 +#define RTLD_NOLOAD 0x00004 +#define RTLD_DEEPBIND 0x00008 +#define RTLD_NODELETE 0x01000 + +#endif // LLVM_LIBC_MACROS_DLFCN_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/elf-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/elf-macros.h new file mode 100644 index 000000000000..fa4442abf0f5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/elf-macros.h @@ -0,0 +1,18 @@ +//===-- Definition of macros from elf.h -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_ELF_MACROS_H +#define LLVM_LIBC_MACROS_ELF_MACROS_H + +#if __has_include(<linux/elf.h>) +#include <linux/elf.h> +#else +#error "cannot use <sys/elf.h> without proper system headers." +#endif + +#endif // LLVM_LIBC_MACROS_ELF_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/endian-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/endian-macros.h new file mode 100644 index 000000000000..52d95dc01cd8 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/endian-macros.h @@ -0,0 +1,50 @@ +//===-- Definition of macros from endian.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_ENDIAN_MACROS_H +#define LLVM_LIBC_MACROS_ENDIAN_MACROS_H + +#include "stdint-macros.h" + +#define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ +#define BIG_ENDIAN __ORDER_BIG_ENDIAN__ +#define BYTE_ORDER __BYTE_ORDER__ + +#if BYTE_ORDER == LITTLE_ENDIAN + +#define htobe16(x) __builtin_bswap16((x)) +#define htobe32(x) __builtin_bswap32((x)) +#define htobe64(x) __builtin_bswap64((x)) +#define htole16(x) __LLVM_LIBC_CAST(static_cast, uint16_t, x) +#define htole32(x) __LLVM_LIBC_CAST(static_cast, uint32_t, x) +#define htole64(x) __LLVM_LIBC_CAST(static_cast, uint64_t, x) +#define be16toh(x) __builtin_bswap16((x)) +#define be32toh(x) __builtin_bswap32((x)) +#define be64toh(x) __builtin_bswap64((x)) +#define le16toh(x) __LLVM_LIBC_CAST(static_cast, uint16_t, x) +#define le32toh(x) __LLVM_LIBC_CAST(static_cast, uint32_t, x) +#define le64toh(x) __LLVM_LIBC_CAST(static_cast, uint64_t, x) + +#else + +#define htobe16(x) __LLVM_LIBC_CAST(static_cast, uint16_t, x) +#define htobe32(x) __LLVM_LIBC_CAST(static_cast, uint32_t, x) +#define htobe64(x) __LLVM_LIBC_CAST(static_cast, uint64_t, x) +#define htole16(x) __builtin_bswap16((x)) +#define htole32(x) __builtin_bswap32((x)) +#define htole64(x) __builtin_bswap64((x)) +#define be16toh(x) __LLVM_LIBC_CAST(static_cast, uint16_t, x) +#define be32toh(x) __LLVM_LIBC_CAST(static_cast, uint32_t, x) +#define be64toh(x) __LLVM_LIBC_CAST(static_cast, uint64_t, x) +#define le16toh(x) __builtin_bswap16((x)) +#define le32toh(x) __builtin_bswap32((x)) +#define le64toh(x) __builtin_bswap64((x)) + +#endif + +#endif // LLVM_LIBC_MACROS_ENDIAN_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/error-number-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/error-number-macros.h new file mode 100644 index 000000000000..29bd54d07f2e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/error-number-macros.h @@ -0,0 +1,8 @@ +#ifndef LLVM_LIBC_MACROS_ERROR_NUMBER_MACROS_H +#define LLVM_LIBC_MACROS_ERROR_NUMBER_MACROS_H + +#ifdef __linux__ +#include "linux/error-number-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_ERROR_NUMBER_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/fcntl-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/fcntl-macros.h new file mode 100644 index 000000000000..4bd03a7e3e2b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/fcntl-macros.h @@ -0,0 +1,8 @@ +#ifndef LLVM_LIBC_MACROS_FCNTL_MACROS_H +#define LLVM_LIBC_MACROS_FCNTL_MACROS_H + +#ifdef __linux__ +#include "linux/fcntl-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_FCNTL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/features-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/features-macros.h new file mode 100644 index 000000000000..f87ae4ad1240 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/features-macros.h @@ -0,0 +1,12 @@ +//===-- Definition of macros from features.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_FEATURES_MACROS_H +#define LLVM_LIBC_MACROS_FEATURES_MACROS_H + +#endif // LLVM_LIBC_MACROS_FEATURES_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/fenv-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/fenv-macros.h new file mode 100644 index 000000000000..1826723f9349 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/fenv-macros.h @@ -0,0 +1,28 @@ +//===-- Definition of macros from fenv.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_FENV_MACROS_H +#define LLVM_LIBC_MACROS_FENV_MACROS_H + +#define FE_DIVBYZERO 0x1 +#define FE_INEXACT 0x2 +#define FE_INVALID 0x4 +#define FE_OVERFLOW 0x8 +#define FE_UNDERFLOW 0x10 +#define __FE_DENORM 0x20 +#define FE_ALL_EXCEPT \ + (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) + +#define FE_DOWNWARD 0x400 +#define FE_TONEAREST 0 +#define FE_TOWARDZERO 0xC00 +#define FE_UPWARD 0x800 + +#define FE_DFL_ENV ((fenv_t *)-1) + +#endif // LLVM_LIBC_MACROS_FENV_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/file-seek-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/file-seek-macros.h new file mode 100644 index 000000000000..676cb7511407 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/file-seek-macros.h @@ -0,0 +1,16 @@ +//===-- Definition of macros to be used with file seek functions ----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_FILE_SEEK_MACROS_H +#define LLVM_LIBC_MACROS_FILE_SEEK_MACROS_H + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +#endif // LLVM_LIBC_MACROS_FILE_SEEK_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/float-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/float-macros.h new file mode 100644 index 000000000000..a25ef60a293d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/float-macros.h @@ -0,0 +1,178 @@ +//===-- Definition of macros from float.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_FLOAT_MACROS_H +#define LLVM_LIBC_MACROS_FLOAT_MACROS_H + +#ifndef FLT_RADIX +#define FLT_RADIX __FLT_RADIX__ +#endif // FLT_RADIX + +#ifndef FLT_EVAL_METHOD +#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ +#endif // FLT_EVAL_METHOD + +#ifndef FLT_ROUNDS +#if __has_builtin(__builtin_flt_rounds) +#define FLT_ROUNDS __builtin_flt_rounds() +#else +#define FLT_ROUNDS 1 +#endif +#endif // FLT_ROUNDS + +#ifndef FLT_DECIMAL_DIG +#define FLT_DECIMAL_DIG __FLT_DECIMAL_DIG__ +#endif // FLT_DECIMAL_DIG + +#ifndef DBL_DECIMAL_DIG +#define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__ +#endif // DBL_DECIMAL_DIG + +#ifndef LDBL_DECIMAL_DIG +#define LDBL_DECIMAL_DIG __LDBL_DECIMAL_DIG__ +#endif // LDBL_DECIMAL_DIG + +#ifndef DECIMAL_DIG +#define DECIMAL_DIG __DECIMAL_DIG__ +#endif // DECIMAL_DIG + +#ifndef FLT_DIG +#define FLT_DIG __FLT_DIG__ +#endif // FLT_DIG + +#ifndef DBL_DIG +#define DBL_DIG __DBL_DIG__ +#endif // DBL_DIG + +#ifndef LDBL_DIG +#define LDBL_DIG __LDBL_DIG__ +#endif // LDBL_DIG + +#ifndef FLT_MANT_DIG +#define FLT_MANT_DIG __FLT_MANT_DIG__ +#endif // FLT_MANT_DIG + +#ifndef DBL_MANT_DIG +#define DBL_MANT_DIG __DBL_MANT_DIG__ +#endif // DBL_MANT_DIG + +#ifndef LDBL_MANT_DIG +#define LDBL_MANT_DIG __LDBL_MANT_DIG__ +#endif // LDBL_MANT_DIG + +#ifndef FLT_MIN +#define FLT_MIN __FLT_MIN__ +#endif // FLT_MIN + +#ifndef DBL_MIN +#define DBL_MIN __DBL_MIN__ +#endif // DBL_MIN + +#ifndef LDBL_MIN +#define LDBL_MIN __LDBL_MIN__ +#endif // LDBL_MIN + +#ifndef FLT_MAX +#define FLT_MAX __FLT_MAX__ +#endif // FLT_MAX + +#ifndef DBL_MAX +#define DBL_MAX __DBL_MAX__ +#endif // DBL_MAX + +#ifndef LDBL_MAX +#define LDBL_MAX __LDBL_MAX__ +#endif // LDBL_MAX + +#ifndef FLT_TRUE_MIN +#define FLT_TRUE_MIN __FLT_DENORM_MIN__ +#endif // FLT_TRUE_MIN + +#ifndef DBL_TRUE_MIN +#define DBL_TRUE_MIN __DBL_DENORM_MIN__ +#endif // DBL_TRUE_MIN + +#ifndef LDBL_TRUE_MIN +#define LDBL_TRUE_MIN __LDBL_DENORM_MIN__ +#endif // LDBL_TRUE_MIN + +#ifndef FLT_EPSILON +#define FLT_EPSILON __FLT_EPSILON__ +#endif // FLT_EPSILON + +#ifndef DBL_EPSILON +#define DBL_EPSILON __DBL_EPSILON__ +#endif // DBL_EPSILON + +#ifndef LDBL_EPSILON +#define LDBL_EPSILON __LDBL_EPSILON__ +#endif // LDBL_EPSILON + +#ifndef FLT_MIN_EXP +#define FLT_MIN_EXP __FLT_MIN_EXP__ +#endif // FLT_MIN_EXP + +#ifndef DBL_MIN_EXP +#define DBL_MIN_EXP __DBL_MIN_EXP__ +#endif // DBL_MIN_EXP + +#ifndef LDBL_MIN_EXP +#define LDBL_MIN_EXP __LDBL_MIN_EXP__ +#endif // LDBL_MIN_EXP + +#ifndef FLT_MIN_10_EXP +#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__ +#endif // FLT_MIN_10_EXP + +#ifndef DBL_MIN_10_EXP +#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__ +#endif // DBL_MIN_10_EXP + +#ifndef LDBL_MIN_10_EXP +#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__ +#endif // LDBL_MIN_10_EXP + +#ifndef FLT_MAX_EXP +#define FLT_MAX_EXP __FLT_MAX_EXP__ +#endif // FLT_MAX_EXP + +#ifndef DBL_MAX_EXP +#define DBL_MAX_EXP __DBL_MAX_EXP__ +#endif // DBL_MAX_EXP + +#ifndef LDBL_MAX_EXP +#define LDBL_MAX_EXP __LDBL_MAX_EXP__ +#endif // LDBL_MAX_EXP + +#ifndef FLT_MAX_10_EXP +#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__ +#endif // FLT_MAX_10_EXP + +#ifndef DBL_MAX_10_EXP +#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__ +#endif // DBL_MAX_10_EXP + +#ifndef LDBL_MAX_10_EXP +#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__ +#endif // LDBL_MAX_10_EXP + +#ifndef FLT_HAS_SUBNORM +#define FLT_HAS_SUBNORM __FLT_HAS_DENORM__ +#endif // FLT_HAS_SUBNORM + +#ifndef DBL_HAS_SUBNORM +#define DBL_HAS_SUBNORM __DBL_HAS_DENORM__ +#endif // DBL_HAS_SUBNORM + +#ifndef LDBL_HAS_SUBNORM +#define LDBL_HAS_SUBNORM __LDBL_HAS_DENORM__ +#endif // LDBL_HAS_SUBNORM + +// TODO: Add FLT16 and FLT128 constants. + +#endif // LLVM_LIBC_MACROS_FLOAT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/float16-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/float16-macros.h new file mode 100644 index 000000000000..229e3e62f2ae --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/float16-macros.h @@ -0,0 +1,27 @@ +//===-- Detection of _Float16 compiler builtin type -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_FLOAT16_MACROS_H +#define LLVM_LIBC_MACROS_FLOAT16_MACROS_H + +#include "../llvm-libc-types/float128.h" + +#if defined(__FLT16_MANT_DIG__) && \ + (!defined(__GNUC__) || __GNUC__ >= 13 || defined(__clang__)) && \ + !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) && \ + !defined(_WIN32) +#define LIBC_TYPES_HAS_FLOAT16 + +// TODO: This would no longer be required if HdrGen let us guard function +// declarations with multiple macros. +#ifdef LIBC_TYPES_HAS_FLOAT128 +#define LIBC_TYPES_HAS_FLOAT16_AND_FLOAT128 +#endif // LIBC_TYPES_HAS_FLOAT128 +#endif + +#endif // LLVM_LIBC_MACROS_FLOAT16_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/generic-error-number-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/generic-error-number-macros.h new file mode 100644 index 000000000000..199a86217b34 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/generic-error-number-macros.h @@ -0,0 +1,48 @@ +//===-- Definition of generic error number macros -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_GENERIC_ERROR_NUMBER_MACROS_H +#define LLVM_LIBC_MACROS_GENERIC_ERROR_NUMBER_MACROS_H + +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define ENOTBLK 15 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define ETXTBSY 26 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EILSEQ 84 + +#endif // LLVM_LIBC_MACROS_GENERIC_ERROR_NUMBER_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/gpu/signal-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/gpu/signal-macros.h new file mode 100644 index 000000000000..f0d49ea34fe0 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/gpu/signal-macros.h @@ -0,0 +1,28 @@ +//===-- Definition of GPU signal number macros ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_GPU_SIGNAL_MACROS_H +#define LLVM_LIBC_MACROS_GPU_SIGNAL_MACROS_H + +#define SIGINT 2 +#define SIGILL 4 +#define SIGABRT 6 +#define SIGFPE 8 +#define SIGSEGV 11 +#define SIGTERM 15 + +#define SIG_DFL ((void (*)(int))(0)) +#define SIG_IGN ((void (*)(int))(1)) +#define SIG_ERR ((void (*)(int))(-1)) + +// Max signal number +#define NSIG 64 + +#define __NSIGSET_WORDS NSIG + +#endif // LLVM_LIBC_MACROS_GPU_SIGNAL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/gpu/time-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/gpu/time-macros.h new file mode 100644 index 000000000000..7142a3e1b276 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/gpu/time-macros.h @@ -0,0 +1,17 @@ +//===-- Definition of macros from time.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_GPU_TIME_MACROS_H +#define LLVM_LIBC_MACROS_GPU_TIME_MACROS_H + +#define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 1 + +#define CLOCKS_PER_SEC 1000000 + +#endif // LLVM_LIBC_MACROS_GPU_TIME_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/inttypes-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/inttypes-macros.h new file mode 100644 index 000000000000..9b554670271e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/inttypes-macros.h @@ -0,0 +1,420 @@ +//===-- Definition of macros from inttypes.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_MACROS_INTTYPES_MACROS_H +#define LLVM_LIBC_MACROS_INTTYPES_MACROS_H + +// fprintf/scanf format macros. +#define __STDC_VERSION_INTTYPES_H__ 202311L + +// clang provides these macros, so we don't need to define them. +#ifndef __clang__ +#if __UINTPTR_MAX__ == __UINT64_MAX__ +#define __PRI64 "l" +#define __PRIPTR "l" +#elif __UINTPTR_MAX__ == __UINT32_MAX__ +#define __PRI64 "ll" +#define __PRIPTR "" +#else +// CHERI achitecture for example, has 128-bit pointers that use special "P" +// format. +#error "Unsupported pointer format" +#endif +#define __INT8_FMTd__ "hhd" +#define __INT16_FMTd__ "hd" +#define __INT32_FMTd__ "d" +#define __INT64_FMTd__ __PRI64 "d" +#define __INT_LEAST8_FMTd__ "hhd" +#define __INT_LEAST16_FMTd__ "hd" +#define __INT_LEAST32_FMTd__ "d" +#define __INT_LEAST64_FMTd__ __PRI64 "d" +#define __INT_FAST8_FMTd__ "hhd" +#define __INT_FAST16_FMTd__ "hd" +#define __INT_FAST32_FMTd__ "d" +#define __INT_FAST64_FMTd__ __PRI64 "d" +#define __INTMAX_FMTd__ __PRI64 "d" +#define __INTPTR_FMTd__ __PRIPTR "d" + +#define __INT8_FMTi__ "hhi" +#define __INT16_FMTi__ "hi" +#define __INT32_FMTi__ "i" +#define __INT64_FMTi__ __PRI64 "i" +#define __INT_LEAST8_FMTi__ "hhi" +#define __INT_LEAST16_FMTi__ "hi" +#define __INT_LEAST32_FMTi__ "i" +#define __INT_LEAST64_FMTi__ __PRI64 "i" +#define __INT_FAST8_FMTi__ "hhi" +#define __INT_FAST16_FMTi__ "hi" +#define __INT_FAST32_FMTi__ "i" +#define __INT_FAST64_FMTi__ __PRI64 "i" +#define __INTMAX_FMTi__ __PRI64 "i" +#define __INTPTR_FMTi__ __PRIPTR "i" + +#define __UINT8_FMTo__ "hho" +#define __UINT16_FMTo__ "ho" +#define __UINT32_FMTo__ "o" +#define __UINT64_FMTo__ __PRI64 "o" +#define __UINT_LEAST8_FMTo__ "hho" +#define __UINT_LEAST16_FMTo__ "ho" +#define __UINT_LEAST32_FMTo__ "o" +#define __UINT_LEAST64_FMTo__ __PRI64 "o" +#define __UINT_FAST8_FMTo__ "hho" +#define __UINT_FAST16_FMTo__ "ho" +#define __UINT_FAST32_FMTo__ "o" +#define __UINT_FAST64_FMTo__ __PRI64 "o" +#define __UINTMAX_FMTo__ __PRI64 "o" +#define __UINTPTR_FMTo__ __PRIPTR "o" + +#define __UINT8_FMTu__ "hhu" +#define __UINT16_FMTu__ "hu" +#define __UINT32_FMTu__ "u" +#define __UINT64_FMTu__ __PRI64 "u" +#define __UINT_LEAST8_FMTu__ "hhu" +#define __UINT_LEAST16_FMTu__ "hu" +#define __UINT_LEAST32_FMTu__ "u" +#define __UINT_LEAST64_FMTu__ __PRI64 "u" +#define __UINT_FAST8_FMTu__ "hhu" +#define __UINT_FAST16_FMTu__ "hu" +#define __UINT_FAST32_FMTu__ "u" +#define __UINT_FAST64_FMTu__ __PRI64 "u" +#define __UINTMAX_FMTu__ __PRI64 "u" +#define __UINTPTR_FMTu__ __PRIPTR "u" + +#define __UINT8_FMTx__ "hhx" +#define __UINT16_FMTx__ "hx" +#define __UINT32_FMTx__ "x" +#define __UINT64_FMTx__ __PRI64 "x" +#define __UINT_LEAST8_FMTx__ "hhx" +#define __UINT_LEAST16_FMTx__ "hx" +#define __UINT_LEAST32_FMTx__ "x" +#define __UINT_LEAST64_FMTx__ __PRI64 "x" +#define __UINT_FAST8_FMTx__ "hhx" +#define __UINT_FAST16_FMTx__ "hx" +#define __UINT_FAST32_FMTx__ "x" +#define __UINT_FAST64_FMTx__ __PRI64 "x" +#define __UINTMAX_FMTx__ __PRI64 "x" +#define __UINTPTR_FMTx__ __PRIPTR "x" + +#define __UINT8_FMTX__ "hhX" +#define __UINT16_FMTX__ "hX" +#define __UINT32_FMTX__ "X" +#define __UINT64_FMTX__ __PRI64 "X" +#define __UINT_LEAST8_FMTX__ "hhX" +#define __UINT_LEAST16_FMTX__ "hX" +#define __UINT_LEAST32_FMTX__ "X" +#define __UINT_LEAST64_FMTX__ __PRI64 "X" +#define __UINT_FAST8_FMTX__ "hhX" +#define __UINT_FAST16_FMTX__ "hX" +#define __UINT_FAST32_FMTX__ "X" +#define __UINT_FAST64_FMTX__ __PRI64 "X" +#define __UINTMAX_FMTX__ __PRI64 "X" +#define __UINTPTR_FMTX__ __PRIPTR "X" +#endif + +// only recent clang provides these macros, so we need to check if they are +// available. +#ifndef __UINT8_FMTb__ +#define __UINT8_FMTb__ "hhb" +#endif +#ifndef __UINT16_FMTb__ +#define __UINT16_FMTb__ "hb" +#endif +#ifndef __UINT32_FMTb__ +#define __UINT32_FMTb__ "b" +#endif +#ifndef __UINT64_FMTb__ +#define __UINT64_FMTb__ __PRI64 "b" +#endif +#ifndef __UINT_LEAST8_FMTb__ +#define __UINT_LEAST8_FMTb__ "hhb" +#endif +#ifndef __UINT_LEAST16_FMTb__ +#define __UINT_LEAST16_FMTb__ "hb" +#endif +#ifndef __UINT_LEAST32_FMTb__ +#define __UINT_LEAST32_FMTb__ "b" +#endif +#ifndef __UINT_LEAST64_FMTb__ +#define __UINT_LEAST64_FMTb__ __PRI64 "b" +#endif +#ifndef __UINT_FAST8_FMTb__ +#define __UINT_FAST8_FMTb__ "hhb" +#endif +#ifndef __UINT_FAST16_FMTb__ +#define __UINT_FAST16_FMTb__ "hb" +#endif +#ifndef __UINT_FAST32_FMTb__ +#define __UINT_FAST32_FMTb__ "b" +#endif +#ifndef __UINT_FAST64_FMTb__ +#define __UINT_FAST64_FMTb__ __PRI64 "b" +#endif +#ifndef __UINTMAX_FMTb__ +#define __UINTMAX_FMTb__ __PRI64 "b" +#endif +#ifndef __UINTPTR_FMTb__ +#define __UINTPTR_FMTb__ __PRIPTR "b" +#endif + +#ifndef __UINT8_FMTB__ +#define __UINT8_FMTB__ "hhB" +#endif +#ifndef __UINT16_FMTB__ +#define __UINT16_FMTB__ "hB" +#endif +#ifndef __UINT32_FMTB__ +#define __UINT32_FMTB__ "B" +#endif +#ifndef __UINT64_FMTB__ +#define __UINT64_FMTB__ __PRI64 "B" +#endif +#ifndef __UINT_LEAST8_FMTB__ +#define __UINT_LEAST8_FMTB__ "hhB" +#endif +#ifndef __UINT_LEAST16_FMTB__ +#define __UINT_LEAST16_FMTB__ "hB" +#endif +#ifndef __UINT_LEAST32_FMTB__ +#define __UINT_LEAST32_FMTB__ "B" +#endif +#ifndef __UINT_LEAST64_FMTB__ +#define __UINT_LEAST64_FMTB__ __PRI64 "B" +#endif +#ifndef __UINT_FAST8_FMTB__ +#define __UINT_FAST8_FMTB__ "hhB" +#endif +#ifndef __UINT_FAST16_FMTB__ +#define __UINT_FAST16_FMTB__ "hB" +#endif +#ifndef __UINT_FAST32_FMTB__ +#define __UINT_FAST32_FMTB__ "B" +#endif +#ifndef __UINT_FAST64_FMTB__ +#define __UINT_FAST64_FMTB__ __PRI64 "B" +#endif +#ifndef __UINTMAX_FMTB__ +#define __UINTMAX_FMTB__ __PRI64 "B" +#endif +#ifndef __UINTPTR_FMTB__ +#define __UINTPTR_FMTB__ __PRIPTR "B" +#endif + +// The fprintf() macros for signed integers. +#define PRId8 __INT8_FMTd__ +#define PRId16 __INT16_FMTd__ +#define PRId32 __INT32_FMTd__ +#define PRId64 __INT64_FMTd__ +#define PRIdLEAST8 __INT_LEAST8_FMTd__ +#define PRIdLEAST16 __INT_LEAST16_FMTd__ +#define PRIdLEAST32 __INT_LEAST32_FMTd__ +#define PRIdLEAST64 __INT_LEAST64_FMTd__ +#define PRIdFAST8 __INT_FAST8_FMTd__ +#define PRIdFAST16 __INT_FAST16_FMTd__ +#define PRIdFAST32 __INT_FAST32_FMTd__ +#define PRIdFAST64 __INT_FAST64_FMTd__ +#define PRIdMAX __INTMAX_FMTd__ +#define PRIdPTR __INTPTR_FMTd__ + +#define PRIi8 __INT8_FMTi__ +#define PRIi16 __INT16_FMTi__ +#define PRIi32 __INT32_FMTi__ +#define PRIi64 __INT64_FMTi__ +#define PRIiLEAST8 __INT_LEAST8_FMTi__ +#define PRIiLEAST16 __INT_LEAST16_FMTi__ +#define PRIiLEAST32 __INT_LEAST32_FMTi__ +#define PRIiLEAST64 __INT_LEAST64_FMTi__ +#define PRIiFAST8 __INT_FAST8_FMTi__ +#define PRIiFAST16 __INT_FAST16_FMTi__ +#define PRIiFAST32 __INT_FAST32_FMTi__ +#define PRIiFAST64 __INT_FAST64_FMTi__ +#define PRIiMAX __INTMAX_FMTi__ +#define PRIiPTR __INTPTR_FMTi__ + +// The fprintf() macros for unsigned integers. +#define PRIo8 __UINT8_FMTo__ +#define PRIo16 __UINT16_FMTo__ +#define PRIo32 __UINT32_FMTo__ +#define PRIo64 __UINT64_FMTo__ +#define PRIoLEAST8 __UINT_LEAST8_FMTo__ +#define PRIoLEAST16 __UINT_LEAST16_FMTo__ +#define PRIoLEAST32 __UINT_LEAST32_FMTo__ +#define PRIoLEAST64 __UINT_LEAST64_FMTo__ +#define PRIoFAST8 __UINT_FAST8_FMTo__ +#define PRIoFAST16 __UINT_FAST16_FMTo__ +#define PRIoFAST32 __UINT_FAST32_FMTo__ +#define PRIoFAST64 __UINT_FAST64_FMTo__ +#define PRIoMAX __UINTMAX_FMTo__ +#define PRIoPTR __UINTPTR_FMTo__ + +#define PRIu8 __UINT8_FMTu__ +#define PRIu16 __UINT16_FMTu__ +#define PRIu32 __UINT32_FMTu__ +#define PRIu64 __UINT64_FMTu__ +#define PRIuLEAST8 __UINT_LEAST8_FMTu__ +#define PRIuLEAST16 __UINT_LEAST16_FMTu__ +#define PRIuLEAST32 __UINT_LEAST32_FMTu__ +#define PRIuLEAST64 __UINT_LEAST64_FMTu__ +#define PRIuFAST8 __UINT_FAST8_FMTu__ +#define PRIuFAST16 __UINT_FAST16_FMTu__ +#define PRIuFAST32 __UINT_FAST32_FMTu__ +#define PRIuFAST64 __UINT_FAST64_FMTu__ +#define PRIuMAX __UINTMAX_FMTu__ +#define PRIuPTR __UINTPTR_FMTu__ + +#define PRIx8 __UINT8_FMTx__ +#define PRIx16 __UINT16_FMTx__ +#define PRIx32 __UINT32_FMTx__ +#define PRIx64 __UINT64_FMTx__ +#define PRIxLEAST8 __UINT_LEAST8_FMTx__ +#define PRIxLEAST16 __UINT_LEAST16_FMTx__ +#define PRIxLEAST32 __UINT_LEAST32_FMTx__ +#define PRIxLEAST64 __UINT_LEAST64_FMTx__ +#define PRIxFAST8 __UINT_FAST8_FMTx__ +#define PRIxFAST16 __UINT_FAST16_FMTx__ +#define PRIxFAST32 __UINT_FAST32_FMTx__ +#define PRIxFAST64 __UINT_FAST64_FMTx__ +#define PRIxMAX __UINTMAX_FMTx__ +#define PRIxPTR __UINTPTR_FMTx__ + +#define PRIX8 __UINT8_FMTX__ +#define PRIX16 __UINT16_FMTX__ +#define PRIX32 __UINT32_FMTX__ +#define PRIX64 __UINT64_FMTX__ +#define PRIXLEAST8 __UINT_LEAST8_FMTX__ +#define PRIXLEAST16 __UINT_LEAST16_FMTX__ +#define PRIXLEAST32 __UINT_LEAST32_FMTX__ +#define PRIXLEAST64 __UINT_LEAST64_FMTX__ +#define PRIXFAST8 __UINT_FAST8_FMTX__ +#define PRIXFAST16 __UINT_FAST16_FMTX__ +#define PRIXFAST32 __UINT_FAST32_FMTX__ +#define PRIXFAST64 __UINT_FAST64_FMTX__ +#define PRIXMAX __UINTMAX_FMTX__ +#define PRIXPTR __UINTPTR_FMTX__ + +#define PRIb8 __UINT8_FMTb__ +#define PRIb16 __UINT16_FMTb__ +#define PRIb32 __UINT32_FMTb__ +#define PRIb64 __UINT64_FMTb__ +#define PRIbLEAST8 __UINT_LEAST8_FMTb__ +#define PRIbLEAST16 __UINT_LEAST16_FMTb__ +#define PRIbLEAST32 __UINT_LEAST32_FMTb__ +#define PRIbLEAST64 __UINT_LEAST64_FMTb__ +#define PRIbFAST8 __UINT_FAST8_FMTb__ +#define PRIbFAST16 __UINT_FAST16_FMTb__ +#define PRIbFAST32 __UINT_FAST32_FMTb__ +#define PRIbFAST64 __UINT_FAST64_FMTb__ +#define PRIbMAX __UINTMAX_FMTb__ +#define PRIbPTR __UINTPTR_FMTb__ + +#define PRIB8 __UINT8_FMTB__ +#define PRIB16 __UINT16_FMTB__ +#define PRIB32 __UINT32_FMTB__ +#define PRIB64 __UINT64_FMTB__ +#define PRIBLEAST8 __UINT_LEAST8_FMTB__ +#define PRIBLEAST16 __UINT_LEAST16_FMTB__ +#define PRIBLEAST32 __UINT_LEAST32_FMTB__ +#define PRIBLEAST64 __UINT_LEAST64_FMTB__ +#define PRIBFAST8 __UINT_FAST8_FMTB__ +#define PRIBFAST16 __UINT_FAST16_FMTB__ +#define PRIBFAST32 __UINT_FAST32_FMTB__ +#define PRIBFAST64 __UINT_FAST64_FMTB__ +#define PRIBMAX __UINTMAX_FMTB__ +#define PRIBPTR __UINTPTR_FMTB__ + +// The fscanf() macros for signed integers. +#define SCNd8 __INT8_FMTd__ +#define SCNd16 __INT16_FMTd__ +#define SCNd32 __INT32_FMTd__ +#define SCNd64 __INT64_FMTd__ +#define SCNdLEAST8 __INT_LEAST8_FMTd__ +#define SCNdLEAST16 __INT_LEAST16_FMTd__ +#define SCNdLEAST32 __INT_LEAST32_FMTd__ +#define SCNdLEAST64 __INT_LEAST64_FMTd__ +#define SCNdFAST8 __INT_FAST8_FMTd__ +#define SCNdFAST16 __INT_FAST16_FMTd__ +#define SCNdFAST32 __INT_FAST32_FMTd__ +#define SCNdFAST64 __INT_FAST64_FMTd__ +#define SCNdMAX __INTMAX_FMTd__ +#define SCNdPTR __INTPTR_FMTd__ + +#define SCNi8 __INT8_FMTi__ +#define SCNi16 __INT16_FMTi__ +#define SCNi32 __INT32_FMTi__ +#define SCNi64 __INT64_FMTi__ +#define SCNiLEAST8 __INT_LEAST8_FMTi__ +#define SCNiLEAST16 __INT_LEAST16_FMTi__ +#define SCNiLEAST32 __INT_LEAST32_FMTi__ +#define SCNiLEAST64 __INT_LEAST64_FMTi__ +#define SCNiFAST8 __INT_FAST8_FMTi__ +#define SCNiFAST16 __INT_FAST16_FMTi__ +#define SCNiFAST32 __INT_FAST32_FMTi__ +#define SCNiFAST64 __INT_FAST64_FMTi__ +#define SCNiMAX __INTMAX_FMTi__ +#define SCNiPTR __INTPTR_FMTi__ + +// The fscanf() macros for unsigned integers. +#define SCNo8 __UINT8_FMTo__ +#define SCNo16 __UINT16_FMTo__ +#define SCNo32 __UINT32_FMTo__ +#define SCNo64 __UINT64_FMTo__ +#define SCNoLEAST8 __UINT_LEAST8_FMTo__ +#define SCNoLEAST16 __UINT_LEAST16_FMTo__ +#define SCNoLEAST32 __UINT_LEAST32_FMTo__ +#define SCNoLEAST64 __UINT_LEAST64_FMTo__ +#define SCNoFAST8 __UINT_FAST8_FMTo__ +#define SCNoFAST16 __UINT_FAST16_FMTo__ +#define SCNoFAST32 __UINT_FAST32_FMTo__ +#define SCNoFAST64 __UINT_FAST64_FMTo__ +#define SCNoMAX __UINTMAX_FMTo__ +#define SCNoPTR __UINTPTR_FMTo__ + +#define SCNu8 __UINT8_FMTu__ +#define SCNu16 __UINT16_FMTu__ +#define SCNu32 __UINT32_FMTu__ +#define SCNu64 __UINT64_FMTu__ +#define SCNuLEAST8 __UINT_LEAST8_FMTu__ +#define SCNuLEAST16 __UINT_LEAST16_FMTu__ +#define SCNuLEAST32 __UINT_LEAST32_FMTu__ +#define SCNuLEAST64 __UINT_LEAST64_FMTu__ +#define SCNuFAST8 __UINT_FAST8_FMTu__ +#define SCNuFAST16 __UINT_FAST16_FMTu__ +#define SCNuFAST32 __UINT_FAST32_FMTu__ +#define SCNuFAST64 __UINT_FAST64_FMTu__ +#define SCNuMAX __UINTMAX_FMTu__ +#define SCNuPTR __UINTPTR_FMTu__ + +#define SCNx8 __UINT8_FMTx__ +#define SCNx16 __UINT16_FMTx__ +#define SCNx32 __UINT32_FMTx__ +#define SCNx64 __UINT64_FMTx__ +#define SCNxLEAST8 __UINT_LEAST8_FMTx__ +#define SCNxLEAST16 __UINT_LEAST16_FMTx__ +#define SCNxLEAST32 __UINT_LEAST32_FMTx__ +#define SCNxLEAST64 __UINT_LEAST64_FMTx__ +#define SCNxFAST8 __UINT_FAST8_FMTx__ +#define SCNxFAST16 __UINT_FAST16_FMTx__ +#define SCNxFAST32 __UINT_FAST32_FMTx__ +#define SCNxFAST64 __UINT_FAST64_FMTx__ +#define SCNxMAX __UINTMAX_FMTx__ +#define SCNxPTR __UINTPTR_FMTx__ + +#define SCNb8 __UINT8_FMTb__ +#define SCNb16 __UINT16_FMTb__ +#define SCNb32 __UINT32_FMTb__ +#define SCNb64 __UINT64_FMTb__ +#define SCNbLEAST8 __UINT_LEAST8_FMTb__ +#define SCNbLEAST16 __UINT_LEAST16_FMTb__ +#define SCNbLEAST32 __UINT_LEAST32_FMTb__ +#define SCNbLEAST64 __UINT_LEAST64_FMTb__ +#define SCNbFAST8 __UINT_FAST8_FMTb__ +#define SCNbFAST16 __UINT_FAST16_FMTb__ +#define SCNbFAST32 __UINT_FAST32_FMTb__ +#define SCNbFAST64 __UINT_FAST64_FMTb__ +#define SCNbMAX __UINTMAX_FMTb__ +#define SCNbPTR __UINTPTR_FMTb__ + +#endif // LLVM_LIBC_MACROS_INTTYPES_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/limits-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/limits-macros.h new file mode 100644 index 000000000000..79bbbe401eb0 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/limits-macros.h @@ -0,0 +1,246 @@ +//===-- Definition of macros from limits.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LIMITS_MACROS_H +#define LLVM_LIBC_MACROS_LIMITS_MACROS_H + +// Define all C23 macro constants of limits.h + +#ifndef CHAR_BIT +#ifdef __CHAR_BIT__ +#define CHAR_BIT __CHAR_BIT__ +#else +#define CHAR_BIT 8 +#endif // __CHAR_BIT__ +#endif // CHAR_BIT + +#ifndef MB_LEN_MAX +// Represents a single UTF-32 wide character in the default locale. +#define MB_LEN_MAX 4 +#endif // MB_LEN_MAX + +// *_WIDTH macros + +#ifndef CHAR_WIDTH +#define CHAR_WIDTH CHAR_BIT +#endif // CHAR_WIDTH + +#ifndef SCHAR_WIDTH +#define SCHAR_WIDTH CHAR_BIT +#endif // SCHAR_WIDTH + +#ifndef UCHAR_WIDTH +#define UCHAR_WIDTH CHAR_BIT +#endif // UCHAR_WIDTH + +#ifndef SHRT_WIDTH +#ifdef __SHRT_WIDTH__ +#define SHRT_WIDTH __SHRT_WIDTH__ +#else +#define SHRT_WIDTH 16 +#endif // __SHRT_WIDTH__ +#endif // SHRT_WIDTH + +#ifndef USHRT_WIDTH +#define USHRT_WIDTH SHRT_WIDTH +#endif // USHRT_WIDTH + +#ifndef INT_WIDTH +#ifdef __INT_WIDTH__ +#define INT_WIDTH __INT_WIDTH__ +#else +#define INT_WIDTH 32 +#endif // __INT_WIDTH__ +#endif // INT_WIDTH + +#ifndef UINT_WIDTH +#define UINT_WIDTH INT_WIDTH +#endif // UINT_WIDTH + +#ifndef LONG_WIDTH +#ifdef __LONG_WIDTH__ +#define LONG_WIDTH __LONG_WIDTH__ +#elif defined(__WORDSIZE) +#define LONG_WIDTH __WORDSIZE +#else +// Use __SIZEOF_LONG__ * CHAR_BIT as backup. This is needed for clang-13 or +// before. +#define LONG_WIDTH (__SIZEOF_LONG__ * CHAR_BIT) +#endif // __LONG_WIDTH__ +#endif // LONG_WIDTH + +#ifndef ULONG_WIDTH +#define ULONG_WIDTH LONG_WIDTH +#endif // ULONG_WIDTH + +#ifndef LLONG_WIDTH +#ifdef __LLONG_WIDTH__ +#define LLONG_WIDTH __LLONG_WIDTH__ +#else +#define LLONG_WIDTH 64 +#endif // __LLONG_WIDTH__ +#endif // LLONG_WIDTH + +#ifndef ULLONG_WIDTH +#define ULLONG_WIDTH LLONG_WIDTH +#endif // ULLONG_WIDTH + +#ifndef BOOL_WIDTH +#ifdef __BOOL_WIDTH__ +#define BOOL_WIDTH __BOOL_WIDTH__ +#else +#define BOOL_WIDTH 1 +#endif // __BOOL_WIDTH__ +#endif // BOOL_WIDTH + +// *_MAX macros + +#ifndef SCHAR_MAX +#ifdef __SCHAR_MAX__ +#define SCHAR_MAX __SCHAR_MAX__ +#else +#define SCHAR_MAX 0x7f +#endif // __SCHAR_MAX__ +#endif // SCHAR_MAX + +#ifndef UCHAR_MAX +#define UCHAR_MAX (SCHAR_MAX * 2 + 1) +#endif // UCHAR_MAX + +// Check if char is unsigned. +#if !defined(__CHAR_UNSIGNED__) && ('\xff' > 0) +#define __CHAR_UNSIGNED__ +#endif + +#ifndef CHAR_MAX +#ifdef __CHAR_UNSIGNED__ +#define CHAR_MAX UCHAR_MAX +#else +#define CHAR_MAX SCHAR_MAX +#endif // __CHAR_UNSIGNED__ +#endif // CHAR_MAX + +#ifndef SHRT_MAX +#ifdef __SHRT_MAX__ +#define SHRT_MAX __SHRT_MAX__ +#else +#define SHRT_MAX 0x7fff +#endif // __SHRT_MAX__ +#endif // SHRT_MAX + +#ifndef USHRT_MAX +#define USHRT_MAX (SHRT_MAX * 2U + 1U) +#endif // USHRT_MAX + +#ifndef INT_MAX +#ifdef __INT_MAX__ +#define INT_MAX __INT_MAX__ +#else +#define INT_MAX (0 ^ (1 << (INT_WIDTH - 1))) +#endif // __INT_MAX__ +#endif // INT_MAX + +#ifndef UINT_MAX +#define UINT_MAX (INT_MAX * 2U + 1U) +#endif // UINT_MAX + +#ifndef LONG_MAX +#ifdef __LONG_MAX__ +#define LONG_MAX __LONG_MAX__ +#else +#define LONG_MAX (0L ^ (1L << (LONG_WIDTH - 1))) +#endif // __LONG_MAX__ +#endif // LONG_MAX + +#ifndef ULONG_MAX +#define ULONG_MAX (LONG_MAX * 2UL + 1UL) +#endif // ULONG_MAX + +#ifndef LLONG_MAX +#ifdef __LONG_LONG_MAX__ +#define LLONG_MAX __LONG_LONG_MAX__ +#else +#define LLONG_MAX (0LL ^ (1LL << (LLONG_WIDTH - 1))) +#endif // __LONG_LONG_MAX__ +#endif // LLONG_MAX + +#ifndef ULLONG_MAX +#define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +#endif // ULLONG_MAX + +// *_MIN macros + +#ifndef SCHAR_MIN +#define SCHAR_MIN (-SCHAR_MAX - 1) +#endif // SCHAR_MIN + +#ifndef UCHAR_MIN +#define UCHAR_MIN 0 +#endif // UCHAR_MIN + +#ifndef CHAR_MIN +#ifdef __CHAR_UNSIGNED__ +#define CHAR_MIN UCHAR_MIN +#else +#define CHAR_MIN SCHAR_MIN +#endif // __CHAR_UNSIGNED__ +#endif // CHAR_MIN + +#ifndef SHRT_MIN +#define SHRT_MIN (-SHRT_MAX - 1) +#endif // SHRT_MIN + +#ifndef USHRT_MIN +#define USHRT_MIN 0U +#endif // USHRT_MIN + +#ifndef INT_MIN +#define INT_MIN (-INT_MAX - 1) +#endif // INT_MIN + +#ifndef UINT_MIN +#define UINT_MIN 0U +#endif // UINT_MIN + +#ifndef LONG_MIN +#define LONG_MIN (-LONG_MAX - 1L) +#endif // LONG_MIN + +#ifndef ULONG_MIN +#define ULONG_MIN 0UL +#endif // ULONG_MIN + +#ifndef LLONG_MIN +#define LLONG_MIN (-LLONG_MAX - 1LL) +#endif // LLONG_MIN + +#ifndef ULLONG_MIN +#define ULLONG_MIN 0ULL +#endif // ULLONG_MIN + +#ifndef _POSIX_MAX_CANON +#define _POSIX_MAX_CANON 255 +#endif + +#ifndef _POSIX_MAX_INPUT +#define _POSIX_MAX_INPUT 255 +#endif + +#ifndef _POSIX_NAME_MAX +#define _POSIX_PATH_MAX 256 +#endif + +#ifndef _POSIX_ARG_MAX +#define _POSIX_ARG_MAX 4096 +#endif + +#ifndef IOV_MAX +#define IOV_MAX 1024 +#endif // IOV_MAX + +#endif // LLVM_LIBC_MACROS_LIMITS_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/link-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/link-macros.h new file mode 100644 index 000000000000..89e7bb50aa55 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/link-macros.h @@ -0,0 +1,20 @@ +//===-- Definition of macros to for extra dynamic linker functionality ----===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINK_MACROS_H +#define LLVM_LIBC_MACROS_LINK_MACROS_H + +#include "elf-macros.h" + +#ifdef __LP64__ +#define ElfW(type) Elf64_##type +#else +#define ElfW(type) Elf32_##type +#endif + +#endif diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/error-number-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/error-number-macros.h new file mode 100644 index 000000000000..9a7304fa161a --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/error-number-macros.h @@ -0,0 +1,32 @@ +#ifndef LLVM_LIBC_MACROS_LINUX_ERROR_NUMBER_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_ERROR_NUMBER_MACROS_H + +#ifndef ECANCELED +#define ECANCELED 125 +#endif // ECANCELED + +#ifndef EOWNERDEAD +#define EOWNERDEAD 130 +#endif // EOWNERDEAD + +#ifndef ENOTRECOVERABLE +#define ENOTRECOVERABLE 131 +#endif // ENOTRECOVERABLE + +#ifndef ERFKILL +#define ERFKILL 132 +#endif // ERFKILL + +#ifndef EHWPOISON +#define EHWPOISON 133 +#endif // EHWPOISON + +#ifndef EOPNOTSUPP +#define EOPNOTSUPP 95 +#endif + +#ifndef ENOTSUP +#define ENOTSUP EOPNOTSUPP +#endif + +#endif // LLVM_LIBC_MACROS_LINUX_ERROR_NUMBER_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/fcntl-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/fcntl-macros.h new file mode 100644 index 000000000000..aec8a0d2da0b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/fcntl-macros.h @@ -0,0 +1,105 @@ +//===-- Definition of macros from fcntl.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_FCNTL_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_FCNTL_MACROS_H + +// File creation flags +#define O_CLOEXEC 02000000 +#define O_CREAT 00000100 +#define O_PATH 010000000 + +#ifdef __aarch64__ +#define O_DIRECTORY 040000 +#else +#define O_DIRECTORY 00200000 +#endif + +#define O_EXCL 00000200 +#define O_NOCTTY 00000400 + +#ifdef __aarch64__ +#define O_NOFOLLOW 0100000 +#else +#define O_NOFOLLOW 00400000 +#endif + +#define O_TRUNC 00001000 +#define O_TMPFILE (020000000 | O_DIRECTORY) + +// File status flags +#define O_APPEND 00002000 +#define O_DSYNC 00010000 +#define O_NONBLOCK 00004000 +#define O_SYNC 04000000 | O_DSYNC + +// File access mode mask +#define O_ACCMODE 00000003 + +// File access mode flags +#define O_RDONLY 00000000 +#define O_RDWR 00000002 +#define O_WRONLY 00000001 + +// Special directory FD to indicate that the path argument to +// openat is relative to the current directory. +#define AT_FDCWD -100 + +// Special flag to the function unlinkat to indicate that it +// has to perform the equivalent of "rmdir" on the path argument. +#define AT_REMOVEDIR 0x200 + +// Special flag for functions like lstat to convey that symlinks +// should not be followed. +#define AT_SYMLINK_NOFOLLOW 0x100 + +// Allow empty relative pathname. +#define AT_EMPTY_PATH 0x1000 + +// Values of SYS_fcntl commands. +#define F_DUPFD 0 +#define F_GETFD 1 +#define F_SETFD 2 +#define F_GETFL 3 +#define F_SETFL 4 +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 +#define F_SETOWN 8 +#define F_GETOWN 9 +#define F_SETSIG 10 +#define F_GETSIG 11 +#define F_GETLK64 12 +#define F_SETLK64 13 +#define F_SETLKW64 14 +#define F_SETOWN_EX 15 +#define F_GETOWN_EX 16 + +// Open File Description Locks. +#define F_OFD_GETLK 36 +#define F_OFD_SETLK 37 +#define F_OFD_SETLKW 38 + +// Close on succesful +#define F_CLOEXEC 1 + +// Close on execute for fcntl. +#define FD_CLOEXEC 1 + +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +// For Large File Support +#if defined(_LARGEFILE64_SOURCE) +#define F_GETLK F_GETLK64 +#define F_SETLK F_SETLK64 +#define F_SETLKW F_SETLKW64 +#endif + +#endif // LLVM_LIBC_MACROS_LINUX_FCNTL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/poll-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/poll-macros.h new file mode 100644 index 000000000000..d6724c5ee321 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/poll-macros.h @@ -0,0 +1,65 @@ +//===-- Macros defined in poll.h header file ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_POLL_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_POLL_MACROS_H + +// From asm-generic/poll.h, redefined here to avoid redeclaring struct pollfd. +#ifndef POLLIN +#define POLLIN 0x0001 +#endif + +#ifndef POLLPRI +#define POLLPRI 0x0002 +#endif + +#ifndef POLLOUT +#define POLLOUT 0x0004 +#endif + +#ifndef POLLERR +#define POLLERR 0x0008 +#endif + +#ifndef POLLHUP +#define POLLHUP 0x0010 +#endif + +#ifndef POLLNVAL +#define POLLNVAL 0x0020 +#endif + +#ifndef POLLRDNORM +#define POLLRDNORM 0x0040 +#endif + +#ifndef POLLRDBAND +#define POLLRDBAND 0x0080 +#endif + +#ifndef POLLWRNORM +#define POLLWRNORM 0x0100 +#endif + +#ifndef POLLWRBAND +#define POLLWRBAND 0x0200 +#endif + +#ifndef POLLMSG +#define POLLMSG 0x0400 +#endif + +#ifndef POLLREMOVE +#define POLLREMOVE 0x1000 +#endif + +#ifndef POLLRDHUP +#define POLLRDHUP 0x2000 +#endif + +#endif // LLVM_LIBC_MACROS_LINUX_POLL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sched-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sched-macros.h new file mode 100644 index 000000000000..597789bb4ce2 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sched-macros.h @@ -0,0 +1,37 @@ +//===-- Definition of macros from sched.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SCHED_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SCHED_MACROS_H + +// Definitions of SCHED_* macros must match was linux as at: +// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/sched.h + +// Posix required +#define SCHED_OTHER 0 +#define SCHED_FIFO 1 +#define SCHED_RR 2 + +// Linux extentions +#define SCHED_BATCH 3 +#define SCHED_ISO 4 // Not yet implemented, reserved. +#define SCHED_IDLE 5 +#define SCHED_DEADLINE 6 + +#define CPU_SETSIZE __CPU_SETSIZE +#define NCPUBITS __NCPUBITS +#define CPU_COUNT_S(setsize, set) __sched_getcpucount(setsize, set) +#define CPU_COUNT(set) CPU_COUNT_S(sizeof(cpu_set_t), set) +#define CPU_ZERO_S(setsize, set) __sched_setcpuzero(setsize, set) +#define CPU_ZERO(set) CPU_ZERO_S(sizeof(cpu_set_t), set) +#define CPU_SET_S(cpu, setsize, set) __sched_setcpuset(cpu, setsize, set) +#define CPU_SET(cpu, setsize, set) CPU_SET_S(cpu, sizeof(cpt_set_t), set) +#define CPU_ISSET_S(cpu, setsize, set) __sched_getcpuisset(cpu, setsize, set) +#define CPU_ISSET(cpu, setsize, set) CPU_ISSET_S(cpu, sizeof(cpt_set_t), set) + +#endif // LLVM_LIBC_MACROS_LINUX_SCHED_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/signal-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/signal-macros.h new file mode 100644 index 000000000000..d220241a3820 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/signal-macros.h @@ -0,0 +1,101 @@ +//===-- Definition of Linux signal number macros --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SIGNAL_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SIGNAL_MACROS_H + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +#define SIGPWR 30 +#define SIGSYS 31 + +// Max signal number +#define NSIG 64 + +// SIGRTMIN is current set to the minimum usable from user mode programs. If +// the libc itself uses some of these signal numbers for private operations, +// then it has to be adjusted in future to reflect that. +#define SIGRTMIN 32 + +#define SIGRTMAX NSIG + +// The kernel sigset is stored as an array of long values. Each bit of this +// array corresponds to a signal, adjusted by 1. That is, bit 0 corresponds +// to signal number 1, bit 1 corresponds to signal number 2 and so on. The +// below macro denotes the size of that array (in number of long words and +// not bytes). +#define __NSIGSET_WORDS (NSIG / (sizeof(unsigned long) * 8)) + +#define SIG_BLOCK 0 // For blocking signals +#define SIG_UNBLOCK 1 // For unblocking signals +#define SIG_SETMASK 2 // For setting signal mask + +// Flag values to be used for setting sigaction.sa_flags. +#define SA_NOCLDSTOP 0x00000001 +#define SA_NOCLDWAIT 0x00000002 +#define SA_SIGINFO 0x00000004 +#define SA_RESTART 0x10000000 +#define SA_RESTORER 0x04000000 +#define SA_ONSTACK 0x08000000 + +// Signal stack flags +#define SS_ONSTACK 0x1 +#define SS_DISABLE 0x2 + +#if defined(__x86_64__) || defined(__i386__) || defined(__riscv) +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 +#elif defined(__aarch64__) +#define MINSIGSTKSZ 5120 +#define SIGSTKSZ 16384 +#else +#error "Signal stack sizes not defined for your platform." +#endif + +#define SIG_DFL ((void (*)(int))0) +#define SIG_IGN ((void (*)(int))1) +#define SIG_ERR ((void (*)(int))(-1)) + +// SIGCHLD si_codes +#define CLD_EXITED 1 // child has exited +#define CLD_KILLED 2 // child was killed +#define CLD_DUMPED 3 // child terminated abnormally +#define CLD_TRAPPED 4 // traced child has trapped +#define CLD_STOPPED 5 // child has stopped +#define CLD_CONTINUED 6 // stopped child has continued + +#endif // LLVM_LIBC_MACROS_LINUX_SIGNAL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h new file mode 100644 index 000000000000..f73d690908fd --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h @@ -0,0 +1,40 @@ +//===-- Macros defined in sys/epoll.h header file -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_EPOLL_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_EPOLL_MACROS_H + +#include "fcntl-macros.h" + +// These are also defined in <linux/eventpoll.h> but that also contains a +// different definition of the epoll_event struct that is different from the +// userspace version. + +#define EPOLL_CLOEXEC O_CLOEXEC + +#define EPOLL_CTL_ADD 1 +#define EPOLL_CTL_DEL 2 +#define EPOLL_CTL_MOD 3 + +#define EPOLLIN 0x1 +#define EPOLLPRI 0x2 +#define EPOLLOUT 0x4 +#define EPOLLERR 0x8 +#define EPOLLHUP 0x10 +#define EPOLLRDNORM 0x40 +#define EPOLLRDBAND 0x80 +#define EPOLLWRNORM 0x100 +#define EPOLLWRBAND 0x200 +#define EPOLLMSG 0x400 +#define EPOLLRDHUP 0x2000 +#define EPOLLEXCLUSIVE 0x10000000 +#define EPOLLWAKEUP 0x20000000 +#define EPOLLONESHOT 0x40000000 +#define EPOLLET 0x80000000 + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_EPOLL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-ioctl-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-ioctl-macros.h new file mode 100644 index 000000000000..41226080084c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-ioctl-macros.h @@ -0,0 +1,20 @@ +//===-- Definition of macros from sys/ioctl.h -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_IOCTL_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_IOCTL_MACROS_H + +// TODO (michaelrj): Finish defining these macros. +// Just defining this macro for the moment since it's all that we need right +// now. The other macros are mostly just constants, but there's some complexity +// around the definitions of macros like _IO, _IOR, _IOW, and _IOWR that I don't +// think is worth digging into right now. +#define TIOCGETD 0x5424 +#define FIONREAD 0x541B + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_IOCTL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-random-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-random-macros.h new file mode 100644 index 000000000000..9261e87bdbf6 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-random-macros.h @@ -0,0 +1,17 @@ +//===-- Definition of macros from sys/random.h ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_RANDOM_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_RANDOM_MACROS_H + +// Getrandom flags +#define GRND_RANDOM 0x0001 +#define GRND_NONBLOCK 0x0002 +#define GRND_INSECURE 0x0004 + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_RANDOM_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-resource-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-resource-macros.h new file mode 100644 index 000000000000..c9d93c30c35a --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-resource-macros.h @@ -0,0 +1,31 @@ +//===-- Macros defined in sys/resource.h header file ----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_RESOURCE_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_RESOURCE_MACROS_H + +#define RLIMIT_CPU 0 +#define RLIMIT_FSIZE 1 +#define RLIMIT_DATA 2 +#define RLIMIT_STACK 3 +#define RLIMIT_CORE 4 +#define RLIMIT_RSS 5 +#define RLIMIT_NPROC 6 +#define RLIMIT_NOFILE 7 +#define RLIMIT_MEMLOCK 8 +#define RLIMIT_AS 9 +#define RLIMIT_LOCKS 10 +#define RLIMIT_SIGPENDING 11 +#define RLIMIT_MSGQUEUE 12 +#define RLIMIT_NICE 13 +#define RLIMIT_RTPRIO 14 +#define RLIMIT_RTTIME 15 + +#define RLIM_INFINITY (~0UL) + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_RESOURCE_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-socket-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-socket-macros.h new file mode 100644 index 000000000000..f335200a103b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-socket-macros.h @@ -0,0 +1,28 @@ +//===-- Definition of macros from sys/socket.h ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_SOCKET_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_SOCKET_MACROS_H + +// IEEE Std 1003.1-2017 - basedefs/sys_socket.h.html +// Macro values come from the Linux syscall interface. + +#define AF_UNSPEC 0 // Unspecified +#define AF_UNIX 1 // Unix domain sockets +#define AF_LOCAL 1 // POSIX name for AF_UNIX +#define AF_INET 2 // Internet IPv4 Protocol +#define AF_INET6 10 // IP version 6 + +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 +#define SOCK_RDM 4 +#define SOCK_SEQPACKET 5 +#define SOCK_PACKET 10 + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_SOCKET_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-stat-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-stat-macros.h new file mode 100644 index 000000000000..3013121d0f3c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-stat-macros.h @@ -0,0 +1,48 @@ +//===-- Definition of macros from sys/stat.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_STAT_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_STAT_MACROS_H + +// Definitions from linux/stat.h +#define S_IFMT 0170000 +#define S_IFSOCK 0140000 +#define S_IFLNK 0120000 +#define S_IFREG 0100000 +#define S_IFBLK 0060000 +#define S_IFDIR 0040000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_ISUID 0004000 +#define S_ISGID 0002000 +#define S_ISVTX 0001000 + +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) + +#define S_IRWXU 00700 +#define S_IRUSR 00400 +#define S_IWUSR 00200 +#define S_IXUSR 00100 + +#define S_IRWXG 00070 +#define S_IRGRP 00040 +#define S_IWGRP 00020 +#define S_IXGRP 00010 + +#define S_IRWXO 00007 +#define S_IROTH 00004 +#define S_IWOTH 00002 +#define S_IXOTH 00001 + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_STAT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-time-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-time-macros.h new file mode 100644 index 000000000000..e97819594adc --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-time-macros.h @@ -0,0 +1,53 @@ +//===-- Definition of macros from sys/time.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_TIME_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_TIME_MACROS_H + +// Add two timevals and put the result in timeval_ptr_result. If the resulting +// usec value is greater than 999,999 then the microseconds are turned into full +// seconds (1,000,000 is subtracted from usec and 1 is added to sec). +#define timeradd(timeval_ptr_a, timeval_ptr_b, timeval_ptr_result) \ + (timeval_ptr_result)->tv_sec = \ + (timeval_ptr_a)->tv_sec + (timeval_ptr_b)->tv_sec + \ + (((timeval_ptr_a)->tv_usec + (timeval_ptr_b)->tv_usec) >= 1000000 ? 1 \ + : 0); \ + (timeval_ptr_result)->tv_usec = \ + (timeval_ptr_a)->tv_usec + (timeval_ptr_b)->tv_usec - \ + (((timeval_ptr_a)->tv_usec + (timeval_ptr_b)->tv_usec) >= 1000000 \ + ? 1000000 \ + : 0); + +// Subtract two timevals and put the result in timeval_ptr_result. If the +// resulting usec value is less than 0 then 1,000,000 is added to usec and 1 is +// subtracted from sec. +#define timersub(timeval_ptr_a, timeval_ptr_b, timeval_ptr_result) \ + (timeval_ptr_result)->tv_sec = \ + (timeval_ptr_a)->tv_sec - (timeval_ptr_b)->tv_sec - \ + (((timeval_ptr_a)->tv_usec - (timeval_ptr_b)->tv_usec) < 0 ? 1 : 0); \ + (timeval_ptr_result)->tv_usec = \ + (timeval_ptr_a)->tv_usec - (timeval_ptr_b)->tv_usec + \ + (((timeval_ptr_a)->tv_usec - (timeval_ptr_b)->tv_usec) < 0 ? 1000000 \ + : 0); + +// Reset a timeval to the epoch. +#define timerclear(timeval_ptr) \ + (timeval_ptr)->tv_sec = 0; \ + (timeval_ptr)->tv_usec = 0; + +// Determine if a timeval is set to the epoch. +#define timerisset(timeval_ptr) \ + (timeval_ptr)->tv_sec != 0 || (timeval_ptr)->tv_usec != 0; + +// Compare two timevals using CMP. +#define timercmp(timeval_ptr_a, timeval_ptr_b, CMP) \ + (((timeval_ptr_a)->tv_sec == (timeval_ptr_b)->tv_sec) \ + ? ((timeval_ptr_a)->tv_usec CMP(timeval_ptr_b)->tv_usec) \ + : ((timeval_ptr_a)->tv_sec CMP(timeval_ptr_b)->tv_sec)) + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_TIME_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-wait-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-wait-macros.h new file mode 100644 index 000000000000..d01cfa71ba39 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/sys-wait-macros.h @@ -0,0 +1,27 @@ +//===-- Definition of macros from sys/wait.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_SYS_WAIT_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_SYS_WAIT_MACROS_H + +#include <linux/wait.h> + +#define WCOREDUMP(status) ((status) & WCOREFLAG) +#define WEXITSTATUS(status) (((status) & 0xff00) >> 8) +#define WIFCONTINUED(status) ((status) == 0xffff) +#define WIFEXITED(status) (WTERMSIG(status) == 0) +#define WIFSIGNALED(status) ((WTERMSIG(status) + 1) >= 2) +#define WIFSTOPPED(status) (WTERMSIG(status) == 0x7f) +#define WSTOPSIG(status) WEXITSTATUS(status) +#define WTERMSIG(status) ((status) & 0x7f) + +#define WCOREFLAG 0x80 +#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig)) +#define W_STOPCODE(sig) ((sig) << 8 | 0x7f) + +#endif // LLVM_LIBC_MACROS_LINUX_SYS_WAIT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/termios-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/termios-macros.h new file mode 100644 index 000000000000..668cfe27abaa --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/termios-macros.h @@ -0,0 +1,167 @@ +//===-- Definition of macros from termios.h -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_TERMIOS_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_TERMIOS_MACROS_H + +// Below are generic definitions of symbolic bit-masks, modes etc. They serve +// most architectures including x86_64, aarch64 but have to be adjusted for few +// architectures MIPS. + +#define NCCS 32 + +// Bit-masks for the c_iflag field of struct termios. +#define IGNBRK 0000001 // Ignore break condition +#define BRKINT 0000002 // Signal interrupt on break +#define IGNPAR 0000004 // Ignore characters with parity errors +#define PARMRK 0000010 // Mark parity and framing errors +#define INPCK 0000020 // Enable input parity check +#define ISTRIP 0000040 // Strip 8th bit off characters +#define INLCR 0000100 // Map NL to CR on input +#define IGNCR 0000200 // Ignore CR +#define ICRNL 0000400 // Map CR to NL on input +#define IUCLC 0001000 // Map uppercase characters to lowercase on input +#define IXON 0002000 // Enable start/stop output control +#define IXANY 0004000 // Enable any character to restart output +#define IXOFF 0010000 // Enable start/stop input control +#define IMAXBEL 0020000 // Ring bell when input queue is full +#define IUTF8 0040000 // Input is UTF8 (not in POSIX) + +// Bit-masks for the c_oflag field of struct termios. +#define OPOST 0000001 // Post-process output +#define OLCUC 0000002 // Map lowercase characters to uppercase on output +#define ONLCR 0000004 // Map NL to CR-NL on output +#define OCRNL 0000010 // Map CR to NL on output +#define ONOCR 0000020 // No CR output at column 0 +#define ONLRET 0000040 // NL performs CR function +#define OFILL 0000100 // Use fill characters for delay +#define OFDEL 0000200 // Fill is DEL +#define NLDLY 0000400 // Select newline delays +#define NL0 0000000 // Newline type 0 +#define NL1 0000400 // Newline type 1 +#define CRDLY 0003000 // Select carriage-return delays +#define CR0 0000000 // Carriage-return delay type 0 +#define CR1 0001000 // Carriage-return delay type 1 +#define CR2 0002000 // Carriage-return delay type 2 +#define CR3 0003000 // Carriage-return delay type 3 +#define TABDLY 0014000 // Select horizontal-tab delays +#define TAB0 0000000 // Horizontal-tab delay type 0 +#define TAB1 0004000 // Horizontal-tab delay type 1 +#define TAB2 0010000 // Horizontal-tab delay type 2 +#define TAB3 0014000 // Expand tabs to spaces +#define BSDLY 0020000 // Select backspace delays +#define BS0 0000000 // Backspace-delay type 0 +#define BS1 0020000 // Backspace-delay type 1 +#define FFDLY 0100000 // Select form-feed delays +#define FF0 0000000 // Form-feed delay type 0 +#define FF1 0100000 // Form-feed delay type 1 +#define VTDLY 0040000 // Select vertical-tab delays +#define VT0 0000000 // Vertical-tab delay type 0 +#define VT1 0040000 // Vertical-tab delay type 1 +#define XTABS 0014000 + +// Symbolic subscripts for the c_cc array. +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VTIME 5 +#define VMIN 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VEOL 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOL2 16 + +// Baud rate related definitions +#define CBAUD 000000010017 // Baud speed mask +#define CBAUDX 000000010000 // Extra baud speed mask +#define CIBAUD 002003600000 +#define CMSPAR 010000000000 +#define CRTSCTS 020000000000 +// Baud rates with values representable by the speed_t type. +#define B0 0000000 // Implies hang-up +// A symbol B<NN+> below indicates a baud rate of <NN+>. +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 +// Extra baud rates +#define B57600 0010001 +#define B115200 0010002 +#define B230400 0010003 +#define B460800 0010004 +#define B500000 0010005 +#define B576000 0010006 +#define B921600 0010007 +#define B1000000 0010010 +#define B1152000 0010011 +#define B1500000 0010012 +#define B2000000 0010013 +#define B2500000 0010014 +#define B3000000 0010015 +#define B3500000 0010016 +#define B4000000 0010017 + +// Control mode bits for use in the c_cflag field of struct termios. +#define CSIZE 0000060 // Mask for character size bits +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 // Send two bits, else one +#define CREAD 0000200 // Enable receiver +#define PARENB 0000400 // Parity enable +#define PARODD 0001000 // Odd parity, else even +#define HUPCL 0002000 // Hang up on last close +#define CLOCAL 0004000 // Ignore modem status lines + +// Local mode bits for use in the c_lflag field of struct termios. +#define ISIG 0000001 // Enable signals +#define ICANON 0000002 // Canonical input (erase and kill processing) +#define ECHO 0000010 // Enable echo +#define ECHOE 0000020 // Echo erase character as error-correcting backspace +#define ECHOK 0000040 // Echo KILL +#define ECHONL 0000100 // Echo NL +#define NOFLSH 0000200 // Disable flush after interrupt or quit +#define TOSTOP 0000400 // Send SIGTTOU for background output + +// Attribute selection +#define TCSANOW 0 // Change attributes immediately +#define TCSADRAIN 1 // Change attributes when output has drained +#define TCSAFLUSH 2 // Same as TCSADRAIN and flush pending Output + +// Symbolic constants for use with tcflush function. +#define TCIFLUSH 0 // Flush pending input +#define TCIOFLUSH 1 // Flush pending input and unstransmitted output +#define TCOFLUSH 2 // Flush unstransmitted output + +// Symbolic constantf for use with tcflow function. +#define TCOOFF 0 // Transmit a STOP character, intended to suspend input data +#define TCOON 1 // Transmit a START character, intended to restart input data +#define TCIOFF 2 // Suspend output +#define TCION 3 // Restart output + +#endif // LLVM_LIBC_MACROS_LINUX_TERMIOS_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/time-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/time-macros.h new file mode 100644 index 000000000000..407a1eb30eea --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/time-macros.h @@ -0,0 +1,26 @@ +//===-- Definition of macros from time.h ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_TIME_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_TIME_MACROS_H + +// clock type macros +#define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 1 +#define CLOCK_PROCESS_CPUTIME_ID 2 +#define CLOCK_THREAD_CPUTIME_ID 3 +#define CLOCK_MONOTONIC_RAW 4 +#define CLOCK_REALTIME_COARSE 5 +#define CLOCK_MONOTONIC_COARSE 6 +#define CLOCK_BOOTTIME 7 +#define CLOCK_REALTIME_ALARM 8 +#define CLOCK_BOOTTIME_ALARM 9 + +#define CLOCKS_PER_SEC 1000000 + +#endif // LLVM_LIBC_MACROS_LINUX_TIME_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/linux/unistd-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/unistd-macros.h new file mode 100644 index 000000000000..a4c8e3cd91f7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/linux/unistd-macros.h @@ -0,0 +1,57 @@ +//===-- Definition of macros from unistd.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LINUX_UNISTD_MACROS_H +#define LLVM_LIBC_MACROS_LINUX_UNISTD_MACROS_H + +// Values for mode argument to the access(...) function. +#define F_OK 0 +#define X_OK 1 +#define W_OK 2 +#define R_OK 4 + +#define _SC_PAGESIZE 1 +#define _SC_PAGE_SIZE _SC_PAGESIZE + +#define _PC_FILESIZEBITS 0 +#define _PC_LINK_MAX 1 +#define _PC_MAX_CANON 2 +#define _PC_MAX_INPUT 3 +#define _PC_NAME_MAX 4 +#define _PC_PATH_MAX 5 +#define _PC_PIPE_BUF 6 +#define _PC_2_SYMLINKS 7 +#define _PC_ALLOC_SIZE_MIN 8 +#define _PC_REC_INCR_XFER_SIZE 9 +#define _PC_REC_MAX_XFER_SIZE 10 +#define _PC_REC_MIN_XFER_SIZE 11 +#define _PC_REC_XFER_ALIGN 12 +#define _PC_SYMLINK_MAX 13 +#define _PC_CHOWN_RESTRICTED 14 +#define _PC_NO_TRUNC 15 +#define _PC_VDISABLE 16 +#define _PC_ASYNC_IO 17 +#define _PC_PRIO_IO 18 +#define _PC_SYNC_IO 19 + +// TODO: Move these limit macros to a separate file +#define _POSIX_CHOWN_RESTRICTED 1 +#define _POSIX_PIPE_BUF 512 +#define _POSIX_NO_TRUNC 1 +#define _POSIX_VDISABLE '\0' + +// Macro to set up the call to the __llvm_libc_syscall function +// This is to prevent the call from having fewer than 6 arguments, since six +// arguments are always passed to the syscall. Unnecessary arguments are +// ignored. +#define __syscall_helper(sysno, arg1, arg2, arg3, arg4, arg5, arg6, ...) \ + __llvm_libc_syscall((long)(sysno), (long)(arg1), (long)(arg2), (long)(arg3), \ + (long)(arg4), (long)(arg5), (long)(arg6)) +#define syscall(...) __syscall_helper(__VA_ARGS__, 0, 1, 2, 3, 4, 5, 6) + +#endif // LLVM_LIBC_MACROS_LINUX_UNISTD_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/locale-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/locale-macros.h new file mode 100644 index 000000000000..892f8b69f3a7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/locale-macros.h @@ -0,0 +1,32 @@ +//===-- Definition of macros from locale.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_LOCALE_MACROS_H +#define LLVM_LIBC_MACROS_LOCALE_MACROS_H + +#include "../llvm-libc-types/locale_t.h" + +#define LC_CTYPE 0 +#define LC_NUMERIC 1 +#define LC_TIME 2 +#define LC_COLLATE 3 +#define LC_MONETARY 4 +#define LC_MESSAGES 5 +#define LC_ALL 6 + +#define LC_GLOBAL_LOCALE ((locale_t)(-1)) + +#define LC_CTYPE_MASK (1 << LC_CTYPE) +#define LC_NUMERIC_MASK (1 << LC_NUMERIC) +#define LC_TIME_MASK (1 << LC_TIME) +#define LC_COLLATE_MASK (1 << LC_COLLATE) +#define LC_MONETARY_MASK (1 << LC_MONETARY) +#define LC_MESSAGES_MASK (1 << LC_MESSAGES) +#define LC_ALL_MASK 0x7fffffff + +#endif // LLVM_LIBC_MACROS_LOCALE_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/malloc-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/malloc-macros.h new file mode 100644 index 000000000000..65eddfc5e86d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/malloc-macros.h @@ -0,0 +1,17 @@ +//===-- Definition of macros to be used with malloc functions -------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_MALLOC_MACROS_H +#define LLVM_LIBC_MACROS_MALLOC_MACROS_H + +// Note: these values only make sense when Scudo is used as the memory +// allocator. +#define M_PURGE (-101) +#define M_PURGE_ALL (-104) + +#endif // LLVM_LIBC_MACROS_MALLOC_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/math-function-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/math-function-macros.h new file mode 100644 index 000000000000..21d09f1f5e1a --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/math-function-macros.h @@ -0,0 +1,37 @@ +//===-- Definition of function macros from math.h -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_MATH_FUNCTION_MACROS_H +#define LLVM_LIBC_MACROS_MATH_FUNCTION_MACROS_H + +#include "math-macros.h" + +#ifndef __cplusplus +#define issignaling(x) \ + _Generic((x), \ + float: issignalingf, \ + double: issignaling, \ + long double: issignalingl)(x) +#define iscanonical(x) \ + _Generic((x), \ + float: iscanonicalf, \ + double: iscanonical, \ + long double: iscanonicall)(x) +#endif + +#define isfinite(x) __builtin_isfinite(x) +#define isinf(x) __builtin_isinf(x) +#define isnan(x) __builtin_isnan(x) +#define signbit(x) __builtin_signbit(x) +#define iszero(x) (x == 0) +#define fpclassify(x) \ + __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x) +#define isnormal(x) __builtin_isnormal(x) +#define issubnormal(x) (fpclassify(x) == FP_SUBNORMAL) + +#endif // LLVM_LIBC_MACROS_MATH_FUNCTION_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/math-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/math-macros.h new file mode 100644 index 000000000000..2f05d7544666 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/math-macros.h @@ -0,0 +1,53 @@ +//===-- Definition of macros from math.h ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_MATH_MACROS_H +#define LLVM_LIBC_MACROS_MATH_MACROS_H + +#include "limits-macros.h" + +#define FP_NAN 0 +#define FP_INFINITE 1 +#define FP_ZERO 2 +#define FP_SUBNORMAL 3 +#define FP_NORMAL 4 + +#define FP_INT_UPWARD 0 +#define FP_INT_DOWNWARD 1 +#define FP_INT_TOWARDZERO 2 +#define FP_INT_TONEARESTFROMZERO 3 +#define FP_INT_TONEAREST 4 + +#define MATH_ERRNO 1 +#define MATH_ERREXCEPT 2 + +#define HUGE_VAL __builtin_huge_val() +#define HUGE_VALF __builtin_huge_valf() +#define INFINITY __builtin_inff() +#define NAN __builtin_nanf("") + +#define FP_ILOGB0 (-INT_MAX - 1) +#define FP_LLOGB0 (-LONG_MAX - 1) + +#ifdef __FP_LOGBNAN_MIN +#define FP_ILOGBNAN (-INT_MAX - 1) +#define FP_LLOGBNAN (-LONG_MAX - 1) +#else +#define FP_ILOGBNAN INT_MAX +#define FP_LLOGBNAN LONG_MAX +#endif + +#if defined(__NVPTX__) || defined(__AMDGPU__) || defined(__FAST_MATH__) +#define math_errhandling 0 +#elif defined(__NO_MATH_ERRNO__) +#define math_errhandling (MATH_ERREXCEPT) +#else +#define math_errhandling (MATH_ERRNO | MATH_ERREXCEPT) +#endif + +#endif // LLVM_LIBC_MACROS_MATH_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/null-macro.h b/contrib/llvm-project/libc/include/llvm-libc-macros/null-macro.h new file mode 100644 index 000000000000..416d4e865fc5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/null-macro.h @@ -0,0 +1,15 @@ +//===-- Definition of the NULL macro --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_NULL_MACRO_H +#define LLVM_LIBC_MACROS_NULL_MACRO_H + +#define __need_NULL +#include <stddef.h> + +#endif // LLVM_LIBC_MACROS_NULL_MACRO_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/offsetof-macro.h b/contrib/llvm-project/libc/include/llvm-libc-macros/offsetof-macro.h new file mode 100644 index 000000000000..208c06b29cb6 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/offsetof-macro.h @@ -0,0 +1,15 @@ +//===-- Definition of the offsetof macro ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_OFFSETOF_MACRO_H +#define LLVM_LIBC_MACROS_OFFSETOF_MACRO_H + +#define __need_offsetof +#include <stddef.h> + +#endif // LLVM_LIBC_MACROS_OFFSETOF_MACRO_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/poll-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/poll-macros.h new file mode 100644 index 000000000000..52b59a978a21 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/poll-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in poll.h header file ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_POLL_MACROS_H +#define LLVM_LIBC_MACROS_POLL_MACROS_H + +#ifdef __linux__ +#include "linux/poll-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_POLL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/pthread-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/pthread-macros.h new file mode 100644 index 000000000000..fcc6ef925e3f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/pthread-macros.h @@ -0,0 +1,65 @@ +//===-- Definition of pthread macros --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_PTHREAD_MACRO_H +#define LLVM_LIBC_MACROS_PTHREAD_MACRO_H + +#include "null-macro.h" + +#define PTHREAD_CREATE_JOINABLE 0 +#define PTHREAD_CREATE_DETACHED 1 + +#define PTHREAD_MUTEX_NORMAL 0 +#define PTHREAD_MUTEX_ERRORCHECK 1 +#define PTHREAD_MUTEX_RECURSIVE 2 +#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL + +#define PTHREAD_MUTEX_STALLED 0 +#define PTHREAD_MUTEX_ROBUST 1 + +#define PTHREAD_ONCE_INIT {0} + +#define PTHREAD_PROCESS_PRIVATE 0 +#define PTHREAD_PROCESS_SHARED 1 + +#ifdef __linux__ +#define PTHREAD_MUTEX_INITIALIZER \ + { \ + /* .__timed = */ 0, /* .__recursive = */ 0, \ + /* .__robust = */ 0, /* .__owner = */ NULL, \ + /* .__lock_count = */ 0, /* .__futex_word = */ {0}, \ + } +#else +#define PTHREAD_MUTEX_INITIALIZER \ + { \ + /* .__timed = */ 0, /* .__recursive = */ 0, \ + /* .__robust = */ 0, /* .__owner = */ NULL, \ + /* .__lock_count = */ 0, \ + } +#endif + +#define PTHREAD_RWLOCK_INITIALIZER \ + { \ + /* .__is_pshared = */ 0, \ + /* .__preference = */ 0, \ + /* .__state = */ 0, \ + /* .__write_tid = */ 0, \ + /* .__wait_queue_mutex = */ {0}, \ + /* .__pending_readers = */ {0}, \ + /* .__pending_writers = */ {0}, \ + /* .__reader_serialization = */ {0}, \ + /* .__writer_serialization = */ {0}, \ + } + +// glibc extensions +#define PTHREAD_STACK_MIN (1 << 14) // 16KB +#define PTHREAD_RWLOCK_PREFER_READER_NP 0 +#define PTHREAD_RWLOCK_PREFER_WRITER_NP 1 +#define PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 2 + +#endif // LLVM_LIBC_MACROS_PTHREAD_MACRO_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sched-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sched-macros.h new file mode 100644 index 000000000000..0f643029816c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sched-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sched.h header file -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SCHED_MACROS_H +#define LLVM_LIBC_MACROS_SCHED_MACROS_H + +#ifdef __linux__ +#include "linux/sched-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SCHED_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/signal-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/signal-macros.h new file mode 100644 index 000000000000..fbe929a0fea2 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/signal-macros.h @@ -0,0 +1,18 @@ +//===-- Definition of signal number macros --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SIGNAL_MACROS_H +#define LLVM_LIBC_MACROS_SIGNAL_MACROS_H + +#if defined(__linux__) +#include "linux/signal-macros.h" +#elif defined(__NVPTX__) || defined(__AMDGPU__) +#include "gpu/signal-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SIGNAL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/stdbit-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/stdbit-macros.h new file mode 100644 index 000000000000..c5b2f0977834 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/stdbit-macros.h @@ -0,0 +1,316 @@ +//===-- Definition of macros to be used with stdbit functions ----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __LLVM_LIBC_MACROS_STDBIT_MACROS_H +#define __LLVM_LIBC_MACROS_STDBIT_MACROS_H + +#define __STDC_VERSION_STDBIT_H__ 202311L +#define __STDC_ENDIAN_LITTLE__ __ORDER_LITTLE_ENDIAN__ +#define __STDC_ENDIAN_BIG__ __ORDER_BIG_ENDIAN__ +#define __STDC_ENDIAN_NATIVE__ __BYTE_ORDER__ + +// TODO(https://github.com/llvm/llvm-project/issues/80509): support _BitInt(). +#ifdef __cplusplus +inline unsigned stdc_leading_zeros(unsigned char x) { + return stdc_leading_zeros_uc(x); +} +inline unsigned stdc_leading_zeros(unsigned short x) { + return stdc_leading_zeros_us(x); +} +inline unsigned stdc_leading_zeros(unsigned x) { + return stdc_leading_zeros_ui(x); +} +inline unsigned stdc_leading_zeros(unsigned long x) { + return stdc_leading_zeros_ul(x); +} +inline unsigned stdc_leading_zeros(unsigned long long x) { + return stdc_leading_zeros_ull(x); +} +inline unsigned stdc_leading_ones(unsigned char x) { + return stdc_leading_ones_uc(x); +} +inline unsigned stdc_leading_ones(unsigned short x) { + return stdc_leading_ones_us(x); +} +inline unsigned stdc_leading_ones(unsigned x) { + return stdc_leading_ones_ui(x); +} +inline unsigned stdc_leading_ones(unsigned long x) { + return stdc_leading_ones_ul(x); +} +inline unsigned stdc_leading_ones(unsigned long long x) { + return stdc_leading_ones_ull(x); +} +inline unsigned stdc_trailing_zeros(unsigned char x) { + return stdc_trailing_zeros_uc(x); +} +inline unsigned stdc_trailing_zeros(unsigned short x) { + return stdc_trailing_zeros_us(x); +} +inline unsigned stdc_trailing_zeros(unsigned x) { + return stdc_trailing_zeros_ui(x); +} +inline unsigned stdc_trailing_zeros(unsigned long x) { + return stdc_trailing_zeros_ul(x); +} +inline unsigned stdc_trailing_zeros(unsigned long long x) { + return stdc_trailing_zeros_ull(x); +} +inline unsigned stdc_trailing_ones(unsigned char x) { + return stdc_trailing_ones_uc(x); +} +inline unsigned stdc_trailing_ones(unsigned short x) { + return stdc_trailing_ones_us(x); +} +inline unsigned stdc_trailing_ones(unsigned x) { + return stdc_trailing_ones_ui(x); +} +inline unsigned stdc_trailing_ones(unsigned long x) { + return stdc_trailing_ones_ul(x); +} +inline unsigned stdc_trailing_ones(unsigned long long x) { + return stdc_trailing_ones_ull(x); +} +inline unsigned stdc_first_leading_zero(unsigned char x) { + return stdc_first_leading_zero_uc(x); +} +inline unsigned stdc_first_leading_zero(unsigned short x) { + return stdc_first_leading_zero_us(x); +} +inline unsigned stdc_first_leading_zero(unsigned x) { + return stdc_first_leading_zero_ui(x); +} +inline unsigned stdc_first_leading_zero(unsigned long x) { + return stdc_first_leading_zero_ul(x); +} +inline unsigned stdc_first_leading_zero(unsigned long long x) { + return stdc_first_leading_zero_ull(x); +} +inline unsigned stdc_first_leading_one(unsigned char x) { + return stdc_first_leading_one_uc(x); +} +inline unsigned stdc_first_leading_one(unsigned short x) { + return stdc_first_leading_one_us(x); +} +inline unsigned stdc_first_leading_one(unsigned x) { + return stdc_first_leading_one_ui(x); +} +inline unsigned stdc_first_leading_one(unsigned long x) { + return stdc_first_leading_one_ul(x); +} +inline unsigned stdc_first_leading_one(unsigned long long x) { + return stdc_first_leading_one_ull(x); +} +inline unsigned stdc_first_trailing_zero(unsigned char x) { + return stdc_first_trailing_zero_uc(x); +} +inline unsigned stdc_first_trailing_zero(unsigned short x) { + return stdc_first_trailing_zero_us(x); +} +inline unsigned stdc_first_trailing_zero(unsigned x) { + return stdc_first_trailing_zero_ui(x); +} +inline unsigned stdc_first_trailing_zero(unsigned long x) { + return stdc_first_trailing_zero_ul(x); +} +inline unsigned stdc_first_trailing_zero(unsigned long long x) { + return stdc_first_trailing_zero_ull(x); +} +inline unsigned stdc_first_trailing_one(unsigned char x) { + return stdc_first_trailing_one_uc(x); +} +inline unsigned stdc_first_trailing_one(unsigned short x) { + return stdc_first_trailing_one_us(x); +} +inline unsigned stdc_first_trailing_one(unsigned x) { + return stdc_first_trailing_one_ui(x); +} +inline unsigned stdc_first_trailing_one(unsigned long x) { + return stdc_first_trailing_one_ul(x); +} +inline unsigned stdc_first_trailing_one(unsigned long long x) { + return stdc_first_trailing_one_ull(x); +} +inline unsigned stdc_count_zeros(unsigned char x) { + return stdc_count_zeros_uc(x); +} +inline unsigned stdc_count_zeros(unsigned short x) { + return stdc_count_zeros_us(x); +} +inline unsigned stdc_count_zeros(unsigned x) { return stdc_count_zeros_ui(x); } +inline unsigned stdc_count_zeros(unsigned long x) { + return stdc_count_zeros_ul(x); +} +inline unsigned stdc_count_zeros(unsigned long long x) { + return stdc_count_zeros_ull(x); +} +inline unsigned stdc_count_ones(unsigned char x) { + return stdc_count_ones_uc(x); +} +inline unsigned stdc_count_ones(unsigned short x) { + return stdc_count_ones_us(x); +} +inline unsigned stdc_count_ones(unsigned x) { return stdc_count_ones_ui(x); } +inline unsigned stdc_count_ones(unsigned long x) { + return stdc_count_ones_ul(x); +} +inline unsigned stdc_count_ones(unsigned long long x) { + return stdc_count_ones_ull(x); +} +inline bool stdc_has_single_bit(unsigned char x) { + return stdc_has_single_bit_uc(x); +} +inline bool stdc_has_single_bit(unsigned short x) { + return stdc_has_single_bit_us(x); +} +inline bool stdc_has_single_bit(unsigned x) { + return stdc_has_single_bit_ui(x); +} +inline bool stdc_has_single_bit(unsigned long x) { + return stdc_has_single_bit_ul(x); +} +inline bool stdc_has_single_bit(unsigned long long x) { + return stdc_has_single_bit_ull(x); +} +inline unsigned stdc_bit_width(unsigned char x) { return stdc_bit_width_uc(x); } +inline unsigned stdc_bit_width(unsigned short x) { + return stdc_bit_width_us(x); +} +inline unsigned stdc_bit_width(unsigned x) { return stdc_bit_width_ui(x); } +inline unsigned stdc_bit_width(unsigned long x) { return stdc_bit_width_ul(x); } +inline unsigned stdc_bit_width(unsigned long long x) { + return stdc_bit_width_ull(x); +} +inline unsigned char stdc_bit_floor(unsigned char x) { + return stdc_bit_floor_uc(x); +} +inline unsigned short stdc_bit_floor(unsigned short x) { + return stdc_bit_floor_us(x); +} +inline unsigned stdc_bit_floor(unsigned x) { return stdc_bit_floor_ui(x); } +inline unsigned long stdc_bit_floor(unsigned long x) { + return stdc_bit_floor_ul(x); +} +inline unsigned long long stdc_bit_floor(unsigned long long x) { + return stdc_bit_floor_ull(x); +} +inline unsigned char stdc_bit_ceil(unsigned char x) { + return stdc_bit_ceil_uc(x); +} +inline unsigned short stdc_bit_ceil(unsigned short x) { + return stdc_bit_ceil_us(x); +} +inline unsigned stdc_bit_ceil(unsigned x) { return stdc_bit_ceil_ui(x); } +inline unsigned long stdc_bit_ceil(unsigned long x) { + return stdc_bit_ceil_ul(x); +} +inline unsigned long long stdc_bit_ceil(unsigned long long x) { + return stdc_bit_ceil_ull(x); +} +#else +#define stdc_leading_zeros(x) \ + _Generic((x), \ + unsigned char: stdc_leading_zeros_uc, \ + unsigned short: stdc_leading_zeros_us, \ + unsigned: stdc_leading_zeros_ui, \ + unsigned long: stdc_leading_zeros_ul, \ + unsigned long long: stdc_leading_zeros_ull)(x) +#define stdc_leading_ones(x) \ + _Generic((x), \ + unsigned char: stdc_leading_ones_uc, \ + unsigned short: stdc_leading_ones_us, \ + unsigned: stdc_leading_ones_ui, \ + unsigned long: stdc_leading_ones_ul, \ + unsigned long long: stdc_leading_ones_ull)(x) +#define stdc_trailing_zeros(x) \ + _Generic((x), \ + unsigned char: stdc_trailing_zeros_uc, \ + unsigned short: stdc_trailing_zeros_us, \ + unsigned: stdc_trailing_zeros_ui, \ + unsigned long: stdc_trailing_zeros_ul, \ + unsigned long long: stdc_trailing_zeros_ull)(x) +#define stdc_trailing_ones(x) \ + _Generic((x), \ + unsigned char: stdc_trailing_ones_uc, \ + unsigned short: stdc_trailing_ones_us, \ + unsigned: stdc_trailing_ones_ui, \ + unsigned long: stdc_trailing_ones_ul, \ + unsigned long long: stdc_trailing_ones_ull)(x) +#define stdc_first_leading_zero(x) \ + _Generic((x), \ + unsigned char: stdc_first_leading_zero_uc, \ + unsigned short: stdc_first_leading_zero_us, \ + unsigned: stdc_first_leading_zero_ui, \ + unsigned long: stdc_first_leading_zero_ul, \ + unsigned long long: stdc_first_leading_zero_ull)(x) +#define stdc_first_leading_one(x) \ + _Generic((x), \ + unsigned char: stdc_first_leading_one_uc, \ + unsigned short: stdc_first_leading_one_us, \ + unsigned: stdc_first_leading_one_ui, \ + unsigned long: stdc_first_leading_one_ul, \ + unsigned long long: stdc_first_leading_one_ull)(x) +#define stdc_first_trailing_zero(x) \ + _Generic((x), \ + unsigned char: stdc_first_trailing_zero_uc, \ + unsigned short: stdc_first_trailing_zero_us, \ + unsigned: stdc_first_trailing_zero_ui, \ + unsigned long: stdc_first_trailing_zero_ul, \ + unsigned long long: stdc_first_trailing_zero_ull)(x) +#define stdc_first_trailing_one(x) \ + _Generic((x), \ + unsigned char: stdc_first_trailing_one_uc, \ + unsigned short: stdc_first_trailing_one_us, \ + unsigned: stdc_first_trailing_one_ui, \ + unsigned long: stdc_first_trailing_one_ul, \ + unsigned long long: stdc_first_trailing_one_ull)(x) +#define stdc_count_zeros(x) \ + _Generic((x), \ + unsigned char: stdc_count_zeros_uc, \ + unsigned short: stdc_count_zeros_us, \ + unsigned: stdc_count_zeros_ui, \ + unsigned long: stdc_count_zeros_ul, \ + unsigned long long: stdc_count_zeros_ull)(x) +#define stdc_count_ones(x) \ + _Generic((x), \ + unsigned char: stdc_count_ones_uc, \ + unsigned short: stdc_count_ones_us, \ + unsigned: stdc_count_ones_ui, \ + unsigned long: stdc_count_ones_ul, \ + unsigned long long: stdc_count_ones_ull)(x) +#define stdc_has_single_bit(x) \ + _Generic((x), \ + unsigned char: stdc_has_single_bit_uc, \ + unsigned short: stdc_has_single_bit_us, \ + unsigned: stdc_has_single_bit_ui, \ + unsigned long: stdc_has_single_bit_ul, \ + unsigned long long: stdc_has_single_bit_ull)(x) +#define stdc_bit_width(x) \ + _Generic((x), \ + unsigned char: stdc_bit_width_uc, \ + unsigned short: stdc_bit_width_us, \ + unsigned: stdc_bit_width_ui, \ + unsigned long: stdc_bit_width_ul, \ + unsigned long long: stdc_bit_width_ull)(x) +#define stdc_bit_floor(x) \ + _Generic((x), \ + unsigned char: stdc_bit_floor_uc, \ + unsigned short: stdc_bit_floor_us, \ + unsigned: stdc_bit_floor_ui, \ + unsigned long: stdc_bit_floor_ul, \ + unsigned long long: stdc_bit_floor_ull)(x) +#define stdc_bit_ceil(x) \ + _Generic((x), \ + unsigned char: stdc_bit_ceil_uc, \ + unsigned short: stdc_bit_ceil_us, \ + unsigned: stdc_bit_ceil_ui, \ + unsigned long: stdc_bit_ceil_ul, \ + unsigned long long: stdc_bit_ceil_ull)(x) +#endif // __cplusplus + +#endif // __LLVM_LIBC_MACROS_STDBIT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/stdckdint-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/stdckdint-macros.h new file mode 100644 index 000000000000..17e4ccdc2d5f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/stdckdint-macros.h @@ -0,0 +1,27 @@ +//===-- Definition of macros for stdckdint.h ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_STDCKDINT_MACROS_H +#define LLVM_LIBC_MACROS_STDCKDINT_MACROS_H + +// We need to use __builtin_*_overflow from GCC/Clang to implement the overflow +// macros. Check __GNUC__ or __clang__ for availability of such builtins. +// Note that clang-cl defines __clang__ only and does not define __GNUC__ so we +// have to check for both. +#if defined(__GNUC__) || defined(__clang__) +// clang/gcc overlay may provides similar macros, we need to avoid redefining +// them. +#ifndef __STDC_VERSION_STDCKDINT_H__ +#define __STDC_VERSION_STDCKDINT_H__ 202311L + +#define ckd_add(R, A, B) __builtin_add_overflow((A), (B), (R)) +#define ckd_sub(R, A, B) __builtin_sub_overflow((A), (B), (R)) +#define ckd_mul(R, A, B) __builtin_mul_overflow((A), (B), (R)) +#endif // __STDC_VERSION_STDCKDINT_H__ +#endif // __GNUC__ +#endif // LLVM_LIBC_MACROS_STDCKDINT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/stdfix-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/stdfix-macros.h new file mode 100644 index 000000000000..04097e14e974 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/stdfix-macros.h @@ -0,0 +1,367 @@ +//===-- Definitions from stdfix.h -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_STDFIX_MACROS_H +#define LLVM_LIBC_MACROS_STDFIX_MACROS_H + +#ifdef __FRACT_FBIT__ +// _Fract and _Accum types are available +#define LIBC_COMPILER_HAS_FIXED_POINT +#endif // __FRACT_FBIT__ + +#ifdef LIBC_COMPILER_HAS_FIXED_POINT + +#define fract _Fract +#define accum _Accum +#define sat _Sat + +// Default values: from ISO/IEC TR 18037:2008 standard - Annex A.3 - Typical +// desktop processor. + +#ifdef __SFRACT_FBIT__ +#define SFRACT_FBIT __SFRACT_FBIT__ +#else +#define SFRACT_FBIT 7 +#endif // SFRACT_FBIT + +#ifdef __SFRACT_MIN__ +#define SFRACT_MIN __SFRACT_MIN__ +#else +#define SFRACT_MIN (-0.5HR - 0.5HR) +#endif // SFRACT_MIN + +#ifdef __SFRACT_MAX__ +#define SFRACT_MAX __SFRACT_MAX__ +#else +#define SFRACT_MAX 0x1.FCp-1HR +#endif // SFRACT_MAX + +#ifdef __SFRACT_EPSILON__ +#define SFRACT_EPSILON __SFRACT_EPSILON__ +#else +#define SFRACT_EPSILON 0x1.0p-7HR +#endif // SFRACT_EPSILON + +#ifdef __USFRACT_FBIT__ +#define USFRACT_FBIT __USFRACT_FBIT__ +#else +#define USFRACT_FBIT 8 +#endif // USFRACT_FBIT + +#define USFRACT_MIN 0.0UHR + +#ifdef __USFRACT_MAX__ +#define USFRACT_MAX __USFRACT_MAX__ +#else +#define USFRACT_MAX 0x1.FEp-1UHR +#endif // USFRACT_MAX + +#ifdef __USFRACT_EPSILON__ +#define USFRACT_EPSILON __USFRACT_EPSILON__ +#else +#define USFRACT_EPSILON 0x1.0p-8UHR +#endif // USFRACT_EPSILON + +#ifdef __FRACT_FBIT__ +#define FRACT_FBIT __FRACT_FBIT__ +#else +#define FRACT_FBIT 15 +#endif // FRACT_FBIT + +#ifdef __FRACT_MIN__ +#define FRACT_MIN __FRACT_MIN__ +#else +#define FRACT_MIN (-0.5R - 0.5R) +#endif // FRACT_MIN + +#ifdef __FRACT_MAX__ +#define FRACT_MAX __FRACT_MAX__ +#else +#define FRACT_MAX 0x1.FFFCp-1R +#endif // FRACT_MAX + +#ifdef __FRACT_EPSILON__ +#define FRACT_EPSILON __FRACT_EPSILON__ +#else +#define FRACT_EPSILON 0x1.0p-15R +#endif // FRACT_EPSILON + +#ifdef __UFRACT_FBIT__ +#define UFRACT_FBIT __UFRACT_FBIT__ +#else +#define UFRACT_FBIT 16 +#endif // UFRACT_FBIT + +#define UFRACT_MIN 0.0UR + +#ifdef __UFRACT_MAX__ +#define UFRACT_MAX __UFRACT_MAX__ +#else +#define UFRACT_MAX 0x1.FFFEp-1UR +#endif // UFRACT_MAX + +#ifdef __UFRACT_EPSILON__ +#define UFRACT_EPSILON __UFRACT_EPSILON__ +#else +#define UFRACT_EPSILON 0x1.0p-16UR +#endif // UFRACT_EPSILON + +#ifdef __LFRACT_FBIT__ +#define LFRACT_FBIT __LFRACT_FBIT__ +#else +#define LFRACT_FBIT 31 +#endif // LFRACT_FBIT + +#ifdef __LFRACT_MIN__ +#define LFRACT_MIN __LFRACT_MIN__ +#else +#define LFRACT_MIN (-0.5LR - 0.5LR) +#endif // LFRACT_MIN + +#ifdef __LFRACT_MAX__ +#define LFRACT_MAX __LFRACT_MAX__ +#else +#define LFRACT_MAX 0x1.FFFFFFFCp-1LR +#endif // LFRACT_MAX + +#ifdef __LFRACT_EPSILON__ +#define LFRACT_EPSILON __LFRACT_EPSILON__ +#else +#define LFRACT_EPSILON 0x1.0p-31LR +#endif // LFRACT_EPSILON + +#ifdef __ULFRACT_FBIT__ +#define ULFRACT_FBIT __ULFRACT_FBIT__ +#else +#define ULFRACT_FBIT 32 +#endif // ULFRACT_FBIT + +#define ULFRACT_MIN 0.0ULR + +#ifdef __ULFRACT_MAX__ +#define ULFRACT_MAX __ULFRACT_MAX__ +#else +#define ULFRACT_MAX 0x1.FFFFFFFEp-1ULR +#endif // ULFRACT_MAX + +#ifdef __ULFRACT_EPSILON__ +#define ULFRACT_EPSILON __ULFRACT_EPSILON__ +#else +#define ULFRACT_EPSILON 0x1.0p-32ULR +#endif // ULFRACT_EPSILON + +#ifdef __SACCUM_FBIT__ +#define SACCUM_FBIT __SACCUM_FBIT__ +#else +#define SACCUM_FBIT 7 +#endif // SACCUM_FBIT + +#ifdef __SACCUM_IBIT__ +#define SACCUM_IBIT __SACCUM_IBIT__ +#else +#define SACCUM_IBIT 8 +#endif // SACCUM_IBIT + +#ifdef __SACCUM_MIN__ +#define SACCUM_MIN __SACCUM_MIN__ +#else +#define SACCUM_MIN (-0x1.0p+7HK - 0x1.0p+7HK) +#endif // SACCUM_MIN + +#ifdef __SACCUM_MAX__ +#define SACCUM_MAX __SACCUM_MAX__ +#else +#define SACCUM_MAX 0x1.FFFCp+7HK +#endif // SACCUM_MAX + +#ifdef __SACCUM_EPSILON__ +#define SACCUM_EPSILON __SACCUM_EPSILON__ +#else +#define SACCUM_EPSILON 0x1.0p-7HK +#endif // SACCUM_EPSILON + +#ifdef __USACCUM_FBIT__ +#define USACCUM_FBIT __USACCUM_FBIT__ +#else +#define USACCUM_FBIT 8 +#endif // USACCUM_FBIT + +#ifdef __USACCUM_IBIT__ +#define USACCUM_IBIT __USACCUM_IBIT__ +#else +#define USACCUM_IBIT 8 +#endif // USACCUM_IBIT + +#define USACCUM_MIN 0.0UHK + +#ifdef __USACCUM_MAX__ +#define USACCUM_MAX __USACCUM_MAX__ +#else +#define USACCUM_MAX 0x1.FFFEp+7UHK +#endif // USACCUM_MAX + +#ifdef __USACCUM_EPSILON__ +#define USACCUM_EPSILON __USACCUM_EPSILON__ +#else +#define USACCUM_EPSILON 0x1.0p-8UHK +#endif // USACCUM_EPSILON + +#ifdef __ACCUM_FBIT__ +#define ACCUM_FBIT __ACCUM_FBIT__ +#else +#define ACCUM_FBIT 15 +#endif // ACCUM_FBIT + +#ifdef __ACCUM_IBIT__ +#define ACCUM_IBIT __ACCUM_IBIT__ +#else +#define ACCUM_IBIT 16 +#endif // ACCUM_IBIT + +#ifdef __ACCUM_MIN__ +#define ACCUM_MIN __ACCUM_MIN__ +#else +#define ACCUM_MIN (-0x1.0p+15K - 0x1.0p+15K) +#endif // ACCUM_MIN + +#ifdef __ACCUM_MAX__ +#define ACCUM_MAX __ACCUM_MAX__ +#else +#define ACCUM_MAX 0x1.FFFFFFFCp+15K +#endif // ACCUM_MAX + +#ifdef __ACCUM_EPSILON__ +#define ACCUM_EPSILON __ACCUM_EPSILON__ +#else +#define ACCUM_EPSILON 0x1.0p-15K +#endif // ACCUM_EPSILON + +#ifdef __UACCUM_FBIT__ +#define UACCUM_FBIT __UACCUM_FBIT__ +#else +#define UACCUM_FBIT 16 +#endif // UACCUM_FBIT + +#ifdef __UACCUM_IBIT__ +#define UACCUM_IBIT __UACCUM_IBIT__ +#else +#define UACCUM_IBIT 16 +#endif // UACCUM_IBIT + +#define UACCUM_MIN 0.0UK + +#ifdef __UACCUM_MAX__ +#define UACCUM_MAX __UACCUM_MAX__ +#else +#define UACCUM_MAX 0x1.FFFFFFFEp+15UK +#endif // UACCUM_MAX + +#ifdef __UACCUM_EPSILON__ +#define UACCUM_EPSILON __UACCUM_EPSILON__ +#else +#define UACCUM_EPSILON 0x1.0p-16UK +#endif // UACCUM_EPSILON + +#ifdef __LACCUM_FBIT__ +#define LACCUM_FBIT __LACCUM_FBIT__ +#else +#define LACCUM_FBIT 31 +#endif // LACCUM_FBIT + +#ifdef __LACCUM_IBIT__ +#define LACCUM_IBIT __LACCUM_IBIT__ +#else +#define LACCUM_IBIT 32 +#endif // LACCUM_IBIT + +#ifdef __LACCUM_MIN__ +#define LACCUM_MIN __LACCUM_MIN__ +#else +#define LACCUM_MIN (-0x1.0p+31LK - 0x1.0p+31LK) +#endif // LACCUM_MIN + +#ifdef __LACCUM_MAX__ +#define LACCUM_MAX __LACCUM_MAX__ +#else +#define LACCUM_MAX 0x1.FFFFFFFFFFFFFFFCp+31LK +#endif // LACCUM_MAX + +#ifdef __LACCUM_EPSILON__ +#define LACCUM_EPSILON __LACCUM_EPSILON__ +#else +#define LACCUM_EPSILON 0x1.0p-31LK +#endif // LACCUM_EPSILON + +#ifdef __ULACCUM_FBIT__ +#define ULACCUM_FBIT __ULACCUM_FBIT__ +#else +#define ULACCUM_FBIT 32 +#endif // ULACCUM_FBIT + +#ifdef __ULACCUM_IBIT__ +#define ULACCUM_IBIT __ULACCUM_IBIT__ +#else +#define ULACCUM_IBIT 32 +#endif // ULACCUM_IBIT + +#define ULACCUM_MIN 0.0ULK + +#ifdef __ULACCUM_MAX__ +#define ULACCUM_MAX __ULACCUM_MAX__ +#else +#define ULACCUM_MAX 0x1.FFFFFFFFFFFFFFFEp+31ULK +#endif // ULACCUM_MAX + +#ifdef __ULACCUM_EPSILON__ +#define ULACCUM_EPSILON __ULACCUM_EPSILON__ +#else +#define ULACCUM_EPSILON 0x1.0p-32ULK +#endif // ULACCUM_EPSILON + +#define absfx(x) \ + _Generic((x), \ + fract: absr, \ + short fract: abshr, \ + long fract: abslr, \ + accum: absk, \ + short accum: abshk, \ + long accum: abslk)(x) + +#define countlsfx(x) \ + _Generic((x), \ + fract: countlsr, \ + short fract: countlshr, \ + long fract: countlslr, \ + accum: countlsk, \ + short accum: countlshk, \ + long accum: countlslk, \ + unsigned fract: countlsur, \ + unsigned short fract: countlsuhr, \ + unsigned long fract: countlsulr, \ + unsigned accum: countlsuk, \ + unsigned short accum: countlsuhk, \ + unsigned long accum: countlsulk)(x) + +#define roundfx(x, y) \ + _Generic((x), \ + fract: roundr, \ + short fract: roundhr, \ + long fract: roundlr, \ + accum: roundk, \ + short accum: roundhk, \ + long accum: roundlk, \ + unsigned fract: roundur, \ + unsigned short fract: rounduhr, \ + unsigned long fract: roundulr, \ + unsigned accum: rounduk, \ + unsigned short accum: rounduhk, \ + unsigned long accum: roundulk)(x, y) + +#endif // LIBC_COMPILER_HAS_FIXED_POINT + +#endif // LLVM_LIBC_MACROS_STDFIX_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/stdint-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/stdint-macros.h new file mode 100644 index 000000000000..1d5da2b783b6 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/stdint-macros.h @@ -0,0 +1,878 @@ +//===-- Definition of macros from stdint.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_STDINT_MACROS_H +#define LLVM_LIBC_MACROS_STDINT_MACROS_H + +// These definitions are copied directly from the clang implementation located +// at 'clang/lib/Headers/stdint.h'. We provide it here again for compatibility. + +/* C99 7.18.1.1 Exact-width integer types. + * C99 7.18.1.2 Minimum-width integer types. + * C99 7.18.1.3 Fastest minimum-width integer types. + * + * The standard requires that exact-width type be defined for 8-, 16-, 32-, and + * 64-bit types if they are implemented. Other exact width types are optional. + * This implementation defines an exact-width types for every integer width + * that is represented in the standard integer types. + * + * The standard also requires minimum-width types be defined for 8-, 16-, 32-, + * and 64-bit widths regardless of whether there are corresponding exact-width + * types. + * + * To accommodate targets that are missing types that are exactly 8, 16, 32, or + * 64 bits wide, this implementation takes an approach of cascading + * redefinitions, redefining __int_leastN_t to successively smaller exact-width + * types. It is therefore important that the types are defined in order of + * descending widths. + * + * We currently assume that the minimum-width types and the fastest + * minimum-width types are the same. This is allowed by the standard, but is + * suboptimal. + * + * In violation of the standard, some targets do not implement a type that is + * wide enough to represent all of the required widths (8-, 16-, 32-, 64-bit). + * To accommodate these targets, a required minimum-width type is only + * defined if there exists an exact-width type of equal or greater width. + */ + +#ifdef __INT64_TYPE__ +#ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/ +typedef __INT64_TYPE__ int64_t; +#endif /* __int8_t_defined */ +typedef __UINT64_TYPE__ uint64_t; +#undef __int_least64_t +#define __int_least64_t int64_t +#undef __uint_least64_t +#define __uint_least64_t uint64_t +#undef __int_least32_t +#define __int_least32_t int64_t +#undef __uint_least32_t +#define __uint_least32_t uint64_t +#undef __int_least16_t +#define __int_least16_t int64_t +#undef __uint_least16_t +#define __uint_least16_t uint64_t +#undef __int_least8_t +#define __int_least8_t int64_t +#undef __uint_least8_t +#define __uint_least8_t uint64_t +#endif /* __INT64_TYPE__ */ + +#ifdef __int_least64_t +typedef __int_least64_t int_least64_t; +typedef __uint_least64_t uint_least64_t; +typedef __int_least64_t int_fast64_t; +typedef __uint_least64_t uint_fast64_t; +#endif /* __int_least64_t */ + +#ifdef __INT56_TYPE__ +typedef __INT56_TYPE__ int56_t; +typedef __UINT56_TYPE__ uint56_t; +typedef int56_t int_least56_t; +typedef uint56_t uint_least56_t; +typedef int56_t int_fast56_t; +typedef uint56_t uint_fast56_t; +#undef __int_least32_t +#define __int_least32_t int56_t +#undef __uint_least32_t +#define __uint_least32_t uint56_t +#undef __int_least16_t +#define __int_least16_t int56_t +#undef __uint_least16_t +#define __uint_least16_t uint56_t +#undef __int_least8_t +#define __int_least8_t int56_t +#undef __uint_least8_t +#define __uint_least8_t uint56_t +#endif /* __INT56_TYPE__ */ + +#ifdef __INT48_TYPE__ +typedef __INT48_TYPE__ int48_t; +typedef __UINT48_TYPE__ uint48_t; +typedef int48_t int_least48_t; +typedef uint48_t uint_least48_t; +typedef int48_t int_fast48_t; +typedef uint48_t uint_fast48_t; +#undef __int_least32_t +#define __int_least32_t int48_t +#undef __uint_least32_t +#define __uint_least32_t uint48_t +#undef __int_least16_t +#define __int_least16_t int48_t +#undef __uint_least16_t +#define __uint_least16_t uint48_t +#undef __int_least8_t +#define __int_least8_t int48_t +#undef __uint_least8_t +#define __uint_least8_t uint48_t +#endif /* __INT48_TYPE__ */ + +#ifdef __INT40_TYPE__ +typedef __INT40_TYPE__ int40_t; +typedef __UINT40_TYPE__ uint40_t; +typedef int40_t int_least40_t; +typedef uint40_t uint_least40_t; +typedef int40_t int_fast40_t; +typedef uint40_t uint_fast40_t; +#undef __int_least32_t +#define __int_least32_t int40_t +#undef __uint_least32_t +#define __uint_least32_t uint40_t +#undef __int_least16_t +#define __int_least16_t int40_t +#undef __uint_least16_t +#define __uint_least16_t uint40_t +#undef __int_least8_t +#define __int_least8_t int40_t +#undef __uint_least8_t +#define __uint_least8_t uint40_t +#endif /* __INT40_TYPE__ */ + +#ifdef __INT32_TYPE__ + +#ifndef __int8_t_defined /* glibc sys/types.h also defines int32_t*/ +typedef __INT32_TYPE__ int32_t; +#endif /* __int8_t_defined */ + +#ifndef __uint32_t_defined /* more glibc compatibility */ +#define __uint32_t_defined +typedef __UINT32_TYPE__ uint32_t; +#endif /* __uint32_t_defined */ + +#undef __int_least32_t +#define __int_least32_t int32_t +#undef __uint_least32_t +#define __uint_least32_t uint32_t +#undef __int_least16_t +#define __int_least16_t int32_t +#undef __uint_least16_t +#define __uint_least16_t uint32_t +#undef __int_least8_t +#define __int_least8_t int32_t +#undef __uint_least8_t +#define __uint_least8_t uint32_t +#endif /* __INT32_TYPE__ */ + +#ifdef __int_least32_t +typedef __int_least32_t int_least32_t; +typedef __uint_least32_t uint_least32_t; +typedef __int_least32_t int_fast32_t; +typedef __uint_least32_t uint_fast32_t; +#endif /* __int_least32_t */ + +#ifdef __INT24_TYPE__ +typedef __INT24_TYPE__ int24_t; +typedef __UINT24_TYPE__ uint24_t; +typedef int24_t int_least24_t; +typedef uint24_t uint_least24_t; +typedef int24_t int_fast24_t; +typedef uint24_t uint_fast24_t; +#undef __int_least16_t +#define __int_least16_t int24_t +#undef __uint_least16_t +#define __uint_least16_t uint24_t +#undef __int_least8_t +#define __int_least8_t int24_t +#undef __uint_least8_t +#define __uint_least8_t uint24_t +#endif /* __INT24_TYPE__ */ + +#ifdef __INT16_TYPE__ +#ifndef __int8_t_defined /* glibc sys/types.h also defines int16_t*/ +typedef __INT16_TYPE__ int16_t; +#endif /* __int8_t_defined */ +typedef __UINT16_TYPE__ uint16_t; +#undef __int_least16_t +#define __int_least16_t int16_t +#undef __uint_least16_t +#define __uint_least16_t uint16_t +#undef __int_least8_t +#define __int_least8_t int16_t +#undef __uint_least8_t +#define __uint_least8_t uint16_t +#endif /* __INT16_TYPE__ */ + +#ifdef __int_least16_t +typedef __int_least16_t int_least16_t; +typedef __uint_least16_t uint_least16_t; +typedef __int_least16_t int_fast16_t; +typedef __uint_least16_t uint_fast16_t; +#endif /* __int_least16_t */ + +#ifdef __INT8_TYPE__ +#ifndef __int8_t_defined /* glibc sys/types.h also defines int8_t*/ +typedef __INT8_TYPE__ int8_t; +#endif /* __int8_t_defined */ +typedef __UINT8_TYPE__ uint8_t; +#undef __int_least8_t +#define __int_least8_t int8_t +#undef __uint_least8_t +#define __uint_least8_t uint8_t +#endif /* __INT8_TYPE__ */ + +#ifdef __int_least8_t +typedef __int_least8_t int_least8_t; +typedef __uint_least8_t uint_least8_t; +typedef __int_least8_t int_fast8_t; +typedef __uint_least8_t uint_fast8_t; +#endif /* __int_least8_t */ + +/* prevent glibc sys/types.h from defining conflicting types */ +#ifndef __int8_t_defined +#define __int8_t_defined +#endif /* __int8_t_defined */ + +/* C99 7.18.1.4 Integer types capable of holding object pointers. + */ +#define __stdint_join3(a, b, c) a##b##c + +#ifndef _INTPTR_T +#ifndef __intptr_t_defined +typedef __INTPTR_TYPE__ intptr_t; +#define __intptr_t_defined +#define _INTPTR_T +#endif +#endif + +#ifndef _UINTPTR_T +typedef __UINTPTR_TYPE__ uintptr_t; +#define _UINTPTR_T +#endif + +/* C99 7.18.1.5 Greatest-width integer types. + */ +typedef __INTMAX_TYPE__ intmax_t; +typedef __UINTMAX_TYPE__ uintmax_t; + +/* C99 7.18.4 Macros for minimum-width integer constants. + * + * The standard requires that integer constant macros be defined for all the + * minimum-width types defined above. As 8-, 16-, 32-, and 64-bit minimum-width + * types are required, the corresponding integer constant macros are defined + * here. This implementation also defines minimum-width types for every other + * integer width that the target implements, so corresponding macros are + * defined below, too. + * + * These macros are defined using the same successive-shrinking approach as + * the type definitions above. It is likewise important that macros are defined + * in order of decending width. + * + * Note that C++ should not check __STDC_CONSTANT_MACROS here, contrary to the + * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]). + */ + +#define __int_c_join(a, b) a##b +#define __int_c(v, suffix) __int_c_join(v, suffix) +#define __uint_c(v, suffix) __int_c_join(v##U, suffix) + +#ifdef __INT64_TYPE__ +#undef __int64_c_suffix +#undef __int32_c_suffix +#undef __int16_c_suffix +#undef __int8_c_suffix +#ifdef __INT64_C_SUFFIX__ +#define __int64_c_suffix __INT64_C_SUFFIX__ +#define __int32_c_suffix __INT64_C_SUFFIX__ +#define __int16_c_suffix __INT64_C_SUFFIX__ +#define __int8_c_suffix __INT64_C_SUFFIX__ +#endif /* __INT64_C_SUFFIX__ */ +#endif /* __INT64_TYPE__ */ + +#ifdef __int_least64_t +#ifdef __int64_c_suffix +#define INT64_C(v) __int_c(v, __int64_c_suffix) +#define UINT64_C(v) __uint_c(v, __int64_c_suffix) +#else +#define INT64_C(v) v +#define UINT64_C(v) v##U +#endif /* __int64_c_suffix */ +#endif /* __int_least64_t */ + +#ifdef __INT56_TYPE__ +#undef __int32_c_suffix +#undef __int16_c_suffix +#undef __int8_c_suffix +#ifdef __INT56_C_SUFFIX__ +#define INT56_C(v) __int_c(v, __INT56_C_SUFFIX__) +#define UINT56_C(v) __uint_c(v, __INT56_C_SUFFIX__) +#define __int32_c_suffix __INT56_C_SUFFIX__ +#define __int16_c_suffix __INT56_C_SUFFIX__ +#define __int8_c_suffix __INT56_C_SUFFIX__ +#else +#define INT56_C(v) v +#define UINT56_C(v) v##U +#endif /* __INT56_C_SUFFIX__ */ +#endif /* __INT56_TYPE__ */ + +#ifdef __INT48_TYPE__ +#undef __int32_c_suffix +#undef __int16_c_suffix +#undef __int8_c_suffix +#ifdef __INT48_C_SUFFIX__ +#define INT48_C(v) __int_c(v, __INT48_C_SUFFIX__) +#define UINT48_C(v) __uint_c(v, __INT48_C_SUFFIX__) +#define __int32_c_suffix __INT48_C_SUFFIX__ +#define __int16_c_suffix __INT48_C_SUFFIX__ +#define __int8_c_suffix __INT48_C_SUFFIX__ +#else +#define INT48_C(v) v +#define UINT48_C(v) v##U +#endif /* __INT48_C_SUFFIX__ */ +#endif /* __INT48_TYPE__ */ + +#ifdef __INT40_TYPE__ +#undef __int32_c_suffix +#undef __int16_c_suffix +#undef __int8_c_suffix +#ifdef __INT40_C_SUFFIX__ +#define INT40_C(v) __int_c(v, __INT40_C_SUFFIX__) +#define UINT40_C(v) __uint_c(v, __INT40_C_SUFFIX__) +#define __int32_c_suffix __INT40_C_SUFFIX__ +#define __int16_c_suffix __INT40_C_SUFFIX__ +#define __int8_c_suffix __INT40_C_SUFFIX__ +#else +#define INT40_C(v) v +#define UINT40_C(v) v##U +#endif /* __INT40_C_SUFFIX__ */ +#endif /* __INT40_TYPE__ */ + +#ifdef __INT32_TYPE__ +#undef __int32_c_suffix +#undef __int16_c_suffix +#undef __int8_c_suffix +#ifdef __INT32_C_SUFFIX__ +#define __int32_c_suffix __INT32_C_SUFFIX__ +#define __int16_c_suffix __INT32_C_SUFFIX__ +#define __int8_c_suffix __INT32_C_SUFFIX__ +#endif /* __INT32_C_SUFFIX__ */ +#endif /* __INT32_TYPE__ */ + +#ifdef __int_least32_t +#ifdef __int32_c_suffix +#define INT32_C(v) __int_c(v, __int32_c_suffix) +#define UINT32_C(v) __uint_c(v, __int32_c_suffix) +#else +#define INT32_C(v) v +#define UINT32_C(v) v##U +#endif /* __int32_c_suffix */ +#endif /* __int_least32_t */ + +#ifdef __INT24_TYPE__ +#undef __int16_c_suffix +#undef __int8_c_suffix +#ifdef __INT24_C_SUFFIX__ +#define INT24_C(v) __int_c(v, __INT24_C_SUFFIX__) +#define UINT24_C(v) __uint_c(v, __INT24_C_SUFFIX__) +#define __int16_c_suffix __INT24_C_SUFFIX__ +#define __int8_c_suffix __INT24_C_SUFFIX__ +#else +#define INT24_C(v) v +#define UINT24_C(v) v##U +#endif /* __INT24_C_SUFFIX__ */ +#endif /* __INT24_TYPE__ */ + +#ifdef __INT16_TYPE__ +#undef __int16_c_suffix +#undef __int8_c_suffix +#ifdef __INT16_C_SUFFIX__ +#define __int16_c_suffix __INT16_C_SUFFIX__ +#define __int8_c_suffix __INT16_C_SUFFIX__ +#endif /* __INT16_C_SUFFIX__ */ +#endif /* __INT16_TYPE__ */ + +#ifdef __int_least16_t +#ifdef __int16_c_suffix +#define INT16_C(v) __int_c(v, __int16_c_suffix) +#define UINT16_C(v) __uint_c(v, __int16_c_suffix) +#else +#define INT16_C(v) v +#define UINT16_C(v) v##U +#endif /* __int16_c_suffix */ +#endif /* __int_least16_t */ + +#ifdef __INT8_TYPE__ +#undef __int8_c_suffix +#ifdef __INT8_C_SUFFIX__ +#define __int8_c_suffix __INT8_C_SUFFIX__ +#endif /* __INT8_C_SUFFIX__ */ +#endif /* __INT8_TYPE__ */ + +#ifdef __int_least8_t +#ifdef __int8_c_suffix +#define INT8_C(v) __int_c(v, __int8_c_suffix) +#define UINT8_C(v) __uint_c(v, __int8_c_suffix) +#else +#define INT8_C(v) v +#define UINT8_C(v) v##U +#endif /* __int8_c_suffix */ +#endif /* __int_least8_t */ + +/* C99 7.18.2.1 Limits of exact-width integer types. + * C99 7.18.2.2 Limits of minimum-width integer types. + * C99 7.18.2.3 Limits of fastest minimum-width integer types. + * + * The presence of limit macros are completely optional in C99. This + * implementation defines limits for all of the types (exact- and + * minimum-width) that it defines above, using the limits of the minimum-width + * type for any types that do not have exact-width representations. + * + * As in the type definitions, this section takes an approach of + * successive-shrinking to determine which limits to use for the standard (8, + * 16, 32, 64) bit widths when they don't have exact representations. It is + * therefore important that the definitions be kept in order of decending + * widths. + * + * Note that C++ should not check __STDC_LIMIT_MACROS here, contrary to the + * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]). + */ + +#ifdef __INT64_TYPE__ +#define INT64_MAX INT64_C(9223372036854775807) +#define INT64_MIN (-INT64_C(9223372036854775807) - 1) +#define UINT64_MAX UINT64_C(18446744073709551615) + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT64_WIDTH 64 +#define INT64_WIDTH UINT64_WIDTH + +#define __UINT_LEAST64_WIDTH UINT64_WIDTH +#undef __UINT_LEAST32_WIDTH +#define __UINT_LEAST32_WIDTH UINT64_WIDTH +#undef __UINT_LEAST16_WIDTH +#define __UINT_LEAST16_WIDTH UINT64_WIDTH +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT64_MAX +#endif /* __STDC_VERSION__ */ + +#define __INT_LEAST64_MIN INT64_MIN +#define __INT_LEAST64_MAX INT64_MAX +#define __UINT_LEAST64_MAX UINT64_MAX +#undef __INT_LEAST32_MIN +#define __INT_LEAST32_MIN INT64_MIN +#undef __INT_LEAST32_MAX +#define __INT_LEAST32_MAX INT64_MAX +#undef __UINT_LEAST32_MAX +#define __UINT_LEAST32_MAX UINT64_MAX +#undef __INT_LEAST16_MIN +#define __INT_LEAST16_MIN INT64_MIN +#undef __INT_LEAST16_MAX +#define __INT_LEAST16_MAX INT64_MAX +#undef __UINT_LEAST16_MAX +#define __UINT_LEAST16_MAX UINT64_MAX +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT64_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT64_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT64_MAX +#endif /* __INT64_TYPE__ */ + +#ifdef __INT_LEAST64_MIN +#define INT_LEAST64_MIN __INT_LEAST64_MIN +#define INT_LEAST64_MAX __INT_LEAST64_MAX +#define UINT_LEAST64_MAX __UINT_LEAST64_MAX +#define INT_FAST64_MIN __INT_LEAST64_MIN +#define INT_FAST64_MAX __INT_LEAST64_MAX +#define UINT_FAST64_MAX __UINT_LEAST64_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT_LEAST64_WIDTH __UINT_LEAST64_WIDTH +#define INT_LEAST64_WIDTH UINT_LEAST64_WIDTH +#define UINT_FAST64_WIDTH __UINT_LEAST64_WIDTH +#define INT_FAST64_WIDTH UINT_FAST64_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT_LEAST64_MIN */ + +#ifdef __INT56_TYPE__ +#define INT56_MAX INT56_C(36028797018963967) +#define INT56_MIN (-INT56_C(36028797018963967) - 1) +#define UINT56_MAX UINT56_C(72057594037927935) +#define INT_LEAST56_MIN INT56_MIN +#define INT_LEAST56_MAX INT56_MAX +#define UINT_LEAST56_MAX UINT56_MAX +#define INT_FAST56_MIN INT56_MIN +#define INT_FAST56_MAX INT56_MAX +#define UINT_FAST56_MAX UINT56_MAX + +#undef __INT_LEAST32_MIN +#define __INT_LEAST32_MIN INT56_MIN +#undef __INT_LEAST32_MAX +#define __INT_LEAST32_MAX INT56_MAX +#undef __UINT_LEAST32_MAX +#define __UINT_LEAST32_MAX UINT56_MAX +#undef __INT_LEAST16_MIN +#define __INT_LEAST16_MIN INT56_MIN +#undef __INT_LEAST16_MAX +#define __INT_LEAST16_MAX INT56_MAX +#undef __UINT_LEAST16_MAX +#define __UINT_LEAST16_MAX UINT56_MAX +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT56_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT56_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT56_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT56_WIDTH 56 +#define INT56_WIDTH UINT56_WIDTH +#define UINT_LEAST56_WIDTH UINT56_WIDTH +#define INT_LEAST56_WIDTH UINT_LEAST56_WIDTH +#define UINT_FAST56_WIDTH UINT56_WIDTH +#define INT_FAST56_WIDTH UINT_FAST56_WIDTH +#undef __UINT_LEAST32_WIDTH +#define __UINT_LEAST32_WIDTH UINT56_WIDTH +#undef __UINT_LEAST16_WIDTH +#define __UINT_LEAST16_WIDTH UINT56_WIDTH +#undef __UINT_LEAST8_WIDTH +#define __UINT_LEAST8_WIDTH UINT56_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT56_TYPE__ */ + +#ifdef __INT48_TYPE__ +#define INT48_MAX INT48_C(140737488355327) +#define INT48_MIN (-INT48_C(140737488355327) - 1) +#define UINT48_MAX UINT48_C(281474976710655) +#define INT_LEAST48_MIN INT48_MIN +#define INT_LEAST48_MAX INT48_MAX +#define UINT_LEAST48_MAX UINT48_MAX +#define INT_FAST48_MIN INT48_MIN +#define INT_FAST48_MAX INT48_MAX +#define UINT_FAST48_MAX UINT48_MAX + +#undef __INT_LEAST32_MIN +#define __INT_LEAST32_MIN INT48_MIN +#undef __INT_LEAST32_MAX +#define __INT_LEAST32_MAX INT48_MAX +#undef __UINT_LEAST32_MAX +#define __UINT_LEAST32_MAX UINT48_MAX +#undef __INT_LEAST16_MIN +#define __INT_LEAST16_MIN INT48_MIN +#undef __INT_LEAST16_MAX +#define __INT_LEAST16_MAX INT48_MAX +#undef __UINT_LEAST16_MAX +#define __UINT_LEAST16_MAX UINT48_MAX +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT48_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT48_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT48_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT48_WIDTH 48 +#define INT48_WIDTH UINT48_WIDTH +#define UINT_LEAST48_WIDTH UINT48_WIDTH +#define INT_LEAST48_WIDTH UINT_LEAST48_WIDTH +#define UINT_FAST48_WIDTH UINT48_WIDTH +#define INT_FAST48_WIDTH UINT_FAST48_WIDTH +#undef __UINT_LEAST32_WIDTH +#define __UINT_LEAST32_WIDTH UINT48_WIDTH +#undef __UINT_LEAST16_WIDTH +#define __UINT_LEAST16_WIDTH UINT48_WIDTH +#undef __UINT_LEAST8_WIDTH +#define __UINT_LEAST8_WIDTH UINT48_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT48_TYPE__ */ + +#ifdef __INT40_TYPE__ +#define INT40_MAX INT40_C(549755813887) +#define INT40_MIN (-INT40_C(549755813887) - 1) +#define UINT40_MAX UINT40_C(1099511627775) +#define INT_LEAST40_MIN INT40_MIN +#define INT_LEAST40_MAX INT40_MAX +#define UINT_LEAST40_MAX UINT40_MAX +#define INT_FAST40_MIN INT40_MIN +#define INT_FAST40_MAX INT40_MAX +#define UINT_FAST40_MAX UINT40_MAX + +#undef __INT_LEAST32_MIN +#define __INT_LEAST32_MIN INT40_MIN +#undef __INT_LEAST32_MAX +#define __INT_LEAST32_MAX INT40_MAX +#undef __UINT_LEAST32_MAX +#define __UINT_LEAST32_MAX UINT40_MAX +#undef __INT_LEAST16_MIN +#define __INT_LEAST16_MIN INT40_MIN +#undef __INT_LEAST16_MAX +#define __INT_LEAST16_MAX INT40_MAX +#undef __UINT_LEAST16_MAX +#define __UINT_LEAST16_MAX UINT40_MAX +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT40_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT40_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT40_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT40_WIDTH 40 +#define INT40_WIDTH UINT40_WIDTH +#define UINT_LEAST40_WIDTH UINT40_WIDTH +#define INT_LEAST40_WIDTH UINT_LEAST40_WIDTH +#define UINT_FAST40_WIDTH UINT40_WIDTH +#define INT_FAST40_WIDTH UINT_FAST40_WIDTH +#undef __UINT_LEAST32_WIDTH +#define __UINT_LEAST32_WIDTH UINT40_WIDTH +#undef __UINT_LEAST16_WIDTH +#define __UINT_LEAST16_WIDTH UINT40_WIDTH +#undef __UINT_LEAST8_WIDTH +#define __UINT_LEAST8_WIDTH UINT40_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT40_TYPE__ */ + +#ifdef __INT32_TYPE__ +#define INT32_MAX INT32_C(2147483647) +#define INT32_MIN (-INT32_C(2147483647) - 1) +#define UINT32_MAX UINT32_C(4294967295) + +#undef __INT_LEAST32_MIN +#define __INT_LEAST32_MIN INT32_MIN +#undef __INT_LEAST32_MAX +#define __INT_LEAST32_MAX INT32_MAX +#undef __UINT_LEAST32_MAX +#define __UINT_LEAST32_MAX UINT32_MAX +#undef __INT_LEAST16_MIN +#define __INT_LEAST16_MIN INT32_MIN +#undef __INT_LEAST16_MAX +#define __INT_LEAST16_MAX INT32_MAX +#undef __UINT_LEAST16_MAX +#define __UINT_LEAST16_MAX UINT32_MAX +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT32_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT32_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT32_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT32_WIDTH 32 +#define INT32_WIDTH UINT32_WIDTH +#undef __UINT_LEAST32_WIDTH +#define __UINT_LEAST32_WIDTH UINT32_WIDTH +#undef __UINT_LEAST16_WIDTH +#define __UINT_LEAST16_WIDTH UINT32_WIDTH +#undef __UINT_LEAST8_WIDTH +#define __UINT_LEAST8_WIDTH UINT32_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT32_TYPE__ */ + +#ifdef __INT_LEAST32_MIN +#define INT_LEAST32_MIN __INT_LEAST32_MIN +#define INT_LEAST32_MAX __INT_LEAST32_MAX +#define UINT_LEAST32_MAX __UINT_LEAST32_MAX +#define INT_FAST32_MIN __INT_LEAST32_MIN +#define INT_FAST32_MAX __INT_LEAST32_MAX +#define UINT_FAST32_MAX __UINT_LEAST32_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT_LEAST32_WIDTH __UINT_LEAST32_WIDTH +#define INT_LEAST32_WIDTH UINT_LEAST32_WIDTH +#define UINT_FAST32_WIDTH __UINT_LEAST32_WIDTH +#define INT_FAST32_WIDTH UINT_FAST32_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT_LEAST32_MIN */ + +#ifdef __INT24_TYPE__ +#define INT24_MAX INT24_C(8388607) +#define INT24_MIN (-INT24_C(8388607) - 1) +#define UINT24_MAX UINT24_C(16777215) +#define INT_LEAST24_MIN INT24_MIN +#define INT_LEAST24_MAX INT24_MAX +#define UINT_LEAST24_MAX UINT24_MAX +#define INT_FAST24_MIN INT24_MIN +#define INT_FAST24_MAX INT24_MAX +#define UINT_FAST24_MAX UINT24_MAX + +#undef __INT_LEAST16_MIN +#define __INT_LEAST16_MIN INT24_MIN +#undef __INT_LEAST16_MAX +#define __INT_LEAST16_MAX INT24_MAX +#undef __UINT_LEAST16_MAX +#define __UINT_LEAST16_MAX UINT24_MAX +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT24_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT24_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT24_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT24_WIDTH 24 +#define INT24_WIDTH UINT24_WIDTH +#define UINT_LEAST24_WIDTH UINT24_WIDTH +#define INT_LEAST24_WIDTH UINT_LEAST24_WIDTH +#define UINT_FAST24_WIDTH UINT24_WIDTH +#define INT_FAST24_WIDTH UINT_FAST24_WIDTH +#undef __UINT_LEAST16_WIDTH +#define __UINT_LEAST16_WIDTH UINT24_WIDTH +#undef __UINT_LEAST8_WIDTH +#define __UINT_LEAST8_WIDTH UINT24_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT24_TYPE__ */ + +#ifdef __INT16_TYPE__ +#define INT16_MAX INT16_C(32767) +#define INT16_MIN (-INT16_C(32767) - 1) +#define UINT16_MAX UINT16_C(65535) + +#undef __INT_LEAST16_MIN +#define __INT_LEAST16_MIN INT16_MIN +#undef __INT_LEAST16_MAX +#define __INT_LEAST16_MAX INT16_MAX +#undef __UINT_LEAST16_MAX +#define __UINT_LEAST16_MAX UINT16_MAX +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT16_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT16_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT16_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT16_WIDTH 16 +#define INT16_WIDTH UINT16_WIDTH +#undef __UINT_LEAST16_WIDTH +#define __UINT_LEAST16_WIDTH UINT16_WIDTH +#undef __UINT_LEAST8_WIDTH +#define __UINT_LEAST8_WIDTH UINT16_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT16_TYPE__ */ + +#ifdef __INT_LEAST16_MIN +#define INT_LEAST16_MIN __INT_LEAST16_MIN +#define INT_LEAST16_MAX __INT_LEAST16_MAX +#define UINT_LEAST16_MAX __UINT_LEAST16_MAX +#define INT_FAST16_MIN __INT_LEAST16_MIN +#define INT_FAST16_MAX __INT_LEAST16_MAX +#define UINT_FAST16_MAX __UINT_LEAST16_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT_LEAST16_WIDTH __UINT_LEAST16_WIDTH +#define INT_LEAST16_WIDTH UINT_LEAST16_WIDTH +#define UINT_FAST16_WIDTH __UINT_LEAST16_WIDTH +#define INT_FAST16_WIDTH UINT_FAST16_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT_LEAST16_MIN */ + +#ifdef __INT8_TYPE__ +#define INT8_MAX INT8_C(127) +#define INT8_MIN (-INT8_C(127) - 1) +#define UINT8_MAX UINT8_C(255) + +#undef __INT_LEAST8_MIN +#define __INT_LEAST8_MIN INT8_MIN +#undef __INT_LEAST8_MAX +#define __INT_LEAST8_MAX INT8_MAX +#undef __UINT_LEAST8_MAX +#define __UINT_LEAST8_MAX UINT8_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT8_WIDTH 8 +#define INT8_WIDTH UINT8_WIDTH +#undef __UINT_LEAST8_WIDTH +#define __UINT_LEAST8_WIDTH UINT8_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT8_TYPE__ */ + +#ifdef __INT_LEAST8_MIN +#define INT_LEAST8_MIN __INT_LEAST8_MIN +#define INT_LEAST8_MAX __INT_LEAST8_MAX +#define UINT_LEAST8_MAX __UINT_LEAST8_MAX +#define INT_FAST8_MIN __INT_LEAST8_MIN +#define INT_FAST8_MAX __INT_LEAST8_MAX +#define UINT_FAST8_MAX __UINT_LEAST8_MAX + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define UINT_LEAST8_WIDTH __UINT_LEAST8_WIDTH +#define INT_LEAST8_WIDTH UINT_LEAST8_WIDTH +#define UINT_FAST8_WIDTH __UINT_LEAST8_WIDTH +#define INT_FAST8_WIDTH UINT_FAST8_WIDTH +#endif /* __STDC_VERSION__ */ +#endif /* __INT_LEAST8_MIN */ + +/* Some utility macros */ +#define __INTN_MIN(n) __stdint_join3(INT, n, _MIN) +#define __INTN_MAX(n) __stdint_join3(INT, n, _MAX) +#define __UINTN_MAX(n) __stdint_join3(UINT, n, _MAX) +#define __INTN_C(n, v) __stdint_join3(INT, n, _C(v)) +#define __UINTN_C(n, v) __stdint_join3(UINT, n, _C(v)) + +/* C99 7.18.2.4 Limits of integer types capable of holding object pointers. */ +/* C99 7.18.3 Limits of other integer types. */ + +#define INTPTR_MIN (-__INTPTR_MAX__ - 1) +#define INTPTR_MAX __INTPTR_MAX__ +#define UINTPTR_MAX __UINTPTR_MAX__ +#define PTRDIFF_MIN (-__PTRDIFF_MAX__ - 1) +#define PTRDIFF_MAX __PTRDIFF_MAX__ +#define SIZE_MAX __SIZE_MAX__ + +/* C23 7.22.2.4 Width of integer types capable of holding object pointers. */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +/* NB: The C standard requires that these be the same value, but the compiler + exposes separate internal width macros. */ +#define INTPTR_WIDTH __INTPTR_WIDTH__ +#define UINTPTR_WIDTH __UINTPTR_WIDTH__ +#endif + +/* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__ + * is enabled. */ +#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 +#define RSIZE_MAX (SIZE_MAX >> 1) +#endif + +/* C99 7.18.2.5 Limits of greatest-width integer types. */ +#define INTMAX_MIN (-__INTMAX_MAX__ - 1) +#define INTMAX_MAX __INTMAX_MAX__ +#define UINTMAX_MAX __UINTMAX_MAX__ + +/* C23 7.22.2.5 Width of greatest-width integer types. */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +/* NB: The C standard requires that these be the same value, but the compiler + exposes separate internal width macros. */ +#define INTMAX_WIDTH __INTMAX_WIDTH__ +#define UINTMAX_WIDTH __UINTMAX_WIDTH__ +#endif + +/* C99 7.18.3 Limits of other integer types. */ +#define SIG_ATOMIC_MIN __INTN_MIN(__SIG_ATOMIC_WIDTH__) +#define SIG_ATOMIC_MAX __INTN_MAX(__SIG_ATOMIC_WIDTH__) +#ifdef __WINT_UNSIGNED__ +#define WINT_MIN __UINTN_C(__WINT_WIDTH__, 0) +#define WINT_MAX __UINTN_MAX(__WINT_WIDTH__) +#else +#define WINT_MIN __INTN_MIN(__WINT_WIDTH__) +#define WINT_MAX __INTN_MAX(__WINT_WIDTH__) +#endif + +#ifndef WCHAR_MAX +#define WCHAR_MAX __WCHAR_MAX__ +#endif +#ifndef WCHAR_MIN +#if __WCHAR_MAX__ == __INTN_MAX(__WCHAR_WIDTH__) +#define WCHAR_MIN __INTN_MIN(__WCHAR_WIDTH__) +#else +#define WCHAR_MIN __UINTN_C(__WCHAR_WIDTH__, 0) +#endif +#endif + +/* 7.18.4.2 Macros for greatest-width integer constants. */ +#define INTMAX_C(v) __int_c(v, __INTMAX_C_SUFFIX__) +#define UINTMAX_C(v) __int_c(v, __UINTMAX_C_SUFFIX__) + +/* C23 7.22.3.x Width of other integer types. */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L +#define PTRDIFF_WIDTH __PTRDIFF_WIDTH__ +#define SIG_ATOMIC_WIDTH __SIG_ATOMIC_WIDTH__ +#define SIZE_WIDTH __SIZE_WIDTH__ +#define WCHAR_WIDTH __WCHAR_WIDTH__ +#define WINT_WIDTH __WINT_WIDTH__ +#endif +#endif // LLVM_LIBC_MACROS_STDINT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/stdio-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/stdio-macros.h new file mode 100644 index 000000000000..96f0e6933ade --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/stdio-macros.h @@ -0,0 +1,58 @@ +//===-- Macros defined in stdio.h header file -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_STDIO_MACROS_H +#define LLVM_LIBC_MACROS_STDIO_MACROS_H + +#include "../llvm-libc-types/FILE.h" + +#ifdef __cplusplus +extern "C" FILE *stdin; +extern "C" FILE *stdout; +extern "C" FILE *stderr; +#else +extern FILE *stdin; +extern FILE *stdout; +extern FILE *stderr; +#endif + +#ifndef stdin +#define stdin stdin +#endif + +#ifndef stdout +#define stdout stdout +#endif + +#ifndef stderr +#define stderr stderr +#endif + +#ifndef EOF +#define EOF (-1) +#endif + +#define BUFSIZ 1024 + +#define _IONBF 2 +#define _IOLBF 1 +#define _IOFBF 0 + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#endif // LLVM_LIBC_MACROS_STDIO_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/stdlib-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/stdlib-macros.h new file mode 100644 index 000000000000..2565c76be3c5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/stdlib-macros.h @@ -0,0 +1,27 @@ +//===-- Definition of macros to be used with stdlib functions ----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_STDLIB_MACROS_H +#define LLVM_LIBC_MACROS_STDLIB_MACROS_H + +#ifndef NULL +#define __need_NULL +#include <stddef.h> +#endif // NULL + +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 + +#ifndef MB_CUR_MAX +// We only support the "C" locale right now, so this is a constant byte. +#define MB_CUR_MAX 1 +#endif // MB_CUR_MAX + +#define RAND_MAX 2147483647 + +#endif // LLVM_LIBC_MACROS_STDLIB_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-auxv-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-auxv-macros.h new file mode 100644 index 000000000000..2dcaa2f1a8ee --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-auxv-macros.h @@ -0,0 +1,43 @@ +//===-- Macros defined in sys/auxv.h header file --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_AUXV_MACROS_H +#define LLVM_LIBC_MACROS_SYS_AUXV_MACROS_H + +// Macros defining the aux vector indexes. +#define AT_NULL 0 +#define AT_IGNORE 1 +#define AT_EXECFD 2 +#define AT_PHDR 3 +#define AT_PHENT 4 +#define AT_PHNUM 5 +#define AT_PAGESZ 6 +#define AT_BASE 7 +#define AT_FLAGS 8 +#define AT_ENTRY 9 +#define AT_NOTELF 10 +#define AT_UID 11 +#define AT_EUID 12 +#define AT_GID 13 +#define AT_EGID 14 +#define AT_PLATFORM 15 +#define AT_HWCAP 16 +#define AT_CLKTCK 17 + +#define AT_SECURE 23 +#define AT_BASE_PLATFORM 24 +#define AT_RANDOM 25 +#define AT_HWCAP2 26 + +#define AT_EXECFN 31 + +#ifndef AT_MINSIGSTKSZ +#define AT_MINSIGSTKSZ 51 +#endif + +#endif // LLVM_LIBC_MACROS_SYS_AUXV_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-epoll-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-epoll-macros.h new file mode 100644 index 000000000000..8212df252b8e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-epoll-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/epoll.h header file -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_EPOLL_MACROS_H +#define LLVM_LIBC_MACROS_SYS_EPOLL_MACROS_H + +#ifdef __linux__ +#include "linux/sys-epoll-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_EPOLL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-ioctl-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-ioctl-macros.h new file mode 100644 index 000000000000..4a5f9651231f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-ioctl-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/ioctl.h header file -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_IOCTL_MACROS_H +#define LLVM_LIBC_MACROS_SYS_IOCTL_MACROS_H + +#ifdef __linux__ +#include "linux/sys-ioctl-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_IOCTL_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-mman-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-mman-macros.h new file mode 100644 index 000000000000..a6dc6d96b5b7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-mman-macros.h @@ -0,0 +1,48 @@ +//===-- Macros defined in sys/mman.h header file --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_MMAN_MACROS_H +#define LLVM_LIBC_MACROS_SYS_MMAN_MACROS_H + +// Use definitions from <linux/mman.h> to dispatch arch-specific flag values. +// For example, MCL_CURRENT/MCL_FUTURE/MCL_ONFAULT are different on different +// architectures. +#if __has_include(<linux/mman.h>) +#include <linux/mman.h> +#else +#error "cannot use <sys/mman.h> without proper system headers." +#endif + +// Some posix standard flags may not be defined in system headers. +// Posix mmap flags. +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)-1) +#endif + +// Posix memory advise flags. (posix_madvise) +#ifndef POSIX_MADV_NORMAL +#define POSIX_MADV_NORMAL MADV_NORMAL +#endif + +#ifndef POSIX_MADV_SEQUENTIAL +#define POSIX_MADV_SEQUENTIAL MADV_SEQUENTIAL +#endif + +#ifndef POSIX_MADV_RANDOM +#define POSIX_MADV_RANDOM MADV_RANDOM +#endif + +#ifndef POSIX_MADV_WILLNEED +#define POSIX_MADV_WILLNEED MADV_WILLNEED +#endif + +#ifndef POSIX_MADV_DONTNEED +#define POSIX_MADV_DONTNEED MADV_DONTNEED +#endif + +#endif // LLVM_LIBC_MACROS_SYS_MMAN_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-queue-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-queue-macros.h new file mode 100644 index 000000000000..21e80f42a91d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-queue-macros.h @@ -0,0 +1,262 @@ +//===-- Macros defined in sys/queue.h header file -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_QUEUE_MACROS_H +#define LLVM_LIBC_MACROS_SYS_QUEUE_MACROS_H + +#include "containerof-macro.h" +#include "null-macro.h" + +#ifdef __cplusplus +#define QUEUE_TYPEOF(type) type +#else +#define QUEUE_TYPEOF(type) struct type +#endif + +// Singly-linked list definitions. + +#define SLIST_HEAD(name, type) \ + struct name { \ + struct type *slh_first; \ + } + +#define SLIST_CLASS_HEAD(name, type) \ + struct name { \ + class type *slh_first; \ + } + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ + struct { \ + struct type *next; \ + } + +#define SLIST_CLASS_ENTRY(type) \ + struct { \ + class type *next; \ + } + +// Singly-linked list access methods. + +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) +#define SLIST_FIRST(head) ((head)->slh_first) +#define SLIST_NEXT(elem, field) ((elem)->field.next) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST(head); (var); (var) = SLIST_NEXT(var, field)) + +#define SLIST_FOREACH_FROM(var, head, field) \ + if (!(var)) \ + (var) = SLIST_FIRST(head); \ + for (; (var); (var) = SLIST_NEXT(var, field)) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST(head); \ + (var) && ((tvar) = SLIST_NEXT(var, field), 1); (var) = (tvar)) + +#define SLIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + if (!(var)) \ + (var) = SLIST_FIRST(head); \ + for (; (var) && ((tvar) = SLIST_NEXT(var, field), 1); (var) = (tvar)) + +// Singly-linked list functions. + +#define SLIST_CONCAT(head1, head2, type, field) \ + do { \ + if (SLIST_EMPTY(head1)) { \ + if ((SLIST_FIRST(head1) = SLIST_FIRST(head2)) != NULL) \ + SLIST_INIT(head2); \ + } else if (!SLIST_EMPTY(head2)) { \ + QUEUE_TYPEOF(type) *cur = SLIST_FIRST(head1); \ + while (SLIST_NEXT(cur, field) != NULL) \ + cur = SLIST_NEXT(cur, field); \ + SLIST_NEXT(cur, field) = SLIST_FIRST(head2); \ + SLIST_INIT(head2); \ + } \ + } while (0) + +#define SLIST_INIT(head) \ + do { \ + SLIST_FIRST(head) = NULL; \ + } while (0) + +#define SLIST_INSERT_AFTER(slistelem, elem, field) \ + do { \ + SLIST_NEXT(elem, field) = SLIST_NEXT(slistelem, field); \ + SLIST_NEXT(slistelem, field) = (elem); \ + } while (0) + +#define SLIST_INSERT_HEAD(head, elem, field) \ + do { \ + SLIST_NEXT(elem, field) = SLIST_FIRST(head); \ + SLIST_FIRST(head) = (elem); \ + } while (0) + +#define SLIST_REMOVE(head, elem, type, field) \ + do { \ + if (SLIST_FIRST(head) == (elem)) { \ + SLIST_REMOVE_HEAD(head, field); \ + } else { \ + QUEUE_TYPEOF(type) *cur = SLIST_FIRST(head); \ + while (SLIST_NEXT(cur, field) != (elem)) \ + cur = SLIST_NEXT(cur, field); \ + SLIST_REMOVE_AFTER(cur, field); \ + } \ + } while (0) + +#define SLIST_REMOVE_AFTER(elem, field) \ + do { \ + SLIST_NEXT(elem, field) = SLIST_NEXT(SLIST_NEXT(elem, field), field); \ + } while (0) + +#define SLIST_REMOVE_HEAD(head, field) \ + do { \ + SLIST_FIRST(head) = SLIST_NEXT(SLIST_FIRST(head), field); \ + } while (0) + +#define SLIST_SWAP(head1, head2, type) \ + do { \ + QUEUE_TYPEOF(type) *first = SLIST_FIRST(head1); \ + SLIST_FIRST(head1) = SLIST_FIRST(head2); \ + SLIST_FIRST(head2) = first; \ + } while (0) + +// Singly-linked tail queue definitions. + +#define STAILQ_HEAD(name, type) \ + struct name { \ + struct type *stqh_first; \ + struct type **stqh_last; \ + } + +#define STAILQ_CLASS_HEAD(name, type) \ + struct name { \ + class type *stqh_first; \ + class type **stqh_last; \ + } + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ + struct { \ + struct type *next; \ + } + +#define STAILQ_CLASS_ENTRY(type) \ + struct { \ + class type *next; \ + } + +// Singly-linked tail queue access methods. + +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) +#define STAILQ_FIRST(head) ((head)->stqh_first) +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY(head) \ + ? NULL \ + : __containerof((head)->stqh_last, QUEUE_TYPEOF(type), field.next)) +#define STAILQ_NEXT(elem, field) ((elem)->field.next) + +#define STAILQ_FOREACH(var, head, field) \ + for ((var) = STAILQ_FIRST(head); (var); (var) = STAILQ_NEXT(var, field)) + +#define STAILQ_FOREACH_FROM(var, head, field) \ + if (!(var)) \ + (var) = STAILQ_FIRST(head); \ + for (; (var); (var) = STAILQ_NEXT(var, field)) + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST(head); \ + (var) && ((tvar) = STAILQ_NEXT(var, field), 1); (var) = (tvar)) + +#define STAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + if (!(var)) \ + (var) = STAILQ_FIRST(head); \ + for (; (var) && ((tvar) = STAILQ_NEXT(var, field), 1); (var) = (tvar)) + +// Singly-linked tail queue functions. + +#define STAILQ_CONCAT(head1, head2, type, field) \ + do { \ + if (!STAILQ_EMPTY(head2)) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT(head2); \ + } \ + } while (0) + +#define STAILQ_INIT(head) \ + do { \ + STAILQ_FIRST(head) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST(head); \ + } while (0) + +#define STAILQ_INSERT_AFTER(head, listelem, elem, field) \ + do { \ + if ((STAILQ_NEXT(elem, field) = STAILQ_NEXT(listelem, field)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT(elem, field); \ + STAILQ_NEXT(listelem, field) = (elem); \ + } while (0) + +#define STAILQ_INSERT_HEAD(head, elem, field) \ + do { \ + if ((STAILQ_NEXT(elem, field) = STAILQ_FIRST(head)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT(elem, field); \ + STAILQ_FIRST(head) = (elem); \ + } while (0) + +#define STAILQ_INSERT_TAIL(head, elem, field) \ + do { \ + STAILQ_NEXT(elem, field) = NULL; \ + *(head)->stqh_last = (elem); \ + (head)->stqh_last = &STAILQ_NEXT(elem, field); \ + } while (0) + +#define STAILQ_REMOVE(head, elem, type, field) \ + do { \ + if (STAILQ_FIRST(head) == (elem)) { \ + STAILQ_REMOVE_HEAD(head, field); \ + } else { \ + QUEUE_TYPEOF(type) *cur = STAILQ_FIRST(head); \ + while (STAILQ_NEXT(cur, field) != (elem)) \ + cur = STAILQ_NEXT(cur, field); \ + STAILQ_REMOVE_AFTER(head, cur, field); \ + } \ + } while (0) + +#define STAILQ_REMOVE_AFTER(head, elem, field) \ + do { \ + if ((STAILQ_NEXT(elem, field) = \ + STAILQ_NEXT(STAILQ_NEXT(elem, field), field)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT(elem, field); \ + } while (0) + +#define STAILQ_REMOVE_HEAD(head, field) \ + do { \ + if ((STAILQ_FIRST(head) = STAILQ_NEXT(STAILQ_FIRST(head), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST(head); \ + } while (0) + +#define STAILQ_SWAP(head1, head2, type) \ + do { \ + QUEUE_TYPEOF(type) *first = STAILQ_FIRST(head1); \ + QUEUE_TYPEOF(type) **last = (head1)->stqh_last; \ + STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_FIRST(head2) = first; \ + (head2)->stqh_last = last; \ + if (STAILQ_EMPTY(head1)) \ + (head1)->stqh_last = &STAILQ_FIRST(head1); \ + if (STAILQ_EMPTY(head2)) \ + (head2)->stqh_last = &STAILQ_FIRST(head2); \ + } while (0) + +#endif // LLVM_LIBC_MACROS_SYS_QUEUE_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-random-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-random-macros.h new file mode 100644 index 000000000000..9b1a8edb4f79 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-random-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/random.h header file ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_RANDOM_MACROS_H +#define LLVM_LIBC_MACROS_SYS_RANDOM_MACROS_H + +#ifdef __linux__ +#include "linux/sys-random-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_RANDOM_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-resource-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-resource-macros.h new file mode 100644 index 000000000000..1ce01cdd1e83 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-resource-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/resource.h header file ----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_RESOURCE_MACROS_H +#define LLVM_LIBC_MACROS_SYS_RESOURCE_MACROS_H + +#ifdef __linux__ +#include "linux/sys-resource-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_RESOURCE_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-select-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-select-macros.h new file mode 100644 index 000000000000..d54e5300d12e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-select-macros.h @@ -0,0 +1,35 @@ +//===-- Macros defined in sys/select.h header file ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_SELECT_MACROS_H +#define LLVM_LIBC_MACROS_SYS_SELECT_MACROS_H + +#define FD_SETSIZE 1024 +#define __FD_SET_WORD_TYPE unsigned long +#define __FD_SET_WORD_SIZE (sizeof(__FD_SET_WORD_TYPE) * 8) +#define __FD_SET_ARRAYSIZE (FD_SETSIZE / __FD_SET_WORD_SIZE) + +#define FD_ZERO(set) \ + do { \ + unsigned i; \ + for (i = 0; i < __FD_SET_ARRAYSIZE; ++i) \ + (set)->__set[i] = 0; \ + } while (0) + +#define __FD_WORD(fd) ((fd) / __FD_SET_WORD_SIZE) +#define __FD_MASK(fd) \ + ((__FD_SET_WORD_TYPE)1) << ((__FD_SET_WORD_TYPE)((fd) % __FD_SET_WORD_SIZE)) + +#define FD_CLR(fd, set) (void)((set)->__set[__FD_WORD(fd)] &= ~__FD_MASK(fd)) + +#define FD_SET(fd, set) (void)((set)->__set[__FD_WORD(fd)] |= __FD_MASK(fd)) + +#define FD_ISSET(fd, set) \ + (int)(((set)->__set[__FD_WORD(fd)] & __FD_MASK(fd)) != 0) + +#endif // LLVM_LIBC_MACROS_SYS_SELECT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-socket-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-socket-macros.h new file mode 100644 index 000000000000..6b1d28070b43 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-socket-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/socket.h header file ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_SOCKET_MACROS_H +#define LLVM_LIBC_MACROS_SYS_SOCKET_MACROS_H + +#ifdef __linux__ +#include "linux/sys-socket-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_SOCKET_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-stat-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-stat-macros.h new file mode 100644 index 000000000000..c47c9612705e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-stat-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/stat.h header file --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_STAT_MACROS_H +#define LLVM_LIBC_MACROS_SYS_STAT_MACROS_H + +#ifdef __linux__ +#include "linux/sys-stat-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_STAT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-time-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-time-macros.h new file mode 100644 index 000000000000..36d7d5adafc9 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-time-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/time.h header file --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_TIME_MACROS_H +#define LLVM_LIBC_MACROS_SYS_TIME_MACROS_H + +#ifdef __linux__ +#include "linux/sys-time-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_TIME_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sys-wait-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-wait-macros.h new file mode 100644 index 000000000000..c418a7930b69 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sys-wait-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in sys/wait.h header file --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_SYS_WAIT_MACROS_H +#define LLVM_LIBC_MACROS_SYS_WAIT_MACROS_H + +#ifdef __linux__ +#include "linux/sys-wait-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_SYS_WAIT_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/sysexits-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/sysexits-macros.h new file mode 100644 index 000000000000..52f838788632 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/sysexits-macros.h @@ -0,0 +1,29 @@ +//===-- Macros defined in sysexits.h header file --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef SYSEXITS_MACROS_H +#define SYSEXITS_MACROS_H + +#define EX_OK 0 // Successful termination +#define EX_USAGE 64 // Command line usage error +#define EX_DATAERR 65 // Data format error +#define EX_NOINPUT 66 // Cannot open input +#define EX_NOUSER 67 // Addressee unknown +#define EX_NOHOST 68 // Host name unknown +#define EX_UNAVAILABLE 69 // Service unavailable +#define EX_SOFTWARE 70 // Internal software error +#define EX_OSERR 71 // Operating system error +#define EX_OSFILE 72 // System file error +#define EX_CANTCREAT 73 // Cannot create (user) output file +#define EX_IOERR 74 // Input/output error +#define EX_TEMPFAIL 75 // Temporary failure, try again +#define EX_PROTOCOL 76 // Remote protocol error +#define EX_NOPERM 77 // Permission denied +#define EX_CONFIG 78 // Configuration error + +#endif // SYSEXITS_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/termios-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/termios-macros.h new file mode 100644 index 000000000000..1067e8a57474 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/termios-macros.h @@ -0,0 +1,16 @@ +//===-- Macros defined in termios.h header file ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_TERMIOS_MACROS_H +#define LLVM_LIBC_MACROS_TERMIOS_MACROS_H + +#ifdef __linux__ +#include "linux/termios-macros.h" +#endif + +#endif // LLVM_LIBC_MACROS_TERMIOS_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/time-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/time-macros.h new file mode 100644 index 000000000000..30e0a310a548 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/time-macros.h @@ -0,0 +1,21 @@ +#ifndef LLVM_LIBC_MACROS_TIME_MACROS_H +#define LLVM_LIBC_MACROS_TIME_MACROS_H + +#if defined(__AMDGPU__) || defined(__NVPTX__) +#include "gpu/time-macros.h" +#elif defined(__linux__) +#include "linux/time-macros.h" +#elif defined(__ELF__) +#include "baremetal/time-macros.h" +#else +#define CLOCKS_PER_SEC 1000000 +#endif + +#define CLK_TCK CLOCKS_PER_SEC + +#define TIME_UTC 1 +#define TIME_MONOTONIC 2 +#define TIME_ACTIVE 3 +#define TIME_THREAD_ACTIVE 4 + +#endif // LLVM_LIBC_MACROS_TIME_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/unistd-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/unistd-macros.h new file mode 100644 index 000000000000..e09dada04a19 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/unistd-macros.h @@ -0,0 +1,12 @@ +#ifndef LLVM_LIBC_MACROS_UNISTD_MACROS_H +#define LLVM_LIBC_MACROS_UNISTD_MACROS_H + +#ifdef __linux__ +#include "linux/unistd-macros.h" +#endif + +#define STDIN_FILENO 0 +#define STDOUT_FILENO 1 +#define STDERR_FILENO 2 + +#endif // LLVM_LIBC_MACROS_UNISTD_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/wchar-macros.h b/contrib/llvm-project/libc/include/llvm-libc-macros/wchar-macros.h new file mode 100644 index 000000000000..2a0cabd6133a --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/wchar-macros.h @@ -0,0 +1,18 @@ +//===-- Macros defined in wchar.h header file -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_WCHAR_MACROS_H +#define LLVM_LIBC_MACROS_WCHAR_MACROS_H + +#include "../llvm-libc-types/wint_t.h" + +#ifndef WEOF +#define WEOF ((wint_t)(0xffffffffu)) +#endif + +#endif // LLVM_LIBC_MACROS_WCHAR_MACROS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-macros/windows/time-macros-ext.h b/contrib/llvm-project/libc/include/llvm-libc-macros/windows/time-macros-ext.h new file mode 100644 index 000000000000..71d914b45187 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-macros/windows/time-macros-ext.h @@ -0,0 +1,17 @@ +//===-- Windows Time Macros Extension -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H +#define LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H + +#define CLOCK_MONOTONIC 0 +#define CLOCK_REALTIME 1 +#define CLOCK_PROCESS_CPUTIME_ID 2 +#define CLOCK_THREAD_CPUTIME_ID 3 + +#endif // LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/ACTION.h b/contrib/llvm-project/libc/include/llvm-libc-types/ACTION.h new file mode 100644 index 000000000000..1ddce208df1c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/ACTION.h @@ -0,0 +1,14 @@ +//===-- Definition of ACTION type -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_ACTION_H +#define LLVM_LIBC_TYPES_ACTION_H + +typedef enum { FIND, ENTER } ACTION; + +#endif // LLVM_LIBC_TYPES_ACTION_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/DIR.h b/contrib/llvm-project/libc/include/llvm-libc-types/DIR.h new file mode 100644 index 000000000000..855446db6f53 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/DIR.h @@ -0,0 +1,14 @@ +//===-- Definition of the type DIR ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_DIR_H +#define LLVM_LIBC_TYPES_DIR_H + +typedef struct DIR DIR; + +#endif // LLVM_LIBC_TYPES_DIR_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_ALLOCATE_TYPE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_ALLOCATE_TYPE.h new file mode 100644 index 000000000000..90f23969678f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_ALLOCATE_TYPE.h @@ -0,0 +1,19 @@ +//===-- Definition of EFI_ALLOCATE_TYPE type ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_ALLOCATE_TYPE_H +#define LLVM_LIBC_TYPES_EFI_ALLOCATE_TYPE_H + +typedef enum { + AllocateAnyPages, + AllocateMaxAddress, + AllocateAddress, + MaxAllocateType +} EFI_ALLOCATE_TYPE; + +#endif // LLVM_LIBC_TYPES_EFI_ALLOCATE_TYPE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_BOOT_SERVICES.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_BOOT_SERVICES.h new file mode 100644 index 000000000000..8b7a6aadd7a2 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_BOOT_SERVICES.h @@ -0,0 +1,250 @@ +//===-- Definition of EFI_BOOT_SERVICES type ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_BOOT_SERVICES_H +#define LLVM_LIBC_TYPES_EFI_BOOT_SERVICES_H + +#include "../llvm-libc-macros/EFIAPI-macros.h" +#include "EFI_ALLOCATE_TYPE.h" +#include "EFI_DEVICE_PATH_PROTOCOL.h" +#include "EFI_EVENT.h" +#include "EFI_GUID.h" +#include "EFI_INTERFACE_TYPE.h" +#include "EFI_LOCATE_SEARCH_TYPE.h" +#include "EFI_MEMORY_DESCRIPTOR.h" +#include "EFI_MEMORY_TYPE.h" +#include "EFI_OPEN_PROTOCOL_INFORMATION_ENTRY.h" +#include "EFI_PHYSICAL_ADDRESS.h" +#include "EFI_STATUS.h" +#include "EFI_TABLE_HEADER.h" +#include "EFI_TIMER_DELAY.h" +#include "EFI_TPL.h" +#include "char16_t.h" +#include "size_t.h" + +#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 +#define EFI_BOOT_SERVICES_REVISION EFI_SPECIFICATION_VERSION + +typedef EFI_TPL(EFIAPI *EFI_RAISE_TPL)(EFI_TPL NewTpl); +typedef void(EFIAPI *EFI_RESTORE_TPL)(EFI_TPL OldTpl); + +typedef EFI_STATUS(EFIAPI *EFI_ALLOCATE_PAGES)(EFI_ALLOCATE_TYPE Type, + EFI_MEMORY_TYPE MemoryType, + size_t Pages, + EFI_PHYSICAL_ADDRESS *Memory); +typedef EFI_STATUS(EFIAPI *EFI_FREE_PAGES)(EFI_PHYSICAL_ADDRESS Memory, + size_t Pages); +typedef EFI_STATUS(EFIAPI *EFI_GET_MEMORY_MAP)(size_t *MemoryMapSize, + EFI_MEMORY_DESCRIPTOR *MemoryMap, + size_t *MapKey, + size_t *DescriptorSize, + uint32_t *DescriptorVersion); + +typedef EFI_STATUS(EFIAPI *EFI_ALLOCATE_POOL)(EFI_MEMORY_TYPE PoolType, + size_t Size, void **Buffer); +typedef EFI_STATUS(EFIAPI *EFI_FREE_POOL)(void *Buffer); + +typedef void(EFIAPI *EFI_EVENT_NOTIFY)(EFI_EVENT Event, void *Context); + +typedef EFI_STATUS(EFIAPI *EFI_CREATE_EVENT)(uint32_t Type, EFI_TPL NotifyTpl, + EFI_EVENT_NOTIFY NotifyFunction, + void *NotifyContext, + EFI_EVENT *Event); +typedef EFI_STATUS(EFIAPI *EFI_SET_TIMER)(EFI_EVENT Event, EFI_TIMER_DELAY Type, + uint64_t TriggerTime); +typedef EFI_STATUS(EFIAPI *EFI_WAIT_FOR_EVENT)(size_t NumberOfEvents, + EFI_EVENT *Event, size_t *Index); +typedef EFI_STATUS(EFIAPI *EFI_SIGNAL_EVENT)(EFI_EVENT Event); +typedef EFI_STATUS(EFIAPI *EFI_CLOSE_EVENT)(EFI_EVENT Event); +typedef EFI_STATUS(EFIAPI *EFI_CHECK_EVENT)(EFI_EVENT Event); + +typedef EFI_STATUS(EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE)( + EFI_HANDLE *Handle, EFI_GUID *Protocol, EFI_INTERFACE_TYPE InterfaceType, + void *Interface); +typedef EFI_STATUS(EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE)( + EFI_HANDLE Handle, EFI_GUID *Protocol, void *OldInterface, + void *NewInterface); +typedef EFI_STATUS(EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE)(EFI_HANDLE Handle, + EFI_GUID *Protocol, + void *Interface); + +typedef EFI_STATUS(EFIAPI *EFI_HANDLE_PROTOCOL)(EFI_HANDLE Handle, + EFI_GUID *Protocol, + void **Interface); +typedef EFI_STATUS(EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY)(EFI_GUID *Protocol, + EFI_EVENT Event, + void **Registration); + +typedef EFI_STATUS(EFIAPI *EFI_LOCATE_HANDLE)(EFI_LOCATE_SEARCH_TYPE SearchType, + EFI_GUID *Protocol, + void *SearchKey, + size_t *BufferSize, + EFI_HANDLE *Buffer); +typedef EFI_STATUS(EFIAPI *EFI_LOCATE_DEVICE_PATH)( + EFI_GUID *Protocol, EFI_DEVICE_PATH_PROTOCOL **DevicePath, + EFI_HANDLE *Device); + +typedef EFI_STATUS(EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE)(EFI_GUID *Guid, + void *Table); +typedef EFI_STATUS(EFIAPI *EFI_IMAGE_UNLOAD)(EFI_HANDLE ImageHandle); +typedef EFI_STATUS(EFIAPI *EFI_IMAGE_START)(EFI_HANDLE ImageHandle, + size_t *ExitDataSize, + char16_t **ExitData); + +typedef EFI_STATUS(EFIAPI *EFI_EXIT)(EFI_HANDLE ImageHandle, + EFI_STATUS ExitStatus, size_t ExitDataSize, + char16_t *ExitData); +typedef EFI_STATUS(EFIAPI *EFI_EXIT_BOOT_SERVICES)(EFI_HANDLE ImageHandle, + size_t MapKey); +typedef EFI_STATUS(EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT)(uint64_t *Count); +typedef EFI_STATUS(EFIAPI *EFI_STALL)(size_t Microseconds); +typedef EFI_STATUS(EFIAPI *EFI_SET_WATCHDOG_TIMER)(size_t Timeout, + uint64_t WatchdogCode, + size_t DataSize, + char16_t *WatchdogData); + +typedef EFI_STATUS(EFIAPI *EFI_CONNECT_CONTROLLER)( + EFI_HANDLE ControllerHandle, EFI_HANDLE *DriverImageHandle, + EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath, bool Recursive); + +typedef EFI_STATUS(EFIAPI *EFI_DISCONNECT_CONTROLLER)( + EFI_HANDLE ControllerHandle, EFI_HANDLE DriverImageHandle, + EFI_HANDLE ChildHandle); + +typedef EFI_STATUS(EFIAPI *EFI_OPEN_PROTOCOL)( + EFI_HANDLE Handle, EFI_GUID *Protocol, void **Interface, + EFI_HANDLE AgentHandle, EFI_HANDLE ControllerHandle, uint32_t Attributes); + +typedef EFI_STATUS(EFIAPI *EFI_CLOSE_PROTOCOL)(EFI_HANDLE Handle, + EFI_GUID *Protocol, + EFI_HANDLE AgentHandle, + EFI_HANDLE ControllerHandle); + +typedef EFI_STATUS(EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION)( + EFI_HANDLE Handle, EFI_GUID *Protocol, + EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer, size_t *EntryCount); + +typedef EFI_STATUS(EFIAPI *EFI_PROTOCOLS_PER_HANDLE)( + EFI_HANDLE Handle, EFI_GUID ***ProtocolBuffer, size_t *ProtocolBufferCount); + +typedef EFI_STATUS(EFIAPI *EFI_LOCATE_HANDLE_BUFFER)( + EFI_LOCATE_SEARCH_TYPE SearchType, EFI_GUID *Protocol, void *SearchKey, + size_t *NoHandles, EFI_HANDLE **Buffer); + +typedef EFI_STATUS(EFIAPI *EFI_LOCATE_PROTOCOL)(EFI_GUID *Protocol, + void *Registration, + void **Interface); + +typedef EFI_STATUS(EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES)( + EFI_HANDLE Handle, ...); +typedef EFI_STATUS(EFIAPI *EFI_CALCULATE_CRC32)(void *Data, size_t DataSize, + uint32_t *Crc32); + +typedef void(EFIAPI *EFI_COPY_MEM)(void *Destination, void *Source, + size_t Length); +typedef void(EFIAPI *EFI_SET_MEM)(void *Buffer, size_t Size, uint8_t Value); + +typedef EFI_STATUS(EFIAPI *EFI_CREATE_EVENT_EX)( + uint32_t Type, EFI_TPL NotifyTpl, EFI_EVENT_NOTIFY NotifyFunction, + const void *NotifyContext, const EFI_GUID *EventGroup, EFI_EVENT *Event); + +typedef struct { + EFI_TABLE_HEADER Hdr; + + // + // Task Priority Services + // + EFI_RAISE_TPL RaiseTPL; // EFI 1.0+ + EFI_RESTORE_TPL RestoreTPL; // EFI 1.0+ + + // + // Memory Services + // + EFI_ALLOCATE_PAGES AllocatePages; // EFI 1.0+ + EFI_FREE_PAGES FreePages; // EFI 1.0+ + EFI_GET_MEMORY_MAP GetMemoryMap; // EFI 1.0+ + EFI_ALLOCATE_POOL AllocatePool; // EFI 1.0+ + EFI_FREE_POOL FreePool; // EFI 1.0+ + + // + // Event & Timer Services + // + EFI_CREATE_EVENT CreateEvent; // EFI 1.0+ + EFI_SET_TIMER SetTimer; // EFI 1.0+ + EFI_WAIT_FOR_EVENT WaitForEvent; // EFI 1.0+ + EFI_SIGNAL_EVENT SignalEvent; // EFI 1.0+ + EFI_CLOSE_EVENT CloseEvent; // EFI 1.0+ + EFI_CHECK_EVENT CheckEvent; // EFI 1.0+ + + // + // Protocol Handler Services + // + EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface; // EFI 1.0+ + EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface; // EFI 1.0+ + EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface; // EFI 1.0+ + EFI_HANDLE_PROTOCOL HandleProtocol; // EFI 1.0+ + void *Reserved; // EFI 1.0+ + EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify; // EFI 1.0+ + EFI_LOCATE_HANDLE LocateHandle; // EFI 1.+ + EFI_LOCATE_DEVICE_PATH LocateDevicePath; // EFI 1.0+ + EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable; // EFI 1.0+ + + // + // Image Services + // + EFI_IMAGE_UNLOAD LoadImage; // EFI 1.0+ + EFI_IMAGE_START StartImage; // EFI 1.0+ + EFI_EXIT Exit; // EFI 1.0+ + EFI_IMAGE_UNLOAD UnloadImage; // EFI 1.0+ + EFI_EXIT_BOOT_SERVICES ExitBootServices; // EFI 1.0+ + + // + // Miscellaneous Services + // + EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount; // EFI 1.0+ + EFI_STALL Stall; // EFI 1.0+ + EFI_SET_WATCHDOG_TIMER SetWatchdogTimer; // EFI 1.0+ + + // + // DriverSupport Services + // + EFI_CONNECT_CONTROLLER ConnectController; // EFI 1.1 + EFI_DISCONNECT_CONTROLLER DisconnectController; // EFI 1.1+ + + // + // Open and Close Protocol Services + // + EFI_OPEN_PROTOCOL OpenProtocol; // EFI 1.1+ + EFI_CLOSE_PROTOCOL CloseProtocol; // EFI 1.1+ + EFI_OPEN_PROTOCOL_INFORMATION OpenProtocolInformation; // EFI 1.1+ + + // + // Library Services + // + EFI_PROTOCOLS_PER_HANDLE ProtocolsPerHandle; // EFI 1.1+ + EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer; // EFI 1.1+ + EFI_LOCATE_PROTOCOL LocateProtocol; // EFI 1.1+ + EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES + InstallMultipleProtocolInterfaces; // EFI 1.1+ + EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES + UninstallMultipleProtocolInterfaces; // EFI 1.1+* + + // + // 32-bit CRC Services + // + EFI_CALCULATE_CRC32 CalculateCrc32; // EFI 1.1+ + + // + // Miscellaneous Services + // + EFI_COPY_MEM CopyMem; // EFI 1.1+ + EFI_SET_MEM SetMem; // EFI 1.1+ + EFI_CREATE_EVENT_EX CreateEventEx; // UEFI 2.0+ +} EFI_BOOT_SERVICES; + +#endif // LLVM_LIBC_TYPES_EFI_BOOT_SERVICES_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_CAPSULE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_CAPSULE.h new file mode 100644 index 000000000000..c7440c9b03b7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_CAPSULE.h @@ -0,0 +1,26 @@ +//===-- Definition of EFI_CAPSULE type ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_CAPSULE_H +#define LLVM_LIBC_TYPES_EFI_CAPSULE_H + +#include "../llvm-libc-macros/stdint-macros.h" +#include "EFI_GUID.h" + +typedef struct { + EFI_GUID CapsuleGuid; + uint32_t HeaderSize; + uint32_t Flags; + uint32_t CapsuleImageSize; +} EFI_CAPSULE_HEADER; + +#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000 +#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000 +#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000 + +#endif // LLVM_LIBC_TYPES_EFI_CAPSULE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_CONFIGURATION_TABLE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_CONFIGURATION_TABLE.h new file mode 100644 index 000000000000..56cd3e4fbb58 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_CONFIGURATION_TABLE.h @@ -0,0 +1,19 @@ +//===-- Definition of EFI_CONFIGURATION_TABLE type ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_CONFIGURATION_TABLE_H +#define LLVM_LIBC_TYPES_EFI_CONFIGURATION_TABLE_H + +#include "EFI_GUID.h" + +typedef struct { + EFI_GUID VendorGuid; + void *VendorTable; +} EFI_CONFIGURATION_TABLE; + +#endif // LLVM_LIBC_TYPES_EFI_CONFIGURATION_TABLE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_DEVICE_PATH_PROTOCOL.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_DEVICE_PATH_PROTOCOL.h new file mode 100644 index 000000000000..f6a0b2e1f45c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_DEVICE_PATH_PROTOCOL.h @@ -0,0 +1,23 @@ +//===-- Definition of EFI_DEVICE_PATH_PROTOCOL type -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_DEVICE_PATH_PROTOCOL_H +#define LLVM_LIBC_TYPES_EFI_DEVICE_PATH_PROTOCOL_H + +#include "../llvm-libc-macros/stdint-macros.h" + +#define EFI_DEVICE_PATH_PROTOCOL_GUID \ + {0x09576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b}} + +typedef struct _EFI_DEVICE_PATH_PROTOCOL { + uint8_t Type; + uint8_t SubType; + uint8_t Length[2]; +} EFI_DEVICE_PATH_PROTOCOL; + +#endif // LLVM_LIBC_TYPES_EFI_DEVICE_PATH_PROTOCOL_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_EVENT.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_EVENT.h new file mode 100644 index 000000000000..938856b8e791 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_EVENT.h @@ -0,0 +1,21 @@ +//===-- Definition of EFI_EVENT type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_EVENT_H +#define LLVM_LIBC_TYPES_EFI_EVENT_H + +typedef void *EFI_EVENT; + +#define EVT_TIMER 0x80000000 +#define EVT_RUNTIME 0x40000000 +#define EVT_NOTIFY_WAIT 0x00000100 +#define EVT_NOTIFY_SIGNAL 0x00000200 +#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 +#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 + +#endif // LLVM_LIBC_TYPES_EFI_EVENT_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_GUID.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_GUID.h new file mode 100644 index 000000000000..b3530008384d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_GUID.h @@ -0,0 +1,21 @@ +//===-- Definition of EFI_GUID type -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_GUID_H +#define LLVM_LIBC_TYPES_EFI_GUID_H + +#include "../llvm-libc-macros/stdint-macros.h" + +typedef struct { + uint32_t Data1; + uint16_t Data2; + uint16_t Data3; + uint8_t Data4[8]; +} EFI_GUID; + +#endif // LLVM_LIBC_TYPES_EFI_GUID_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_HANDLE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_HANDLE.h new file mode 100644 index 000000000000..d4376dd24753 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_HANDLE.h @@ -0,0 +1,14 @@ +//===-- Definition of EFI_HANDLE type ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_HANDLE_H +#define LLVM_LIBC_TYPES_EFI_HANDLE_H + +typedef void *EFI_HANDLE; + +#endif // LLVM_LIBC_TYPES_EFI_HANDLE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_INTERFACE_TYPE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_INTERFACE_TYPE.h new file mode 100644 index 000000000000..d463c5381b3f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_INTERFACE_TYPE.h @@ -0,0 +1,16 @@ +//===-- Definition of EFI_INTERFACE_TYPE type -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_INTERFACE_TYPE_H +#define LLVM_LIBC_TYPES_EFI_INTERFACE_TYPE_H + +typedef enum { + EFI_NATIVE_INTERFACE, +} EFI_INTERFACE_TYPE; + +#endif // LLVM_LIBC_TYPES_EFI_INTERFACE_TYPE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_LOCATE_SEARCH_TYPE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_LOCATE_SEARCH_TYPE.h new file mode 100644 index 000000000000..3a8fd7bc3e77 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_LOCATE_SEARCH_TYPE.h @@ -0,0 +1,18 @@ +//===-- Definition of EFI_LOCATE_SEARCH_TYPE type -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_LOCATE_SEARCH_TYPE_H +#define LLVM_LIBC_TYPES_EFI_LOCATE_SEARCH_TYPE_H + +typedef enum { + AllHandles, + ByRegisterNotify, + ByProtocol, +} EFI_LOCATE_SEARCH_TYPE; + +#endif // LLVM_LIBC_TYPES_EFI_LOCATE_SEARCH_TYPE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_MEMORY_DESCRIPTOR.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_MEMORY_DESCRIPTOR.h new file mode 100644 index 000000000000..72d0579aef76 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_MEMORY_DESCRIPTOR.h @@ -0,0 +1,43 @@ +//===-- Definition of EFI_MEMORY_DESCRIPTOR type --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_MEMORY_DESCRIPTOR_H +#define LLVM_LIBC_TYPES_EFI_MEMORY_DESCRIPTOR_H + +#include "../llvm-libc-macros/stdint-macros.h" +#include "EFI_PHYSICAL_ADDRESS.h" +#include "EFI_VIRTUAL_ADDRESS.h" + +#define EFI_MEMORY_DESCRIPTOR_VERSION 1 + +#define EFI_MEMORY_UC 0x0000000000000001 +#define EFI_MEMORY_WC 0x0000000000000002 +#define EFI_MEMORY_WT 0x0000000000000004 +#define EFI_MEMORY_WB 0x0000000000000008 +#define EFI_MEMORY_UCE 0x0000000000000010 +#define EFI_MEMORY_WP 0x0000000000001000 +#define EFI_MEMORY_RP 0x0000000000002000 +#define EFI_MEMORY_XP 0x0000000000004000 +#define EFI_MEMORY_NV 0x0000000000008000 +#define EFI_MEMORY_MORE_RELIABLE 0x0000000000010000 +#define EFI_MEMORY_RO 0x0000000000020000 +#define EFI_MEMORY_SP 0x0000000000040000 +#define EFI_MEMORY_CPU_CRYPTO 0x0000000000080000 +#define EFI_MEMORY_RUNTIME 0x8000000000000000 +#define EFI_MEMORY_ISA_VALID 0x4000000000000000 +#define EFI_MEMORY_ISA_MASK 0x0FFFF00000000000 + +typedef struct { + uint32_t Type; + EFI_PHYSICAL_ADDRESS PhysicalStart; + EFI_VIRTUAL_ADDRESS VirtualStart; + uint64_t NumberOfPages; + uint64_t Attribute; +} EFI_MEMORY_DESCRIPTOR; + +#endif // LLVM_LIBC_TYPES_EFI_MEMORY_DESCRIPTOR_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_MEMORY_TYPE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_MEMORY_TYPE.h new file mode 100644 index 000000000000..c8921cda2c38 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_MEMORY_TYPE.h @@ -0,0 +1,32 @@ +//===-- Definition of EFI_MEMORY_TYPE type --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_MEMORY_TYPE_H +#define LLVM_LIBC_TYPES_EFI_MEMORY_TYPE_H + +typedef enum { + EfiReservedMemoryType, + EfiLoaderCode, + EfiLoaderData, + EfiBootServicesCode, + EfiBootServicesData, + EfiRuntimeServicesCode, + EfiRuntimeServicesData, + EfiConventionalMemory, + EfiUnusableMemory, + EfiACPIReclaimMemory, + EfiACPIMemoryNVS, + EfiMemoryMappedIO, + EfiMemoryMappedIOPortSpace, + EfiPalCode, + EfiPersistentMemory, + EfiUnacceptedMemoryType, + EfiMaxMemoryType +} EFI_MEMORY_TYPE; + +#endif // LLVM_LIBC_TYPES_EFI_MEMORY_TYPE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_OPEN_PROTOCOL_INFORMATION_ENTRY.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_OPEN_PROTOCOL_INFORMATION_ENTRY.h new file mode 100644 index 000000000000..de0c59c139ef --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_OPEN_PROTOCOL_INFORMATION_ENTRY.h @@ -0,0 +1,22 @@ +//===-- Definition of EFI_OPEN_PROTOCOL_INFORMATION_ENTRY type ------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY_H +#define LLVM_LIBC_TYPES_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY_H + +#include "../llvm-libc-macros/stdint-macros.h" +#include "EFI_HANDLE.h" + +typedef struct { + EFI_HANDLE AgentHandle; + EFI_HANDLE ControllerHandle; + uint32_t Attributes; + uint32_t OpenCount; +} EFI_OPEN_PROTOCOL_INFORMATION_ENTRY; + +#endif // LLVM_LIBC_TYPES_EFI_OPEN_PROTOCOL_INFORMATION_ENTRY_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_PHYSICAL_ADDRESS.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_PHYSICAL_ADDRESS.h new file mode 100644 index 000000000000..8880ee66c0f8 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_PHYSICAL_ADDRESS.h @@ -0,0 +1,16 @@ +//===-- Definition of EFI_PHYSICAL_ADDRESS type ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_PHYSICAL_ADDRESS_H +#define LLVM_LIBC_TYPES_EFI_PHYSICAL_ADDRESS_H + +#include "../llvm-libc-macros/stdint-macros.h" + +typedef uint64_t EFI_PHYSICAL_ADDRESS; + +#endif // LLVM_LIBC_TYPES_EFI_PHYSICAL_ADDRESS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_RUNTIME_SERVICES.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_RUNTIME_SERVICES.h new file mode 100644 index 000000000000..8913118b0844 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_RUNTIME_SERVICES.h @@ -0,0 +1,137 @@ +//===-- Definition of EFI_RUNTIME_SERVICES type ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_RUNTIME_SERVICES_H +#define LLVM_LIBC_TYPES_EFI_RUNTIME_SERVICES_H + +#include "../llvm-libc-macros/EFIAPI-macros.h" +#include "../llvm-libc-macros/stdint-macros.h" +#include "EFI_CAPSULE.h" +#include "EFI_MEMORY_DESCRIPTOR.h" +#include "EFI_PHYSICAL_ADDRESS.h" +#include "EFI_STATUS.h" +#include "EFI_TABLE_HEADER.h" +#include "EFI_TIME.h" +#include "char16_t.h" +#include "size_t.h" + +#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552 +#define EFI_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_VERSION + +#define EFI_VARIABLE_NON_VOLATILE 0x00000001 +#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 +#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 +#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008 +// This attribute is identified by the mnemonic 'HR' elsewhere +// in this specification. +#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010 +// NOTE: EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is deprecated +// and should be considered reserved. +#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020 +#define EFI_VARIABLE_APPEND_WRITE 0x00000040 +#define EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS 0x00000080 + +typedef enum { + EfiResetCold, + EfiResetWarm, + EfiResetShutdown, + EfiResetPlatformSpecific, +} EFI_RESET_TYPE; + +#define EFI_VARIABLE_AUTHENTICATION_3_CERT_ID_SHA256 1 + +typedef struct { + uint8_t Type; + uint32_t IdSize; + // Value is defined as: + // uint8_t Id[IdSize]; +} EFI_VARIABLE_AUTHENTICATION_3_CERT_ID; + +typedef EFI_STATUS(EFIAPI *EFI_GET_TIME)(EFI_TIME *Time, + EFI_TIME_CAPABILITIES *Capabilities); +typedef EFI_STATUS(EFIAPI *EFI_SET_TIME)(EFI_TIME *Time); +typedef EFI_STATUS(EFIAPI *EFI_GET_WAKEUP_TIME)(bool *Enabled, bool *Pending, + EFI_TIME *Time); +typedef EFI_STATUS(EFIAPI *EFI_SET_WAKEUP_TIME)(bool *Enabled, EFI_TIME *Time); + +typedef EFI_STATUS(EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP)( + size_t MemoryMapSize, size_t DescriptorSize, uint32_t DescriptorVersion, + EFI_MEMORY_DESCRIPTOR *VirtualMap); +typedef EFI_STATUS(EFIAPI *EFI_CONVERT_POINTER)(size_t DebugDisposition, + void **Address); + +typedef EFI_STATUS(EFIAPI *EFI_GET_VARIABLE)(char16_t *VariableName, + EFI_GUID *VendorGuid, + uint32_t *Attributes, + size_t *DataSize, void *Data); +typedef EFI_STATUS(EFIAPI *EFI_GET_NEXT_VARIABLE_NAME)(size_t *VariableNameSize, + char16_t *VariableName, + EFI_GUID *VendorGuid); +typedef EFI_STATUS(EFIAPI *EFI_SET_VARIABLE)(char16_t *VariableName, + EFI_GUID *VendorGuid, + uint32_t Attributes, + size_t DataSize, void *Data); + +typedef EFI_STATUS(EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT)(uint32_t *HighCount); +typedef void(EFIAPI *EFI_RESET_SYSTEM)(EFI_RESET_TYPE ResetType, + EFI_STATUS ResetStatus, size_t DataSize, + void *ResetData); + +typedef EFI_STATUS(EFIAPI *EFI_UPDATE_CAPSULE)( + EFI_CAPSULE_HEADER **CapsuleHeaderArray, size_t CapsuleCount, + EFI_PHYSICAL_ADDRESS ScatterGatherList); +typedef EFI_STATUS(EFIAPI *EFI_QUERY_CAPSULE_CAPABILITIES)( + EFI_CAPSULE_HEADER **CapsuleHeaderArray, size_t CapsuleCount, + uint64_t *MaximumCapsuleSize, EFI_RESET_TYPE ResetType); + +typedef EFI_STATUS(EFIAPI *EFI_QUERY_VARIABLE_INFO)( + uint32_t Attributes, uint64_t *MaximumVariableStorageSize, + uint64_t *RemainingVariableStorageSize, uint64_t *MaximumVariableSize); + +typedef struct { + EFI_TABLE_HEADER Hdr; + + /// + /// Time Services + EFI_GET_TIME GetTime; + EFI_SET_TIME SetTime; + EFI_GET_WAKEUP_TIME GetWakeupTime; + EFI_SET_WAKEUP_TIME SetWakeupTime; + + // + // Virtual Memory Services + // + EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap; + EFI_CONVERT_POINTER ConvertPointer; + + // + // Variable Services + // + EFI_GET_VARIABLE GetVariable; + EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName; + EFI_SET_VARIABLE SetVariable; + + // + // Miscellaneous Services + // + EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount; + EFI_RESET_SYSTEM ResetSystem; + + // + // UEFI 2.0 Capsule Services + // + EFI_UPDATE_CAPSULE UpdateCapsule; + EFI_QUERY_CAPSULE_CAPABILITIES QueryCapsuleCapabilities; + + // + // Miscellaneous UEFI 2.0 Service + // + EFI_QUERY_VARIABLE_INFO QueryVariableInfo; +} EFI_RUNTIME_SERVICES; + +#endif // LLVM_LIBC_TYPES_EFI_RUNTIME_SERVICES_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SIMPLE_TEXT_INPUT_PROTOCOL.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SIMPLE_TEXT_INPUT_PROTOCOL.h new file mode 100644 index 000000000000..a6dc0952b631 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SIMPLE_TEXT_INPUT_PROTOCOL.h @@ -0,0 +1,39 @@ +//===-- Definition of EFI_SIMPLE_TEXT_INPUT_PROTOCOL type -----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_SIMPLE_TEXT_INPUT_PROTOCOL_H +#define LLVM_LIBC_TYPES_EFI_SIMPLE_TEXT_INPUT_PROTOCOL_H + +#include "../llvm-libc-macros/EFIAPI-macros.h" +#include "../llvm-libc-macros/stdint-macros.h" +#include "EFI_EVENT.h" +#include "EFI_STATUS.h" +#include "char16_t.h" + +#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \ + {0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b}} + +typedef struct { + uint16_t ScanCode; + char16_t UnicodeChar; +} EFI_INPUT_KEY; + +struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL; + +typedef EFI_STATUS(EFIAPI *EFI_INPUT_RESET)( + struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, bool ExtendedVerification); +typedef EFI_STATUS(EFIAPI *EFI_INPUT_READ_KEY)( + struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, EFI_INPUT_KEY *Key); + +typedef struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL { + EFI_INPUT_RESET Reset; + EFI_INPUT_READ_KEY ReadKeyStroke; + EFI_EVENT WaitForKey; +} EFI_SIMPLE_TEXT_INPUT_PROTOCOL; + +#endif // LLVM_LIBC_TYPES_EFI_SIMPLE_TEXT_INPUT_PROTOCOL_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.h new file mode 100644 index 000000000000..b5014c46a072 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.h @@ -0,0 +1,64 @@ +//===-- Definition of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL type ----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_H +#define LLVM_LIBC_TYPES_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_H + +#include "../llvm-libc-macros/stdint-macros.h" +#include "EFI_STATUS.h" +#include "size_t.h" + +#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \ + {0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b}} + +struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL; + +typedef EFI_STATUS(EFIAPI *EFI_TEXT_RESET)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, bool ExtendedVerification); +typedef EFI_STATUS(EFIAPI *EFI_TEXT_STRING)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, const char16_t *String); +typedef EFI_STATUS(EFIAPI *EFI_TEXT_TEST_STRING)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, const char16_t *String); +typedef EFI_STATUS(EFIAPI *EFI_TEXT_QUERY_MODE)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, size_t ModeNumber, + size_t *Columns, size_t *Rows); + +typedef EFI_STATUS(EFIAPI *EFI_TEXT_SET_MODE)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, size_t ModeNumber); +typedef EFI_STATUS(EFIAPI *EFI_TEXT_SET_ATTRIBUTE)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, size_t Attribute); +typedef EFI_STATUS(EFIAPI *EFI_TEXT_CLEAR_SCREEN)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This); +typedef EFI_STATUS(EFIAPI *EFI_TEXT_SET_CURSOR_POSITION)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, size_t Column, size_t Row); +typedef EFI_STATUS(EFIAPI *EFI_TEXT_ENABLE_CURSOR)( + struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, bool Visible); + +typedef struct { + int32_t MaxMode; + int32_t Mode; + int32_t Attribute; + int32_t CursorColumn; + int32_t CursorRow; + bool CursorVisible; +} SIMPLE_TEXT_OUTPUT_MODE; + +typedef struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL { + EFI_TEXT_RESET Reset; + EFI_TEXT_STRING OutputString; + EFI_TEXT_TEST_STRING TestString; + EFI_TEXT_QUERY_MODE QueryMode; + EFI_TEXT_SET_MODE SetMode; + EFI_TEXT_SET_ATTRIBUTE SetAttribute; + EFI_TEXT_CLEAR_SCREEN ClearScreen; + EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition; + EFI_TEXT_ENABLE_CURSOR EnableCursor; + SIMPLE_TEXT_OUTPUT_MODE *Mode; +} EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL; + +#endif // LLVM_LIBC_TYPES_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_STATUS.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_STATUS.h new file mode 100644 index 000000000000..bb9542bed8ef --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_STATUS.h @@ -0,0 +1,60 @@ +//===-- Definition of EFI_STATUS type ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_STATUS_H +#define LLVM_LIBC_TYPES_EFI_STATUS_H + +#include "../llvm-libc-macros/stdint-macros.h" + +typedef uintptr_t EFI_STATUS; + +#define EFI_SUCCESS 0 + +#define EFI_LOAD_ERROR 1 +#define EFI_INVALID_PARAMETER 2 +#define EFI_UNSUPPORTED 3 +#define EFI_BAD_BUFFER_SIZE 4 +#define EFI_BUFFER_TOO_SMALL 5 +#define EFI_NOT_READY 6 +#define EFI_DEVICE_ERROR 7 +#define EFI_WRITE_PROTECTED 8 +#define EFI_OUT_OF_RESOURCES 9 +#define EFI_VOLUME_CORRUPTED 10 +#define EFI_VOLUME_FULL 11 +#define EFI_NO_MEDIA 12 +#define EFI_MEDIA_CHANGED 13 +#define EFI_NOT_FOUND 14 +#define EFI_ACCESS_DENIED 15 +#define EFI_NO_RESPONSE 16 +#define EFI_NO_MAPPING 17 +#define EFI_TIMEOUT 18 +#define EFI_NOT_STARTED 19 +#define EFI_ALREADY_STARTED 20 +#define EFI_ABORTED 21 +#define EFI_ICMP_ERROR 22 +#define EFI_TFTP_ERROR 23 +#define EFI_PROTOCOL_ERROR 24 +#define EFI_INCOMPATIBLE_VERSION 25 +#define EFI_SECURITY_VIOLATION 26 +#define EFI_CRC_ERROR 27 +#define EFI_END_OF_MEDIA 28 +#define EFI_END_OF_FILE 31 +#define EFI_INVALID_LANGUAGE 32 +#define EFI_COMPROMISED_DATA 33 +#define EFI_IP_ADDRESS_CONFLICT 34 +#define EFI_HTTP_ERROR 35 + +#define EFI_WARN_UNKNOWN_GLYPH 1 +#define EFI_WARN_DELETE_FAILURE 2 +#define EFI_WARN_WRITE_FAILURE 3 +#define EFI_WARN_BUFFER_TOO_SMALL 4 +#define EFI_WARN_STALE_DATA 5 +#define EFI_WARN_FILE_SYSTEM 6 +#define EFI_WARN_RESET_REQUIRED 7 + +#endif // LLVM_LIBC_TYPES_EFI_STATUS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SYSTEM_TABLE.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SYSTEM_TABLE.h new file mode 100644 index 000000000000..290067ad862e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_SYSTEM_TABLE.h @@ -0,0 +1,65 @@ +//===-- Definition of EFI_SYSTEM_TABLE type -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_SYSTEM_TABLE_H +#define LLVM_LIBC_TYPES_EFI_SYSTEM_TABLE_H + +#include "../llvm-libc-macros/stdint-macros.h" +#include "EFI_BOOT_SERVICES.h" +#include "EFI_CONFIGURATION_TABLE.h" +#include "EFI_HANDLE.h" +#include "EFI_RUNTIME_SERVICES.h" +#include "EFI_SIMPLE_TEXT_INPUT_PROTOCOL.h" +#include "EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.h" +#include "EFI_STATUS.h" +#include "EFI_TABLE_HEADER.h" + +#include "char16_t.h" +#include "size_t.h" + +#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 +#define EFI_2_100_SYSTEM_TABLE_REVISION ((2 << 16) | (100)) +#define EFI_2_90_SYSTEM_TABLE_REVISION ((2 << 16) | (90)) +#define EFI_2_80_SYSTEM_TABLE_REVISION ((2 << 16) | (80)) +#define EFI_2_70_SYSTEM_TABLE_REVISION ((2 << 16) | (70)) +#define EFI_2_60_SYSTEM_TABLE_REVISION ((2 << 16) | (60)) +#define EFI_2_50_SYSTEM_TABLE_REVISION ((2 << 16) | (50)) +#define EFI_2_40_SYSTEM_TABLE_REVISION ((2 << 16) | (40)) +#define EFI_2_31_SYSTEM_TABLE_REVISION ((2 << 16) | (31)) +#define EFI_2_30_SYSTEM_TABLE_REVISION ((2 << 16) | (30)) +#define EFI_2_20_SYSTEM_TABLE_REVISION ((2 << 16) | (20)) +#define EFI_2_10_SYSTEM_TABLE_REVISION ((2 << 16) | (10)) +#define EFI_2_00_SYSTEM_TABLE_REVISION ((2 << 16) | (00)) +#define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10)) +#define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02)) +#define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION +#define EFI_SYSTEM_TABLE_REVISION EFI_2_100_SYSTEM_TABLE_REVISION + +typedef struct { + EFI_TABLE_HEADER Hdr; + + char16_t *FirmwareVendor; + uint32_t FirmwareRevision; + + EFI_HANDLE ConsoleInHandle; + EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; + + EFI_HANDLE ConsoleOutHandle; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; + + EFI_HANDLE StandardErrorHandle; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr; + + EFI_RUNTIME_SERVICES *RuntimeServices; + EFI_BOOT_SERVICES *BootServices; + + size_t NumberOfTableEntries; + EFI_CONFIGURATION_TABLE *ConfigurationTable; +} EFI_SYSTEM_TABLE; + +#endif // LLVM_LIBC_TYPES_EFI_SYSTEM_TABLE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TABLE_HEADER.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TABLE_HEADER.h new file mode 100644 index 000000000000..293968ecc4d1 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TABLE_HEADER.h @@ -0,0 +1,22 @@ +//===-- Definition of EFI_TABLE_HEADER type -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_TABLE_HEADER_H +#define LLVM_LIBC_TYPES_EFI_TABLE_HEADER_H + +#include "../llvm-libc-macros/stdint-macros.h" + +typedef struct { + uint64_t Signature; + uint32_t Revision; + uint32_t HeaderSize; + uint32_t CRC32; + uint32_t Reserved; +} EFI_TABLE_HEADER; + +#endif // LLVM_LIBC_TYPES_EFI_TABLE_HEADER_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TIME.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TIME.h new file mode 100644 index 000000000000..b0e38b987d44 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TIME.h @@ -0,0 +1,37 @@ +//===-- Definition of EFI_TIME type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_TIME_H +#define LLVM_LIBC_TYPES_EFI_TIME_H + +#include "../llvm-libc-macros/stdint-macros.h" + +typedef struct { + uint16_t Year; // 1900 - 9999 + uint8_t Month; // 1 - 12 + uint8_t Day; // 1 - 31 + uint8_t Hour; // 0 - 23 + uint8_t Minute; // 0 - 59 + uint8_t Second; // 0 - 59 + uint8_t Pad1; + uint32_t Nanosecond; // 0 - 999,999,999 + int16_t TimeZone; // --1440 to 1440 or 2047 +} EFI_TIME; + +#define EFI_TIME_ADJUST_DAYLIGHT 0x01 +#define EFI_TIME_IN_DAYLIGHT 0x02 + +#define EFI_UNSPECIFIED_TIMEZONE 0x07FF + +typedef struct { + uint32_t Resolution; + uint32_t Accuracy; + bool SetsToZero; +} EFI_TIME_CAPABILITIES; + +#endif // LLVM_LIBC_TYPES_EFI_TIME_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TIMER_DELAY.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TIMER_DELAY.h new file mode 100644 index 000000000000..2a6872c69c8b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TIMER_DELAY.h @@ -0,0 +1,18 @@ +//===-- Definition of EFI_TIMER_DELAY type --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_TIMER_DELAY_H +#define LLVM_LIBC_TYPES_EFI_TIMER_DELAY_H + +typedef enum { + TimerCancel, + TimerPeriodic, + TimerRelative, +} EFI_TIMER_DELAY; + +#endif // LLVM_LIBC_TYPES_EFI_TIMER_DELAY_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TPL.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TPL.h new file mode 100644 index 000000000000..8361ccfacd6f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_TPL.h @@ -0,0 +1,21 @@ +//===-- Definition of EFI_TPL type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_TPL_H +#define LLVM_LIBC_TYPES_EFI_TPL_H + +#include "size_t.h" + +typedef size_t EFI_TPL; + +#define TPL_APPLICATION 4 +#define TPL_CALLBACK 8 +#define TPL_NOTIFY 16 +#define TPL_HIGH_LEVEL 31 + +#endif // LLVM_LIBC_TYPES_EFI_TPL_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/EFI_VIRTUAL_ADDRESS.h b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_VIRTUAL_ADDRESS.h new file mode 100644 index 000000000000..46cbec734dad --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/EFI_VIRTUAL_ADDRESS.h @@ -0,0 +1,16 @@ +//===-- Definition of EFI_VIRTUAL_ADDRESS type ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_EFI_VIRTUAL_ADDRESS_H +#define LLVM_LIBC_TYPES_EFI_VIRTUAL_ADDRESS_H + +#include "../llvm-libc-macros/stdint-macros.h" + +typedef uint64_t EFI_VIRTUAL_ADDRESS; + +#endif // LLVM_LIBC_TYPES_EFI_VIRTUAL_ADDRESS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/ENTRY.h b/contrib/llvm-project/libc/include/llvm-libc-types/ENTRY.h new file mode 100644 index 000000000000..b007c8edba2f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/ENTRY.h @@ -0,0 +1,17 @@ +//===-- Definition of ENTRY type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_ENTRY_H +#define LLVM_LIBC_TYPES_ENTRY_H + +typedef struct entry { + char *key; + void *data; +} ENTRY; + +#endif // LLVM_LIBC_TYPES_ENTRY_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/FILE.h b/contrib/llvm-project/libc/include/llvm-libc-types/FILE.h new file mode 100644 index 000000000000..f1d2e4f726c7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/FILE.h @@ -0,0 +1,14 @@ +//===-- Definition of the type FILE ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FILE_H +#define LLVM_LIBC_TYPES_FILE_H + +typedef struct FILE FILE; + +#endif // LLVM_LIBC_TYPES_FILE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/VISIT.h b/contrib/llvm-project/libc/include/llvm-libc-types/VISIT.h new file mode 100644 index 000000000000..0a7ff6e50d46 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/VISIT.h @@ -0,0 +1,14 @@ +//===-- Definition of VISIT type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_VISIT_H +#define LLVM_LIBC_TYPES_VISIT_H + +typedef enum { preorder, postorder, endorder, leaf } VISIT; + +#endif // LLVM_LIBC_TYPES_VISIT_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__atexithandler_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__atexithandler_t.h new file mode 100644 index 000000000000..01aed676c2a7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__atexithandler_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __atexithandler_t ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___ATEXITHANDLER_T_H +#define LLVM_LIBC_TYPES___ATEXITHANDLER_T_H + +typedef void (*__atexithandler_t)(void); + +#endif // LLVM_LIBC_TYPES___ATEXITHANDLER_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__atfork_callback_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__atfork_callback_t.h new file mode 100644 index 000000000000..ae2d0ca39d53 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__atfork_callback_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __atfork_callback_t ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___ATFORK_CALLBACK_T_H +#define LLVM_LIBC_TYPES___ATFORK_CALLBACK_T_H + +typedef void (*__atfork_callback_t)(void); + +#endif // LLVM_LIBC_TYPES___ATFORK_CALLBACK_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__call_once_func_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__call_once_func_t.h new file mode 100644 index 000000000000..6d278da4f1d3 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__call_once_func_t.h @@ -0,0 +1,14 @@ +//===-- Definition of __call_once_func_t type -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___CALL_ONCE_FUNC_T_H +#define LLVM_LIBC_TYPES___CALL_ONCE_FUNC_T_H + +typedef void (*__call_once_func_t)(void); + +#endif // LLVM_LIBC_TYPES___CALL_ONCE_FUNC_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h new file mode 100644 index 000000000000..52078daf7d3c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h @@ -0,0 +1,19 @@ +//===-- Definition of type __dl_iterate_phdr_callback_t ------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H +#define LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H + +#include "size_t.h" + +struct dl_phdr_info; + +typedef int (*__dl_iterate_phdr_callback_t)(struct dl_phdr_info *, size_t, + void *); + +#endif // LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__exec_argv_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__exec_argv_t.h new file mode 100644 index 000000000000..4eff583768af --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__exec_argv_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __exec_argv_t ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___EXEC_ARGV_T_H +#define LLVM_LIBC_TYPES___EXEC_ARGV_T_H + +typedef char *const __exec_argv_t[]; + +#endif // LLVM_LIBC_TYPES___EXEC_ARGV_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__exec_envp_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__exec_envp_t.h new file mode 100644 index 000000000000..89e02754c4e4 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__exec_envp_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __exec_envp_t ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___EXEC_ENVP_T_H +#define LLVM_LIBC_TYPES___EXEC_ENVP_T_H + +typedef char *const __exec_envp_t[]; + +#endif // LLVM_LIBC_TYPES___EXEC_ENVP_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__futex_word.h b/contrib/llvm-project/libc/include/llvm-libc-types/__futex_word.h new file mode 100644 index 000000000000..04023c7e2d5f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__futex_word.h @@ -0,0 +1,20 @@ +//===-- Definition of type which can represent a futex word ---------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___FUTEX_WORD_H +#define LLVM_LIBC_TYPES___FUTEX_WORD_H + +typedef struct { + // Futex word should be aligned appropriately to allow target atomic + // instructions. This declaration mimics the internal setup. + _Alignas(sizeof(__UINT32_TYPE__) > _Alignof(__UINT32_TYPE__) + ? sizeof(__UINT32_TYPE__) + : _Alignof(__UINT32_TYPE__)) __UINT32_TYPE__ __word; +} __futex_word; + +#endif // LLVM_LIBC_TYPES___FUTEX_WORD_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__getoptargv_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__getoptargv_t.h new file mode 100644 index 000000000000..c26b9e9fa619 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__getoptargv_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __getoptargv_t ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___GETOPTARGV_T_H +#define LLVM_LIBC_TYPES___GETOPTARGV_T_H + +typedef char *const __getoptargv_t[]; + +#endif // LLVM_LIBC_TYPES___GETOPTARGV_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__mutex_type.h b/contrib/llvm-project/libc/include/llvm-libc-types/__mutex_type.h new file mode 100644 index 000000000000..835561626149 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__mutex_type.h @@ -0,0 +1,29 @@ +//===-- Definition of a common mutex type ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___MUTEX_TYPE_H +#define LLVM_LIBC_TYPES___MUTEX_TYPE_H + +#include "__futex_word.h" + +typedef struct { + unsigned char __timed; + unsigned char __recursive; + unsigned char __robust; + + void *__owner; + unsigned long long __lock_count; + +#ifdef __linux__ + __futex_word __ftxw; +#else +#error "Mutex type not defined for the target platform." +#endif +} __mutex_type; + +#endif // LLVM_LIBC_TYPES___MUTEX_TYPE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_once_func_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_once_func_t.h new file mode 100644 index 000000000000..7575029f08c2 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_once_func_t.h @@ -0,0 +1,14 @@ +//===-- Definition of __pthread_once_func_t type --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___PTHREAD_ONCE_FUNC_T_H +#define LLVM_LIBC_TYPES___PTHREAD_ONCE_FUNC_T_H + +typedef void (*__pthread_once_func_t)(void); + +#endif // LLVM_LIBC_TYPES___PTHREAD_ONCE_FUNC_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_start_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_start_t.h new file mode 100644 index 000000000000..6b7ae40b1b77 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_start_t.h @@ -0,0 +1,14 @@ +//===-- Definition of __pthread_start_t type ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___PTHREAD_START_T_H +#define LLVM_LIBC_TYPES___PTHREAD_START_T_H + +typedef void *(*__pthread_start_t)(void *); + +#endif // LLVM_LIBC_TYPES___PTHREAD_START_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_tss_dtor_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_tss_dtor_t.h new file mode 100644 index 000000000000..c67b6045936d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__pthread_tss_dtor_t.h @@ -0,0 +1,14 @@ +//===-- Definition of the type __pthread_tss_dtor_t -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___PTHREAD_TSS_DTOR_T_H +#define LLVM_LIBC_TYPES___PTHREAD_TSS_DTOR_T_H + +typedef void (*__pthread_tss_dtor_t)(void *); + +#endif // LLVM_LIBC_TYPES___PTHREAD_TSS_DTOR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__qsortcompare_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__qsortcompare_t.h new file mode 100644 index 000000000000..48fc9ccb4409 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__qsortcompare_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __qsortcompare_t -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___QSORTCOMPARE_T_H +#define LLVM_LIBC_TYPES___QSORTCOMPARE_T_H + +typedef int (*__qsortcompare_t)(const void *, const void *); + +#endif // LLVM_LIBC_TYPES___QSORTCOMPARE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__qsortrcompare_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__qsortrcompare_t.h new file mode 100644 index 000000000000..f6b058864359 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__qsortrcompare_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __qsortrcompare_t ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___QSORTRCOMPARE_T_H +#define LLVM_LIBC_TYPES___QSORTRCOMPARE_T_H + +typedef int (*__qsortrcompare_t)(const void *, const void *, void *); + +#endif // LLVM_LIBC_TYPES___QSORTRCOMPARE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__search_compare_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/__search_compare_t.h new file mode 100644 index 000000000000..7033fef49b49 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__search_compare_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type __search_compare_t -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___SEARCH_COMPARE_T_H +#define LLVM_LIBC_TYPES___SEARCH_COMPARE_T_H + +typedef int (*__search_compare_t)(const void *, const void *); + +#endif // LLVM_LIBC_TYPES___SEARCH_COMPARE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/__thread_type.h b/contrib/llvm-project/libc/include/llvm-libc-types/__thread_type.h new file mode 100644 index 000000000000..645573f544a9 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/__thread_type.h @@ -0,0 +1,16 @@ +//===-- Definition of thrd_t type -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES___THREAD_TYPE_H +#define LLVM_LIBC_TYPES___THREAD_TYPE_H + +typedef struct { + void *__attrib; +} __thread_type; + +#endif // LLVM_LIBC_TYPES___THREAD_TYPE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/blkcnt_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/blkcnt_t.h new file mode 100644 index 000000000000..9dea8f033d6d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/blkcnt_t.h @@ -0,0 +1,14 @@ +//===-- Definition of blkcnt_t type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_BLKCNT_T_H +#define LLVM_LIBC_TYPES_BLKCNT_T_H + +typedef __INTPTR_TYPE__ blkcnt_t; + +#endif // LLVM_LIBC_TYPES_BLKCNT_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/blksize_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/blksize_t.h new file mode 100644 index 000000000000..7caa9705cca3 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/blksize_t.h @@ -0,0 +1,14 @@ +//===-- Definition of blksize_t type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_BLKSIZE_T_H +#define LLVM_LIBC_TYPES_BLKSIZE_T_H + +typedef __INTPTR_TYPE__ blksize_t; + +#endif // LLVM_LIBC_TYPES_BLKSIZE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/cc_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/cc_t.h new file mode 100644 index 000000000000..40d99ad22da2 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/cc_t.h @@ -0,0 +1,14 @@ +//===-- Definition of cc_t type -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CC_T_H +#define LLVM_LIBC_TYPES_CC_T_H + +typedef unsigned char cc_t; + +#endif // LLVM_LIBC_TYPES_CC_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/cfloat128.h b/contrib/llvm-project/libc/include/llvm-libc-types/cfloat128.h new file mode 100644 index 000000000000..83fad8791013 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/cfloat128.h @@ -0,0 +1,44 @@ +//===-- Definition of cfloat128 type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CFLOAT128_H +#define LLVM_LIBC_TYPES_CFLOAT128_H + +#include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG + +// Currently, the complex variant of C23 `_Float128` type is only defined as a +// built-in type in GCC 7 or later, for C and in GCC 13 or later, for C++. For +// clang, the complex variant of `__float128` is defined instead, and only on +// x86-64 targets for clang 11 or later. +// +// TODO: Update the complex variant of C23 `_Float128` type detection again when +// clang supports it. +#ifdef __clang__ +#if (__clang_major__ >= 11) && \ + (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) +// Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__ +// macro to notify the availability of __float128 type: +// https://reviews.llvm.org/D15120 +#define LIBC_TYPES_HAS_CFLOAT128 +typedef _Complex __float128 cfloat128; +#endif +#elif defined(__GNUC__) +#if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) && \ + (__GNUC__ >= 13 || (!defined(__cplusplus))) +#define LIBC_TYPES_HAS_CFLOAT128 +typedef _Complex _Float128 cfloat128; +#endif +#endif + +#if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113) +#define LIBC_TYPES_HAS_CFLOAT128 +#define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +typedef _Complex long double cfloat128; +#endif + +#endif // LLVM_LIBC_TYPES_CFLOAT128_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/cfloat16.h b/contrib/llvm-project/libc/include/llvm-libc-types/cfloat16.h new file mode 100644 index 000000000000..2d4cef756272 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/cfloat16.h @@ -0,0 +1,21 @@ +//===-- Definition of cfloat16 type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CFLOAT16_H +#define LLVM_LIBC_TYPES_CFLOAT16_H + +#if defined(__FLT16_MANT_DIG__) && \ + (!defined(__GNUC__) || __GNUC__ >= 13 || \ + (defined(__clang__) && __clang_major__ >= 14)) && \ + !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) && \ + !defined(_WIN32) +#define LIBC_TYPES_HAS_CFLOAT16 +typedef _Complex _Float16 cfloat16; +#endif + +#endif // LLVM_LIBC_TYPES_CFLOAT16_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/char16_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/char16_t.h new file mode 100644 index 000000000000..1f5847ae771b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/char16_t.h @@ -0,0 +1,17 @@ +//===-- Definition of char16_t type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CHAR16_T_H +#define LLVM_LIBC_TYPES_CHAR16_T_H + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include "../llvm-libc-macros/stdint-macros.h" +typedef uint_least16_t char16_t; +#endif + +#endif // LLVM_LIBC_TYPES_CHAR16_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/char32_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/char32_t.h new file mode 100644 index 000000000000..20b72dc5d67e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/char32_t.h @@ -0,0 +1,17 @@ +//===-- Definition of char32_t type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CHAR32_T_H +#define LLVM_LIBC_TYPES_CHAR32_T_H + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#include "../llvm-libc-macros/stdint-macros.h" +typedef uint_least32_t char32_t; +#endif + +#endif // LLVM_LIBC_TYPES_CHAR32_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/char8_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/char8_t.h new file mode 100644 index 000000000000..a343be77d810 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/char8_t.h @@ -0,0 +1,16 @@ +//===-- Definition of char8_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CHAR8_T_H +#define LLVM_LIBC_TYPES_CHAR8_T_H + +#if !(defined(__cplusplus) && defined(__cpp_char8_t)) +typedef unsigned char char8_t; +#endif + +#endif // LLVM_LIBC_TYPES_CHAR8_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/clock_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/clock_t.h new file mode 100644 index 000000000000..8759ee999fb5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/clock_t.h @@ -0,0 +1,14 @@ +//===-- Definition of clock_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CLOCK_T_H +#define LLVM_LIBC_TYPES_CLOCK_T_H + +typedef long clock_t; + +#endif // LLVM_LIBC_TYPES_CLOCK_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/clockid_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/clockid_t.h new file mode 100644 index 000000000000..4b059599502c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/clockid_t.h @@ -0,0 +1,14 @@ +//===-- Definition of the type clockid_t ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CLOCKID_T_H +#define LLVM_LIBC_TYPES_CLOCKID_T_H + +typedef int clockid_t; + +#endif // LLVM_LIBC_TYPES_CLOCKID_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/cnd_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/cnd_t.h new file mode 100644 index 000000000000..77ec58352f07 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/cnd_t.h @@ -0,0 +1,20 @@ +//===-- Definition of cnd_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CND_T_H +#define LLVM_LIBC_TYPES_CND_T_H + +#include "__futex_word.h" + +typedef struct { + void *__qfront; + void *__qback; + __futex_word __qmtx; +} cnd_t; + +#endif // LLVM_LIBC_TYPES_CND_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/cookie_io_functions_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/cookie_io_functions_t.h new file mode 100644 index 000000000000..d1eea8ff3b5d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/cookie_io_functions_t.h @@ -0,0 +1,28 @@ +//===-- Definition of type cookie_io_functions_t --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_COOKIE_IO_FUNCTIONS_T_H +#define LLVM_LIBC_TYPES_COOKIE_IO_FUNCTIONS_T_H + +#include "off64_t.h" +#include "size_t.h" +#include "ssize_t.h" + +typedef ssize_t cookie_read_function_t(void *, char *, size_t); +typedef ssize_t cookie_write_function_t(void *, const char *, size_t); +typedef int cookie_seek_function_t(void *, off64_t *, int); +typedef int cookie_close_function_t(void *); + +typedef struct { + cookie_read_function_t *read; + cookie_write_function_t *write; + cookie_seek_function_t *seek; + cookie_close_function_t *close; +} cookie_io_functions_t; + +#endif // LLVM_LIBC_TYPES_COOKIE_IO_FUNCTIONS_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/cpu_set_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/cpu_set_t.h new file mode 100644 index 000000000000..8c6859de5f1d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/cpu_set_t.h @@ -0,0 +1,21 @@ +//===-- Definition of a cpu_set_t type ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_CPU_SET_T_H +#define LLVM_LIBC_TYPES_CPU_SET_T_H + +#define __CPU_SETSIZE 1024 +#define __NCPUBITS (8 * sizeof(unsigned long)) + +typedef struct { + // If a processor with more than 1024 CPUs is to be supported in future, + // we need to adjust the size of this array. + unsigned long __mask[128 / sizeof(unsigned long)]; +} cpu_set_t; + +#endif // LLVM_LIBC_TYPES_CPU_SET_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/dev_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/dev_t.h new file mode 100644 index 000000000000..3181e3415f2e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/dev_t.h @@ -0,0 +1,14 @@ +//===-- Definition of dev_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_DEV_T_H +#define LLVM_LIBC_TYPES_DEV_T_H + +typedef __UINT64_TYPE__ dev_t; + +#endif // LLVM_LIBC_TYPES_DEV_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/div_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/div_t.h new file mode 100644 index 000000000000..450603d69f35 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/div_t.h @@ -0,0 +1,17 @@ +//===-- Definition of type div_t ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_DIV_T_H +#define LLVM_LIBC_TYPES_DIV_T_H + +typedef struct { + int quot; + int rem; +} div_t; + +#endif // LLVM_LIBC_TYPES_DIV_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/double_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/double_t.h new file mode 100644 index 000000000000..c4ad08afddfa --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/double_t.h @@ -0,0 +1,24 @@ +//===-- Definition of double_t type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_DOUBLE_T_H +#define LLVM_LIBC_TYPES_DOUBLE_T_H + +#if !defined(__FLT_EVAL_METHOD__) || __FLT_EVAL_METHOD__ == 0 +#define __LLVM_LIBC_DOUBLE_T double +#elif __FLT_EVAL_METHOD__ == 1 +#define __LLVM_LIBC_DOUBLE_T double +#elif __FLT_EVAL_METHOD__ == 2 +#define __LLVM_LIBC_DOUBLE_T long double +#else +#error "Unsupported __FLT_EVAL_METHOD__ value." +#endif + +typedef __LLVM_LIBC_DOUBLE_T double_t; + +#endif // LLVM_LIBC_TYPES_DOUBLE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/fd_set.h b/contrib/llvm-project/libc/include/llvm-libc-types/fd_set.h new file mode 100644 index 000000000000..52b716185566 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/fd_set.h @@ -0,0 +1,18 @@ +//===-- Definition of fd_set type -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FD_SET_H +#define LLVM_LIBC_TYPES_FD_SET_H + +#include "../llvm-libc-macros/sys-select-macros.h" // __FD_SET_WORD_TYPE, __FD_SET_ARRAYSIZE + +typedef struct { + __FD_SET_WORD_TYPE __set[__FD_SET_ARRAYSIZE]; +} fd_set; + +#endif // LLVM_LIBC_TYPES_FD_SET_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/fenv_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/fenv_t.h new file mode 100644 index 000000000000..c83f23894c0c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/fenv_t.h @@ -0,0 +1,36 @@ +//===-- Definition of type fenv_t -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FENV_T_H +#define LLVM_LIBC_TYPES_FENV_T_H + +#ifdef __aarch64__ +typedef struct { + unsigned char __control_word[4]; + unsigned char __status_word[4]; +} fenv_t; +#elif defined(__x86_64__) +typedef struct { + unsigned char __x86_status[28]; + unsigned char __mxcsr[4]; +} fenv_t; +#elif defined(__arm__) || defined(_M_ARM) +typedef struct { + unsigned int __fpscr; +} fenv_t; +#elif defined(__riscv) +typedef unsigned int fenv_t; +#elif defined(__AMDGPU__) || defined(__NVPTX__) +typedef struct { + unsigned int __fpc; +} fenv_t; +#else +#error "fenv_t not defined for your platform" +#endif + +#endif // LLVM_LIBC_TYPES_FENV_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/fexcept_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/fexcept_t.h new file mode 100644 index 000000000000..5aa09fbbaffc --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/fexcept_t.h @@ -0,0 +1,18 @@ +//===-- Definition of fexcept_t type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FEXCEPT_T_H +#define LLVM_LIBC_TYPES_FEXCEPT_T_H + +#if defined(__x86_64__) || defined(__i386__) +typedef unsigned short int fexcept_t; +#else +typedef unsigned int fexcept_t; +#endif + +#endif // LLVM_LIBC_TYPES_FEXCEPT_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/float128.h b/contrib/llvm-project/libc/include/llvm-libc-types/float128.h new file mode 100644 index 000000000000..82ebb79f1f58 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/float128.h @@ -0,0 +1,36 @@ +//===-- Definition of float128 type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FLOAT128_H +#define LLVM_LIBC_TYPES_FLOAT128_H + +#include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG + +// Currently, C23 `_Float128` type is only defined as a built-in type in GCC 7 +// or later, and only for C. For C++, or for clang, `__float128` is defined +// instead, and only on x86-64 targets. +// +// TODO: Update C23 `_Float128` type detection again when clang supports it. +// https://github.com/llvm/llvm-project/issues/80195 +#if defined(__STDC_IEC_60559_BFP__) && !defined(__clang__) && \ + !defined(__cplusplus) +#define LIBC_TYPES_HAS_FLOAT128 +typedef _Float128 float128; +#elif defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +// Use __float128 type. gcc and clang sometime use __SIZEOF_FLOAT128__ to +// notify the availability of __float128. +// clang also uses __FLOAT128__ macro to notify the availability of __float128 +// type: https://reviews.llvm.org/D15120 +#define LIBC_TYPES_HAS_FLOAT128 +typedef __float128 float128; +#elif (LDBL_MANT_DIG == 113) +#define LIBC_TYPES_HAS_FLOAT128 +typedef long double float128; +#endif + +#endif // LLVM_LIBC_TYPES_FLOAT128_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/float_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/float_t.h new file mode 100644 index 000000000000..5027249c30d3 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/float_t.h @@ -0,0 +1,24 @@ +//===-- Definition of float_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FLOAT_T_H +#define LLVM_LIBC_TYPES_FLOAT_T_H + +#if !defined(__FLT_EVAL_METHOD__) || __FLT_EVAL_METHOD__ == 0 +#define __LLVM_LIBC_FLOAT_T float +#elif __FLT_EVAL_METHOD__ == 1 +#define __LLVM_LIBC_FLOAT_T double +#elif __FLT_EVAL_METHOD__ == 2 +#define __LLVM_LIBC_FLOAT_T long double +#else +#error "Unsupported __FLT_EVAL_METHOD__ value." +#endif + +typedef __LLVM_LIBC_FLOAT_T float_t; + +#endif // LLVM_LIBC_TYPES_FLOAT_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/fsblkcnt_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/fsblkcnt_t.h new file mode 100644 index 000000000000..8c7d3307278c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/fsblkcnt_t.h @@ -0,0 +1,14 @@ +//===-- Definition of fsblkcnt_t type -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FSBLKCNT_T_H +#define LLVM_LIBC_TYPES_FSBLKCNT_T_H + +typedef __UINT64_TYPE__ fsblkcnt_t; + +#endif // LLVM_LIBC_TYPES_FSBLKCNT_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/fsfilcnt_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/fsfilcnt_t.h new file mode 100644 index 000000000000..12697830e92e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/fsfilcnt_t.h @@ -0,0 +1,14 @@ +//===-- Definition of fsfilcnt_t type -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_FSFILCNT_T_H +#define LLVM_LIBC_TYPES_FSFILCNT_T_H + +typedef __UINT64_TYPE__ fsfilcnt_t; + +#endif // LLVM_LIBC_TYPES_FSFILCNT_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/gid_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/gid_t.h new file mode 100644 index 000000000000..cfe36ce9906b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/gid_t.h @@ -0,0 +1,14 @@ +//===-- Definition of gid_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_GID_T_H +#define LLVM_LIBC_TYPES_GID_T_H + +typedef __UINT32_TYPE__ gid_t; + +#endif // LLVM_LIBC_TYPES_GID_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/imaxdiv_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/imaxdiv_t.h new file mode 100644 index 000000000000..5062b643065a --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/imaxdiv_t.h @@ -0,0 +1,17 @@ +//===-- Definition of type imaxdiv_t --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __LLVM_LIBC_TYPES_IMAXDIV_T_H__ +#define __LLVM_LIBC_TYPES_IMAXDIV_T_H__ + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +#endif // __LLVM_LIBC_TYPES_IMAXDIV_T_H__ diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/ino_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/ino_t.h new file mode 100644 index 000000000000..148bd67f98fe --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/ino_t.h @@ -0,0 +1,14 @@ +//===-- Definition of ino_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_INO_T_H +#define LLVM_LIBC_TYPES_INO_T_H + +typedef __UINTPTR_TYPE__ ino_t; + +#endif // LLVM_LIBC_TYPES_INO_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/jmp_buf.h b/contrib/llvm-project/libc/include/llvm-libc-types/jmp_buf.h new file mode 100644 index 000000000000..8a7d2839e21d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/jmp_buf.h @@ -0,0 +1,84 @@ +//===-- Definition of type jmp_buf ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_JMP_BUF_H +#define LLVM_LIBC_TYPES_JMP_BUF_H + +// TODO: implement sigjmp_buf related functions for other architectures +// Issue: https://github.com/llvm/llvm-project/issues/136358 +#if defined(__linux__) +#if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \ + defined(__arm__) || defined(__riscv) +#define __LIBC_HAS_SIGJMP_BUF +#endif +#endif + +#if defined(__LIBC_HAS_SIGJMP_BUF) +#include "sigset_t.h" +#endif + +typedef struct { +#ifdef __x86_64__ + __UINT64_TYPE__ rbx; + __UINT64_TYPE__ rbp; + __UINT64_TYPE__ r12; + __UINT64_TYPE__ r13; + __UINT64_TYPE__ r14; + __UINT64_TYPE__ r15; + __UINTPTR_TYPE__ rsp; + __UINTPTR_TYPE__ rip; +#elif defined(__i386__) + long ebx; + long esi; + long edi; + long ebp; + long esp; + long eip; +#elif defined(__riscv) + /* Program counter. */ + long int __pc; + /* Callee-saved registers. */ + long int __regs[12]; + /* Stack pointer. */ + long int __sp; + /* Callee-saved floating point registers. */ +#if __riscv_float_abi_double + double __fpregs[12]; +#elif defined(__riscv_float_abi_single) +#error "__jmp_buf not available for your target architecture." +#endif +#elif defined(__arm__) + // r4, r5, r6, r7, r8, r9, r10, r11, r12, lr + long opaque[10]; +#elif defined(__aarch64__) + long opaque[14]; // x19-x29, lr, sp, optional x18 +#if __ARM_FP + long fopaque[8]; // d8-d15 +#endif +#else +#error "__jmp_buf not available for your target architecture." +#endif +#if defined(__LIBC_HAS_SIGJMP_BUF) + // return address + void *sig_retaddr; + // extra register buffer to avoid indefinite stack growth in sigsetjmp + void *sig_extra; + // signal masks + sigset_t sigmask; +#endif +} __jmp_buf; + +typedef __jmp_buf jmp_buf[1]; + +#if defined(__LIBC_HAS_SIGJMP_BUF) +typedef __jmp_buf sigjmp_buf[1]; +#endif + +#undef __LIBC_HAS_SIGJMP_BUF + +#endif // LLVM_LIBC_TYPES_JMP_BUF_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/ldiv_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/ldiv_t.h new file mode 100644 index 000000000000..5c64ec10d918 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/ldiv_t.h @@ -0,0 +1,17 @@ +//===-- Definition of type ldiv_t -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_LDIV_T_H +#define LLVM_LIBC_TYPES_LDIV_T_H + +typedef struct { + long quot; + long rem; +} ldiv_t; + +#endif // LLVM_LIBC_TYPES_LDIV_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/lldiv_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/lldiv_t.h new file mode 100644 index 000000000000..5b8dcbef9470 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/lldiv_t.h @@ -0,0 +1,17 @@ +//===-- Definition of type lldiv_t ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_LLDIV_T_H +#define LLVM_LIBC_TYPES_LLDIV_T_H + +typedef struct { + long long quot; + long long rem; +} lldiv_t; + +#endif // LLVM_LIBC_TYPES_LLDIV_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/locale_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/locale_t.h new file mode 100644 index 000000000000..6d783001acf9 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/locale_t.h @@ -0,0 +1,22 @@ +//===-- Definition of type locale_t ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_LOCALE_T_H +#define LLVM_LIBC_TYPES_LOCALE_T_H + +#define NUM_LOCALE_CATEGORIES 6 + +struct __locale_data; + +struct __locale_t { + struct __locale_data *data[NUM_LOCALE_CATEGORIES]; +}; + +typedef struct __locale_t *locale_t; + +#endif // LLVM_LIBC_TYPES_LOCALE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/mbstate_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/mbstate_t.h new file mode 100644 index 000000000000..009fe57da50e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/mbstate_t.h @@ -0,0 +1,20 @@ +//===-- Definition of mbstate_t type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_MBSTATE_T_H +#define LLVM_LIBC_TYPES_MBSTATE_T_H + +#include "../llvm-libc-macros/stdint-macros.h" + +typedef struct { + uint32_t __field1; + uint8_t __field2; + uint8_t __field3; +} mbstate_t; + +#endif // LLVM_LIBC_TYPES_MBSTATE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/mode_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/mode_t.h new file mode 100644 index 000000000000..fe09060d9a6e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/mode_t.h @@ -0,0 +1,14 @@ +//===-- Definition of mode_t type -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_MODE_T_H +#define LLVM_LIBC_TYPES_MODE_T_H + +typedef unsigned mode_t; + +#endif // LLVM_LIBC_TYPES_MODE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/mtx_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/mtx_t.h new file mode 100644 index 000000000000..56e41bdf89bc --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/mtx_t.h @@ -0,0 +1,16 @@ +//===-- Definition of mtx_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_MTX_T_H +#define LLVM_LIBC_TYPES_MTX_T_H + +#include "__mutex_type.h" + +typedef __mutex_type mtx_t; + +#endif // LLVM_LIBC_TYPES_MTX_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/nfds_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/nfds_t.h new file mode 100644 index 000000000000..c0abccee8a7d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/nfds_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type nfds_t -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_NFDS_T_H +#define LLVM_LIBC_TYPES_NFDS_T_H + +typedef unsigned int nfds_t; + +#endif // LLVM_LIBC_TYPES_NFDS_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/nlink_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/nlink_t.h new file mode 100644 index 000000000000..7e0016a9af95 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/nlink_t.h @@ -0,0 +1,14 @@ +//===-- Definition of nlink_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_NLINK_T_H +#define LLVM_LIBC_TYPES_NLINK_T_H + +typedef __UINTPTR_TYPE__ nlink_t; + +#endif // LLVM_LIBC_TYPES_NLINK_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/off64_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/off64_t.h new file mode 100644 index 000000000000..669698a8c05f --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/off64_t.h @@ -0,0 +1,14 @@ +//===-- Definition of off64_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_OFF64_T_H +#define LLVM_LIBC_TYPES_OFF64_T_H + +typedef __INT64_TYPE__ off64_t; + +#endif // LLVM_LIBC_TYPES_OFF64_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/off_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/off_t.h new file mode 100644 index 000000000000..63224b6831d5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/off_t.h @@ -0,0 +1,14 @@ +//===-- Definition of off_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_OFF_T_H +#define LLVM_LIBC_TYPES_OFF_T_H + +typedef __INT64_TYPE__ off_t; + +#endif // LLVM_LIBC_TYPES_OFF_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/once_flag.h b/contrib/llvm-project/libc/include/llvm-libc-types/once_flag.h new file mode 100644 index 000000000000..b3b7e0de988c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/once_flag.h @@ -0,0 +1,20 @@ +//===-- Definition of once_flag type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_ONCE_FLAG_H +#define LLVM_LIBC_TYPES_ONCE_FLAG_H + +#include "__futex_word.h" + +#ifdef __linux__ +typedef __futex_word once_flag; +#else +#error "Once flag type not defined for the target platform." +#endif + +#endif // LLVM_LIBC_TYPES_ONCE_FLAG_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pid_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pid_t.h new file mode 100644 index 000000000000..0397bd249032 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pid_t.h @@ -0,0 +1,14 @@ +//===-- Definition of pid_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PID_T_H +#define LLVM_LIBC_TYPES_PID_T_H + +typedef __INT32_TYPE__ pid_t; + +#endif // LLVM_LIBC_TYPES_PID_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/posix_spawn_file_actions_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/posix_spawn_file_actions_t.h new file mode 100644 index 000000000000..3062da3a54b5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/posix_spawn_file_actions_t.h @@ -0,0 +1,17 @@ +//===-- Definition of type posix_spawn_file_actions_t ---------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_POSIX_SPAWN_FILE_ACTIONS_T_H +#define LLVM_LIBC_TYPES_POSIX_SPAWN_FILE_ACTIONS_T_H + +typedef struct { + void *__front; + void *__back; +} posix_spawn_file_actions_t; + +#endif // LLVM_LIBC_TYPES_POSIX_SPAWN_FILE_ACTIONS_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/posix_spawnattr_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/posix_spawnattr_t.h new file mode 100644 index 000000000000..47cadc7cdda1 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/posix_spawnattr_t.h @@ -0,0 +1,16 @@ +//===-- Definition of type posix_spawn_file_actions_t ---------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_POSIX_SPAWNATTR_T_H +#define LLVM_LIBC_TYPES_POSIX_SPAWNATTR_T_H + +typedef struct { + // This data structure will be populated as required. +} posix_spawnattr_t; + +#endif // LLVM_LIBC_TYPES_POSIX_SPAWNATTR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_attr_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_attr_t.h new file mode 100644 index 000000000000..e686ac91a6fe --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_attr_t.h @@ -0,0 +1,21 @@ +//===-- Definition of pthread_attr_t type ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_ATTR_T_H +#define LLVM_LIBC_TYPES_PTHREAD_ATTR_T_H + +#include "size_t.h" + +typedef struct { + int __detachstate; + void *__stack; + size_t __stacksize; + size_t __guardsize; +} pthread_attr_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_ATTR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_condattr_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_condattr_t.h new file mode 100644 index 000000000000..b91fc2950aa3 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_condattr_t.h @@ -0,0 +1,18 @@ +//===-- Definition of pthread_condattr_t type -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_TYPES_PTHREAD_CONDATTR_T_H +#define LLVM_LIBC_TYPES_PTHREAD_CONDATTR_T_H + +#include "clockid_t.h" + +typedef struct { + clockid_t clock; + int pshared; +} pthread_condattr_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_CONDATTR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_key_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_key_t.h new file mode 100644 index 000000000000..e73c7e26c17c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_key_t.h @@ -0,0 +1,14 @@ +//===-- Definition of the type pthread_key_t ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_KEY_T_H +#define LLVM_LIBC_TYPES_PTHREAD_KEY_T_H + +typedef unsigned int pthread_key_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_KEY_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_mutex_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_mutex_t.h new file mode 100644 index 000000000000..1535cba65835 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_mutex_t.h @@ -0,0 +1,16 @@ +//===-- Definition of pthread_mutex_t type --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_MUTEX_T_H +#define LLVM_LIBC_TYPES_PTHREAD_MUTEX_T_H + +#include "__mutex_type.h" + +typedef __mutex_type pthread_mutex_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_MUTEX_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_mutexattr_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_mutexattr_t.h new file mode 100644 index 000000000000..8f159a61420c --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_mutexattr_t.h @@ -0,0 +1,16 @@ +//===-- Definition of pthread_mutexattr_t type ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_MUTEXATTR_T_H +#define LLVM_LIBC_TYPES_PTHREAD_MUTEXATTR_T_H + +// pthread_mutexattr_t is a collection bit mapped flags. The mapping is internal +// detail of the libc implementation. +typedef unsigned int pthread_mutexattr_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_MUTEXATTR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_once_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_once_t.h new file mode 100644 index 000000000000..12a81502baaf --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_once_t.h @@ -0,0 +1,20 @@ +//===-- Definition of pthread_once_t type ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_ONCE_T_H +#define LLVM_LIBC_TYPES_PTHREAD_ONCE_T_H + +#include "__futex_word.h" + +#ifdef __linux__ +typedef __futex_word pthread_once_t; +#else +#error "Once flag type not defined for the target platform." +#endif + +#endif // LLVM_LIBC_TYPES_PTHREAD_ONCE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_rwlock_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_rwlock_t.h new file mode 100644 index 000000000000..4a7c6c75250a --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_rwlock_t.h @@ -0,0 +1,26 @@ +//===-- Definition of pthread_mutex_t type --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_RWLOCK_T_H +#define LLVM_LIBC_TYPES_PTHREAD_RWLOCK_T_H + +#include "__futex_word.h" +#include "pid_t.h" +typedef struct { + unsigned __is_pshared : 1; + unsigned __preference : 1; + int __state; + pid_t __writer_tid; + __futex_word __wait_queue_mutex; + __futex_word __pending_readers; + __futex_word __pending_writers; + __futex_word __reader_serialization; + __futex_word __writer_serialization; +} pthread_rwlock_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_RWLOCK_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_rwlockattr_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_rwlockattr_t.h new file mode 100644 index 000000000000..397c8440402a --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_rwlockattr_t.h @@ -0,0 +1,16 @@ +//===-- Definition of pthread_rwlockattr_t type ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_TYPES_PTHREAD_RWLOCKATTR_T_H +#define LLVM_LIBC_TYPES_PTHREAD_RWLOCKATTR_T_H + +typedef struct { + int pshared; + int pref; +} pthread_rwlockattr_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_RWLOCKATTR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_spinlock_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_spinlock_t.h new file mode 100644 index 000000000000..afb4fe91edd2 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_spinlock_t.h @@ -0,0 +1,17 @@ +//===-- Definition of pthread_spinlock_t type -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_SPINLOCK_T_H +#define LLVM_LIBC_TYPES_PTHREAD_SPINLOCK_T_H +#include "pid_t.h" +typedef struct { + unsigned char __lockword; + pid_t __owner; +} pthread_spinlock_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_SPINLOCK_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/pthread_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_t.h new file mode 100644 index 000000000000..f64887b25225 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/pthread_t.h @@ -0,0 +1,16 @@ +//===-- Definition of pthread_t type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_PTHREAD_T_H +#define LLVM_LIBC_TYPES_PTHREAD_T_H + +#include "__thread_type.h" + +typedef __thread_type pthread_t; + +#endif // LLVM_LIBC_TYPES_PTHREAD_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/rlim_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/rlim_t.h new file mode 100644 index 000000000000..016ec7bdc5b1 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/rlim_t.h @@ -0,0 +1,14 @@ +//===-- Definition of type rlim_t -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_RLIM_T_H +#define LLVM_LIBC_TYPES_RLIM_T_H + +typedef __UINT64_TYPE__ rlim_t; + +#endif // LLVM_LIBC_TYPES_RLIM_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/sa_family_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/sa_family_t.h new file mode 100644 index 000000000000..0a010b678ddb --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/sa_family_t.h @@ -0,0 +1,19 @@ +//===-- Definition of sa_family_t type ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SA_FAMILY_T_H +#define LLVM_LIBC_TYPES_SA_FAMILY_T_H + +// The posix standard only says of sa_family_t that it must be unsigned. The +// linux man page for "address_families" lists approximately 32 different +// address families, meaning that a short 16 bit number will have plenty of +// space for all of them. + +typedef unsigned short sa_family_t; + +#endif // LLVM_LIBC_TYPES_SA_FAMILY_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/sig_atomic_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/sig_atomic_t.h new file mode 100644 index 000000000000..2ef375806791 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/sig_atomic_t.h @@ -0,0 +1,14 @@ +//===-- Definition of sig_atomic_t type -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SIG_ATOMIC_T_H +#define LLVM_LIBC_TYPES_SIG_ATOMIC_T_H + +typedef int sig_atomic_t; + +#endif // LLVM_LIBC_TYPES_SIG_ATOMIC_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/sighandler_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/sighandler_t.h new file mode 100644 index 000000000000..f39ab0468520 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/sighandler_t.h @@ -0,0 +1,17 @@ +//===-- Definition of sighandler_t ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SIGHANDLER_T_H +#define LLVM_LIBC_TYPES_SIGHANDLER_T_H + +#ifdef __linux__ +// For compatibility with glibc. +typedef void (*sighandler_t)(int); +#endif + +#endif // LLVM_LIBC_TYPES_SIGHANDLER_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/siginfo_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/siginfo_t.h new file mode 100644 index 000000000000..20fdd461bb6d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/siginfo_t.h @@ -0,0 +1,109 @@ +//===-- Definition of siginfo_t type --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SIGINFO_T_H +#define LLVM_LIBC_TYPES_SIGINFO_T_H + +#include "clock_t.h" +#include "pid_t.h" +#include "uid_t.h" +#include "union_sigval.h" + +#define SI_MAX_SIZE 128 + +typedef struct { + int si_signo; /* Signal number. */ + int si_errno; /* If non-zero, an errno value associated with + this signal, as defined in <errno.h>. */ + int si_code; /* Signal code. */ + union { + int _si_pad[SI_MAX_SIZE / sizeof(int)]; + + /* kill() */ + struct { + pid_t si_pid; /* sender's pid */ + uid_t si_uid; /* sender's uid */ + } _kill; + + /* POSIX.1b timers */ + struct { + int si_tid; /* timer id */ + int _overrun; /* overrun count */ + union sigval si_sigval; /* same as below */ + } _timer; + + /* POSIX.1b signals */ + struct { + pid_t si_pid; /* sender's pid */ + uid_t si_uid; /* sender's uid */ + union sigval si_sigval; + } _rt; + + /* SIGCHLD */ + struct { + pid_t si_pid; /* which child */ + uid_t si_uid; /* sender's uid */ + int si_status; /* exit code */ + clock_t si_utime; + clock_t si_stime; + } _sigchld; + + /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */ + struct { + void *si_addr; /* faulting insn/memory ref. */ + short int si_addr_lsb; /* Valid LSB of the reported address. */ + union { + /* used when si_code=SEGV_BNDERR */ + struct { + void *_lower; + void *_upper; + } _addr_bnd; + /* used when si_code=SEGV_PKUERR */ + __UINT32_TYPE__ _pkey; + } _bounds; + } _sigfault; + + /* SIGPOLL */ + struct { + long int si_band; /* POLL_IN, POLL_OUT, POLL_MSG */ + int si_fd; + } _sigpoll; + + /* SIGSYS */ + struct { + void *_call_addr; /* calling user insn */ + int _syscall; /* triggering system call number */ + unsigned int _arch; /* AUDIT_ARCH_* of syscall */ + } _sigsys; + } _sifields; +} siginfo_t; + +#undef SI_MAX_SIZE + +#define si_pid _sifields._kill.si_pid +#define si_uid _sifields._kill.si_uid +#define si_timerid _sifields._timer.si_tid +#define si_overrun _sifields._timer.si_overrun +#define si_status _sifields._sigchld.si_status +#define si_utime _sifields._sigchld.si_utime +#define si_stime _sifields._sigchld.si_stime +#define si_value _sifields._rt.si_sigval +#define si_int _sifields._rt.si_sigval.sival_int +#define si_ptr _sifields._rt.si_sigval.sival_ptr +#define si_addr _sifields._sigfault.si_addr +#define si_addr_lsb _sifields._sigfault.si_addr_lsb +#define si_lower _sifields._sigfault._bounds._addr_bnd._lower +#define si_upper _sifields._sigfault._bounds._addr_bnd._upper +#define si_pkey _sifields._sigfault._bounds._pkey +#define si_band _sifields._sigpoll.si_band +#define si_fd _sifields._sigpoll.si_fd +#define si_call_addr _sifields._sigsys._call_addr +#define si_syscall _sifields._sigsys._syscall +#define si_arch _sifields._sigsys._arch + +#endif // LLVM_LIBC_TYPES_SIGINFO_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/sigset_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/sigset_t.h new file mode 100644 index 000000000000..8c4d3b49533d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/sigset_t.h @@ -0,0 +1,20 @@ +//===-- Definition of sigset_t type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SIGSET_T_H +#define LLVM_LIBC_TYPES_SIGSET_T_H + +#include "../llvm-libc-macros/signal-macros.h" // __NSIGSET_WORDS + +// This definition can be adjusted/specialized for different targets and +// platforms as necessary. This definition works for Linux on most targets. +typedef struct { + unsigned long __signals[__NSIGSET_WORDS]; +} sigset_t; + +#endif // LLVM_LIBC_TYPES_SIGSET_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/size_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/size_t.h new file mode 100644 index 000000000000..26ae68abe0ee --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/size_t.h @@ -0,0 +1,14 @@ +//===-- Definition of size_t types ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SIZE_T_H +#define LLVM_LIBC_TYPES_SIZE_T_H + +typedef __SIZE_TYPE__ size_t; + +#endif // LLVM_LIBC_TYPES_SIZE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/socklen_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/socklen_t.h new file mode 100644 index 000000000000..5357747f5b83 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/socklen_t.h @@ -0,0 +1,18 @@ +//===-- Definition of socklen_t type ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SOCKLEN_T_H +#define LLVM_LIBC_TYPES_SOCKLEN_T_H + +// The posix standard only says of socklen_t that it must be an integer type of +// width of at least 32 bits. The long type is defined as being at least 32 +// bits, so an unsigned long should be fine. + +typedef unsigned long socklen_t; + +#endif // LLVM_LIBC_TYPES_SOCKLEN_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/speed_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/speed_t.h new file mode 100644 index 000000000000..9875d3b82a69 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/speed_t.h @@ -0,0 +1,14 @@ +//===-- Definition of speed_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SPEED_T_H +#define LLVM_LIBC_TYPES_SPEED_T_H + +typedef unsigned int speed_t; + +#endif // LLVM_LIBC_TYPES_SPEED_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/ssize_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/ssize_t.h new file mode 100644 index 000000000000..8f579e2749ba --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/ssize_t.h @@ -0,0 +1,14 @@ +//===-- Definition of ssize_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SSIZE_T_H +#define LLVM_LIBC_TYPES_SSIZE_T_H + +typedef __PTRDIFF_TYPE__ ssize_t; + +#endif // LLVM_LIBC_TYPES_SSIZE_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/stack_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/stack_t.h new file mode 100644 index 000000000000..92d030587168 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/stack_t.h @@ -0,0 +1,22 @@ +//===-- Definition of stack_t type ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STACK_T_H +#define LLVM_LIBC_TYPES_STACK_T_H + +#include "size_t.h" + +typedef struct { + // The order of the fields declared here should match the kernel definition + // of stack_t in order for the SYS_sigaltstack syscall to work correctly. + void *ss_sp; + int ss_flags; + size_t ss_size; +} stack_t; + +#endif // LLVM_LIBC_TYPES_STACK_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/stdfix-types.h b/contrib/llvm-project/libc/include/llvm-libc-types/stdfix-types.h new file mode 100644 index 000000000000..542d45ea97e9 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/stdfix-types.h @@ -0,0 +1,25 @@ +//===-- Definition of stdfix integer types --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STDFIX_TYPES_H +#define LLVM_LIBC_TYPES_STDFIX_TYPES_H + +typedef signed char int_hr_t; +typedef signed short int int_r_t; +typedef signed int int_lr_t; +typedef signed short int_hk_t; +typedef signed int int_k_t; +typedef signed long long int_lk_t; +typedef unsigned char uint_uhr_t; +typedef unsigned short int uint_ur_t; +typedef unsigned int uint_ulr_t; +typedef unsigned short int uint_uhk_t; +typedef unsigned int uint_uk_t; +typedef unsigned long long uint_ulk_t; + +#endif // LLVM_LIBC_TYPES_STDFIX_TYPES_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_dirent.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_dirent.h new file mode 100644 index 000000000000..f950869fc77d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_dirent.h @@ -0,0 +1,29 @@ +//===-- Definition of type struct dirent ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_DIRENT_H +#define LLVM_LIBC_TYPES_STRUCT_DIRENT_H + +#include "ino_t.h" +#include "off_t.h" + +struct dirent { + ino_t d_ino; +#ifdef __linux__ + off_t d_off; + unsigned short d_reclen; +#endif + unsigned char d_type; + // The user code should use strlen to determine actual the size of d_name. + // Likewise, it is incorrect and prohibited by the POSIX standard to detemine + // the size of struct dirent type using sizeof. The size should be got using + // a different method, for example, from the d_reclen field on Linux. + char d_name[1]; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_DIRENT_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_dl_phdr_info.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_dl_phdr_info.h new file mode 100644 index 000000000000..2b9a5d21b4a1 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_dl_phdr_info.h @@ -0,0 +1,30 @@ +//===-- Definition of type struct dl_phdr_info ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H +#define LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H + +#include "../llvm-libc-macros/link-macros.h" +#include "size_t.h" +#include <elf.h> +#include <stdint.h> + +struct dl_phdr_info { + ElfW(Addr) dlpi_addr; + const char *dlpi_name; + const ElfW(Phdr) * dlpi_phdr; + ElfW(Half) dlpi_phnum; + + uint64_t dlpi_adds; + uint64_t dlpi_subs; + + size_t dlpi_tls_modid; + void *dlpi_tls_data; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_epoll_data.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_epoll_data.h new file mode 100644 index 000000000000..7200276a141e --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_epoll_data.h @@ -0,0 +1,21 @@ +//===-- Definition of epoll_data type -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_EPOLL_DATA_H +#define LLVM_LIBC_TYPES_STRUCT_EPOLL_DATA_H + +union epoll_data { + void *ptr; + int fd; + __UINT32_TYPE__ u32; + __UINT64_TYPE__ u64; +}; + +typedef union epoll_data epoll_data_t; + +#endif // LLVM_LIBC_TYPES_STRUCT_EPOLL_DATA_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_epoll_event.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_epoll_event.h new file mode 100644 index 000000000000..f95fd1a92bc8 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_epoll_event.h @@ -0,0 +1,23 @@ +//===-- Definition of epoll_event type ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_EPOLL_EVENT_H +#define LLVM_LIBC_TYPES_STRUCT_EPOLL_EVENT_H + +#include "struct_epoll_data.h" + +typedef struct +#ifdef __x86_64__ + [[gnu::packed]] // Necessary for compatibility. +#endif + epoll_event { + __UINT32_TYPE__ events; + epoll_data_t data; +} epoll_event; + +#endif // LLVM_LIBC_TYPES_STRUCT_EPOLL_EVENT_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_f_owner_ex.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_f_owner_ex.h new file mode 100644 index 000000000000..87d4b8988178 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_f_owner_ex.h @@ -0,0 +1,25 @@ +//===-- Definition of type struct f_owner_ex ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_F_OWNER_EX_H +#define LLVM_LIBC_TYPES_STRUCT_F_OWNER_EX_H + +#include "pid_t.h" + +enum pid_type { + F_OWNER_TID = 0, + F_OWNER_PID, + F_OWNER_PGRP, +}; + +struct f_owner_ex { + enum pid_type type; + pid_t pid; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_F_OWNER_EX_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_flock.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_flock.h new file mode 100644 index 000000000000..d4bde09045e8 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_flock.h @@ -0,0 +1,25 @@ +//===-- Definition of type struct flock64 ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_FLOCK_H +#define LLVM_LIBC_TYPES_STRUCT_FLOCK_H + +#include "off_t.h" +#include "pid_t.h" + +#include <stdint.h> + +struct flock { + int16_t l_type; + int16_t l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_FLOCK_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_flock64.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_flock64.h new file mode 100644 index 000000000000..8e485d737738 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_flock64.h @@ -0,0 +1,25 @@ +//===-- Definition of type struct flock64 ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_FLOCK64_H +#define LLVM_LIBC_TYPES_STRUCT_FLOCK64_H + +#include "off64_t.h" +#include "pid_t.h" + +#include <stdint.h> + +struct flock64 { + int16_t l_type; + int16_t l_whence; + off64_t l_start; + off64_t l_len; + pid_t l_pid; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_FLOCK64_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_hsearch_data.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_hsearch_data.h new file mode 100644 index 000000000000..cdb1d0c5da14 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_hsearch_data.h @@ -0,0 +1,17 @@ +//===-- Definition of type struct hsearch_data ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_HSEARCH_DATA_H +#define LLVM_LIBC_TYPES_STRUCT_HSEARCH_DATA_H + +struct hsearch_data { + void *__opaque; + unsigned int __unused[2]; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_HSEARCH_DATA_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_iovec.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_iovec.h new file mode 100644 index 000000000000..db2ca64cc1a1 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_iovec.h @@ -0,0 +1,19 @@ +//===-- Definition of struct iovec ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_IOVEC_H +#define LLVM_LIBC_TYPES_STRUCT_IOVEC_H + +#include "size_t.h" + +struct iovec { + void *iov_base; + size_t iov_len; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_IOVEC_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_itimerval.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_itimerval.h new file mode 100644 index 000000000000..e23f1e6076df --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_itimerval.h @@ -0,0 +1,19 @@ +//===-- Definition of struct itimerval ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_ITIMERVAL_H +#define LLVM_LIBC_TYPES_STRUCT_ITIMERVAL_H + +#include "struct_timeval.h" + +struct itimerval { + struct timeval it_interval; /* Interval for periodic timer */ + struct timeval it_value; /* Time until next expiration */ +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_ITIMERVAL_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_lconv.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_lconv.h new file mode 100644 index 000000000000..9d69f055484d --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_lconv.h @@ -0,0 +1,39 @@ +//===-- Definition of type lconv ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_LCONV_H +#define LLVM_LIBC_TYPES_LCONV_H + +struct lconv { + char *decimal_point; + char *thousands_sep; + char *grouping; + char *mon_decimal_point; + char *mon_thousands_sep; + char *mon_grouping; + char *positive_sign; + char *negative_sign; + char *currency_symbol; + char frac_digits; + char p_cs_precedes; + char n_cs_precedes; + char p_sep_by_space; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; + char *int_curr_symbol; + char int_frac_digits; + char int_p_cs_precedes; + char int_n_cs_precedes; + char int_p_sep_by_space; + char int_n_sep_by_space; + char int_p_sign_posn; + char int_n_sign_posn; +}; + +#endif // LLVM_LIBC_TYPES_LCONV_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_msghdr.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_msghdr.h new file mode 100644 index 000000000000..7933de190f34 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_msghdr.h @@ -0,0 +1,26 @@ +//===-- Definition of struct msghdr ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_MSGHDR_H +#define LLVM_LIBC_TYPES_STRUCT_MSGHDR_H + +#include "size_t.h" +#include "socklen_t.h" +#include "struct_iovec.h" + +struct msghdr { + void *msg_name; /* Optional address */ + socklen_t msg_namelen; /* Size of address */ + struct iovec *msg_iov; /* Scatter/gather array */ + size_t msg_iovlen; /* # elements in msg_iov */ + void *msg_control; /* Ancillary data, see below */ + size_t msg_controllen; /* Ancillary data buffer len */ + int msg_flags; /* Flags (unused) */ +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_MSGHDR_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_pollfd.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_pollfd.h new file mode 100644 index 000000000000..80abc8e76efc --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_pollfd.h @@ -0,0 +1,18 @@ +//===-- Definition of type struct pollfd ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_POLLFD_H +#define LLVM_LIBC_TYPES_STRUCT_POLLFD_H + +struct pollfd { + int fd; + short events; + short revents; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_POLLFD_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_rlimit.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_rlimit.h new file mode 100644 index 000000000000..15d8c0e16a64 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_rlimit.h @@ -0,0 +1,19 @@ +//===-- Definition of type struct rlimit ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_RLIMIT_H +#define LLVM_LIBC_TYPES_STRUCT_RLIMIT_H + +#include "rlim_t.h" + +struct rlimit { + rlim_t rlim_cur; + rlim_t rlim_max; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_RLIMIT_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_rusage.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_rusage.h new file mode 100644 index 000000000000..59fe9f7c1d2b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_rusage.h @@ -0,0 +1,37 @@ +//===-- Definition of type struct rusage ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_RUSAGE_H +#define LLVM_LIBC_TYPES_STRUCT_RUSAGE_H + +#include "struct_timeval.h" + +struct rusage { + struct timeval ru_utime; + struct timeval ru_stime; +#ifdef __linux__ + // Following fields are linux extensions as expected by the + // linux syscalls. + long ru_maxrss; // Maximum resident set size + long ru_ixrss; // Integral shared memory size + long ru_idrss; // Integral unshared data size + long ru_isrss; // Integral unshared stack size + long ru_minflt; // Page reclaims + long ru_majflt; // Page faults + long ru_nswap; // Swaps + long ru_inblock; // Block input operations + long ru_oublock; // Block output operations + long ru_msgsnd; // Messages sent + long ru_msgrcv; // Messages received + long ru_nsignals; // Signals received + long ru_nvcsw; // Voluntary context switches + long ru_nivcsw; // Involuntary context switches +#endif +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_RUSAGE_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_sched_param.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sched_param.h new file mode 100644 index 000000000000..e44a00bc0e87 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sched_param.h @@ -0,0 +1,21 @@ +//===-- Definition of type struct sched_param -----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_SCHED_PARAM_H +#define LLVM_LIBC_TYPES_STRUCT_SCHED_PARAM_H + +#include "pid_t.h" +#include "struct_timespec.h" +#include "time_t.h" + +struct sched_param { + // Process or thread execution scheduling priority. + int sched_priority; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_SCHED_PARAM_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_sigaction.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sigaction.h new file mode 100644 index 000000000000..907418b5e0f9 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sigaction.h @@ -0,0 +1,28 @@ +//===-- Definition of struct __sigaction ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_SIGACTION_H +#define LLVM_LIBC_TYPES_STRUCT_SIGACTION_H + +#include "siginfo_t.h" +#include "sigset_t.h" + +struct sigaction { + union { + void (*sa_handler)(int); + void (*sa_sigaction)(int, siginfo_t *, void *); + }; + sigset_t sa_mask; + int sa_flags; +#ifdef __linux__ + // This field is present on linux for most targets. + void (*sa_restorer)(void); +#endif +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_SIGACTION_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_sockaddr.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sockaddr.h new file mode 100644 index 000000000000..b7579e9c6ba7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sockaddr.h @@ -0,0 +1,21 @@ +//===-- Definition of struct sockaddr -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_SOCKADDR_H +#define LLVM_LIBC_TYPES_STRUCT_SOCKADDR_H + +#include "sa_family_t.h" + +struct sockaddr { + sa_family_t sa_family; + // sa_data is a variable length array. It is provided with a length of one + // here as a placeholder. + char sa_data[1]; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_SOCKADDR_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_sockaddr_un.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sockaddr_un.h new file mode 100644 index 000000000000..5ed31a49ebb5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_sockaddr_un.h @@ -0,0 +1,22 @@ +//===-- Definition of struct sockaddr_un ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_SOCKADDR_UN_H +#define LLVM_LIBC_TYPES_STRUCT_SOCKADDR_UN_H + +#include "sa_family_t.h" + +// This is the sockaddr specialization for AF_UNIX or AF_LOCAL sockets, as +// defined by posix. + +struct sockaddr_un { + sa_family_t sun_family; /* AF_UNIX */ + char sun_path[108]; /* Pathname */ +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_SOCKADDR_UN_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_stat.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_stat.h new file mode 100644 index 000000000000..4026679f8d67 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_stat.h @@ -0,0 +1,39 @@ +//===-- Definition of struct stat -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_STAT_H +#define LLVM_LIBC_TYPES_STRUCT_STAT_H + +#include "blkcnt_t.h" +#include "blksize_t.h" +#include "dev_t.h" +#include "gid_t.h" +#include "ino_t.h" +#include "mode_t.h" +#include "nlink_t.h" +#include "off_t.h" +#include "struct_timespec.h" +#include "uid_t.h" + +struct stat { + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + off_t st_size; + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + blksize_t st_blksize; + blkcnt_t st_blocks; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_STAT_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_statvfs.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_statvfs.h new file mode 100644 index 000000000000..9c649af151ff --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_statvfs.h @@ -0,0 +1,29 @@ +//===-- Definition of type struct statvfs ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_STATVFS_H +#define LLVM_LIBC_TYPES_STRUCT_STATVFS_H + +#include "fsblkcnt_t.h" +#include "fsfilcnt_t.h" + +struct statvfs { + unsigned long f_bsize; /* Filesystem block size */ + unsigned long f_frsize; /* Fragment size */ + fsblkcnt_t f_blocks; /* Size of fs in f_frsize units */ + fsblkcnt_t f_bfree; /* Number of free blocks */ + fsblkcnt_t f_bavail; /* Number of free blocks for unprivileged users */ + fsfilcnt_t f_files; /* Number of inodes */ + fsfilcnt_t f_ffree; /* Number of free inodes */ + fsfilcnt_t f_favail; /* Number of free inodes for unprivileged users */ + unsigned long f_fsid; /* Filesystem ID */ + unsigned long f_flag; /* Mount flags */ + unsigned long f_namemax; /* Maximum filename length */ +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_STATVFS_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_termios.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_termios.h new file mode 100644 index 000000000000..e3c5f2809e43 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_termios.h @@ -0,0 +1,32 @@ +//===-- Definition of struct termios --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __LLVM_LIBC_TYPES_STRUCT_TERMIOS_H__ +#define __LLVM_LIBC_TYPES_STRUCT_TERMIOS_H__ + +#include "cc_t.h" +#include "speed_t.h" +#include "tcflag_t.h" + +struct termios { + tcflag_t c_iflag; // Input mode flags + tcflag_t c_oflag; // Output mode flags + tcflag_t c_cflag; // Control mode flags + tcflag_t c_lflag; // Local mode flags +#ifdef __linux__ + cc_t c_line; // Line discipline +#endif // __linux__ + // NCCS is defined in llvm-libc-macros/termios-macros.h. + cc_t c_cc[NCCS]; // Control characters +#ifdef __linux__ + speed_t c_ispeed; // Input speed + speed_t c_ospeed; // output speed +#endif // __linux__ +}; + +#endif // __LLVM_LIBC_TYPES_STRUCT_TERMIOS_H__ diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_timespec.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_timespec.h new file mode 100644 index 000000000000..28b5a571f679 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_timespec.h @@ -0,0 +1,20 @@ +//===-- Definition of struct timespec -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_TIMESPEC_H +#define LLVM_LIBC_TYPES_STRUCT_TIMESPEC_H + +#include "time_t.h" + +struct timespec { + time_t tv_sec; /* Seconds. */ + /* TODO: BIG_ENDIAN may require padding. */ + long tv_nsec; /* Nanoseconds. */ +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_TIMESPEC_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_timeval.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_timeval.h new file mode 100644 index 000000000000..9595d85a46c8 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_timeval.h @@ -0,0 +1,20 @@ +//===-- Definition of struct timeval -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_TIMEVAL_H +#define LLVM_LIBC_TYPES_STRUCT_TIMEVAL_H + +#include "suseconds_t.h" +#include "time_t.h" + +struct timeval { + time_t tv_sec; // Seconds + suseconds_t tv_usec; // Micro seconds +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_TIMEVAL_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_tm.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_tm.h new file mode 100644 index 000000000000..2ec74ecac029 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_tm.h @@ -0,0 +1,25 @@ +//===-- Definition of struct tm -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_TM_H +#define LLVM_LIBC_TYPES_STRUCT_TM_H + +struct tm { + int tm_sec; // seconds after the minute + int tm_min; // minutes after the hour + int tm_hour; // hours since midnight + int tm_mday; // day of the month + int tm_mon; // months since January + int tm_year; // years since 1900 + int tm_wday; // days since Sunday + int tm_yday; // days since January + int tm_isdst; // Daylight Saving Time flag + // TODO: add tm_gmtoff and tm_zone? (posix extensions) +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_TM_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/struct_utsname.h b/contrib/llvm-project/libc/include/llvm-libc-types/struct_utsname.h new file mode 100644 index 000000000000..e474171c7285 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/struct_utsname.h @@ -0,0 +1,34 @@ +//===-- Definition of struct utsname --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_STRUCT_UTSNAME_H +#define LLVM_LIBC_TYPES_STRUCT_UTSNAME_H + +#if defined(__linux__) +#define __UTS_NAME_LENGTH 65 +#elif defined(__APPLE__) +#define __UTS_NAME_LENGTH 256 +#else +// Arbitray default. Should be specialized for each platform. +#define __UTS_NAME_LENGTH 1024 +#endif + +struct utsname { + char sysname[__UTS_NAME_LENGTH]; + char nodename[__UTS_NAME_LENGTH]; + char release[__UTS_NAME_LENGTH]; + char version[__UTS_NAME_LENGTH]; + char machine[__UTS_NAME_LENGTH]; +#ifdef __linux__ + char domainname[__UTS_NAME_LENGTH]; +#endif +}; + +#undef __UTS_NAME_LENGTH + +#endif // LLVM_LIBC_TYPES_STRUCT_UTSNAME_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/suseconds_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/suseconds_t.h new file mode 100644 index 000000000000..8e926e8401f5 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/suseconds_t.h @@ -0,0 +1,19 @@ +//===-- Definition of suseconds_t type ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_SUSECONDS_T_H +#define LLVM_LIBC_TYPES_SUSECONDS_T_H + +// Per posix: suseconds_t shall be a signed integer type capable of storing +// values at least in the range [-1, 1000000]. [...] the widths of [other +// types...] and suseconds_t are no greater than the width of type long. + +// The kernel expects 64 bit suseconds_t at least on x86_64. +typedef long suseconds_t; + +#endif // LLVM_LIBC_TYPES_SUSECONDS_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/tcflag_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/tcflag_t.h new file mode 100644 index 000000000000..2978487df434 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/tcflag_t.h @@ -0,0 +1,14 @@ +//===-- Definition of tcflag_t type ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_TCFLAG_T_H +#define LLVM_LIBC_TYPES_TCFLAG_T_H + +typedef unsigned int tcflag_t; + +#endif // LLVM_LIBC_TYPES_TCFLAG_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/test_rpc_opcodes_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/test_rpc_opcodes_t.h new file mode 100644 index 000000000000..7129768dc8b9 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/test_rpc_opcodes_t.h @@ -0,0 +1,21 @@ +//===-- Definition of RPC opcodes used for internal tests -----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_TEST_RPC_OPCODES_T_H +#define LLVM_LIBC_TYPES_TEST_RPC_OPCODES_T_H + +// We consider the first 32768 opcodes as reserved for libc purposes. We allow +// extensions to use any other number without conflicting with anything else. +typedef enum : unsigned short { + RPC_TEST_NOOP = 1 << 15, + RPC_TEST_INCREMENT, + RPC_TEST_INTERFACE, + RPC_TEST_STREAM, +} rpc_test_opcode_t; + +#endif // LLVM_LIBC_TYPES_TEST_RPC_OPCODES_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/thrd_start_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/thrd_start_t.h new file mode 100644 index 000000000000..1fb21bccc036 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/thrd_start_t.h @@ -0,0 +1,14 @@ +//===-- Definition of thrd_start_t type -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_THRD_START_T_H +#define LLVM_LIBC_TYPES_THRD_START_T_H + +typedef int (*thrd_start_t)(void *); + +#endif // LLVM_LIBC_TYPES_THRD_START_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/thrd_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/thrd_t.h new file mode 100644 index 000000000000..d5f31064f2fe --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/thrd_t.h @@ -0,0 +1,16 @@ +//===-- Definition of thrd_t type -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_THRD_T_H +#define LLVM_LIBC_TYPES_THRD_T_H + +#include "__thread_type.h" + +typedef __thread_type thrd_t; + +#endif // LLVM_LIBC_TYPES_THRD_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/time_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/time_t.h new file mode 100644 index 000000000000..76920dc07ec6 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/time_t.h @@ -0,0 +1,18 @@ +//===-- Definition of the type time_t, for use during the libc build ------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_TIME_T_H +#define LLVM_LIBC_TYPES_TIME_T_H + +#ifdef LIBC_TYPES_TIME_T_IS_32_BIT +#include "time_t_32.h" +#else +#include "time_t_64.h" +#endif + +#endif // LLVM_LIBC_TYPES_TIME_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/time_t_32.h b/contrib/llvm-project/libc/include/llvm-libc-types/time_t_32.h new file mode 100644 index 000000000000..2c415f6fa9dc --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/time_t_32.h @@ -0,0 +1,14 @@ +//===-- Definition of the type time_t -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_TIME_T_32_H +#define LLVM_LIBC_TYPES_TIME_T_32_H + +typedef __INT32_TYPE__ time_t; + +#endif // LLVM_LIBC_TYPES_TIME_T_32_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/time_t_64.h b/contrib/llvm-project/libc/include/llvm-libc-types/time_t_64.h new file mode 100644 index 000000000000..8f7fd3233646 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/time_t_64.h @@ -0,0 +1,14 @@ +//===-- Definition of the type time_t -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_TIME_T_64_H +#define LLVM_LIBC_TYPES_TIME_T_64_H + +typedef __INT64_TYPE__ time_t; + +#endif // LLVM_LIBC_TYPES_TIME_T_64_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/tss_dtor_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/tss_dtor_t.h new file mode 100644 index 000000000000..c54b34e7d8b7 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/tss_dtor_t.h @@ -0,0 +1,14 @@ +//===-- Definition of the type tss_dtor_t ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_TSS_DTOR_T_H +#define LLVM_LIBC_TYPES_TSS_DTOR_T_H + +typedef void (*tss_dtor_t)(void *); + +#endif // LLVM_LIBC_TYPES_TSS_DTOR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/tss_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/tss_t.h new file mode 100644 index 000000000000..92bc7ef451ca --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/tss_t.h @@ -0,0 +1,14 @@ +//===-- Definition of the type tss_t --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_TSS_T_H +#define LLVM_LIBC_TYPES_TSS_T_H + +typedef unsigned int tss_t; + +#endif // LLVM_LIBC_TYPES_TSS_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/uid_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/uid_t.h new file mode 100644 index 000000000000..4f6c6479186b --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/uid_t.h @@ -0,0 +1,14 @@ +//===-- Definition of uid_t type ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_UID_T_H +#define LLVM_LIBC_TYPES_UID_T_H + +typedef __UINT32_TYPE__ uid_t; + +#endif // LLVM_LIBC_TYPES_UID_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/union_sigval.h b/contrib/llvm-project/libc/include/llvm-libc-types/union_sigval.h new file mode 100644 index 000000000000..5f83cd220308 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/union_sigval.h @@ -0,0 +1,17 @@ +//===-- Definition of type union sigval -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_UNION_SIGVAL_H +#define LLVM_LIBC_TYPES_UNION_SIGVAL_H + +union sigval { + int sival_int; + void *sival_ptr; +}; + +#endif // LLVM_LIBC_TYPES_UNION_SIGVAL_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/wchar_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/wchar_t.h new file mode 100644 index 000000000000..bf2633a1c244 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/wchar_t.h @@ -0,0 +1,19 @@ +//===-- Definition of wchar_t types ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_WCHAR_T_H +#define LLVM_LIBC_TYPES_WCHAR_T_H + +// wchar_t is a fundamental type in C++. +#ifndef __cplusplus + +typedef __WCHAR_TYPE__ wchar_t; + +#endif + +#endif // LLVM_LIBC_TYPES_WCHAR_T_H diff --git a/contrib/llvm-project/libc/include/llvm-libc-types/wint_t.h b/contrib/llvm-project/libc/include/llvm-libc-types/wint_t.h new file mode 100644 index 000000000000..a53c6e3cb622 --- /dev/null +++ b/contrib/llvm-project/libc/include/llvm-libc-types/wint_t.h @@ -0,0 +1,14 @@ +//===-- Definition of wint_t types ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TYPES_WINT_T_H +#define LLVM_LIBC_TYPES_WINT_T_H + +typedef __WINT_TYPE__ wint_t; + +#endif // LLVM_LIBC_TYPES_WINT_T_H diff --git a/contrib/llvm-project/libc/include/sys/queue.h b/contrib/llvm-project/libc/include/sys/queue.h new file mode 100644 index 000000000000..fc739b4a253b --- /dev/null +++ b/contrib/llvm-project/libc/include/sys/queue.h @@ -0,0 +1,14 @@ +//===-- BSD sys/queue.h ---------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef SYS_QUEUE_H +#define SYS_QUEUE_H + +#include "../llvm-libc-macros/sys-queue-macros.h" + +#endif // SYS_QUEUE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/README.md b/contrib/llvm-project/libc/src/__support/CPP/README.md new file mode 100644 index 000000000000..b470c3f1dc34 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/README.md @@ -0,0 +1,13 @@ +This directory contains partial re-implementations of some C++ standard library +utilities. They are for use with internal LLVM libc code and tests. + +More utilities can be added on an as needed basis. There are certain rules to +be followed for future changes and additions: + +1. Only two kind of headers can be included: Other headers from this directory, +and free standing C headers. +2. Free standing C headers are to be included as C headers and not as C++ +headers. That is, use `#include <stddef.h>` and not `#include <cstddef>`. +3. The utilities should be defined in the namespace `LIBC_NAMESPACE::cpp`. The +higher level namespace should have a `__` prefix to avoid symbol name pollution +when the utilities are used in implementation of public functions. diff --git a/contrib/llvm-project/libc/src/__support/CPP/algorithm.h b/contrib/llvm-project/libc/src/__support/CPP/algorithm.h new file mode 100644 index 000000000000..7704b3fa81f0 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/algorithm.h @@ -0,0 +1,49 @@ +//===-- A self contained equivalent of <algorithm> --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This file is minimalist on purpose but can receive a few more function if +// they prove useful. +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ALGORITHM_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_ALGORITHM_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +template <class T> LIBC_INLINE constexpr const T &max(const T &a, const T &b) { + return (a < b) ? b : a; +} + +template <class T> LIBC_INLINE constexpr const T &min(const T &a, const T &b) { + return (a < b) ? a : b; +} + +template <class T> LIBC_INLINE constexpr T abs(T a) { return a < 0 ? -a : a; } + +template <class InputIt, class UnaryPred> +LIBC_INLINE constexpr InputIt find_if_not(InputIt first, InputIt last, + UnaryPred q) { + for (; first != last; ++first) + if (!q(*first)) + return first; + + return last; +} + +template <class InputIt, class UnaryPred> +LIBC_INLINE constexpr bool all_of(InputIt first, InputIt last, UnaryPred p) { + return find_if_not(first, last, p) == last; +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_ALGORITHM_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/array.h b/contrib/llvm-project/libc/src/__support/CPP/array.h new file mode 100644 index 000000000000..db0a986b7120 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/array.h @@ -0,0 +1,80 @@ +//===-- A self contained equivalent of std::array ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H + +#include "src/__support/CPP/iterator.h" // reverse_iterator +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include <stddef.h> // For size_t. + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +template <class T, size_t N> struct array { + static_assert(N != 0, + "Cannot create a LIBC_NAMESPACE::cpp::array of size 0."); + + T Data[N]; + using value_type = T; + using iterator = T *; + using const_iterator = const T *; + using reverse_iterator = cpp::reverse_iterator<iterator>; + using const_reverse_iterator = cpp::reverse_iterator<const_iterator>; + + LIBC_INLINE constexpr T *data() { return Data; } + LIBC_INLINE constexpr const T *data() const { return Data; } + + LIBC_INLINE constexpr T &front() { return Data[0]; } + LIBC_INLINE constexpr const T &front() const { return Data[0]; } + + LIBC_INLINE constexpr T &back() { return Data[N - 1]; } + LIBC_INLINE constexpr const T &back() const { return Data[N - 1]; } + + LIBC_INLINE constexpr T &operator[](size_t Index) { return Data[Index]; } + + LIBC_INLINE constexpr const T &operator[](size_t Index) const { + return Data[Index]; + } + + LIBC_INLINE constexpr size_t size() const { return N; } + + LIBC_INLINE constexpr bool empty() const { return N == 0; } + + LIBC_INLINE constexpr iterator begin() { return Data; } + LIBC_INLINE constexpr const_iterator begin() const { return Data; } + LIBC_INLINE constexpr const_iterator cbegin() const { return begin(); } + + LIBC_INLINE constexpr iterator end() { return Data + N; } + LIBC_INLINE constexpr const_iterator end() const { return Data + N; } + LIBC_INLINE constexpr const_iterator cend() const { return end(); } + + LIBC_INLINE constexpr reverse_iterator rbegin() { + return reverse_iterator{end()}; + } + LIBC_INLINE constexpr const_reverse_iterator rbegin() const { + return const_reverse_iterator{end()}; + } + LIBC_INLINE constexpr const_reverse_iterator crbegin() const { + return rbegin(); + } + + LIBC_INLINE constexpr reverse_iterator rend() { + return reverse_iterator{begin()}; + } + LIBC_INLINE constexpr const_reverse_iterator rend() const { + return const_reverse_iterator{begin()}; + } + LIBC_INLINE constexpr const_reverse_iterator crend() const { return rend(); } +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/atomic.h b/contrib/llvm-project/libc/src/__support/CPP/atomic.h new file mode 100644 index 000000000000..53b583c04ba1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/atomic.h @@ -0,0 +1,430 @@ +//===-- A simple equivalent of std::atomic ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ATOMIC_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_ATOMIC_H + +#include "src/__support/CPP/type_traits/has_unique_object_representations.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#include "type_traits.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +enum class MemoryOrder : int { + RELAXED = __ATOMIC_RELAXED, + CONSUME = __ATOMIC_CONSUME, + ACQUIRE = __ATOMIC_ACQUIRE, + RELEASE = __ATOMIC_RELEASE, + ACQ_REL = __ATOMIC_ACQ_REL, + SEQ_CST = __ATOMIC_SEQ_CST +}; + +// These are a clang extension, see the clang documentation for more +// information: +// https://clang.llvm.org/docs/LanguageExtensions.html#scoped-atomic-builtins. +enum class MemoryScope : int { +#if defined(__MEMORY_SCOPE_SYSTEM) && defined(__MEMORY_SCOPE_DEVICE) + SYSTEM = __MEMORY_SCOPE_SYSTEM, + DEVICE = __MEMORY_SCOPE_DEVICE, +#else + SYSTEM = 0, + DEVICE = 0, +#endif +}; + +namespace impl { +LIBC_INLINE constexpr int order(MemoryOrder mem_ord) { + return static_cast<int>(mem_ord); +} + +LIBC_INLINE constexpr int scope(MemoryScope mem_scope) { + return static_cast<int>(mem_scope); +} + +template <class T> LIBC_INLINE T *addressof(T &ref) { + return __builtin_addressof(ref); +} + +LIBC_INLINE constexpr int infer_failure_order(MemoryOrder mem_ord) { + if (mem_ord == MemoryOrder::RELEASE) + return order(MemoryOrder::RELAXED); + if (mem_ord == MemoryOrder::ACQ_REL) + return order(MemoryOrder::ACQUIRE); + return order(mem_ord); +} +} // namespace impl + +template <typename T> struct Atomic { + static_assert(is_trivially_copyable_v<T> && is_copy_constructible_v<T> && + is_move_constructible_v<T> && is_copy_assignable_v<T> && + is_move_assignable_v<T>, + "atomic<T> requires T to be trivially copyable, copy " + "constructible, move constructible, copy assignable, " + "and move assignable."); + + static_assert(cpp::has_unique_object_representations_v<T>, + "atomic<T> in libc only support types whose values has unique " + "object representations."); + +private: + // type conversion helper to avoid long c++ style casts + + // Require types that are 1, 2, 4, 8, or 16 bytes in length to be aligned to + // at least their size to be potentially used lock-free. + LIBC_INLINE_VAR static constexpr size_t MIN_ALIGNMENT = + (sizeof(T) & (sizeof(T) - 1)) || (sizeof(T) > 16) ? 0 : sizeof(T); + + LIBC_INLINE_VAR static constexpr size_t ALIGNMENT = alignof(T) > MIN_ALIGNMENT + ? alignof(T) + : MIN_ALIGNMENT; + +public: + using value_type = T; + + // We keep the internal value public so that it can be addressable. + // This is useful in places like the Linux futex operations where + // we need pointers to the memory of the atomic values. Load and store + // operations should be performed using the atomic methods however. + alignas(ALIGNMENT) value_type val; + + LIBC_INLINE constexpr Atomic() = default; + + // Initializes the value without using atomic operations. + LIBC_INLINE constexpr Atomic(value_type v) : val(v) {} + + LIBC_INLINE Atomic(const Atomic &) = delete; + LIBC_INLINE Atomic &operator=(const Atomic &) = delete; + + // Atomic load. + LIBC_INLINE operator T() { return load(); } + + LIBC_INLINE T + load(MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + T res; +#if __has_builtin(__scoped_atomic_load) + __scoped_atomic_load(impl::addressof(val), impl::addressof(res), + impl::order(mem_ord), impl::scope(mem_scope)); +#else + __atomic_load(impl::addressof(val), impl::addressof(res), + impl::order(mem_ord)); +#endif + return res; + } + + // Atomic store. + LIBC_INLINE T operator=(T rhs) { + store(rhs); + return rhs; + } + + LIBC_INLINE void + store(T rhs, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { +#if __has_builtin(__scoped_atomic_store) + __scoped_atomic_store(impl::addressof(val), impl::addressof(rhs), + impl::order(mem_ord), impl::scope(mem_scope)); +#else + __atomic_store(impl::addressof(val), impl::addressof(rhs), + impl::order(mem_ord)); +#endif + } + + // Atomic compare exchange + LIBC_INLINE bool compare_exchange_strong( + T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + return __atomic_compare_exchange( + impl::addressof(val), impl::addressof(expected), + impl::addressof(desired), false, impl::order(mem_ord), + impl::infer_failure_order(mem_ord)); + } + + // Atomic compare exchange (separate success and failure memory orders) + LIBC_INLINE bool compare_exchange_strong( + T &expected, T desired, MemoryOrder success_order, + MemoryOrder failure_order, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + return __atomic_compare_exchange( + impl::addressof(val), impl::addressof(expected), + impl::addressof(desired), false, impl::order(success_order), + impl::order(failure_order)); + } + + // Atomic compare exchange (weak version) + LIBC_INLINE bool compare_exchange_weak( + T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + return __atomic_compare_exchange( + impl::addressof(val), impl::addressof(expected), + impl::addressof(desired), true, impl::order(mem_ord), + impl::infer_failure_order(mem_ord)); + } + + // Atomic compare exchange (weak version with separate success and failure + // memory orders) + LIBC_INLINE bool compare_exchange_weak( + T &expected, T desired, MemoryOrder success_order, + MemoryOrder failure_order, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + return __atomic_compare_exchange( + impl::addressof(val), impl::addressof(expected), + impl::addressof(desired), true, impl::order(success_order), + impl::order(failure_order)); + } + + LIBC_INLINE T + exchange(T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + T ret; +#if __has_builtin(__scoped_atomic_exchange) + __scoped_atomic_exchange(impl::addressof(val), impl::addressof(desired), + impl::addressof(ret), impl::order(mem_ord), + impl::scope(mem_scope)); +#else + __atomic_exchange(impl::addressof(val), impl::addressof(desired), + impl::addressof(ret), impl::order(mem_ord)); +#endif + return ret; + } + + LIBC_INLINE T + fetch_add(T increment, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_add) + return __scoped_atomic_fetch_add(impl::addressof(val), increment, + impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_add(impl::addressof(val), increment, + impl::order(mem_ord)); +#endif + } + + LIBC_INLINE T + fetch_or(T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_or) + return __scoped_atomic_fetch_or(impl::addressof(val), mask, + impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_or(impl::addressof(val), mask, impl::order(mem_ord)); +#endif + } + + LIBC_INLINE T + fetch_and(T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_and) + return __scoped_atomic_fetch_and(impl::addressof(val), mask, + impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_and(impl::addressof(val), mask, impl::order(mem_ord)); +#endif + } + + LIBC_INLINE T + fetch_sub(T decrement, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_sub) + return __scoped_atomic_fetch_sub(impl::addressof(val), decrement, + impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_sub(impl::addressof(val), decrement, + impl::order(mem_ord)); +#endif + } + + // Set the value without using an atomic operation. This is useful + // in initializing atomic values without a constructor. + LIBC_INLINE void set(T rhs) { val = rhs; } +}; + +template <typename T> struct AtomicRef { + static_assert(is_trivially_copyable_v<T> && is_copy_constructible_v<T> && + is_move_constructible_v<T> && is_copy_assignable_v<T> && + is_move_assignable_v<T>, + "AtomicRef<T> requires T to be trivially copyable, copy " + "constructible, move constructible, copy assignable, " + "and move assignable."); + + static_assert(cpp::has_unique_object_representations_v<T>, + "AtomicRef<T> only supports types with unique object " + "representations."); + +private: + T *ptr; + +public: + // Constructor from T reference + LIBC_INLINE explicit constexpr AtomicRef(T &obj) : ptr(&obj) {} + + // Non-standard Implicit conversion from T* + LIBC_INLINE constexpr AtomicRef(T *obj) : ptr(obj) {} + + LIBC_INLINE AtomicRef(const AtomicRef &) = default; + LIBC_INLINE AtomicRef &operator=(const AtomicRef &) = default; + + // Atomic load + LIBC_INLINE operator T() const { return load(); } + + LIBC_INLINE T + load(MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + T res; +#if __has_builtin(__scoped_atomic_load) + __scoped_atomic_load(ptr, &res, impl::order(mem_ord), + impl::scope(mem_scope)); +#else + __atomic_load(ptr, &res, impl::order(mem_ord)); +#endif + return res; + } + + // Atomic store + LIBC_INLINE T operator=(T rhs) const { + store(rhs); + return rhs; + } + + LIBC_INLINE void + store(T rhs, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { +#if __has_builtin(__scoped_atomic_store) + __scoped_atomic_store(ptr, &rhs, impl::order(mem_ord), + impl::scope(mem_scope)); +#else + __atomic_store(ptr, &rhs, impl::order(mem_ord)); +#endif + } + + // Atomic compare exchange (strong) + LIBC_INLINE bool compare_exchange_strong( + T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + return __atomic_compare_exchange(ptr, &expected, &desired, false, + impl::order(mem_ord), + impl::infer_failure_order(mem_ord)); + } + + // Atomic compare exchange (strong, separate success/failure memory orders) + LIBC_INLINE bool compare_exchange_strong( + T &expected, T desired, MemoryOrder success_order, + MemoryOrder failure_order, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + return __atomic_compare_exchange(ptr, &expected, &desired, false, + impl::order(success_order), + impl::order(failure_order)); + } + + // Atomic exchange + LIBC_INLINE T + exchange(T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + T ret; +#if __has_builtin(__scoped_atomic_exchange) + __scoped_atomic_exchange(ptr, &desired, &ret, impl::order(mem_ord), + impl::scope(mem_scope)); +#else + __atomic_exchange(ptr, &desired, &ret, impl::order(mem_ord)); +#endif + return ret; + } + + LIBC_INLINE T fetch_add( + T increment, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_add) + return __scoped_atomic_fetch_add(ptr, increment, impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_add(ptr, increment, impl::order(mem_ord)); +#endif + } + + LIBC_INLINE T + fetch_or(T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_or) + return __scoped_atomic_fetch_or(ptr, mask, impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_or(ptr, mask, impl::order(mem_ord)); +#endif + } + + LIBC_INLINE T fetch_and( + T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_and) + return __scoped_atomic_fetch_and(ptr, mask, impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_and(ptr, mask, impl::order(mem_ord)); +#endif + } + + LIBC_INLINE T fetch_sub( + T decrement, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) const { + static_assert(cpp::is_integral_v<T>, "T must be an integral type."); +#if __has_builtin(__scoped_atomic_fetch_sub) + return __scoped_atomic_fetch_sub(ptr, decrement, impl::order(mem_ord), + impl::scope(mem_scope)); +#else + return __atomic_fetch_sub(ptr, decrement, impl::order(mem_ord)); +#endif + } +}; + +// Permit CTAD when generating an atomic reference. +template <typename T> AtomicRef(T &) -> AtomicRef<T>; + +// Issue a thread fence with the given memory ordering. +LIBC_INLINE void atomic_thread_fence( + MemoryOrder mem_ord, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { +#if __has_builtin(__scoped_atomic_thread_fence) + __scoped_atomic_thread_fence(static_cast<int>(mem_ord), + static_cast<int>(mem_scope)); +#else + __atomic_thread_fence(static_cast<int>(mem_ord)); +#endif +} + +// Establishes memory synchronization ordering of non-atomic and relaxed atomic +// accesses, as instructed by order, between a thread and a signal handler +// executed on the same thread. This is equivalent to atomic_thread_fence, +// except no instructions for memory ordering are issued. Only reordering of +// the instructions by the compiler is suppressed as order instructs. +LIBC_INLINE void atomic_signal_fence([[maybe_unused]] MemoryOrder mem_ord) { +#if __has_builtin(__atomic_signal_fence) + __atomic_signal_fence(static_cast<int>(mem_ord)); +#else + // if the builtin is not ready, use asm as a full compiler barrier. + asm volatile("" ::: "memory"); +#endif +} +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_ATOMIC_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/bit.h b/contrib/llvm-project/libc/src/__support/CPP/bit.h new file mode 100644 index 000000000000..e491f3e03266 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/bit.h @@ -0,0 +1,298 @@ +//===-- Implementation of the C++20 bit header -----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This is inspired by LLVM ADT/bit.h header. +// Some functions are missing, we can add them as needed (popcount, byteswap). + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_BIT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_BIT_H + +#include "src/__support/CPP/limits.h" // numeric_limits +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/sanitizer.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +#if __has_builtin(__builtin_memcpy_inline) +#define LLVM_LIBC_HAS_BUILTIN_MEMCPY_INLINE +#endif + +// This implementation of bit_cast requires trivially-constructible To, to avoid +// UB in the implementation. +template <typename To, typename From> +LIBC_INLINE constexpr cpp::enable_if_t< + (sizeof(To) == sizeof(From)) && + cpp::is_trivially_constructible<To>::value && + cpp::is_trivially_copyable<To>::value && + cpp::is_trivially_copyable<From>::value, + To> +bit_cast(const From &from) { + MSAN_UNPOISON(&from, sizeof(From)); +#if __has_builtin(__builtin_bit_cast) + return __builtin_bit_cast(To, from); +#else + To to; + char *dst = reinterpret_cast<char *>(&to); + const char *src = reinterpret_cast<const char *>(&from); +#if __has_builtin(__builtin_memcpy_inline) + __builtin_memcpy_inline(dst, src, sizeof(To)); +#else + for (unsigned i = 0; i < sizeof(To); ++i) + dst[i] = src[i]; +#endif // __has_builtin(__builtin_memcpy_inline) + return to; +#endif // __has_builtin(__builtin_bit_cast) +} + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, + bool> +has_single_bit(T value) { + return (value != 0) && ((value & (value - 1)) == 0); +} + +// A temporary macro to add template function specialization when compiler +// builtin is available. +#define ADD_SPECIALIZATION(NAME, TYPE, BUILTIN) \ + template <> [[nodiscard]] LIBC_INLINE constexpr int NAME<TYPE>(TYPE value) { \ + static_assert(cpp::is_unsigned_v<TYPE>); \ + return value == 0 ? cpp::numeric_limits<TYPE>::digits : BUILTIN(value); \ + } + +/// Count number of 0's from the least significant bit to the most +/// stopping at the first 1. +/// +/// Only unsigned integral types are allowed. +/// +/// Returns cpp::numeric_limits<T>::digits on an input of 0. +// clang-19+, gcc-14+ +#if __has_builtin(__builtin_ctzg) +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +countr_zero(T value) { + return __builtin_ctzg(value, cpp::numeric_limits<T>::digits); +} +#else +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +countr_zero(T value) { + if (!value) + return cpp::numeric_limits<T>::digits; + if (value & 0x1) + return 0; + // Bisection method. + unsigned zero_bits = 0; + unsigned shift = cpp::numeric_limits<T>::digits >> 1; + T mask = cpp::numeric_limits<T>::max() >> shift; + while (shift) { + if ((value & mask) == 0) { + value >>= shift; + zero_bits |= shift; + } + shift >>= 1; + mask >>= shift; + } + return static_cast<int>(zero_bits); +} +#if __has_builtin(__builtin_ctzs) +ADD_SPECIALIZATION(countr_zero, unsigned short, __builtin_ctzs) +#endif +ADD_SPECIALIZATION(countr_zero, unsigned int, __builtin_ctz) +ADD_SPECIALIZATION(countr_zero, unsigned long, __builtin_ctzl) +ADD_SPECIALIZATION(countr_zero, unsigned long long, __builtin_ctzll) +#endif // __has_builtin(__builtin_ctzg) + +/// Count number of 0's from the most significant bit to the least +/// stopping at the first 1. +/// +/// Only unsigned integral types are allowed. +/// +/// Returns cpp::numeric_limits<T>::digits on an input of 0. +// clang-19+, gcc-14+ +#if __has_builtin(__builtin_clzg) +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +countl_zero(T value) { + return __builtin_clzg(value, cpp::numeric_limits<T>::digits); +} +#else +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +countl_zero(T value) { + if (!value) + return cpp::numeric_limits<T>::digits; + // Bisection method. + unsigned zero_bits = 0; + for (unsigned shift = cpp::numeric_limits<T>::digits >> 1; shift; + shift >>= 1) { + T tmp = value >> shift; + if (tmp) + value = tmp; + else + zero_bits |= shift; + } + return static_cast<int>(zero_bits); +} +#if __has_builtin(__builtin_clzs) +ADD_SPECIALIZATION(countl_zero, unsigned short, __builtin_clzs) +#endif +ADD_SPECIALIZATION(countl_zero, unsigned int, __builtin_clz) +ADD_SPECIALIZATION(countl_zero, unsigned long, __builtin_clzl) +ADD_SPECIALIZATION(countl_zero, unsigned long long, __builtin_clzll) +#endif // __has_builtin(__builtin_clzg) + +#undef ADD_SPECIALIZATION + +/// Count the number of ones from the most significant bit to the first +/// zero bit. +/// +/// Ex. countl_one(0xFF0FFF00) == 8. +/// Only unsigned integral types are allowed. +/// +/// Returns cpp::numeric_limits<T>::digits on an input of all ones. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +countl_one(T value) { + return cpp::countl_zero<T>(static_cast<T>(~value)); +} + +/// Count the number of ones from the least significant bit to the first +/// zero bit. +/// +/// Ex. countr_one(0x00FF00FF) == 8. +/// Only unsigned integral types are allowed. +/// +/// Returns cpp::numeric_limits<T>::digits on an input of all ones. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +countr_one(T value) { + return cpp::countr_zero<T>(static_cast<T>(~value)); +} + +/// Returns the number of bits needed to represent value if value is nonzero. +/// Returns 0 otherwise. +/// +/// Ex. bit_width(5) == 3. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +bit_width(T value) { + return cpp::numeric_limits<T>::digits - cpp::countl_zero(value); +} + +/// Returns the largest integral power of two no greater than value if value is +/// nonzero. Returns 0 otherwise. +/// +/// Ex. bit_floor(5) == 4. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +bit_floor(T value) { + if (!value) + return 0; + return static_cast<T>(T(1) << (cpp::bit_width(value) - 1)); +} + +/// Returns the smallest integral power of two no smaller than value if value is +/// nonzero. Returns 1 otherwise. +/// +/// Ex. bit_ceil(5) == 8. +/// +/// The return value is undefined if the input is larger than the largest power +/// of two representable in T. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +bit_ceil(T value) { + if (value < 2) + return 1; + return static_cast<T>(T(1) << cpp::bit_width(value - 1U)); +} + +// Rotate algorithms make use of "Safe, Efficient, and Portable Rotate in C/C++" +// from https://blog.regehr.org/archives/1063. + +// Forward-declare rotr so that rotl can use it. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +rotr(T value, int rotate); + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +rotl(T value, int rotate) { + constexpr int N = cpp::numeric_limits<T>::digits; + rotate = rotate % N; + if (!rotate) + return value; + if (rotate < 0) + return cpp::rotr<T>(value, -rotate); + return static_cast<T>((value << rotate) | (value >> (N - rotate))); +} + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +rotr(T value, int rotate) { + constexpr int N = cpp::numeric_limits<T>::digits; + rotate = rotate % N; + if (!rotate) + return value; + if (rotate < 0) + return cpp::rotl<T>(value, -rotate); + return static_cast<T>((value >> rotate) | (value << (N - rotate))); +} + +// TODO: Do we need this function at all? How is it different from +// 'static_cast'? +template <class To, class From> +LIBC_INLINE constexpr To bit_or_static_cast(const From &from) { + if constexpr (sizeof(To) == sizeof(From)) { + return bit_cast<To>(from); + } else { + return static_cast<To>(from); + } +} + +/// Count number of 1's aka population count or Hamming weight. +/// +/// Only unsigned integral types are allowed. +// clang-19+, gcc-14+ +#if __has_builtin(__builtin_popcountg) +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +popcount(T value) { + return __builtin_popcountg(value); +} +#else // !__has_builtin(__builtin_popcountg) +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +popcount(T value) { + int count = 0; + while (value) { + value &= value - 1; + ++count; + } + return count; +} +#define ADD_SPECIALIZATION(TYPE, BUILTIN) \ + template <> \ + [[nodiscard]] LIBC_INLINE constexpr int popcount<TYPE>(TYPE value) { \ + return BUILTIN(value); \ + } +ADD_SPECIALIZATION(unsigned char, __builtin_popcount) +ADD_SPECIALIZATION(unsigned short, __builtin_popcount) +ADD_SPECIALIZATION(unsigned, __builtin_popcount) +ADD_SPECIALIZATION(unsigned long, __builtin_popcountl) +ADD_SPECIALIZATION(unsigned long long, __builtin_popcountll) +#endif // __builtin_popcountg +#undef ADD_SPECIALIZATION + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_BIT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/bitset.h b/contrib/llvm-project/libc/src/__support/CPP/bitset.h new file mode 100644 index 000000000000..db193f414abd --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/bitset.h @@ -0,0 +1,94 @@ +//===-- A self contained equivalent of std::bitset --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_BITSET_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_BITSET_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include <stddef.h> // For size_t. + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +template <size_t NumberOfBits> struct bitset { + static_assert(NumberOfBits != 0, + "Cannot create a LIBC_NAMESPACE::cpp::bitset of size 0."); + + LIBC_INLINE constexpr void set(size_t Index) { + Data[Index / BITS_PER_UNIT] |= mask(Index); + } + + LIBC_INLINE constexpr void reset() { + for (size_t i = 0; i < NUMBER_OF_UNITS; ++i) + Data[i] = 0; + } + + LIBC_INLINE constexpr bool test(size_t Index) const { + return Data[Index / BITS_PER_UNIT] & mask(Index); + } + + LIBC_INLINE constexpr void flip() { + for (size_t i = 0; i < NUMBER_OF_UNITS; ++i) + Data[i] = ~Data[i]; + } + + // This function sets all bits in the range from Start to End (inclusive) to + // true. It assumes that Start <= End. + LIBC_INLINE constexpr void set_range(size_t Start, size_t End) { + size_t start_index = Start / BITS_PER_UNIT; + size_t end_index = End / BITS_PER_UNIT; + + if (start_index == end_index) { + // The reason the left shift is split into two parts (instead of just left + // shifting by End - Start + 1) is because when a number is shifted left + // by 64 then it wraps around to doing nothing, but shifting by 63 and the + // shifting by 1 correctly shifts away all of the bits. + size_t bit_mask = (((size_t(1) << (End - Start)) << 1) - 1) + << (Start - (start_index * BITS_PER_UNIT)); + Data[start_index] |= bit_mask; + } else { + size_t low_bit_mask = + ~((size_t(1) << (Start - (start_index * BITS_PER_UNIT))) - 1); + Data[start_index] |= low_bit_mask; + + for (size_t i = start_index + 1; i < end_index; ++i) + Data[i] = ~size_t(0); + + // Same as above, by splitting the shift the behavior is more consistent. + size_t high_bit_mask = + ((size_t(1) << (End - (end_index * BITS_PER_UNIT))) << 1) - 1; + Data[end_index] |= high_bit_mask; + } + } + + LIBC_INLINE constexpr bool + operator==(const bitset<NumberOfBits> &other) const { + for (size_t i = 0; i < NUMBER_OF_UNITS; ++i) { + if (Data[i] != other.Data[i]) + return false; + } + return true; + } + +private: + static constexpr size_t BITS_PER_BYTE = 8; + static constexpr size_t BITS_PER_UNIT = BITS_PER_BYTE * sizeof(size_t); + static constexpr size_t NUMBER_OF_UNITS = + (NumberOfBits + BITS_PER_UNIT - 1) / BITS_PER_UNIT; + + LIBC_INLINE static constexpr size_t mask(size_t Index) { + return size_t{1} << (Index % BITS_PER_UNIT); + } + size_t Data[NUMBER_OF_UNITS] = {0}; +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_BITSET_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/cstddef.h b/contrib/llvm-project/libc/src/__support/CPP/cstddef.h new file mode 100644 index 000000000000..ed6c9d03362f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/cstddef.h @@ -0,0 +1,74 @@ +//===-- A self contained equivalent of cstddef ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "type_traits.h" // For enable_if_t, is_integral_v. + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +enum class byte : unsigned char {}; + +template <class IntegerType> +LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte> +operator>>(byte b, IntegerType shift) noexcept { + return static_cast<byte>(static_cast<unsigned char>(b) >> shift); +} +template <class IntegerType> +LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte &> +operator>>=(byte &b, IntegerType shift) noexcept { + return b = b >> shift; +} +template <class IntegerType> +LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte> +operator<<(byte b, IntegerType shift) noexcept { + return static_cast<byte>(static_cast<unsigned char>(b) << shift); +} +template <class IntegerType> +LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte &> +operator<<=(byte &b, IntegerType shift) noexcept { + return b = b << shift; +} +LIBC_INLINE constexpr byte operator|(byte l, byte r) noexcept { + return static_cast<byte>(static_cast<unsigned char>(l) | + static_cast<unsigned char>(r)); +} +LIBC_INLINE constexpr byte &operator|=(byte &l, byte r) noexcept { + return l = l | r; +} +LIBC_INLINE constexpr byte operator&(byte l, byte r) noexcept { + return static_cast<byte>(static_cast<unsigned char>(l) & + static_cast<unsigned char>(r)); +} +LIBC_INLINE constexpr byte &operator&=(byte &l, byte r) noexcept { + return l = l & r; +} +LIBC_INLINE constexpr byte operator^(byte l, byte r) noexcept { + return static_cast<byte>(static_cast<unsigned char>(l) ^ + static_cast<unsigned char>(r)); +} +LIBC_INLINE constexpr byte &operator^=(byte &l, byte r) noexcept { + return l = l ^ r; +} +LIBC_INLINE constexpr byte operator~(byte b) noexcept { + return static_cast<byte>(~static_cast<unsigned char>(b)); +} +template <typename IntegerType> +LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, IntegerType> +to_integer(byte b) noexcept { + return static_cast<IntegerType>(b); +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/expected.h b/contrib/llvm-project/libc/src/__support/CPP/expected.h new file mode 100644 index 000000000000..8a93091f0ebf --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/expected.h @@ -0,0 +1,60 @@ +//===-- Holds an expected or unexpected value -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_EXPECTED_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_EXPECTED_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// This is used to hold an unexpected value so that a different constructor is +// selected. +template <class T> class unexpected { + T value; + +public: + LIBC_INLINE constexpr explicit unexpected(T value) : value(value) {} + LIBC_INLINE constexpr T error() { return value; } +}; + +template <class T> explicit unexpected(T) -> unexpected<T>; + +template <class T, class E> class expected { + union { + T exp; + E unexp; + }; + bool is_expected; + +public: + LIBC_INLINE constexpr expected(T exp) : exp(exp), is_expected(true) {} + LIBC_INLINE constexpr expected(unexpected<E> unexp) + : unexp(unexp.error()), is_expected(false) {} + + LIBC_INLINE constexpr bool has_value() const { return is_expected; } + + LIBC_INLINE constexpr T &value() { return exp; } + LIBC_INLINE constexpr E &error() { return unexp; } + LIBC_INLINE constexpr const T &value() const { return exp; } + LIBC_INLINE constexpr const E &error() const { return unexp; } + + LIBC_INLINE constexpr operator bool() const { return is_expected; } + + LIBC_INLINE constexpr T &operator*() { return exp; } + LIBC_INLINE constexpr const T &operator*() const { return exp; } + LIBC_INLINE constexpr T *operator->() { return &exp; } + LIBC_INLINE constexpr const T *operator->() const { return &exp; } +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_EXPECTED_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/functional.h b/contrib/llvm-project/libc/src/__support/CPP/functional.h new file mode 100644 index 000000000000..50cfa256b668 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/functional.h @@ -0,0 +1,71 @@ +//===-- Self contained functional header ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_FUNCTIONAL_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_FUNCTIONAL_H + +#include "src/__support/CPP/type_traits/enable_if.h" +#include "src/__support/CPP/type_traits/is_convertible.h" +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/is_void.h" +#include "src/__support/CPP/type_traits/remove_cvref.h" +#include "src/__support/CPP/type_traits/remove_reference.h" +#include "src/__support/CPP/utility/forward.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +/// A function type adapted from LLVM's function_ref. +/// This class does not own the callable, so it is not in general safe to +/// store a function. +template <typename Fn> class function; + +template <typename Ret, typename... Params> class function<Ret(Params...)> { + Ret (*callback)(intptr_t callable, Params... params) = nullptr; + intptr_t callable; + + template <typename Callable> + LIBC_INLINE static Ret callback_fn(intptr_t callable, Params... params) { + return (*reinterpret_cast<Callable *>(callable))( + cpp::forward<Params>(params)...); + } + +public: + LIBC_INLINE function() = default; + LIBC_INLINE function(decltype(nullptr)) {} + LIBC_INLINE ~function() = default; + + template <typename Callable> + LIBC_INLINE function( + Callable &&callable, + // This is not the copy-constructor. + enable_if_t<!cpp::is_same_v<remove_cvref_t<Callable>, function>> * = + nullptr, + // Functor must be callable and return a suitable type. + enable_if_t<cpp::is_void_v<Ret> || + cpp::is_convertible_v< + decltype(declval<Callable>()(declval<Params>()...)), Ret>> + * = nullptr) + : callback(callback_fn<cpp::remove_reference_t<Callable>>), + callable(reinterpret_cast<intptr_t>(&callable)) {} + + LIBC_INLINE Ret operator()(Params... params) const { + return callback(callable, cpp::forward<Params>(params)...); + } + + LIBC_INLINE explicit operator bool() const { return callback; } +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_FUNCTIONAL_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/iterator.h b/contrib/llvm-project/libc/src/__support/CPP/iterator.h new file mode 100644 index 000000000000..168a26973182 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/iterator.h @@ -0,0 +1,99 @@ +//===-- Standalone implementation of iterator -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H + +#include "src/__support/CPP/type_traits/enable_if.h" +#include "src/__support/CPP/type_traits/is_convertible.h" +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +template <typename T> struct iterator_traits; +template <typename T> struct iterator_traits<T *> { + using reference = T &; + using value_type = T; +}; + +template <typename Iter> class reverse_iterator { + Iter current; + +public: + using reference = typename iterator_traits<Iter>::reference; + using value_type = typename iterator_traits<Iter>::value_type; + using iterator_type = Iter; + + LIBC_INLINE reverse_iterator() : current() {} + LIBC_INLINE constexpr explicit reverse_iterator(Iter it) : current(it) {} + + template <typename Other, + cpp::enable_if_t<!cpp::is_same_v<Iter, Other> && + cpp::is_convertible_v<const Other &, Iter>, + int> = 0> + LIBC_INLINE constexpr explicit reverse_iterator(const Other &it) + : current(it) {} + + LIBC_INLINE friend constexpr bool operator==(const reverse_iterator &lhs, + const reverse_iterator &rhs) { + return lhs.base() == rhs.base(); + } + + LIBC_INLINE friend constexpr bool operator!=(const reverse_iterator &lhs, + const reverse_iterator &rhs) { + return lhs.base() != rhs.base(); + } + + LIBC_INLINE friend constexpr bool operator<(const reverse_iterator &lhs, + const reverse_iterator &rhs) { + return lhs.base() > rhs.base(); + } + + LIBC_INLINE friend constexpr bool operator<=(const reverse_iterator &lhs, + const reverse_iterator &rhs) { + return lhs.base() >= rhs.base(); + } + + LIBC_INLINE friend constexpr bool operator>(const reverse_iterator &lhs, + const reverse_iterator &rhs) { + return lhs.base() < rhs.base(); + } + + LIBC_INLINE friend constexpr bool operator>=(const reverse_iterator &lhs, + const reverse_iterator &rhs) { + return lhs.base() <= rhs.base(); + } + + LIBC_INLINE constexpr iterator_type base() const { return current; } + + LIBC_INLINE constexpr reference operator*() const { + Iter tmp = current; + return *--tmp; + } + LIBC_INLINE constexpr reverse_iterator operator--() { + ++current; + return *this; + } + LIBC_INLINE constexpr reverse_iterator &operator++() { + --current; + return *this; + } + LIBC_INLINE constexpr reverse_iterator operator++(int) { + reverse_iterator tmp(*this); + --current; + return tmp; + } +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/limits.h b/contrib/llvm-project/libc/src/__support/CPP/limits.h new file mode 100644 index 000000000000..cf4beb9cc859 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/limits.h @@ -0,0 +1,92 @@ +//===-- A self contained equivalent of std::limits --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_LIMITS_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_LIMITS_H + +#include "hdr/limits_macros.h" // CHAR_BIT +#include "src/__support/CPP/type_traits/is_integral.h" +#include "src/__support/CPP/type_traits/is_signed.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128 + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +namespace internal { + +template <typename T, T min_value, T max_value> struct integer_impl { + static_assert(cpp::is_integral_v<T>); + LIBC_INLINE static constexpr T max() { return max_value; } + LIBC_INLINE static constexpr T min() { return min_value; } + LIBC_INLINE_VAR static constexpr int digits = + CHAR_BIT * sizeof(T) - cpp::is_signed_v<T>; +}; + +} // namespace internal + +template <class T> struct numeric_limits {}; + +// TODO: Add numeric_limits specializations as needed for new types. +template <> +struct numeric_limits<short> + : public internal::integer_impl<short, SHRT_MIN, SHRT_MAX> {}; + +template <> +struct numeric_limits<unsigned short> + : public internal::integer_impl<unsigned short, 0, USHRT_MAX> {}; + +template <> +struct numeric_limits<int> + : public internal::integer_impl<int, INT_MIN, INT_MAX> {}; + +template <> +struct numeric_limits<unsigned int> + : public internal::integer_impl<unsigned int, 0, UINT_MAX> {}; + +template <> +struct numeric_limits<long> + : public internal::integer_impl<long, LONG_MIN, LONG_MAX> {}; + +template <> +struct numeric_limits<unsigned long> + : public internal::integer_impl<unsigned long, 0, ULONG_MAX> {}; + +template <> +struct numeric_limits<long long> + : public internal::integer_impl<long long, LLONG_MIN, LLONG_MAX> {}; + +template <> +struct numeric_limits<unsigned long long> + : public internal::integer_impl<unsigned long long, 0, ULLONG_MAX> {}; + +template <> +struct numeric_limits<char> + : public internal::integer_impl<char, CHAR_MIN, CHAR_MAX> {}; + +template <> +struct numeric_limits<signed char> + : public internal::integer_impl<signed char, SCHAR_MIN, SCHAR_MAX> {}; + +template <> +struct numeric_limits<unsigned char> + : public internal::integer_impl<unsigned char, 0, UCHAR_MAX> {}; + +#ifdef LIBC_TYPES_HAS_INT128 +// On platform where UInt128 resolves to __uint128_t, this specialization +// provides the limits of UInt128. +template <> +struct numeric_limits<__uint128_t> + : public internal::integer_impl<__uint128_t, 0, ~__uint128_t(0)> {}; +#endif + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_LIMITS_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/mutex.h b/contrib/llvm-project/libc/src/__support/CPP/mutex.h new file mode 100644 index 000000000000..8a3102426e2d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/mutex.h @@ -0,0 +1,51 @@ +//===--- A self contained equivalent of std::mutex --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_MUTEX_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_MUTEX_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// Assume the calling thread has already obtained mutex ownership. +struct adopt_lock_t { + explicit adopt_lock_t() = default; +}; + +// Tag used to make a scoped lock take ownership of a locked mutex. +constexpr adopt_lock_t adopt_lock{}; + +// An RAII class for easy locking and unlocking of mutexes. +template <typename MutexType> class lock_guard { + MutexType &mutex; + +public: + // Calls `m.lock()` upon resource acquisition. + explicit lock_guard(MutexType &m) : mutex(m) { mutex.lock(); } + + // Acquires ownership of the mutex object `m` without attempting to lock + // it. The behavior is undefined if the current thread does not hold the + // lock on `m`. Does not call `m.lock()` upon resource acquisition. + lock_guard(MutexType &m, adopt_lock_t /* t */) : mutex(m) {} + + ~lock_guard() { mutex.unlock(); } + + // non-copyable + lock_guard &operator=(const lock_guard &) = delete; + lock_guard(const lock_guard &) = delete; +}; + +// Deduction guide for lock_guard to suppress CTAD warnings. +template <typename T> lock_guard(T &) -> lock_guard<T>; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_MUTEX_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/new.cpp b/contrib/llvm-project/libc/src/__support/CPP/new.cpp new file mode 100644 index 000000000000..65f80de37348 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/new.cpp @@ -0,0 +1,44 @@ +//===-- Implementation of custom operator delete --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "new.h" +#include "hdr/func/free.h" + +void operator delete(void *mem) noexcept { ::free(mem); } + +void operator delete(void *mem, std::align_val_t) noexcept { ::free(mem); } + +void operator delete(void *mem, size_t) noexcept { ::free(mem); } + +void operator delete(void *mem, size_t, std::align_val_t) noexcept { +#ifdef LIBC_TARGET_OS_IS_WINDOWS + ::_aligned_free(mem); +#else + ::free(mem); +#endif +} + +void operator delete[](void *mem) noexcept { ::free(mem); } + +void operator delete[](void *mem, std::align_val_t) noexcept { +#ifdef LIBC_TARGET_OS_IS_WINDOWS + ::_aligned_free(mem); +#else + ::free(mem); +#endif +} + +void operator delete[](void *mem, size_t) noexcept { ::free(mem); } + +void operator delete[](void *mem, size_t, std::align_val_t) noexcept { +#ifdef LIBC_TARGET_OS_IS_WINDOWS + ::_aligned_free(mem); +#else + ::free(mem); +#endif +} diff --git a/contrib/llvm-project/libc/src/__support/CPP/new.h b/contrib/llvm-project/libc/src/__support/CPP/new.h new file mode 100644 index 000000000000..fe36de29468a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/new.h @@ -0,0 +1,130 @@ +//===-- Libc specific custom operator new and delete ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_NEW_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_NEW_H + +#include "hdr/func/aligned_alloc.h" +#include "hdr/func/free.h" +#include "hdr/func/malloc.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/os.h" + +#include <stddef.h> // For size_t + +// Defining members in the std namespace is not preferred. But, we do it here +// so that we can use it to define the operator new which takes std::align_val_t +// argument. +namespace std { + +enum class align_val_t : size_t {}; + +} // namespace std + +namespace LIBC_NAMESPACE_DECL { + +namespace cpp { +template <class T> [[nodiscard]] constexpr T *launder(T *p) { + static_assert(__has_builtin(__builtin_launder), + "cpp::launder requires __builtin_launder"); + return __builtin_launder(p); +} +} // namespace cpp + +class AllocChecker { + bool success = false; + + LIBC_INLINE AllocChecker &operator=(bool status) { + success = status; + return *this; + } + +public: + LIBC_INLINE AllocChecker() = default; + + LIBC_INLINE operator bool() const { return success; } + + LIBC_INLINE static void *alloc(size_t s, AllocChecker &ac) { + void *mem = ::malloc(s); + ac = (mem != nullptr); + return mem; + } + + LIBC_INLINE static void *aligned_alloc(size_t s, std::align_val_t align, + AllocChecker &ac) { +#ifdef LIBC_TARGET_OS_IS_WINDOWS + // std::aligned_alloc is not available on Windows because std::free on + // Windows cannot deallocate any over-aligned memory. Microsoft provides an + // alternative for std::aligned_alloc named _aligned_malloc, but it must be + // paired with _aligned_free instead of std::free. + void *mem = ::_aligned_malloc(static_cast<size_t>(align), s); +#else + void *mem = ::aligned_alloc(static_cast<size_t>(align), s); +#endif + ac = (mem != nullptr); + return mem; + } +}; + +} // namespace LIBC_NAMESPACE_DECL + +LIBC_INLINE void *operator new(size_t size, + LIBC_NAMESPACE::AllocChecker &ac) noexcept { + return LIBC_NAMESPACE::AllocChecker::alloc(size, ac); +} + +LIBC_INLINE void *operator new(size_t size, std::align_val_t align, + LIBC_NAMESPACE::AllocChecker &ac) noexcept { + return LIBC_NAMESPACE::AllocChecker::aligned_alloc(size, align, ac); +} + +LIBC_INLINE void *operator new[](size_t size, + LIBC_NAMESPACE::AllocChecker &ac) noexcept { + return LIBC_NAMESPACE::AllocChecker::alloc(size, ac); +} + +LIBC_INLINE void *operator new[](size_t size, std::align_val_t align, + LIBC_NAMESPACE::AllocChecker &ac) noexcept { + return LIBC_NAMESPACE::AllocChecker::aligned_alloc(size, align, ac); +} + +LIBC_INLINE void *operator new(size_t, void *p) { return p; } + +LIBC_INLINE void *operator new[](size_t, void *p) { return p; } + +// The ideal situation would be to define the various flavors of operator delete +// inlinelike we do with operator new above. However, since we need operator +// delete prototypes to match those specified by the C++ standard, we cannot +// define them inline as the C++ standard does not allow inline definitions of +// replacement operator delete implementations. Note also that we assign a +// special linkage name to each of these replacement operator delete functions. +// This is because, if we do not give them a special libc internal linkage name, +// they will replace operator delete for the entire application. Including this +// header file in all libc source files where operator delete is called ensures +// that only libc call sites use these replacement operator delete functions. + +#define DELETE_NAME(name) \ + __asm__(LIBC_MACRO_TO_STRING(LIBC_NAMESPACE) "_" LIBC_MACRO_TO_STRING(name)) + +void operator delete(void *) noexcept DELETE_NAME(delete); +void operator delete(void *, std::align_val_t) noexcept + DELETE_NAME(delete_aligned); +void operator delete(void *, size_t) noexcept DELETE_NAME(delete_sized); +void operator delete(void *, size_t, std::align_val_t) noexcept + DELETE_NAME(delete_sized_aligned); +void operator delete[](void *) noexcept DELETE_NAME(delete_array); +void operator delete[](void *, std::align_val_t) noexcept + DELETE_NAME(delete_array_aligned); +void operator delete[](void *, size_t) noexcept DELETE_NAME(delete_array_sized); +void operator delete[](void *, size_t, std::align_val_t) noexcept + DELETE_NAME(delete_array_sized_aligned); + +#undef DELETE_NAME + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_NEW_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/optional.h b/contrib/llvm-project/libc/src/__support/CPP/optional.h new file mode 100644 index 000000000000..aed2269db1b1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/optional.h @@ -0,0 +1,139 @@ +//===-- Standalone implementation of std::optional --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_OPTIONAL_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_OPTIONAL_H + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/CPP/utility.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// Trivial nullopt_t struct. +struct nullopt_t { + LIBC_INLINE constexpr explicit nullopt_t() = default; +}; + +// nullopt that can be used and returned. +LIBC_INLINE_VAR constexpr nullopt_t nullopt{}; + +// This is very simple implementation of the std::optional class. It makes +// several assumptions that the underlying type is trivially constructible, +// copyable, or movable. +template <typename T> class optional { + template <typename U, bool = !is_trivially_destructible<U>::value> + struct OptionalStorage { + union { + char empty; + U stored_value; + }; + + bool in_use = false; + + LIBC_INLINE ~OptionalStorage() { reset(); } + + LIBC_INLINE constexpr OptionalStorage() : empty() {} + + template <typename... Args> + LIBC_INLINE constexpr explicit OptionalStorage(in_place_t, Args &&...args) + : stored_value(forward<Args>(args)...) {} + + LIBC_INLINE constexpr void reset() { + if (in_use) + stored_value.~U(); + in_use = false; + } + }; + + // The only difference is that this type U doesn't have a nontrivial + // destructor. + template <typename U> struct OptionalStorage<U, false> { + union { + char empty; + U stored_value; + }; + + bool in_use = false; + + LIBC_INLINE constexpr OptionalStorage() : empty() {} + + template <typename... Args> + LIBC_INLINE constexpr explicit OptionalStorage(in_place_t, Args &&...args) + : stored_value(forward<Args>(args)...) {} + + LIBC_INLINE constexpr void reset() { in_use = false; } + }; + + OptionalStorage<T> storage; + +public: + LIBC_INLINE constexpr optional() = default; + LIBC_INLINE constexpr optional(nullopt_t) {} + + LIBC_INLINE constexpr optional(const T &t) : storage(in_place, t) { + storage.in_use = true; + } + LIBC_INLINE constexpr optional(const optional &) = default; + + LIBC_INLINE constexpr optional(T &&t) : storage(in_place, move(t)) { + storage.in_use = true; + } + LIBC_INLINE constexpr optional(optional &&O) = default; + + template <typename... ArgTypes> + LIBC_INLINE constexpr optional(in_place_t, ArgTypes &&...Args) + : storage(in_place, forward<ArgTypes>(Args)...) { + storage.in_use = true; + } + + LIBC_INLINE constexpr optional &operator=(T &&t) { + storage = move(t); + return *this; + } + LIBC_INLINE constexpr optional &operator=(optional &&) = default; + + LIBC_INLINE constexpr optional &operator=(const T &t) { + storage = t; + return *this; + } + LIBC_INLINE constexpr optional &operator=(const optional &) = default; + + LIBC_INLINE constexpr void reset() { storage.reset(); } + + LIBC_INLINE constexpr const T &value() const & { + return storage.stored_value; + } + + LIBC_INLINE constexpr T &value() & { return storage.stored_value; } + + LIBC_INLINE constexpr explicit operator bool() const { + return storage.in_use; + } + LIBC_INLINE constexpr bool has_value() const { return storage.in_use; } + LIBC_INLINE constexpr const T *operator->() const { + return &storage.stored_value; + } + LIBC_INLINE constexpr T *operator->() { return &storage.stored_value; } + LIBC_INLINE constexpr const T &operator*() const & { + return storage.stored_value; + } + LIBC_INLINE constexpr T &operator*() & { return storage.stored_value; } + + LIBC_INLINE constexpr T &&value() && { return move(storage.stored_value); } + LIBC_INLINE constexpr T &&operator*() && { + return move(storage.stored_value); + } +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_OPTIONAL_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/span.h b/contrib/llvm-project/libc/src/__support/CPP/span.h new file mode 100644 index 000000000000..9234a26d201c --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/span.h @@ -0,0 +1,131 @@ +//===-- Standalone implementation std::span ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_SPAN_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_SPAN_H + +#include <stddef.h> // For size_t + +#include "array.h" // For array +#include "limits.h" +#include "src/__support/macros/config.h" +#include "type_traits.h" // For remove_cv_t, enable_if_t, is_same_v, is_const_v + +#include "src/__support/macros/attributes.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// A trimmed down implementation of std::span. +// Missing features: +// - No constant size spans (e.g. Span<int, 4>), +// - Only handle pointer like types, no fancy interators nor object overriding +// the & operator, +// - No implicit type conversion (e.g. Span<B>, initialized with As where A +// inherits from B), +// - No reverse iterators +template <typename T> class span { + template <typename U> + LIBC_INLINE_VAR static constexpr bool is_const_view_v = + !cpp::is_const_v<U> && cpp::is_const_v<T> && + cpp::is_same_v<U, remove_cv_t<T>>; + + template <typename U> + LIBC_INLINE_VAR static constexpr bool is_compatible_v = + cpp::is_same_v<U, T> || is_const_view_v<U>; + +public: + using element_type = T; + using value_type = remove_cv_t<T>; + using size_type = size_t; + using difference_type = ptrdiff_t; + using pointer = T *; + using const_pointer = const T *; + using reference = T &; + using const_reference = const T &; + using iterator = T *; + + LIBC_INLINE_VAR static constexpr size_type dynamic_extent = + cpp::numeric_limits<size_type>::max(); + + LIBC_INLINE constexpr span() : span_data(nullptr), span_size(0) {} + + LIBC_INLINE constexpr span(const span &) = default; + + LIBC_INLINE constexpr span(pointer first, size_type count) + : span_data(first), span_size(count) {} + + LIBC_INLINE constexpr span(pointer first, pointer end) + : span_data(first), span_size(static_cast<size_t>(end - first)) {} + + template <typename U, size_t N, + cpp::enable_if_t<is_compatible_v<U>, bool> = true> + LIBC_INLINE constexpr span(U (&arr)[N]) : span_data(arr), span_size(N) {} + + template <typename U, size_t N, + cpp::enable_if_t<is_compatible_v<U>, bool> = true> + LIBC_INLINE constexpr span(array<U, N> &arr) + : span_data(arr.data()), span_size(arr.size()) {} + + template <typename U, cpp::enable_if_t<is_compatible_v<U>, bool> = true> + LIBC_INLINE constexpr span(span<U> &s) + : span_data(s.data()), span_size(s.size()) {} + + template <typename U, cpp::enable_if_t<is_compatible_v<U>, bool> = true> + LIBC_INLINE constexpr span &operator=(span<U> &s) { + span_data = s.data(); + span_size = s.size(); + return *this; + } + + LIBC_INLINE ~span() = default; + + LIBC_INLINE constexpr reference operator[](size_type index) const { + return data()[index]; + } + + LIBC_INLINE constexpr iterator begin() const { return data(); } + LIBC_INLINE constexpr iterator end() const { return data() + size(); } + LIBC_INLINE constexpr reference front() const { return (*this)[0]; } + LIBC_INLINE constexpr reference back() const { return (*this)[size() - 1]; } + LIBC_INLINE constexpr pointer data() const { return span_data; } + LIBC_INLINE constexpr size_type size() const { return span_size; } + LIBC_INLINE constexpr size_type size_bytes() const { + return sizeof(T) * size(); + } + LIBC_INLINE constexpr bool empty() const { return size() == 0; } + + LIBC_INLINE constexpr span<element_type> + subspan(size_type offset, size_type count = dynamic_extent) const { + return span<element_type>(data() + offset, count_to_size(offset, count)); + } + + LIBC_INLINE constexpr span<element_type> first(size_type count) const { + return subspan(0, count); + } + + LIBC_INLINE constexpr span<element_type> last(size_type count) const { + return span<element_type>(data() + (size() - count), count); + } + +private: + LIBC_INLINE constexpr size_type count_to_size(size_type offset, + size_type count) const { + if (count == dynamic_extent) { + return size() - offset; + } + return count; + } + + T *span_data; + size_t span_size; +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_SPAN_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/string.h b/contrib/llvm-project/libc/src/__support/CPP/string.h new file mode 100644 index 000000000000..1ac04c7f1f9d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/string.h @@ -0,0 +1,234 @@ +//===-- A simple implementation of the string class -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_STRING_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_STRING_H + +#include "hdr/func/free.h" +#include "hdr/func/malloc.h" +#include "hdr/func/realloc.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/integer_to_string.h" // IntegerToString +#include "src/__support/macros/config.h" +#include "src/string/memory_utils/inline_memcpy.h" +#include "src/string/memory_utils/inline_memset.h" +#include "src/string/string_utils.h" // string_length + +#include <stddef.h> // size_t + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// This class mimics std::string but does not intend to be a full fledged +// implementation. Most notably it does not provide support for character traits +// nor custom allocator. +class string { +private: + static constexpr char NULL_CHARACTER = '\0'; + static constexpr char *get_empty_string() { + return const_cast<char *>(&NULL_CHARACTER); + } + + char *buffer_ = get_empty_string(); + size_t size_ = 0; + size_t capacity_ = 0; + + constexpr void reset_no_deallocate() { + buffer_ = get_empty_string(); + size_ = 0; + capacity_ = 0; + } + + void set_size_and_add_null_character(size_t size) { + size_ = size; + if (buffer_ != get_empty_string()) + buffer_[size_] = NULL_CHARACTER; + } + +public: + LIBC_INLINE constexpr string() {} + LIBC_INLINE string(const string &other) { this->operator+=(other); } + LIBC_INLINE constexpr string(string &&other) + : buffer_(other.buffer_), size_(other.size_), capacity_(other.capacity_) { + other.reset_no_deallocate(); + } + LIBC_INLINE string(const char *cstr, size_t count) { + resize(count); + inline_memcpy(buffer_, cstr, count); + } + LIBC_INLINE string(const string_view &view) + : string(view.data(), view.size()) {} + LIBC_INLINE string(const char *cstr) + : string(cstr, ::LIBC_NAMESPACE::internal::string_length(cstr)) {} + LIBC_INLINE string(size_t size_, char value) { + resize(size_); + static_assert(sizeof(char) == sizeof(uint8_t)); + inline_memset((void *)buffer_, static_cast<uint8_t>(value), size_); + } + + LIBC_INLINE string &operator=(const string &other) { + resize(0); + return (*this) += other; + } + + LIBC_INLINE string &operator=(string &&other) { + buffer_ = other.buffer_; + size_ = other.size_; + capacity_ = other.capacity_; + other.reset_no_deallocate(); + return *this; + } + + LIBC_INLINE string &operator=(const string_view &view) { + return *this = string(view); + } + + LIBC_INLINE ~string() { + if (buffer_ != get_empty_string()) + ::free(buffer_); + } + + LIBC_INLINE constexpr size_t capacity() const { return capacity_; } + LIBC_INLINE constexpr size_t size() const { return size_; } + LIBC_INLINE constexpr bool empty() const { return size_ == 0; } + + LIBC_INLINE constexpr const char *data() const { return buffer_; } + LIBC_INLINE char *data() { return buffer_; } + + LIBC_INLINE constexpr const char *begin() const { return data(); } + LIBC_INLINE char *begin() { return data(); } + + LIBC_INLINE constexpr const char *end() const { return data() + size_; } + LIBC_INLINE char *end() { return data() + size_; } + + LIBC_INLINE constexpr const char &front() const { return data()[0]; } + LIBC_INLINE char &front() { return data()[0]; } + + LIBC_INLINE constexpr const char &back() const { return data()[size_ - 1]; } + LIBC_INLINE char &back() { return data()[size_ - 1]; } + + LIBC_INLINE constexpr const char &operator[](size_t index) const { + return data()[index]; + } + LIBC_INLINE char &operator[](size_t index) { return data()[index]; } + + LIBC_INLINE const char *c_str() const { return data(); } + + LIBC_INLINE operator string_view() const { + return string_view(buffer_, size_); + } + + LIBC_INLINE void reserve(size_t new_capacity) { + ++new_capacity; // Accounting for the terminating '\0' + if (new_capacity <= capacity_) + return; + // We extend the capacity to amortize buffer_ reallocations. + // We choose to augment the value by 11 / 8, this is about +40% and division + // by 8 is cheap. We guard the extension so the operation doesn't overflow. + if (new_capacity < SIZE_MAX / 11) + new_capacity = new_capacity * 11 / 8; + if (void *Ptr = ::realloc(buffer_ == get_empty_string() ? nullptr : buffer_, + new_capacity)) { + buffer_ = static_cast<char *>(Ptr); + capacity_ = new_capacity; + } else { + __builtin_unreachable(); // out of memory + } + } + + LIBC_INLINE void resize(size_t size) { + if (size > capacity_) { + reserve(size); + const size_t size_extension = size - size_; + inline_memset(data() + size_, '\0', size_extension); + } + set_size_and_add_null_character(size); + } + + LIBC_INLINE string &operator+=(const string &rhs) { + const size_t new_size = size_ + rhs.size(); + reserve(new_size); + inline_memcpy(buffer_ + size_, rhs.data(), rhs.size()); + set_size_and_add_null_character(new_size); + return *this; + } + + LIBC_INLINE string &operator+=(const char c) { + const size_t new_size = size_ + 1; + reserve(new_size); + buffer_[size_] = c; + set_size_and_add_null_character(new_size); + return *this; + } +}; + +LIBC_INLINE bool operator==(const string &lhs, const string &rhs) { + return string_view(lhs) == string_view(rhs); +} +LIBC_INLINE bool operator!=(const string &lhs, const string &rhs) { + return string_view(lhs) != string_view(rhs); +} +LIBC_INLINE bool operator<(const string &lhs, const string &rhs) { + return string_view(lhs) < string_view(rhs); +} +LIBC_INLINE bool operator<=(const string &lhs, const string &rhs) { + return string_view(lhs) <= string_view(rhs); +} +LIBC_INLINE bool operator>(const string &lhs, const string &rhs) { + return string_view(lhs) > string_view(rhs); +} +LIBC_INLINE bool operator>=(const string &lhs, const string &rhs) { + return string_view(lhs) >= string_view(rhs); +} + +LIBC_INLINE string operator+(const string &lhs, const string &rhs) { + string Tmp(lhs); + return Tmp += rhs; +} +LIBC_INLINE string operator+(const string &lhs, const char *rhs) { + return lhs + string(rhs); +} +LIBC_INLINE string operator+(const char *lhs, const string &rhs) { + return string(lhs) + rhs; +} + +namespace internal { +template <typename T> string to_dec_string(T value) { + const IntegerToString<T> buffer(value); + return buffer.view(); +} +} // namespace internal + +LIBC_INLINE string to_string(int value) { + return internal::to_dec_string<int>(value); +} +LIBC_INLINE string to_string(long value) { + return internal::to_dec_string<long>(value); +} +LIBC_INLINE string to_string(long long value) { + return internal::to_dec_string<long long>(value); +} +LIBC_INLINE string to_string(unsigned value) { + return internal::to_dec_string<unsigned>(value); +} +LIBC_INLINE string to_string(unsigned long value) { + return internal::to_dec_string<unsigned long>(value); +} +LIBC_INLINE string to_string(unsigned long long value) { + return internal::to_dec_string<unsigned long long>(value); +} + +// TODO: Support floating point +// LIBC_INLINE string to_string(float value); +// LIBC_INLINE string to_string(double value); +// LIBC_INLINE string to_string(long double value); + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_STRING_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/string_view.h b/contrib/llvm-project/libc/src/__support/CPP/string_view.h new file mode 100644 index 000000000000..aa15814b2e14 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/string_view.h @@ -0,0 +1,222 @@ +//===-- Standalone implementation std::string_view --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_STRING_VIEW_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_STRING_VIEW_H + +#include "limits.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#include <stddef.h> + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// This is very simple alternate of the std::string_view class. There is no +// bounds check performed in any of the methods. The callers are expected to +// do the checks before invoking the methods. +// +// This class will be extended as needed in future. +class string_view { +private: + const char *Data; + size_t Len; + + LIBC_INLINE static size_t min(size_t A, size_t B) { return A <= B ? A : B; } + + LIBC_INLINE static int compareMemory(const char *Lhs, const char *Rhs, + size_t Length) { + for (size_t i = 0; i < Length; ++i) + if (int Diff = (int)Lhs[i] - (int)Rhs[i]) + return Diff; + return 0; + } + + LIBC_INLINE static constexpr size_t length(const char *Str) { + for (const char *End = Str;; ++End) + if (*End == '\0') + return static_cast<size_t>(End - Str); + } + + LIBC_INLINE bool equals(string_view Other) const { + return (Len == Other.Len && + compareMemory(Data, Other.Data, Other.Len) == 0); + } + +public: + using value_type = char; + using size_type = size_t; + using difference_type = ptrdiff_t; + using pointer = char *; + using const_pointer = const char *; + using reference = char &; + using const_reference = const char &; + using const_iterator = char *; + using iterator = const_iterator; + + // special value equal to the maximum value representable by the type + // size_type. + LIBC_INLINE_VAR static constexpr size_t npos = + cpp::numeric_limits<size_t>::max(); + + LIBC_INLINE constexpr string_view() : Data(nullptr), Len(0) {} + + // Assumes Str is a null-terminated string. The length of the string does + // not include the terminating null character. + // Preconditions: [Str, Str + length(Str)) is a valid range. + LIBC_INLINE constexpr string_view(const char *Str) + : Data(Str), Len(length(Str)) {} + + // Preconditions: [Str, Str + N) is a valid range. + LIBC_INLINE constexpr string_view(const char *Str, size_t N) + : Data(Str), Len(N) {} + + LIBC_INLINE constexpr const char *data() const { return Data; } + + // Returns the size of the string_view. + LIBC_INLINE constexpr size_t size() const { return Len; } + + // Returns whether the string_view is empty. + LIBC_INLINE constexpr bool empty() const { return Len == 0; } + + // Returns an iterator to the first character of the view. + LIBC_INLINE const char *begin() const { return Data; } + + // Returns an iterator to the character following the last character of the + // view. + LIBC_INLINE const char *end() const { return Data + Len; } + + // Returns a const reference to the character at specified location pos. + // No bounds checking is performed: the behavior is undefined if pos >= + // size(). + LIBC_INLINE constexpr const char &operator[](size_t Index) const { + return Data[Index]; + } + + /// compare - Compare two strings; the result is -1, 0, or 1 if this string + /// is lexicographically less than, equal to, or greater than the \p Other. + LIBC_INLINE int compare(string_view Other) const { + // Check the prefix for a mismatch. + if (int Res = compareMemory(Data, Other.Data, min(Len, Other.Len))) + return Res < 0 ? -1 : 1; + // Otherwise the prefixes match, so we only need to check the lengths. + if (Len == Other.Len) + return 0; + return Len < Other.Len ? -1 : 1; + } + + LIBC_INLINE bool operator==(string_view Other) const { return equals(Other); } + LIBC_INLINE bool operator!=(string_view Other) const { + return !(*this == Other); + } + LIBC_INLINE bool operator<(string_view Other) const { + return compare(Other) == -1; + } + LIBC_INLINE bool operator<=(string_view Other) const { + return compare(Other) != 1; + } + LIBC_INLINE bool operator>(string_view Other) const { + return compare(Other) == 1; + } + LIBC_INLINE bool operator>=(string_view Other) const { + return compare(Other) != -1; + } + + // Moves the start of the view forward by n characters. + // The behavior is undefined if n > size(). + LIBC_INLINE void remove_prefix(size_t N) { + Len -= N; + Data += N; + } + + // Moves the end of the view back by n characters. + // The behavior is undefined if n > size(). + LIBC_INLINE void remove_suffix(size_t N) { Len -= N; } + + // Check if this string starts with the given Prefix. + LIBC_INLINE bool starts_with(string_view Prefix) const { + return Len >= Prefix.Len && + compareMemory(Data, Prefix.Data, Prefix.Len) == 0; + } + + // Check if this string starts with the given Prefix. + LIBC_INLINE bool starts_with(const char Prefix) const { + return !empty() && front() == Prefix; + } + + // Check if this string ends with the given Prefix. + LIBC_INLINE bool ends_with(const char Suffix) const { + return !empty() && back() == Suffix; + } + + // Check if this string ends with the given Suffix. + LIBC_INLINE bool ends_with(string_view Suffix) const { + return Len >= Suffix.Len && + compareMemory(end() - Suffix.Len, Suffix.Data, Suffix.Len) == 0; + } + + // Return a reference to the substring from [Start, Start + N). + // + // Start The index of the starting character in the substring; if the index is + // npos or greater than the length of the string then the empty substring will + // be returned. + // + // N The number of characters to included in the substring. If N exceeds the + // number of characters remaining in the string, the string suffix (starting + // with Start) will be returned. + LIBC_INLINE string_view substr(size_t Start, size_t N = npos) const { + Start = min(Start, Len); + return string_view(Data + Start, min(N, Len - Start)); + } + + // front - Get the first character in the string. + LIBC_INLINE char front() const { return Data[0]; } + + // back - Get the last character in the string. + LIBC_INLINE char back() const { return Data[Len - 1]; } + + // Finds the first occurence of c in this view, starting at position From. + LIBC_INLINE constexpr size_t find_first_of(const char c, + size_t From = 0) const { + for (size_t Pos = From; Pos < size(); ++Pos) + if ((*this)[Pos] == c) + return Pos; + return npos; + } + + // Finds the last occurence of c in this view, ending at position End. + LIBC_INLINE constexpr size_t find_last_of(const char c, + size_t End = npos) const { + End = End >= size() ? size() : End + 1; + for (; End > 0; --End) + if ((*this)[End - 1] == c) + return End - 1; + return npos; + } + + // Finds the first character not equal to c in this view, starting at position + // From. + LIBC_INLINE constexpr size_t find_first_not_of(const char c, + size_t From = 0) const { + for (size_t Pos = From; Pos < size(); ++Pos) + if ((*this)[Pos] != c) + return Pos; + return npos; + } + + // Check if this view contains the given character. + LIBC_INLINE constexpr bool contains(char c) const { + return find_first_of(c) != npos; + } +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_STRING_VIEW_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/stringstream.h b/contrib/llvm-project/libc/src/__support/CPP/stringstream.h new file mode 100644 index 000000000000..a16084c84868 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/stringstream.h @@ -0,0 +1,96 @@ +//===-- A simple implementation of string stream class ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_STRINGSTREAM_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_STRINGSTREAM_H + +#include "span.h" +#include "src/__support/macros/config.h" +#include "string_view.h" +#include "type_traits.h" + +#include "src/__support/integer_to_string.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// This class is to be used to write simple strings into a user provided buffer +// without any dynamic memory allocation. There is no requirement to mimic the +// C++ standard library class std::stringstream. +class StringStream { + span<char> data; + size_t write_ptr = 0; // The current write pointer + bool err = false; // If an error occurs while writing + + void write(const char *bytes, size_t size) { + size_t i = 0; + const size_t data_size = data.size(); + for (; write_ptr < data_size && i < size; ++i, ++write_ptr) + data[write_ptr] = bytes[i]; + if (i < size) { + // If some of the characters couldn't be written, set error. + err = true; + } + } + +public: + static constexpr char ENDS = '\0'; + + // Create a string stream which will write into |buf|. + constexpr StringStream(const span<char> &buf) : data(buf) {} + + // Return a string_view to the current characters in the stream. If a + // null terminator was not explicitly written, then the return value + // will not include one. In order to produce a string_view to a null + // terminated string, write ENDS explicitly. + string_view str() const { return string_view(data.data(), write_ptr); } + + // Write the characters from |str| to the stream. + StringStream &operator<<(string_view str) { + write(str.data(), str.size()); + return *this; + } + + // Write the |val| as string. + template <typename T, enable_if_t<is_integral_v<T>, int> = 0> + StringStream &operator<<(T val) { + const IntegerToString<T> buffer(val); + return *this << buffer.view(); + } + + template <typename T, enable_if_t<is_floating_point_v<T>, int> = 0> + StringStream &operator<<(T) { + // If this specialization gets activated, then the static_assert will + // trigger a compile error about missing floating point number support. + static_assert(!is_floating_point_v<T>, + "Writing floating point numbers is not yet supported"); + return *this; + } + + // Write a null-terminated string. The terminating null character is not + // written to allow stremaing to continue. + StringStream &operator<<(const char *str) { + return operator<<(string_view(str)); + } + + // Write a single character. + StringStream &operator<<(char a) { + write(&a, 1); + return *this; + } + + // Return true if any write operation(s) failed due to insufficient size. + bool overflow() const { return err; } + + size_t bufsize() const { return data.size(); } +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_STRINGSTREAM_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits.h new file mode 100644 index 000000000000..d48ee23aeae0 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits.h @@ -0,0 +1,70 @@ +//===-- Self contained C++ type_traits --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_H + +#include "src/__support/CPP/type_traits/add_lvalue_reference.h" +#include "src/__support/CPP/type_traits/add_pointer.h" +#include "src/__support/CPP/type_traits/add_rvalue_reference.h" +#include "src/__support/CPP/type_traits/aligned_storage.h" +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/conditional.h" +#include "src/__support/CPP/type_traits/decay.h" +#include "src/__support/CPP/type_traits/enable_if.h" +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/has_unique_object_representations.h" +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/CPP/type_traits/invoke.h" +#include "src/__support/CPP/type_traits/invoke_result.h" +#include "src/__support/CPP/type_traits/is_arithmetic.h" +#include "src/__support/CPP/type_traits/is_array.h" +#include "src/__support/CPP/type_traits/is_base_of.h" +#include "src/__support/CPP/type_traits/is_class.h" +#include "src/__support/CPP/type_traits/is_complex.h" +#include "src/__support/CPP/type_traits/is_const.h" +#include "src/__support/CPP/type_traits/is_constant_evaluated.h" +#include "src/__support/CPP/type_traits/is_convertible.h" +#include "src/__support/CPP/type_traits/is_copy_assignable.h" +#include "src/__support/CPP/type_traits/is_copy_constructible.h" +#include "src/__support/CPP/type_traits/is_destructible.h" +#include "src/__support/CPP/type_traits/is_enum.h" +#include "src/__support/CPP/type_traits/is_fixed_point.h" +#include "src/__support/CPP/type_traits/is_floating_point.h" +#include "src/__support/CPP/type_traits/is_function.h" +#include "src/__support/CPP/type_traits/is_integral.h" +#include "src/__support/CPP/type_traits/is_lvalue_reference.h" +#include "src/__support/CPP/type_traits/is_member_pointer.h" +#include "src/__support/CPP/type_traits/is_move_assignable.h" +#include "src/__support/CPP/type_traits/is_move_constructible.h" +#include "src/__support/CPP/type_traits/is_null_pointer.h" +#include "src/__support/CPP/type_traits/is_object.h" +#include "src/__support/CPP/type_traits/is_pointer.h" +#include "src/__support/CPP/type_traits/is_reference.h" +#include "src/__support/CPP/type_traits/is_rvalue_reference.h" +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/is_scalar.h" +#include "src/__support/CPP/type_traits/is_signed.h" +#include "src/__support/CPP/type_traits/is_trivially_constructible.h" +#include "src/__support/CPP/type_traits/is_trivially_copyable.h" +#include "src/__support/CPP/type_traits/is_trivially_destructible.h" +#include "src/__support/CPP/type_traits/is_union.h" +#include "src/__support/CPP/type_traits/is_unsigned.h" +#include "src/__support/CPP/type_traits/is_void.h" +#include "src/__support/CPP/type_traits/make_signed.h" +#include "src/__support/CPP/type_traits/make_unsigned.h" +#include "src/__support/CPP/type_traits/remove_all_extents.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/CPP/type_traits/remove_cvref.h" +#include "src/__support/CPP/type_traits/remove_extent.h" +#include "src/__support/CPP/type_traits/remove_reference.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/CPP/type_traits/void_t.h" + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_lvalue_reference.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_lvalue_reference.h new file mode 100644 index 000000000000..6f5fc6b0a4be --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_lvalue_reference.h @@ -0,0 +1,33 @@ +//===-- add_lvalue_reference type_traits ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_LVALUE_REFERENCE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_LVALUE_REFERENCE_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// add_lvalue_reference +namespace detail { +template <class T> // Note that `cv void&` is a substitution failure +auto try_add_lvalue_reference(int) -> cpp::type_identity<T &>; +template <class T> // Handle T = cv void case +auto try_add_lvalue_reference(...) -> cpp::type_identity<T>; +} // namespace detail +template <class T> +struct add_lvalue_reference : decltype(detail::try_add_lvalue_reference<T>(0)) { +}; +template <class T> +using add_lvalue_reference_t = typename add_lvalue_reference<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_LVALUE_REFERENCE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_pointer.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_pointer.h new file mode 100644 index 000000000000..2568a35653ed --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_pointer.h @@ -0,0 +1,30 @@ +//===-- add_pointer type_traits ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_POINTER_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_POINTER_H + +#include "src/__support/CPP/type_traits/remove_reference.h" +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// add_pointer +namespace detail { +template <class T> +auto try_add_pointer(int) -> cpp::type_identity<cpp::remove_reference_t<T> *>; +template <class T> auto try_add_pointer(...) -> cpp::type_identity<T>; +} // namespace detail +template <class T> +struct add_pointer : decltype(detail::try_add_pointer<T>(0)) {}; +template <class T> using add_pointer_t = typename add_pointer<T>::type; +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_POINTER_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_rvalue_reference.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_rvalue_reference.h new file mode 100644 index 000000000000..f51ebf46d7c8 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/add_rvalue_reference.h @@ -0,0 +1,32 @@ +//===-- add_rvalue_reference type_traits ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_RVALUE_REFERENCE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_RVALUE_REFERENCE_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// add_rvalue_reference +namespace detail { +template <class T> +auto try_add_rvalue_reference(int) -> cpp::type_identity<T &&>; +template <class T> auto try_add_rvalue_reference(...) -> cpp::type_identity<T>; +} // namespace detail +template <class T> +struct add_rvalue_reference : decltype(detail::try_add_rvalue_reference<T>(0)) { +}; +template <class T> +using add_rvalue_reference_t = typename add_rvalue_reference<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ADD_RVALUE_REFERENCE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/aligned_storage.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/aligned_storage.h new file mode 100644 index 000000000000..69ad4cc8478e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/aligned_storage.h @@ -0,0 +1,30 @@ +//===-- aligned_storage type_traits --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALIGNED_STORAGE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALIGNED_STORAGE_H + +#include "src/__support/macros/config.h" +#include <stddef.h> // size_t + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +template <size_t Len, size_t Align> struct aligned_storage { + struct type { + alignas(Align) unsigned char data[Len]; + }; +}; + +template <size_t Len, size_t Align> +using aligned_storage_t = typename aligned_storage<Len, Align>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALIGNED_STORAGE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/always_false.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/always_false.h new file mode 100644 index 000000000000..218eb9d577ec --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/always_false.h @@ -0,0 +1,32 @@ +//===-- convenient static_assert(false) helper ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALWAYS_FALSE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALWAYS_FALSE_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// This is technically not part of the standard but it come often enough that +// it's convenient to have around. +// +// https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2593r0.html#valid-workaround +// +// This will be fixed in C++23 according to [CWG +// 2518](https://cplusplus.github.io/CWG/issues/2518.html). + +// Usage `static_assert(cpp::always_false<T>, "error message");` +template <typename...> LIBC_INLINE_VAR constexpr bool always_false = false; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALWAYS_FALSE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/bool_constant.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/bool_constant.h new file mode 100644 index 000000000000..e61a81a84b0f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/bool_constant.h @@ -0,0 +1,23 @@ +//===-- bool_constant type_traits -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_BOOL_CONSTANT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_BOOL_CONSTANT_H + +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// bool_constant +template <bool V> using bool_constant = cpp::integral_constant<bool, V>; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_BOOL_CONSTANT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/conditional.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/conditional.h new file mode 100644 index 000000000000..effcda02da1a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/conditional.h @@ -0,0 +1,28 @@ +//===-- conditional type_traits ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_CONDITIONAL_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_CONDITIONAL_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// conditional +template <bool B, typename T, typename F> +struct conditional : type_identity<T> {}; +template <typename T, typename F> +struct conditional<false, T, F> : type_identity<F> {}; +template <bool B, typename T, typename F> +using conditional_t = typename conditional<B, T, F>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_CONDITIONAL_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/decay.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/decay.h new file mode 100644 index 000000000000..c07e9e855778 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/decay.h @@ -0,0 +1,40 @@ +//===-- decay type_traits ---------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_DECAY_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_DECAY_H + +#include "src/__support/macros/attributes.h" + +#include "src/__support/CPP/type_traits/add_pointer.h" +#include "src/__support/CPP/type_traits/conditional.h" +#include "src/__support/CPP/type_traits/is_array.h" +#include "src/__support/CPP/type_traits/is_function.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/CPP/type_traits/remove_extent.h" +#include "src/__support/CPP/type_traits/remove_reference.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// decay +template <class T> class decay { + using U = cpp::remove_reference_t<T>; + +public: + using type = conditional_t< + cpp::is_array_v<U>, cpp::add_pointer_t<cpp::remove_extent_t<U>>, + cpp::conditional_t<cpp::is_function_v<U>, cpp::add_pointer_t<U>, + cpp::remove_cv_t<U>>>; +}; +template <class T> using decay_t = typename decay<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_DECAY_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/enable_if.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/enable_if.h new file mode 100644 index 000000000000..a2ce2037eb96 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/enable_if.h @@ -0,0 +1,26 @@ +//===-- enable_if type_traits -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ENABLE_IF_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ENABLE_IF_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// enable_if +template <bool B, typename T = void> struct enable_if; +template <typename T> struct enable_if<true, T> : type_identity<T> {}; +template <bool B, typename T = void> +using enable_if_t = typename enable_if<B, T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ENABLE_IF_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/false_type.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/false_type.h new file mode 100644 index 000000000000..65934b96bab0 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/false_type.h @@ -0,0 +1,23 @@ +//===-- false_type type_traits ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_FALSE_TYPE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_FALSE_TYPE_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// false_type +using false_type = cpp::bool_constant<false>; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_FALSE_TYPE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/has_unique_object_representations.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/has_unique_object_representations.h new file mode 100644 index 000000000000..639fb69d2720 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/has_unique_object_representations.h @@ -0,0 +1,30 @@ +//===-- has_unique_object_representations type_traits ------------*- C++-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_HAS_UNIQUE_OBJECT_REPRESENTATIONS_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_HAS_UNIQUE_OBJECT_REPRESENTATIONS_H + +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/CPP/type_traits/remove_all_extents.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +template <class T> +struct has_unique_object_representations + : public integral_constant<bool, __has_unique_object_representations( + remove_all_extents_t<T>)> {}; + +template <class T> +LIBC_INLINE_VAR constexpr bool has_unique_object_representations_v = + has_unique_object_representations<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_HAS_UNIQUE_OBJECT_REPRESENTATIONS_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/integral_constant.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/integral_constant.h new file mode 100644 index 000000000000..931a9b98a64c --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/integral_constant.h @@ -0,0 +1,26 @@ +//===-- integral_constant type_traits ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INTEGRAL_CONSTANT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INTEGRAL_CONSTANT_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE_VAR +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// integral_constant +template <typename T, T v> struct integral_constant { + using value_type = T; + LIBC_INLINE_VAR static constexpr T value = v; +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INTEGRAL_CONSTANT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/invoke.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/invoke.h new file mode 100644 index 000000000000..e4d9be74d12d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/invoke.h @@ -0,0 +1,67 @@ +//===-- invoke type_traits --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INVOKE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INVOKE_H + +#include "src/__support/CPP/type_traits/always_false.h" +#include "src/__support/CPP/type_traits/decay.h" +#include "src/__support/CPP/type_traits/enable_if.h" +#include "src/__support/CPP/type_traits/is_base_of.h" +#include "src/__support/CPP/type_traits/is_pointer.h" +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/utility/forward.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +namespace detail { + +// Catch all function and functor types. +template <class FunctionPtrType> struct invoke_dispatcher { + template <class T, class... Args, + typename = cpp::enable_if_t< + cpp::is_same_v<cpp::decay_t<T>, FunctionPtrType>>> + LIBC_INLINE static decltype(auto) call(T &&fun, Args &&...args) { + return cpp::forward<T>(fun)(cpp::forward<Args>(args)...); + } +}; + +// Catch pointer to member function types. +template <class Class, class FunctionReturnType> +struct invoke_dispatcher<FunctionReturnType Class::*> { + using FunctionPtrType = FunctionReturnType Class::*; + + template <class T, class... Args, class DecayT = cpp::decay_t<T>> + LIBC_INLINE static decltype(auto) call(FunctionPtrType fun, T &&t1, + Args &&...args) { + if constexpr (cpp::is_base_of_v<Class, DecayT>) { + // T is a (possibly cv ref) type. + return (cpp::forward<T>(t1).*fun)(cpp::forward<Args>(args)...); + } else if constexpr (cpp::is_pointer_v<T>) { + // T is a pointer type. + return (*cpp::forward<T>(t1).*fun)(cpp::forward<Args>(args)...); + } else { + static_assert(cpp::always_false<T>); + } + } +}; + +} // namespace detail +template <class Function, class... Args> +decltype(auto) invoke(Function &&fun, Args &&...args) { + return detail::invoke_dispatcher<cpp::decay_t<Function>>::call( + cpp::forward<Function>(fun), cpp::forward<Args>(args)...); +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INVOKE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/invoke_result.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/invoke_result.h new file mode 100644 index 000000000000..71d848b77fd2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/invoke_result.h @@ -0,0 +1,29 @@ +//===-- invoke_result type_traits -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INVOKE_RESULT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INVOKE_RESULT_H + +#include "src/__support/CPP/type_traits/invoke.h" +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/CPP/utility/declval.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +template <class F, class... Args> +struct invoke_result : cpp::type_identity<decltype(cpp::invoke( + cpp::declval<F>(), cpp::declval<Args>()...))> {}; + +template <class F, class... Args> +using invoke_result_t = typename invoke_result<F, Args...>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_INVOKE_RESULT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_arithmetic.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_arithmetic.h new file mode 100644 index 000000000000..33671b0def43 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_arithmetic.h @@ -0,0 +1,30 @@ +//===-- is_arithmetic type_traits -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ARITHMETIC_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ARITHMETIC_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/is_floating_point.h" +#include "src/__support/CPP/type_traits/is_integral.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_arithmetic +template <typename T> +struct is_arithmetic : cpp::bool_constant<(cpp::is_integral_v<T> || + cpp::is_floating_point_v<T>)> {}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_arithmetic_v = is_arithmetic<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ARITHMETIC_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_array.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_array.h new file mode 100644 index 000000000000..f0ab100fd5c7 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_array.h @@ -0,0 +1,31 @@ +//===-- is_array type_traits ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ARRAY_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ARRAY_H + +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +#include <stddef.h> // For size_t + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_array +template <class T> struct is_array : false_type {}; +template <class T> struct is_array<T[]> : true_type {}; +template <class T, size_t N> struct is_array<T[N]> : true_type {}; +template <class T> +LIBC_INLINE_VAR constexpr bool is_array_v = is_array<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ARRAY_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_base_of.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_base_of.h new file mode 100644 index 000000000000..2efd1bf3f1af --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_base_of.h @@ -0,0 +1,47 @@ +//===-- is_base_of type_traits ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_BASE_OF_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_BASE_OF_H + +#include "src/__support/CPP/type_traits/add_rvalue_reference.h" +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/is_class.h" +#include "src/__support/CPP/type_traits/remove_all_extents.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_base_of +namespace detail { +template <typename B> cpp::true_type __test_ptr_conv(const volatile B *); +template <typename> cpp::false_type __test_ptr_conv(const volatile void *); + +template <typename B, typename D> +auto is_base_of(int) -> decltype(__test_ptr_conv<B>(static_cast<D *>(nullptr))); + +template <typename, typename> +auto is_base_of(...) -> cpp::true_type; // private or ambiguous base + +} // namespace detail + +template <typename Base, typename Derived> +struct is_base_of + : cpp::bool_constant< + cpp::is_class_v<Base> && + cpp::is_class_v<Derived> &&decltype(detail::is_base_of<Base, Derived>( + 0))::value> {}; +template <typename Base, typename Derived> +LIBC_INLINE_VAR constexpr bool is_base_of_v = is_base_of<Base, Derived>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_BASE_OF_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_class.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_class.h new file mode 100644 index 000000000000..fe12f7d2763c --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_class.h @@ -0,0 +1,32 @@ +//===-- is_class type_traits ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CLASS_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CLASS_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/is_union.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_class +namespace detail { +template <class T> cpp::bool_constant<!cpp::is_union_v<T>> test(int T::*); +template <class> cpp::false_type test(...); +} // namespace detail +template <class T> struct is_class : decltype(detail::test<T>(nullptr)) {}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_class_v = is_class<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CLASS_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_complex.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_complex.h new file mode 100644 index 000000000000..23f05c08ccab --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_complex.h @@ -0,0 +1,53 @@ +//===-- is_complex type_traits ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COMPLEX_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COMPLEX_H + +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +// LIBC_TYPES_HAS_CFLOAT16 && LIBC_TYPES_HAS_CFLOAT128 +#include "src/__support/macros/properties/complex_types.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_complex +template <typename T> struct is_complex { +private: + template <typename Head, typename... Args> + LIBC_INLINE_VAR static constexpr bool __is_unqualified_any_of() { + return (... || is_same_v<remove_cv_t<Head>, Args>); + } + +public: + LIBC_INLINE_VAR static constexpr bool value = + __is_unqualified_any_of<T, _Complex float, _Complex double, + _Complex long double +#ifdef LIBC_TYPES_HAS_CFLOAT16 + , + cfloat16 +#endif +#ifdef LIBC_TYPES_HAS_CFLOAT128 + , + cfloat128 +#endif + >(); +}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_complex_v = is_complex<T>::value; +template <typename T1, typename T2> +LIBC_INLINE_VAR constexpr bool is_complex_type_same() { + return is_same_v<remove_cv_t<T1>, T2>; +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COMPLEX_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_const.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_const.h new file mode 100644 index 000000000000..b8e60f79a668 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_const.h @@ -0,0 +1,28 @@ +//===-- is_const type_traits ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONST_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONST_H + +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_const +template <class T> struct is_const : cpp::false_type {}; +template <class T> struct is_const<const T> : cpp::true_type {}; +template <class T> +LIBC_INLINE_VAR constexpr bool is_const_v = is_const<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONST_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_constant_evaluated.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_constant_evaluated.h new file mode 100644 index 000000000000..0bb2d0806cb0 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_constant_evaluated.h @@ -0,0 +1,24 @@ +//===-- is_constant_evaluated type_traits -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONSTANT_EVALUATED_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONSTANT_EVALUATED_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +LIBC_INLINE constexpr bool is_constant_evaluated() { + return __builtin_is_constant_evaluated(); +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONSTANT_EVALUATED_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_convertible.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_convertible.h new file mode 100644 index 000000000000..a9f94cbb95a2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_convertible.h @@ -0,0 +1,48 @@ +//===-- is_convertible type_traits ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONVERTIBLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONVERTIBLE_H + +#include "src/__support/CPP/type_traits/is_void.h" +#include "src/__support/CPP/utility/declval.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_convertible +namespace detail { +template <class T> +auto test_returnable(int) + -> decltype(void(static_cast<T (*)()>(nullptr)), cpp::true_type{}); +template <class> auto test_returnable(...) -> cpp::false_type; + +template <class From, class To> +auto test_implicitly_convertible(int) + -> decltype(void(cpp::declval<void (&)(To)>()(cpp::declval<From>())), + cpp::true_type{}); +template <class, class> +auto test_implicitly_convertible(...) -> cpp::false_type; +} // namespace detail + +template <class From, class To> +struct is_convertible + : cpp::bool_constant< + (decltype(detail::test_returnable<To>(0))::value && + decltype(detail::test_implicitly_convertible<From, To>(0))::value) || + (cpp::is_void_v<From> && cpp::is_void_v<To>)> {}; + +template <class From, class To> +LIBC_INLINE_VAR constexpr bool is_convertible_v = + is_convertible<From, To>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_CONVERTIBLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_copy_assignable.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_copy_assignable.h new file mode 100644 index 000000000000..9beb93d14668 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_copy_assignable.h @@ -0,0 +1,32 @@ +//===-- is_copy_assignable type_traits --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_ASSIGNABLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_ASSIGNABLE_H + +#include "src/__support/CPP/type_traits/add_lvalue_reference.h" +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is copy assignable +template <class T> +struct is_copy_assignable + : public integral_constant< + bool, __is_assignable(cpp::add_lvalue_reference_t<T>, + cpp::add_lvalue_reference_t<const T>)> {}; + +template <class T> +LIBC_INLINE_VAR constexpr bool is_copy_assignable_v = + is_copy_assignable<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_ASSIGNABLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_copy_constructible.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_copy_constructible.h new file mode 100644 index 000000000000..d8eb9ad3507e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_copy_constructible.h @@ -0,0 +1,31 @@ +//===-- is_copy_constructible type_traits -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_CONSTRUCTIBLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_CONSTRUCTIBLE_H + +#include "src/__support/CPP/type_traits/add_lvalue_reference.h" +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is copy constructible +template <class T> +struct is_copy_constructible + : public integral_constant< + bool, __is_constructible(T, cpp::add_lvalue_reference_t<const T>)> {}; + +template <class T> +LIBC_INLINE_VAR constexpr bool is_copy_constructible_v = + is_copy_constructible<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_CONSTRUCTIBLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_destructible.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_destructible.h new file mode 100644 index 000000000000..830f22efafa5 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_destructible.h @@ -0,0 +1,68 @@ +//===-- is_destructible type_traits -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_DESTRUCTIBLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_DESTRUCTIBLE_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/is_function.h" +#include "src/__support/CPP/type_traits/is_reference.h" +#include "src/__support/CPP/type_traits/remove_all_extents.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_destructible +#if __has_builtin(__is_destructible) +template <typename T> +struct is_destructible : bool_constant<__is_destructible(T)> {}; +#else +// if it's a reference, return true +// if it's a function, return false +// if it's void, return false +// if it's an array of unknown bound, return false +// Otherwise, return "declval<T&>().~T()" is well-formed +// where T is remove_all_extents<T>::type +template <typename> struct __is_destructible_apply : cpp::type_identity<int> {}; +template <typename T> struct __is_destructor_wellformed { + template <typename T1> + static cpp::true_type __test( + typename __is_destructible_apply<decltype(declval<T1 &>().~T1())>::type); + template <typename T1> static cpp::false_type __test(...); + static const bool value = decltype(__test<T>(12))::value; +}; +template <typename T, bool> struct __destructible_imp; +template <typename T> +struct __destructible_imp<T, false> + : public bool_constant< + __is_destructor_wellformed<cpp::remove_all_extents_t<T>>::value> {}; +template <typename T> +struct __destructible_imp<T, true> : public cpp::true_type {}; +template <typename T, bool> struct __destructible_false; +template <typename T> +struct __destructible_false<T, false> + : public __destructible_imp<T, is_reference<T>::value> {}; +template <typename T> +struct __destructible_false<T, true> : public cpp::false_type {}; +template <typename T> +struct is_destructible : public __destructible_false<T, is_function<T>::value> { +}; +template <typename T> struct is_destructible<T[]> : public false_type {}; +template <> struct is_destructible<void> : public false_type {}; +#endif +template <class T> +LIBC_INLINE_VAR constexpr bool is_destructible_v = is_destructible<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_DESTRUCTIBLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_enum.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_enum.h new file mode 100644 index 000000000000..623ae072aff6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_enum.h @@ -0,0 +1,26 @@ +//===-- is_enum type_traits -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ENUM_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ENUM_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_enum +template <typename T> struct is_enum : bool_constant<__is_enum(T)> {}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_enum_v = is_enum<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_ENUM_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_fixed_point.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_fixed_point.h new file mode 100644 index 000000000000..9df2a7727c96 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_fixed_point.h @@ -0,0 +1,49 @@ +//===-- is_fixed_point type_traits ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FIXED_POINT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FIXED_POINT_H + +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" + +#include "include/llvm-libc-macros/stdfix-macros.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_fixed_point +#ifdef LIBC_COMPILER_HAS_FIXED_POINT +template <typename T> struct is_fixed_point { +private: + template <typename Head, typename... Args> + LIBC_INLINE static constexpr bool __is_unqualified_any_of() { + return (... || is_same_v<remove_cv_t<Head>, Args>); + } + +public: + LIBC_INLINE_VAR static constexpr bool value = __is_unqualified_any_of< + T, short fract, fract, long fract, unsigned short fract, unsigned fract, + unsigned long fract, short accum, accum, long accum, unsigned short accum, + unsigned accum, unsigned long accum, short sat fract, sat fract, + long sat fract, unsigned short sat fract, unsigned sat fract, + unsigned long sat fract, short sat accum, sat accum, long sat accum, + unsigned short sat accum, unsigned sat accum, unsigned long sat accum>(); +}; +#else +template <typename T> struct is_fixed_point : false_type {}; +#endif // LIBC_COMPILER_HAS_FIXED_POINT + +template <typename T> +LIBC_INLINE_VAR constexpr bool is_fixed_point_v = is_fixed_point<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FIXED_POINT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_floating_point.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_floating_point.h new file mode 100644 index 000000000000..9dc77ad7ee0e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_floating_point.h @@ -0,0 +1,49 @@ +//===-- is_floating_point type_traits ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FLOATING_POINT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FLOATING_POINT_H + +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_FLOAT128 + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_floating_point +template <typename T> struct is_floating_point { +private: + template <typename Head, typename... Args> + LIBC_INLINE_VAR static constexpr bool __is_unqualified_any_of() { + return (... || is_same_v<remove_cv_t<Head>, Args>); + } + +public: + LIBC_INLINE_VAR static constexpr bool value = + __is_unqualified_any_of<T, float, double, long double +#ifdef LIBC_TYPES_HAS_FLOAT16 + , + float16 +#endif +#ifdef LIBC_TYPES_HAS_FLOAT128 + , + float128 +#endif + , + bfloat16>(); +}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_floating_point_v = + is_floating_point<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FLOATING_POINT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_function.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_function.h new file mode 100644 index 000000000000..f7717f0a4dcd --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_function.h @@ -0,0 +1,35 @@ +//===-- is_function type_traits ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FUNCTION_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FUNCTION_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/is_const.h" +#include "src/__support/CPP/type_traits/is_reference.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_function +#if __has_builtin(__is_function) +template <typename T> +struct is_function : integral_constant<bool, __is_function(T)> {}; +#else +template <typename T> +struct is_function + : public bool_constant<!(is_reference_v<T> || is_const_v<const T>)> {}; +#endif +template <class T> +LIBC_INLINE_VAR constexpr bool is_function_v = is_function<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_FUNCTION_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_integral.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_integral.h new file mode 100644 index 000000000000..96ba09a07ddc --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_integral.h @@ -0,0 +1,43 @@ +//===-- is_integral type_traits ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_INTEGRAL_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_INTEGRAL_H + +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128 + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_integral +template <typename T> struct is_integral { +private: + template <typename Head, typename... Args> + LIBC_INLINE_VAR static constexpr bool __is_unqualified_any_of() { + return (... || is_same_v<remove_cv_t<Head>, Args>); + } + +public: + LIBC_INLINE_VAR static constexpr bool value = __is_unqualified_any_of< + T, +#ifdef LIBC_TYPES_HAS_INT128 + __int128_t, __uint128_t, +#endif + char, signed char, unsigned char, short, unsigned short, int, + unsigned int, long, unsigned long, long long, unsigned long long, bool>(); +}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_integral_v = is_integral<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_INTEGRAL_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_lvalue_reference.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_lvalue_reference.h new file mode 100644 index 000000000000..e0bfbebdaa29 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_lvalue_reference.h @@ -0,0 +1,35 @@ +//===-- is_lvalue_reference type_traits -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_LVALUE_REFERENCE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_LVALUE_REFERENCE_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_lvalue_reference +#if __has_builtin(__is_lvalue_reference) +template <typename T> +struct is_lvalue_reference : bool_constant<__is_lvalue_reference(T)> {}; +#else +template <typename T> struct is_lvalue_reference : public false_type {}; +template <typename T> struct is_lvalue_reference<T &> : public true_type {}; +#endif +template <class T> +LIBC_INLINE_VAR constexpr bool is_lvalue_reference_v = + is_lvalue_reference<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_LVALUE_REFERENCE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_member_pointer.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_member_pointer.h new file mode 100644 index 000000000000..f44567003959 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_member_pointer.h @@ -0,0 +1,33 @@ +//===-- is_member_pointer type_traits ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MEMBER_POINTER_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MEMBER_POINTER_H + +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_member_pointer +template <class T> struct is_member_pointer_helper : cpp::false_type {}; +template <class T, class U> +struct is_member_pointer_helper<T U::*> : cpp::true_type {}; +template <class T> +struct is_member_pointer : is_member_pointer_helper<cpp::remove_cv_t<T>> {}; +template <class T> +LIBC_INLINE_VAR constexpr bool is_member_pointer_v = + is_member_pointer<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MEMBER_POINTER_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_move_assignable.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_move_assignable.h new file mode 100644 index 000000000000..a788bd9074e3 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_move_assignable.h @@ -0,0 +1,33 @@ +//===-- is_move_assignable type_traits --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_ASSIGNABLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_ASSIGNABLE_H + +#include "src/__support/CPP/type_traits/add_lvalue_reference.h" +#include "src/__support/CPP/type_traits/add_rvalue_reference.h" +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is move assignable +template <class T> +struct is_move_assignable + : public integral_constant<bool, __is_assignable( + cpp::add_lvalue_reference_t<T>, + cpp::add_rvalue_reference_t<T>)> {}; + +template <class T> +LIBC_INLINE_VAR constexpr bool is_move_assignable_v = + is_move_assignable<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_ASSIGNABLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_move_constructible.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_move_constructible.h new file mode 100644 index 000000000000..c89896054625 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_move_constructible.h @@ -0,0 +1,31 @@ +//===-- is_move_constructible type_traits ------------------------*- C++-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_CONSTRUCTIBLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_CONSTRUCTIBLE_H + +#include "src/__support/CPP/type_traits/add_rvalue_reference.h" +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is move constructible +template <class T> +struct is_move_constructible + : public integral_constant<bool, __is_constructible( + T, cpp::add_rvalue_reference_t<T>)> {}; + +template <class T> +LIBC_INLINE_VAR constexpr bool is_move_constructible_v = + is_move_constructible<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_CONSTRUCTIBLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_null_pointer.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_null_pointer.h new file mode 100644 index 000000000000..acf341311be0 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_null_pointer.h @@ -0,0 +1,29 @@ +//===-- is_null_pointer type_traits -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_NULL_POINTER_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_NULL_POINTER_H + +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_null_pointer +using nullptr_t = decltype(nullptr); +template <class T> +struct is_null_pointer : cpp::is_same<cpp::nullptr_t, cpp::remove_cv_t<T>> {}; +template <class T> +LIBC_INLINE_VAR constexpr bool is_null_pointer_v = is_null_pointer<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_NULL_POINTER_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_object.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_object.h new file mode 100644 index 000000000000..16799fb8f25f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_object.h @@ -0,0 +1,33 @@ +//===-- is_object type_traits -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_OBJECT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_OBJECT_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/is_array.h" +#include "src/__support/CPP/type_traits/is_class.h" +#include "src/__support/CPP/type_traits/is_scalar.h" +#include "src/__support/CPP/type_traits/is_union.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_object +template <class T> +struct is_object + : cpp::bool_constant<cpp::is_scalar_v<T> || cpp::is_array_v<T> || + cpp::is_union_v<T> || cpp::is_class_v<T>> {}; +template <class T> +LIBC_INLINE_VAR constexpr bool is_object_v = is_object<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_OBJECT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_pointer.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_pointer.h new file mode 100644 index 000000000000..606c8e9e8c0f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_pointer.h @@ -0,0 +1,31 @@ +//===-- is_pointer type_traits ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_POINTER_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_POINTER_H + +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_pointer +template <typename T> struct is_pointer : cpp::false_type {}; +template <typename T> struct is_pointer<T *> : cpp::true_type {}; +template <typename T> struct is_pointer<T *const> : cpp::true_type {}; +template <typename T> struct is_pointer<T *volatile> : cpp::true_type {}; +template <typename T> struct is_pointer<T *const volatile> : cpp::true_type {}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_pointer_v = is_pointer<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_POINTER_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_reference.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_reference.h new file mode 100644 index 000000000000..12da81778fd5 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_reference.h @@ -0,0 +1,34 @@ +//===-- is_reference type_traits --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_REFERENCE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_REFERENCE_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_reference +#if __has_builtin(__is_reference) +template <typename T> struct is_reference : bool_constant<__is_reference(T)> {}; +#else +template <typename T> struct is_reference : public false_type {}; +template <typename T> struct is_reference<T &> : public true_type {}; +template <typename T> struct is_reference<T &&> : public true_type {}; +#endif +template <class T> +LIBC_INLINE_VAR constexpr bool is_reference_v = is_reference<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_REFERENCE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_rvalue_reference.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_rvalue_reference.h new file mode 100644 index 000000000000..998b6353afb1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_rvalue_reference.h @@ -0,0 +1,35 @@ +//===-- is_rvalue_reference type_traits -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_RVALUE_REFERENCE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_RVALUE_REFERENCE_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_rvalue_reference +#if __has_builtin(__is_rvalue_reference) +template <typename T> +struct is_rvalue_reference : bool_constant<__is_rvalue_reference(T)> {}; +#else +template <typename T> struct is_rvalue_reference : public false_type {}; +template <typename T> struct is_rvalue_reference<T &&> : public true_type {}; +#endif +template <class T> +LIBC_INLINE_VAR constexpr bool is_rvalue_reference_v = + is_rvalue_reference<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_RVALUE_REFERENCE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_same.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_same.h new file mode 100644 index 000000000000..306d16b86f88 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_same.h @@ -0,0 +1,28 @@ +//===-- is_same type_traits -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SAME_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SAME_H + +#include "src/__support/CPP/type_traits/false_type.h" +#include "src/__support/CPP/type_traits/true_type.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_same +template <typename T, typename U> struct is_same : cpp::false_type {}; +template <typename T> struct is_same<T, T> : cpp::true_type {}; +template <typename T, typename U> +LIBC_INLINE_VAR constexpr bool is_same_v = is_same<T, U>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SAME_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_scalar.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_scalar.h new file mode 100644 index 000000000000..7f8a750cd7ed --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_scalar.h @@ -0,0 +1,35 @@ +//===-- is_scalar type_traits -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SCALAR_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SCALAR_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/is_arithmetic.h" +#include "src/__support/CPP/type_traits/is_enum.h" +#include "src/__support/CPP/type_traits/is_member_pointer.h" +#include "src/__support/CPP/type_traits/is_null_pointer.h" +#include "src/__support/CPP/type_traits/is_pointer.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_scalar +template <class T> +struct is_scalar + : cpp::bool_constant<cpp::is_arithmetic_v<T> || cpp::is_enum_v<T> || + cpp::is_pointer_v<T> || cpp::is_member_pointer_v<T> || + cpp::is_null_pointer_v<T>> {}; +template <class T> +LIBC_INLINE_VAR constexpr bool is_scalar_v = is_scalar<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SCALAR_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_signed.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_signed.h new file mode 100644 index 000000000000..2ddb43ac4ee3 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_signed.h @@ -0,0 +1,54 @@ +//===-- is_signed type_traits -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SIGNED_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SIGNED_H + +#include "include/llvm-libc-macros/stdfix-macros.h" +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/is_arithmetic.h" +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +#ifndef LIBC_COMPILER_HAS_FIXED_POINT +template <typename T> +struct is_signed : bool_constant<(is_arithmetic_v<T> && (T(-1) < T(0)))> { + LIBC_INLINE constexpr operator bool() const { return is_signed::value; } + LIBC_INLINE constexpr bool operator()() const { return is_signed::value; } +}; +#else +template <typename T> struct is_signed { +private: + template <typename Head, typename... Args> + LIBC_INLINE static constexpr bool __is_unqualified_any_of() { + return (... || is_same_v<remove_cv_t<Head>, Args>); + } + +public: + LIBC_INLINE_VAR static constexpr bool value = + (is_arithmetic_v<T> && (T(-1) < T(0))) || + __is_unqualified_any_of<T, short fract, fract, long fract, short accum, + accum, long accum, short sat fract, sat fract, + long sat fract, short sat accum, sat accum, + long sat accum>(); + LIBC_INLINE constexpr operator bool() const { return is_signed::value; } + LIBC_INLINE constexpr bool operator()() const { return is_signed::value; } +}; +#endif // LIBC_COMPILER_HAS_FIXED_POINT + +template <typename T> +LIBC_INLINE_VAR constexpr bool is_signed_v = is_signed<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_SIGNED_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_constructible.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_constructible.h new file mode 100644 index 000000000000..b801911038a9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_constructible.h @@ -0,0 +1,25 @@ +//===-- is_trivially_constructible type_traits ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_CONSTRUCTIBLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_CONSTRUCTIBLE_H + +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_trivially_constructible +template <class T, class... Args> +struct is_trivially_constructible + : integral_constant<bool, __is_trivially_constructible(T, Args...)> {}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_CONSTRUCTIBLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_copyable.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_copyable.h new file mode 100644 index 000000000000..a3e786fe1d14 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_copyable.h @@ -0,0 +1,29 @@ +//===-- is_trivially_copyable type_traits -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_COPYABLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_COPYABLE_H + +#include "src/__support/CPP/type_traits/integral_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_trivially_copyable +template <class T> +struct is_trivially_copyable + : public integral_constant<bool, __is_trivially_copyable(T)> {}; + +template <class T> +LIBC_INLINE_VAR constexpr bool is_trivially_copyable_v = + is_trivially_copyable<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_COPYABLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_destructible.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_destructible.h new file mode 100644 index 000000000000..d727a0ec3a82 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_trivially_destructible.h @@ -0,0 +1,37 @@ +//===-- is_trivially_destructible type_traits -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_DESTRUCTIBLE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_DESTRUCTIBLE_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/is_destructible.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_trivially_destructible +#if __has_builtin(__is_trivially_destructible) +template <typename T> +struct is_trivially_destructible + : public bool_constant<__is_trivially_destructible(T)> {}; +#else +template <typename T> +struct is_trivially_destructible + : public bool_constant<cpp::is_destructible_v<T> &&__has_trivial_destructor( + T)> {}; +#endif // __has_builtin(__is_trivially_destructible) +template <typename T> +LIBC_INLINE_VAR constexpr bool is_trivially_destructible_v = + is_trivially_destructible<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_TRIVIALLY_DESTRUCTIBLE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_union.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_union.h new file mode 100644 index 000000000000..00ca11a351bd --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_union.h @@ -0,0 +1,26 @@ +//===-- is_union type_traits ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_UNION_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_UNION_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_union +template <class T> struct is_union : bool_constant<__is_union(T)> {}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_union_v = is_union<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_UNION_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_unsigned.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_unsigned.h new file mode 100644 index 000000000000..3ae6337ceb50 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_unsigned.h @@ -0,0 +1,56 @@ +//===-- is_unsigned type_traits ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_UNSIGNED_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_UNSIGNED_H + +#include "include/llvm-libc-macros/stdfix-macros.h" +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/CPP/type_traits/is_arithmetic.h" +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +#ifndef LIBC_COMPILER_HAS_FIXED_POINT +template <typename T> +struct is_unsigned : bool_constant<(is_arithmetic_v<T> && (T(-1) > T(0)))> { + LIBC_INLINE constexpr operator bool() const { return is_unsigned::value; } + LIBC_INLINE constexpr bool operator()() const { return is_unsigned::value; } +}; +#else +template <typename T> struct is_unsigned { +private: + template <typename Head, typename... Args> + LIBC_INLINE static constexpr bool __is_unqualified_any_of() { + return (... || is_same_v<remove_cv_t<Head>, Args>); + } + +public: + LIBC_INLINE_VAR static constexpr bool value = + (is_arithmetic_v<T> && (T(-1) > T(0))) || + __is_unqualified_any_of<T, unsigned short fract, unsigned fract, + unsigned long fract, unsigned short accum, + unsigned accum, unsigned long accum, + unsigned short sat fract, unsigned sat fract, + unsigned long sat fract, unsigned short sat accum, + unsigned sat accum, unsigned long sat accum>(); + LIBC_INLINE constexpr operator bool() const { return is_unsigned::value; } + LIBC_INLINE constexpr bool operator()() const { return is_unsigned::value; } +}; +#endif // LIBC_COMPILER_HAS_FIXED_POINT + +template <typename T> +LIBC_INLINE_VAR constexpr bool is_unsigned_v = is_unsigned<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_UNSIGNED_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_void.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_void.h new file mode 100644 index 000000000000..30459dcf91a7 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/is_void.h @@ -0,0 +1,27 @@ +//===-- is_void type_traits -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_VOID_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_VOID_H + +#include "src/__support/CPP/type_traits/is_same.h" +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// is_void +template <typename T> struct is_void : is_same<void, remove_cv_t<T>> {}; +template <typename T> +LIBC_INLINE_VAR constexpr bool is_void_v = is_void<T>::value; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_VOID_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/make_signed.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/make_signed.h new file mode 100644 index 000000000000..00bc6be8fcc1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/make_signed.h @@ -0,0 +1,41 @@ +//===-- make_signed type_traits ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_MAKE_SIGNED_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_MAKE_SIGNED_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128 + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// make_signed +template <typename T> struct make_signed; +template <> struct make_signed<char> : type_identity<char> {}; +template <> struct make_signed<signed char> : type_identity<char> {}; +template <> struct make_signed<short> : type_identity<short> {}; +template <> struct make_signed<int> : type_identity<int> {}; +template <> struct make_signed<long> : type_identity<long> {}; +template <> struct make_signed<long long> : type_identity<long long> {}; +template <> struct make_signed<unsigned char> : type_identity<char> {}; +template <> struct make_signed<unsigned short> : type_identity<short> {}; +template <> struct make_signed<unsigned int> : type_identity<int> {}; +template <> struct make_signed<unsigned long> : type_identity<long> {}; +template <> +struct make_signed<unsigned long long> : type_identity<long long> {}; +#ifdef LIBC_TYPES_HAS_INT128 +template <> struct make_signed<__int128_t> : type_identity<__int128_t> {}; +template <> struct make_signed<__uint128_t> : type_identity<__int128_t> {}; +#endif +template <typename T> using make_signed_t = typename make_signed<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_MAKE_SIGNED_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/make_unsigned.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/make_unsigned.h new file mode 100644 index 000000000000..e5f60ae66521 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/make_unsigned.h @@ -0,0 +1,46 @@ +//===-- make_unsigned type_traits -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_MAKE_UNSIGNED_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_MAKE_UNSIGNED_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128 + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// make_unsigned + +template <typename T> struct make_unsigned; +template <> struct make_unsigned<char> : type_identity<unsigned char> {}; +template <> struct make_unsigned<signed char> : type_identity<unsigned char> {}; +template <> struct make_unsigned<short> : type_identity<unsigned short> {}; +template <> struct make_unsigned<int> : type_identity<unsigned int> {}; +template <> struct make_unsigned<long> : type_identity<unsigned long> {}; +template <> +struct make_unsigned<long long> : type_identity<unsigned long long> {}; +template <> +struct make_unsigned<unsigned char> : type_identity<unsigned char> {}; +template <> +struct make_unsigned<unsigned short> : type_identity<unsigned short> {}; +template <> struct make_unsigned<unsigned int> : type_identity<unsigned int> {}; +template <> +struct make_unsigned<unsigned long> : type_identity<unsigned long> {}; +template <> +struct make_unsigned<unsigned long long> : type_identity<unsigned long long> {}; +#ifdef LIBC_TYPES_HAS_INT128 +template <> struct make_unsigned<__int128_t> : type_identity<__uint128_t> {}; +template <> struct make_unsigned<__uint128_t> : type_identity<__uint128_t> {}; +#endif +template <typename T> using make_unsigned_t = typename make_unsigned<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_MAKE_UNSIGNED_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_all_extents.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_all_extents.h new file mode 100644 index 000000000000..bc577ca6f4df --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_all_extents.h @@ -0,0 +1,41 @@ +//===-- remove_all_extents type_traits --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_ALL_EXTENTS_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_ALL_EXTENTS_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +#include <stddef.h> // size_t + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// remove_all_extents +#if __has_builtin(__remove_all_extents) +template <typename T> using remove_all_extents_t = __remove_all_extents(T); +template <typename T> +struct remove_all_extents : cpp::type_identity<remove_all_extents_t<T>> {}; +#else +template <typename T> struct remove_all_extents { + using type = T; +}; +template <typename T> struct remove_all_extents<T[]> { + using type = typename remove_all_extents<T>::type; +}; +template <typename T, size_t _Np> struct remove_all_extents<T[_Np]> { + using type = typename remove_all_extents<T>::type; +}; +template <typename T> +using remove_all_extents_t = typename remove_all_extents<T>::type; +#endif + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_ALL_EXTENTS_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_cv.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_cv.h new file mode 100644 index 000000000000..2e843e0b4363 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_cv.h @@ -0,0 +1,28 @@ +//===-- remove_cv type_traits -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_CV_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_CV_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// remove_cv +template <class T> struct remove_cv : cpp::type_identity<T> {}; +template <class T> struct remove_cv<const T> : cpp::type_identity<T> {}; +template <class T> struct remove_cv<volatile T> : cpp::type_identity<T> {}; +template <class T> +struct remove_cv<const volatile T> : cpp::type_identity<T> {}; +template <class T> using remove_cv_t = typename remove_cv<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_CV_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_cvref.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_cvref.h new file mode 100644 index 000000000000..27591783fd7a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_cvref.h @@ -0,0 +1,27 @@ +//===-- remove_cvref type_traits --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_CVREF_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_CVREF_H + +#include "src/__support/CPP/type_traits/remove_cv.h" +#include "src/__support/CPP/type_traits/remove_reference.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// remove_cvref +template <typename T> struct remove_cvref { + using type = remove_cv_t<remove_reference_t<T>>; +}; +template <typename T> using remove_cvref_t = typename remove_cvref<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_CVREF_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_extent.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_extent.h new file mode 100644 index 000000000000..4f5ffd34530d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_extent.h @@ -0,0 +1,28 @@ +//===-- remove_extent type_traits -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_EXTENT_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_EXTENT_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" +#include "stddef.h" // size_t + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// remove_extent +template <class T> struct remove_extent : cpp::type_identity<T> {}; +template <class T> struct remove_extent<T[]> : cpp::type_identity<T> {}; +template <class T, size_t N> +struct remove_extent<T[N]> : cpp::type_identity<T> {}; +template <class T> using remove_extent_t = typename remove_extent<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_EXTENT_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_reference.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_reference.h new file mode 100644 index 000000000000..26ded0879f19 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/remove_reference.h @@ -0,0 +1,27 @@ +//===-- remove_reference type_traits ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_REFERENCE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_REFERENCE_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// remove_reference +template <class T> struct remove_reference : cpp::type_identity<T> {}; +template <class T> struct remove_reference<T &> : cpp::type_identity<T> {}; +template <class T> struct remove_reference<T &&> : cpp::type_identity<T> {}; +template <class T> +using remove_reference_t = typename remove_reference<T>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_REMOVE_REFERENCE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/true_type.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/true_type.h new file mode 100644 index 000000000000..55f8a535d03f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/true_type.h @@ -0,0 +1,23 @@ +//===-- true_type type_traits -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_TRUE_TYPE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_TRUE_TYPE_H + +#include "src/__support/CPP/type_traits/bool_constant.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// true_type +using true_type = cpp::bool_constant<true>; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_TRUE_TYPE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/type_identity.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/type_identity.h new file mode 100644 index 000000000000..304a1ed2cea3 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/type_identity.h @@ -0,0 +1,24 @@ +//===-- type_identity type_traits -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_TYPE_IDENTITY_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_TYPE_IDENTITY_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// type_identity +template <typename T> struct type_identity { + using type = T; +}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_TYPE_IDENTITY_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/type_traits/void_t.h b/contrib/llvm-project/libc/src/__support/CPP/type_traits/void_t.h new file mode 100644 index 000000000000..9018860a83a2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/type_traits/void_t.h @@ -0,0 +1,29 @@ +//===-- void_t type_traits --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_VOID_T_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_VOID_T_H + +#include "src/__support/CPP/type_traits/type_identity.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// void_t + +namespace detail { +template <typename... Ts> struct make_void : cpp::type_identity<void> {}; +} // namespace detail + +template <typename... Ts> +using void_t = typename detail::make_void<Ts...>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_VOID_T_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/utility.h b/contrib/llvm-project/libc/src/__support/CPP/utility.h new file mode 100644 index 000000000000..083b4877c392 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/utility.h @@ -0,0 +1,18 @@ +//===-- Analogous to <utility> ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_H + +#include "src/__support/CPP/utility/declval.h" +#include "src/__support/CPP/utility/forward.h" +#include "src/__support/CPP/utility/in_place.h" +#include "src/__support/CPP/utility/integer_sequence.h" +#include "src/__support/CPP/utility/move.h" + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/utility/declval.h b/contrib/llvm-project/libc/src/__support/CPP/utility/declval.h new file mode 100644 index 000000000000..9b963b92204f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/utility/declval.h @@ -0,0 +1,27 @@ +//===-- declval utility -----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_DECLVAL_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_DECLVAL_H + +#include "src/__support/CPP/type_traits/add_rvalue_reference.h" +#include "src/__support/CPP/type_traits/always_false.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// declval +template <typename T> cpp::add_rvalue_reference_t<T> declval() { + static_assert(cpp::always_false<T>, + "declval not allowed in an evaluated context"); +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_DECLVAL_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/utility/forward.h b/contrib/llvm-project/libc/src/__support/CPP/utility/forward.h new file mode 100644 index 000000000000..085b3d16f999 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/utility/forward.h @@ -0,0 +1,35 @@ +//===-- forward utility -----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_FORWARD_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_FORWARD_H + +#include "src/__support/CPP/type_traits/is_lvalue_reference.h" +#include "src/__support/CPP/type_traits/remove_reference.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// forward +template <typename T> +LIBC_INLINE constexpr T &&forward(remove_reference_t<T> &value) { + return static_cast<T &&>(value); +} + +template <typename T> +LIBC_INLINE constexpr T &&forward(remove_reference_t<T> &&value) { + static_assert(!is_lvalue_reference_v<T>, + "cannot forward an rvalue as an lvalue"); + return static_cast<T &&>(value); +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_FORWARD_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/utility/in_place.h b/contrib/llvm-project/libc/src/__support/CPP/utility/in_place.h new file mode 100644 index 000000000000..3967eb1c535e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/utility/in_place.h @@ -0,0 +1,39 @@ +//===-- in_place utility ----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_IN_PLACE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_IN_PLACE_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE, LIBC_INLINE_VAR +#include "src/__support/macros/config.h" + +#include <stddef.h> // size_t + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// in_place +struct in_place_t { + LIBC_INLINE explicit in_place_t() = default; +}; +LIBC_INLINE_VAR constexpr in_place_t in_place{}; + +template <class T> struct in_place_type_t { + LIBC_INLINE explicit in_place_type_t() = default; +}; +template <class T> LIBC_INLINE_VAR constexpr in_place_type_t<T> in_place_type{}; + +template <size_t IDX> struct in_place_index_t { + LIBC_INLINE explicit in_place_index_t() = default; +}; +template <size_t IDX> +LIBC_INLINE_VAR constexpr in_place_index_t<IDX> in_place_index{}; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_IN_PLACE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/utility/integer_sequence.h b/contrib/llvm-project/libc/src/__support/CPP/utility/integer_sequence.h new file mode 100644 index 000000000000..06643d505aca --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/utility/integer_sequence.h @@ -0,0 +1,40 @@ +//===-- integer_sequence utility --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_INTEGER_SEQUENCE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_INTEGER_SEQUENCE_H + +#include "src/__support/CPP/type_traits/is_integral.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// integer_sequence +template <typename T, T... Ints> struct integer_sequence { + static_assert(cpp::is_integral_v<T>); + template <T Next> using append = integer_sequence<T, Ints..., Next>; +}; + +namespace detail { +template <typename T, int N> struct make_integer_sequence { + using type = + typename make_integer_sequence<T, N - 1>::type::template append<N>; +}; +template <typename T> struct make_integer_sequence<T, -1> { + using type = integer_sequence<T>; +}; +} // namespace detail + +template <typename T, int N> +using make_integer_sequence = + typename detail::make_integer_sequence<T, N - 1>::type; + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_INTEGER_SEQUENCE_H diff --git a/contrib/llvm-project/libc/src/__support/CPP/utility/move.h b/contrib/llvm-project/libc/src/__support/CPP/utility/move.h new file mode 100644 index 000000000000..b61f723e8d4c --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/CPP/utility/move.h @@ -0,0 +1,27 @@ +//===-- move utility --------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_MOVE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_MOVE_H + +#include "src/__support/CPP/type_traits/remove_reference.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace cpp { + +// move +template <class T> +LIBC_INLINE constexpr cpp::remove_reference_t<T> &&move(T &&t) { + return static_cast<typename cpp::remove_reference_t<T> &&>(t); +} + +} // namespace cpp +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_MOVE_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/BasicOperations.h b/contrib/llvm-project/libc/src/__support/FPUtil/BasicOperations.h new file mode 100644 index 000000000000..2357b053b60b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/BasicOperations.h @@ -0,0 +1,396 @@ +//===-- Basic operations on floating point numbers --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_BASICOPERATIONS_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_BASICOPERATIONS_H + +#include "FEnvImpl.h" +#include "FPBits.h" +#include "dyadic_float.h" + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/big_int.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/types.h" +#include "src/__support/uint128.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T abs(T x) { + return FPBits<T>(x).abs().get_val(); +} + +namespace internal { + +template <typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, T> max(T x, T y) { + FPBits<T> x_bits(x); + FPBits<T> y_bits(y); + + // To make sure that fmax(+0, -0) == +0 == fmax(-0, +0), whenever x and y + // have different signs and both are not NaNs, we return the number with + // positive sign. + if (x_bits.sign() != y_bits.sign()) + return x_bits.is_pos() ? x : y; + return x > y ? x : y; +} + +#ifdef LIBC_TYPES_HAS_FLOAT16 +#if defined(__LIBC_USE_BUILTIN_FMAXF16_FMINF16) +template <> LIBC_INLINE float16 max(float16 x, float16 y) { + return __builtin_fmaxf16(x, y); +} +#elif !defined(LIBC_TARGET_ARCH_IS_AARCH64) +template <> LIBC_INLINE float16 max(float16 x, float16 y) { + FPBits<float16> x_bits(x); + FPBits<float16> y_bits(y); + + int16_t xi = static_cast<int16_t>(x_bits.uintval()); + int16_t yi = static_cast<int16_t>(y_bits.uintval()); + return ((xi > yi) != (xi < 0 && yi < 0)) ? x : y; +} +#endif +#endif // LIBC_TYPES_HAS_FLOAT16 + +#if defined(__LIBC_USE_BUILTIN_FMAX_FMIN) && !defined(LIBC_TARGET_ARCH_IS_X86) +template <> LIBC_INLINE float max(float x, float y) { + return __builtin_fmaxf(x, y); +} + +template <> LIBC_INLINE double max(double x, double y) { + return __builtin_fmax(x, y); +} +#endif + +template <typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, T> min(T x, T y) { + FPBits<T> x_bits(x); + FPBits<T> y_bits(y); + + // To make sure that fmin(+0, -0) == -0 == fmin(-0, +0), whenever x and y have + // different signs and both are not NaNs, we return the number with negative + // sign. + if (x_bits.sign() != y_bits.sign()) + return x_bits.is_neg() ? x : y; + return x < y ? x : y; +} + +#ifdef LIBC_TYPES_HAS_FLOAT16 +#if defined(__LIBC_USE_BUILTIN_FMAXF16_FMINF16) +template <> LIBC_INLINE float16 min(float16 x, float16 y) { + return __builtin_fminf16(x, y); +} +#elif !defined(LIBC_TARGET_ARCH_IS_AARCH64) +template <> LIBC_INLINE float16 min(float16 x, float16 y) { + FPBits<float16> x_bits(x); + FPBits<float16> y_bits(y); + + int16_t xi = static_cast<int16_t>(x_bits.uintval()); + int16_t yi = static_cast<int16_t>(y_bits.uintval()); + return ((xi < yi) != (xi < 0 && yi < 0)) ? x : y; +} +#endif +#endif // LIBC_TYPES_HAS_FLOAT16 + +#if defined(__LIBC_USE_BUILTIN_FMAX_FMIN) && !defined(LIBC_TARGET_ARCH_IS_X86) +template <> LIBC_INLINE float min(float x, float y) { + return __builtin_fminf(x, y); +} + +template <> LIBC_INLINE double min(double x, double y) { + return __builtin_fmin(x, y); +} +#endif + +} // namespace internal + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fmin(T x, T y) { + const FPBits<T> bitx(x), bity(y); + + if (bitx.is_nan()) + return y; + if (bity.is_nan()) + return x; + return internal::min(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fmax(T x, T y) { + FPBits<T> bitx(x), bity(y); + + if (bitx.is_nan()) + return y; + if (bity.is_nan()) + return x; + return internal::max(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fmaximum(T x, T y) { + FPBits<T> bitx(x), bity(y); + + if (bitx.is_nan()) + return x; + if (bity.is_nan()) + return y; + return internal::max(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fminimum(T x, T y) { + const FPBits<T> bitx(x), bity(y); + + if (bitx.is_nan()) + return x; + if (bity.is_nan()) + return y; + return internal::min(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fmaximum_num(T x, T y) { + FPBits<T> bitx(x), bity(y); + if (bitx.is_signaling_nan() || bity.is_signaling_nan()) { + fputil::raise_except_if_required(FE_INVALID); + if (bitx.is_nan() && bity.is_nan()) + return FPBits<T>::quiet_nan().get_val(); + } + if (bitx.is_nan()) + return y; + if (bity.is_nan()) + return x; + return internal::max(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fminimum_num(T x, T y) { + FPBits<T> bitx(x), bity(y); + if (bitx.is_signaling_nan() || bity.is_signaling_nan()) { + fputil::raise_except_if_required(FE_INVALID); + if (bitx.is_nan() && bity.is_nan()) + return FPBits<T>::quiet_nan().get_val(); + } + if (bitx.is_nan()) + return y; + if (bity.is_nan()) + return x; + return internal::min(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fmaximum_mag(T x, T y) { + FPBits<T> bitx(x), bity(y); + + if (abs(x) > abs(y)) + return x; + if (abs(y) > abs(x)) + return y; + return fmaximum(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fminimum_mag(T x, T y) { + FPBits<T> bitx(x), bity(y); + + if (abs(x) < abs(y)) + return x; + if (abs(y) < abs(x)) + return y; + return fminimum(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fmaximum_mag_num(T x, T y) { + FPBits<T> bitx(x), bity(y); + + if (abs(x) > abs(y)) + return x; + if (abs(y) > abs(x)) + return y; + return fmaximum_num(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fminimum_mag_num(T x, T y) { + FPBits<T> bitx(x), bity(y); + + if (abs(x) < abs(y)) + return x; + if (abs(y) < abs(x)) + return y; + return fminimum_num(x, y); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T fdim(T x, T y) { + FPBits<T> bitx(x), bity(y); + + if (bitx.is_nan()) { + return x; + } + + if (bity.is_nan()) { + return y; + } + + return (x > y ? x - y : 0); +} + +// Avoid reusing `issignaling` macro. +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE int issignaling_impl(const T &x) { + FPBits<T> sx(x); + return sx.is_signaling_nan(); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE int canonicalize(T &cx, const T &x) { + FPBits<T> sx(x); + if constexpr (get_fp_type<T>() == FPType::X86_Binary80) { + // All the pseudo and unnormal numbers are not canonical. + // More precisely : + // Exponent | Significand | Meaning + // | Bits 63-62 | Bits 61-0 | + // All Ones | 00 | Zero | Pseudo Infinity, Value = SNaN + // All Ones | 00 | Non-Zero | Pseudo NaN, Value = SNaN + // All Ones | 01 | Anything | Pseudo NaN, Value = SNaN + // | Bit 63 | Bits 62-0 | + // All zeroes | One | Anything | Pseudo Denormal, Value = + // | | | (−1)**s × m × 2**−16382 + // All Other | Zero | Anything | Unnormal, Value = SNaN + // Values | | | + bool bit63 = sx.get_implicit_bit(); + UInt128 mantissa = sx.get_explicit_mantissa(); + bool bit62 = static_cast<bool>((mantissa & (1ULL << 62)) >> 62); + int exponent = sx.get_biased_exponent(); + if (exponent == 0x7FFF) { + if (!bit63 && !bit62) { + if (mantissa == 0) { + cx = FPBits<T>::quiet_nan(sx.sign(), mantissa).get_val(); + raise_except_if_required(FE_INVALID); + return 1; + } + cx = FPBits<T>::quiet_nan(sx.sign(), mantissa).get_val(); + raise_except_if_required(FE_INVALID); + return 1; + } else if (!bit63 && bit62) { + cx = FPBits<T>::quiet_nan(sx.sign(), mantissa).get_val(); + raise_except_if_required(FE_INVALID); + return 1; + } else if (LIBC_UNLIKELY(sx.is_signaling_nan())) { + cx = FPBits<T>::quiet_nan(sx.sign(), sx.get_explicit_mantissa()) + .get_val(); + raise_except_if_required(FE_INVALID); + return 1; + } else + cx = x; + } else if (exponent == 0 && bit63) + cx = FPBits<T>::make_value(mantissa, 0).get_val(); + else if (exponent != 0 && !bit63) { + cx = FPBits<T>::quiet_nan(sx.sign(), mantissa).get_val(); + raise_except_if_required(FE_INVALID); + return 1; + } else if (LIBC_UNLIKELY(sx.is_signaling_nan())) { + cx = + FPBits<T>::quiet_nan(sx.sign(), sx.get_explicit_mantissa()).get_val(); + raise_except_if_required(FE_INVALID); + return 1; + } else + cx = x; + } else if (LIBC_UNLIKELY(sx.is_signaling_nan())) { + cx = FPBits<T>::quiet_nan(sx.sign(), sx.get_explicit_mantissa()).get_val(); + raise_except_if_required(FE_INVALID); + return 1; + } else + cx = x; + return 0; +} + +template <typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, bool> +totalorder(T x, T y) { + using FPBits = FPBits<T>; + FPBits x_bits(x); + FPBits y_bits(y); + + using StorageType = typename FPBits::StorageType; + StorageType x_u = x_bits.uintval(); + StorageType y_u = y_bits.uintval(); + + bool has_neg = ((x_u | y_u) & FPBits::SIGN_MASK) != 0; + return x_u == y_u || ((x_u < y_u) != has_neg); +} + +template <typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, bool> +totalordermag(T x, T y) { + return FPBits<T>(x).abs().uintval() <= FPBits<T>(y).abs().uintval(); +} + +template <typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, T> getpayload(T x) { + using FPBits = FPBits<T>; + using StorageType = typename FPBits::StorageType; + FPBits x_bits(x); + + if (!x_bits.is_nan()) + return T(-1.0); + + StorageType payload = x_bits.uintval() & (FPBits::FRACTION_MASK >> 1); + + if constexpr (is_big_int_v<StorageType>) { + DyadicFloat<FPBits::STORAGE_LEN> payload_dfloat(Sign::POS, 0, payload); + + return static_cast<T>(payload_dfloat); + } else { + return static_cast<T>(payload); + } +} + +template <bool IsSignaling, typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, bool> +setpayload(T &res, T pl) { + using FPBits = FPBits<T>; + FPBits pl_bits(pl); + + // Signaling NaNs don't have the mantissa's MSB set to 1, so they need a + // non-zero payload to distinguish them from infinities. + if (!IsSignaling && pl_bits.is_zero()) { + res = FPBits::quiet_nan(Sign::POS).get_val(); + return false; + } + + int pl_exp = pl_bits.get_exponent(); + + if (pl_bits.is_neg() || pl_exp < 0 || pl_exp >= FPBits::FRACTION_LEN - 1 || + ((pl_bits.get_mantissa() << pl_exp) & FPBits::FRACTION_MASK) != 0) { + res = T(0.0); + return true; + } + + using StorageType = typename FPBits::StorageType; + StorageType v(pl_bits.get_explicit_mantissa() >> + (FPBits::FRACTION_LEN - pl_exp)); + + if constexpr (IsSignaling) + res = FPBits::signaling_nan(Sign::POS, v).get_val(); + else + res = FPBits::quiet_nan(Sign::POS, v).get_val(); + return false; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_BASICOPERATIONS_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/DivisionAndRemainderOperations.h b/contrib/llvm-project/libc/src/__support/FPUtil/DivisionAndRemainderOperations.h new file mode 100644 index 000000000000..fda33875f25b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/DivisionAndRemainderOperations.h @@ -0,0 +1,121 @@ +//===-- Floating point divsion and remainder operations ---------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_DIVISIONANDREMAINDEROPERATIONS_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_DIVISIONANDREMAINDEROPERATIONS_H + +#include "FPBits.h" +#include "ManipulationFunctions.h" +#include "NormalFloat.h" + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +static constexpr int QUOTIENT_LSB_BITS = 3; + +// The implementation is a bit-by-bit algorithm which uses integer division +// to evaluate the quotient and remainder. +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T remquo(T x, T y, int &q) { + FPBits<T> xbits(x), ybits(y); + if (xbits.is_nan()) + return x; + if (ybits.is_nan()) + return y; + if (xbits.is_inf() || ybits.is_zero()) + return FPBits<T>::quiet_nan().get_val(); + + if (xbits.is_zero()) { + q = 0; + return LIBC_NAMESPACE::fputil::copysign(T(0.0), x); + } + + if (ybits.is_inf()) { + q = 0; + return x; + } + + const Sign result_sign = + (xbits.sign() == ybits.sign() ? Sign::POS : Sign::NEG); + + // Once we know the sign of the result, we can just operate on the absolute + // values. The correct sign can be applied to the result after the result + // is evaluated. + xbits.set_sign(Sign::POS); + ybits.set_sign(Sign::POS); + + NormalFloat<T> normalx(xbits), normaly(ybits); + int exp = normalx.exponent - normaly.exponent; + typename NormalFloat<T>::StorageType mx = normalx.mantissa, + my = normaly.mantissa; + + q = 0; + while (exp >= 0) { + unsigned shift_count = 0; + typename NormalFloat<T>::StorageType n = mx; + for (shift_count = 0; n < my; n <<= 1, ++shift_count) + ; + + if (static_cast<int>(shift_count) > exp) + break; + + exp -= shift_count; + if (0 <= exp && exp < QUOTIENT_LSB_BITS) + q |= (1 << exp); + + mx = n - my; + if (mx == 0) { + q = result_sign.is_neg() ? -q : q; + return LIBC_NAMESPACE::fputil::copysign(T(0.0), x); + } + } + + NormalFloat<T> remainder(Sign::POS, exp + normaly.exponent, mx); + + // Since NormalFloat to native type conversion is a truncation operation + // currently, the remainder value in the native type is correct as is. + // However, if NormalFloat to native type conversion is updated in future, + // then the conversion to native remainder value should be updated + // appropriately and some directed tests added. + T native_remainder(remainder); + T absy = ybits.get_val(); + int cmp = remainder.mul2(1).cmp(normaly); + if (cmp > 0) { + q = q + 1; + if (x >= T(0.0)) + native_remainder = native_remainder - absy; + else + native_remainder = absy - native_remainder; + } else if (cmp == 0) { + if (q & 1) { + q += 1; + if (x >= T(0.0)) + native_remainder = -native_remainder; + } else { + if (x < T(0.0)) + native_remainder = -native_remainder; + } + } else { + if (x < T(0.0)) + native_remainder = -native_remainder; + } + + q = result_sign.is_neg() ? -q : q; + if (native_remainder == T(0.0)) + return LIBC_NAMESPACE::fputil::copysign(T(0.0), x); + return native_remainder; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_DIVISIONANDREMAINDEROPERATIONS_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/FEnvImpl.h b/contrib/llvm-project/libc/src/__support/FPUtil/FEnvImpl.h new file mode 100644 index 000000000000..76910880eb81 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/FEnvImpl.h @@ -0,0 +1,114 @@ +//===-- Floating point environment manipulation functions -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_FENVIMPL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_FENVIMPL_H + +#include "hdr/fenv_macros.h" +#include "hdr/math_macros.h" +#include "hdr/types/fenv_t.h" +#include "src/__support/libc_errno.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" +#include "src/__support/macros/properties/architectures.h" + +#if defined(LIBC_TARGET_ARCH_IS_AARCH64) && defined(__ARM_FP) +#if defined(__APPLE__) +#include "aarch64/fenv_darwin_impl.h" +#else +#include "aarch64/FEnvImpl.h" +#endif + +// The extra !defined(APPLE) condition is to cause x86_64 MacOS builds to use +// the dummy implementations below. Once a proper x86_64 darwin fenv is set up, +// the apple condition here should be removed. +#elif defined(LIBC_TARGET_ARCH_IS_X86) && !defined(__APPLE__) +#include "x86_64/FEnvImpl.h" +#elif defined(LIBC_TARGET_ARCH_IS_ARM) && defined(__ARM_FP) +#include "arm/FEnvImpl.h" +#elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) && defined(__riscv_flen) +#include "riscv/FEnvImpl.h" +#else + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +// All dummy functions silently succeed. + +LIBC_INLINE int clear_except(int) { return 0; } + +LIBC_INLINE int test_except(int) { return 0; } + +LIBC_INLINE int get_except() { return 0; } + +LIBC_INLINE int set_except(int) { return 0; } + +LIBC_INLINE int raise_except(int) { return 0; } + +LIBC_INLINE int enable_except(int) { return 0; } + +LIBC_INLINE int disable_except(int) { return 0; } + +LIBC_INLINE int get_round() { return FE_TONEAREST; } + +LIBC_INLINE int set_round(int rounding_mode) { + return (rounding_mode == FE_TONEAREST) ? 0 : 1; +} + +LIBC_INLINE int get_env(fenv_t *) { return 0; } + +LIBC_INLINE int set_env(const fenv_t *) { return 0; } + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL +#endif + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +LIBC_INLINE static int clear_except_if_required([[maybe_unused]] int excepts) { +#ifndef LIBC_MATH_HAS_NO_EXCEPT + if (math_errhandling & MATH_ERREXCEPT) + return clear_except(excepts); +#endif // LIBC_MATH_HAS_NO_EXCEPT + return 0; +} + +LIBC_INLINE static int set_except_if_required([[maybe_unused]] int excepts) { +#ifndef LIBC_MATH_HAS_NO_EXCEPT + if (math_errhandling & MATH_ERREXCEPT) + return set_except(excepts); +#endif // LIBC_MATH_HAS_NO_EXCEPT + return 0; +} + +LIBC_INLINE static int raise_except_if_required([[maybe_unused]] int excepts) { +#ifndef LIBC_MATH_HAS_NO_EXCEPT + if (math_errhandling & MATH_ERREXCEPT) +#ifdef LIBC_TARGET_ARCH_IS_X86_64 + return raise_except</*SKIP_X87_FPU*/ true>(excepts); +#else // !LIBC_TARGET_ARCH_IS_X86 + return raise_except(excepts); +#endif // LIBC_TARGET_ARCH_IS_X86 + +#endif // LIBC_MATH_HAS_NO_EXCEPT + return 0; +} + +LIBC_INLINE static void set_errno_if_required([[maybe_unused]] int err) { +#ifndef LIBC_MATH_HAS_NO_ERRNO + if (math_errhandling & MATH_ERRNO) + libc_errno = err; +#endif // LIBC_MATH_HAS_NO_ERRNO +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_FENVIMPL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/FMA.h b/contrib/llvm-project/libc/src/__support/FPUtil/FMA.h new file mode 100644 index 000000000000..2cafb4c0974e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/FMA.h @@ -0,0 +1,52 @@ +//===-- Common header for FMA implementations -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_FMA_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_FMA_H + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/generic/FMA.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" // LIBC_TARGET_CPU_HAS_FMA + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <typename OutType, typename InType> +LIBC_INLINE OutType fma(InType x, InType y, InType z) { + return generic::fma<OutType>(x, y, z); +} + +#ifdef LIBC_TARGET_CPU_HAS_FMA + +#ifdef LIBC_TARGET_CPU_HAS_FMA_FLOAT +template <> LIBC_INLINE float fma(float x, float y, float z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else + return __builtin_fmaf(x, y, z); +#endif +} +#endif // LIBC_TARGET_CPU_HAS_FMA_FLOAT + +#ifdef LIBC_TARGET_CPU_HAS_FMA_DOUBLE +template <> LIBC_INLINE double fma(double x, double y, double z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else + return __builtin_fma(x, y, z); +#endif +} +#endif // LIBC_TARGET_CPU_HAS_FMA_DOUBLE +#endif // LIBC_TARGET_CPU_HAS_FMA + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_FMA_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/FPBits.h b/contrib/llvm-project/libc/src/__support/FPUtil/FPBits.h new file mode 100644 index 000000000000..9e21136558a0 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/FPBits.h @@ -0,0 +1,857 @@ +//===-- Abstract class for bit manipulation of float numbers. ---*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// ----------------------------------------------------------------------------- +// **** WARNING **** +// This file is shared with libc++. You should also be careful when adding +// dependencies to this file, since it needs to build for all libc++ targets. +// ----------------------------------------------------------------------------- + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_FPBITS_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_FPBITS_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/common.h" +#include "src/__support/libc_assert.h" // LIBC_ASSERT +#include "src/__support/macros/attributes.h" // LIBC_INLINE, LIBC_INLINE_VAR +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_FLOAT128 +#include "src/__support/math_extras.h" // mask_trailing_ones +#include "src/__support/sign.h" // Sign +#include "src/__support/uint128.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +// The supported floating point types. +enum class FPType { + IEEE754_Binary16, + IEEE754_Binary32, + IEEE754_Binary64, + IEEE754_Binary128, + X86_Binary80, + BFloat16 +}; + +// The classes hierarchy is as follows: +// +// ┌───────────────────┐ +// │ FPLayout<FPType> │ +// └─────────▲─────────┘ +// │ +// ┌─────────┴─────────┐ +// │ FPStorage<FPType> │ +// └─────────▲─────────┘ +// │ +// ┌────────────┴─────────────┐ +// │ │ +// ┌────────┴─────────┐ ┌──────────────┴──────────────────┐ +// │ FPRepSem<FPType> │ │ FPRepSem<FPType::X86_Binary80 │ +// └────────▲─────────┘ └──────────────▲──────────────────┘ +// │ │ +// └────────────┬─────────────┘ +// │ +// ┌───────┴───────┐ +// │ FPRepImpl<T> │ +// └───────▲───────┘ +// │ +// ┌────────┴────────┐ +// ┌─────┴─────┐ ┌─────┴─────┐ +// │ FPRep<T> │ │ FPBits<T> │ +// └───────────┘ └───────────┘ +// +// - 'FPLayout' defines only a few constants, namely the 'StorageType' and +// length of the sign, the exponent, fraction and significand parts. +// - 'FPStorage' builds more constants on top of those from 'FPLayout' like +// exponent bias and masks. It also holds the bit representation of the +// floating point as a 'StorageType' type and defines tools to assemble or +// test these parts. +// - 'FPRepSem' defines functions to interact semantically with the floating +// point representation. The default implementation is the one for 'IEEE754', +// a specialization is provided for X86 Extended Precision. +// - 'FPRepImpl' derives from 'FPRepSem' and adds functions that are common to +// all implementations or build on the ones in 'FPRepSem'. +// - 'FPRep' exposes all functions from 'FPRepImpl' and returns 'FPRep' +// instances when using Builders (static functions to create values). +// - 'FPBits' exposes all the functions from 'FPRepImpl' but operates on the +// native C++ floating point type instead of 'FPType'. An additional 'get_val' +// function allows getting the C++ floating point type value back. Builders +// called from 'FPBits' return 'FPBits' instances. + +namespace internal { + +// Defines the layout (sign, exponent, significand) of a floating point type in +// memory. It also defines its associated StorageType, i.e., the unsigned +// integer type used to manipulate its representation. +// Additionally we provide the fractional part length, i.e., the number of bits +// after the decimal dot when the number is in normal form. +template <FPType> struct FPLayout {}; + +template <> struct FPLayout<FPType::IEEE754_Binary16> { + using StorageType = uint16_t; + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int EXP_LEN = 5; + LIBC_INLINE_VAR static constexpr int SIG_LEN = 10; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SIG_LEN; +}; + +template <> struct FPLayout<FPType::IEEE754_Binary32> { + using StorageType = uint32_t; + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int EXP_LEN = 8; + LIBC_INLINE_VAR static constexpr int SIG_LEN = 23; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SIG_LEN; +}; + +template <> struct FPLayout<FPType::IEEE754_Binary64> { + using StorageType = uint64_t; + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int EXP_LEN = 11; + LIBC_INLINE_VAR static constexpr int SIG_LEN = 52; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SIG_LEN; +}; + +template <> struct FPLayout<FPType::IEEE754_Binary128> { + using StorageType = UInt128; + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int EXP_LEN = 15; + LIBC_INLINE_VAR static constexpr int SIG_LEN = 112; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SIG_LEN; +}; + +template <> struct FPLayout<FPType::X86_Binary80> { +#if __SIZEOF_LONG_DOUBLE__ == 12 + using StorageType = UInt<__SIZEOF_LONG_DOUBLE__ * CHAR_BIT>; +#else + using StorageType = UInt128; +#endif + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int EXP_LEN = 15; + LIBC_INLINE_VAR static constexpr int SIG_LEN = 64; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SIG_LEN - 1; +}; + +template <> struct FPLayout<FPType::BFloat16> { + using StorageType = uint16_t; + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int EXP_LEN = 8; + LIBC_INLINE_VAR static constexpr int SIG_LEN = 7; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SIG_LEN; +}; + +// FPStorage derives useful constants from the FPLayout above. +template <FPType fp_type> struct FPStorage : public FPLayout<fp_type> { + using UP = FPLayout<fp_type>; + + using UP::EXP_LEN; // The number of bits for the *exponent* part + using UP::SIG_LEN; // The number of bits for the *significand* part + using UP::SIGN_LEN; // The number of bits for the *sign* part + // For convenience, the sum of `SIG_LEN`, `EXP_LEN`, and `SIGN_LEN`. + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + EXP_LEN + SIG_LEN; + + // The number of bits after the decimal dot when the number is in normal form. + using UP::FRACTION_LEN; + + // An unsigned integer that is wide enough to contain all of the floating + // point bits. + using StorageType = typename UP::StorageType; + + // The number of bits in StorageType. + LIBC_INLINE_VAR static constexpr int STORAGE_LEN = + sizeof(StorageType) * CHAR_BIT; + static_assert(STORAGE_LEN >= TOTAL_LEN); + + // The exponent bias. Always positive. + LIBC_INLINE_VAR static constexpr int32_t EXP_BIAS = + (1U << (EXP_LEN - 1U)) - 1U; + static_assert(EXP_BIAS > 0); + + // The bit pattern that keeps only the *significand* part. + LIBC_INLINE_VAR static constexpr StorageType SIG_MASK = + mask_trailing_ones<StorageType, SIG_LEN>(); + // The bit pattern that keeps only the *exponent* part. + LIBC_INLINE_VAR static constexpr StorageType EXP_MASK = + mask_trailing_ones<StorageType, EXP_LEN>() << SIG_LEN; + // The bit pattern that keeps only the *sign* part. + LIBC_INLINE_VAR static constexpr StorageType SIGN_MASK = + mask_trailing_ones<StorageType, SIGN_LEN>() << (EXP_LEN + SIG_LEN); + // The bit pattern that keeps only the *exponent + significand* part. + LIBC_INLINE_VAR static constexpr StorageType EXP_SIG_MASK = + mask_trailing_ones<StorageType, EXP_LEN + SIG_LEN>(); + // The bit pattern that keeps only the *sign + exponent + significand* part. + LIBC_INLINE_VAR static constexpr StorageType FP_MASK = + mask_trailing_ones<StorageType, TOTAL_LEN>(); + // The bit pattern that keeps only the *fraction* part. + // i.e., the *significand* without the leading one. + LIBC_INLINE_VAR static constexpr StorageType FRACTION_MASK = + mask_trailing_ones<StorageType, FRACTION_LEN>(); + + static_assert((SIG_MASK & EXP_MASK & SIGN_MASK) == 0, "masks disjoint"); + static_assert((SIG_MASK | EXP_MASK | SIGN_MASK) == FP_MASK, "masks cover"); + +protected: + // Merge bits from 'a' and 'b' values according to 'mask'. + // Use 'a' bits when corresponding 'mask' bits are zeroes and 'b' bits when + // corresponding bits are ones. + LIBC_INLINE static constexpr StorageType merge(StorageType a, StorageType b, + StorageType mask) { + // https://graphics.stanford.edu/~seander/bithacks.html#MaskedMerge + return a ^ ((a ^ b) & mask); + } + + // A stongly typed integer that prevents mixing and matching integers with + // different semantics. + template <typename T> struct TypedInt { + using value_type = T; + LIBC_INLINE constexpr explicit TypedInt(T value) : value(value) {} + LIBC_INLINE constexpr TypedInt(const TypedInt &value) = default; + LIBC_INLINE constexpr TypedInt &operator=(const TypedInt &value) = default; + + LIBC_INLINE constexpr explicit operator T() const { return value; } + + LIBC_INLINE constexpr StorageType to_storage_type() const { + return StorageType(value); + } + + LIBC_INLINE friend constexpr bool operator==(TypedInt a, TypedInt b) { + return a.value == b.value; + } + LIBC_INLINE friend constexpr bool operator!=(TypedInt a, TypedInt b) { + return a.value != b.value; + } + + protected: + T value; + }; + + // An opaque type to store a floating point exponent. + // We define special values but it is valid to create arbitrary values as long + // as they are in the range [min, max]. + struct Exponent : public TypedInt<int32_t> { + using UP = TypedInt<int32_t>; + using UP::UP; + LIBC_INLINE static constexpr auto subnormal() { + return Exponent(-EXP_BIAS); + } + LIBC_INLINE static constexpr auto min() { return Exponent(1 - EXP_BIAS); } + LIBC_INLINE static constexpr auto zero() { return Exponent(0); } + LIBC_INLINE static constexpr auto max() { return Exponent(EXP_BIAS); } + LIBC_INLINE static constexpr auto inf() { return Exponent(EXP_BIAS + 1); } + }; + + // An opaque type to store a floating point biased exponent. + // We define special values but it is valid to create arbitrary values as long + // as they are in the range [zero, bits_all_ones]. + // Values greater than bits_all_ones are truncated. + struct BiasedExponent : public TypedInt<uint32_t> { + using UP = TypedInt<uint32_t>; + using UP::UP; + + LIBC_INLINE constexpr BiasedExponent(Exponent exp) + : UP(static_cast<uint32_t>(static_cast<int32_t>(exp) + EXP_BIAS)) {} + + // Cast operator to get convert from BiasedExponent to Exponent. + LIBC_INLINE constexpr operator Exponent() const { + return Exponent(static_cast<int32_t>(UP::value - EXP_BIAS)); + } + + LIBC_INLINE constexpr BiasedExponent &operator++() { + LIBC_ASSERT(*this != BiasedExponent(Exponent::inf())); + ++UP::value; + return *this; + } + + LIBC_INLINE constexpr BiasedExponent &operator--() { + LIBC_ASSERT(*this != BiasedExponent(Exponent::subnormal())); + --UP::value; + return *this; + } + }; + + // An opaque type to store a floating point significand. + // We define special values but it is valid to create arbitrary values as long + // as they are in the range [zero, bits_all_ones]. + // Note that the semantics of the Significand are implementation dependent. + // Values greater than bits_all_ones are truncated. + struct Significand : public TypedInt<StorageType> { + using UP = TypedInt<StorageType>; + using UP::UP; + + LIBC_INLINE friend constexpr Significand operator|(const Significand a, + const Significand b) { + return Significand( + StorageType(a.to_storage_type() | b.to_storage_type())); + } + LIBC_INLINE friend constexpr Significand operator^(const Significand a, + const Significand b) { + return Significand( + StorageType(a.to_storage_type() ^ b.to_storage_type())); + } + LIBC_INLINE friend constexpr Significand operator>>(const Significand a, + int shift) { + return Significand(StorageType(a.to_storage_type() >> shift)); + } + + LIBC_INLINE static constexpr auto zero() { + return Significand(StorageType(0)); + } + LIBC_INLINE static constexpr auto lsb() { + return Significand(StorageType(1)); + } + LIBC_INLINE static constexpr auto msb() { + return Significand(StorageType(1) << (SIG_LEN - 1)); + } + LIBC_INLINE static constexpr auto bits_all_ones() { + return Significand(SIG_MASK); + } + }; + + LIBC_INLINE static constexpr StorageType encode(BiasedExponent exp) { + return (exp.to_storage_type() << SIG_LEN) & EXP_MASK; + } + + LIBC_INLINE static constexpr StorageType encode(Significand value) { + return value.to_storage_type() & SIG_MASK; + } + + LIBC_INLINE static constexpr StorageType encode(BiasedExponent exp, + Significand sig) { + return encode(exp) | encode(sig); + } + + LIBC_INLINE static constexpr StorageType encode(Sign sign, BiasedExponent exp, + Significand sig) { + if (sign.is_neg()) + return SIGN_MASK | encode(exp, sig); + return encode(exp, sig); + } + + // The floating point number representation as an unsigned integer. + StorageType bits{}; + + LIBC_INLINE constexpr FPStorage() : bits(0) {} + LIBC_INLINE constexpr FPStorage(StorageType value) : bits(value) {} + + // Observers + LIBC_INLINE constexpr StorageType exp_bits() const { return bits & EXP_MASK; } + LIBC_INLINE constexpr StorageType sig_bits() const { return bits & SIG_MASK; } + LIBC_INLINE constexpr StorageType exp_sig_bits() const { + return bits & EXP_SIG_MASK; + } + + // Parts + LIBC_INLINE constexpr BiasedExponent biased_exponent() const { + return BiasedExponent(static_cast<uint32_t>(exp_bits() >> SIG_LEN)); + } + LIBC_INLINE constexpr void set_biased_exponent(BiasedExponent biased) { + bits = merge(bits, encode(biased), EXP_MASK); + } + +public: + LIBC_INLINE constexpr Sign sign() const { + return (bits & SIGN_MASK) ? Sign::NEG : Sign::POS; + } + LIBC_INLINE constexpr void set_sign(Sign signVal) { + if (sign() != signVal) + bits ^= SIGN_MASK; + } +}; + +// This layer defines all functions that are specific to how the the floating +// point type is encoded. It enables constructions, modification and observation +// of values manipulated as 'StorageType'. +template <FPType fp_type, typename RetT> +struct FPRepSem : public FPStorage<fp_type> { + using UP = FPStorage<fp_type>; + using typename UP::StorageType; + using UP::FRACTION_LEN; + using UP::FRACTION_MASK; + +protected: + using typename UP::Exponent; + using typename UP::Significand; + using UP::bits; + using UP::encode; + using UP::exp_bits; + using UP::exp_sig_bits; + using UP::sig_bits; + using UP::UP; + +public: + // Builders + LIBC_INLINE static constexpr RetT zero(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::subnormal(), Significand::zero())); + } + LIBC_INLINE static constexpr RetT one(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::zero(), Significand::zero())); + } + LIBC_INLINE static constexpr RetT min_subnormal(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::subnormal(), Significand::lsb())); + } + LIBC_INLINE static constexpr RetT max_subnormal(Sign sign = Sign::POS) { + return RetT( + encode(sign, Exponent::subnormal(), Significand::bits_all_ones())); + } + LIBC_INLINE static constexpr RetT min_normal(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::min(), Significand::zero())); + } + LIBC_INLINE static constexpr RetT max_normal(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::max(), Significand::bits_all_ones())); + } + LIBC_INLINE static constexpr RetT inf(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::inf(), Significand::zero())); + } + LIBC_INLINE static constexpr RetT signaling_nan(Sign sign = Sign::POS, + StorageType v = 0) { + return RetT(encode(sign, Exponent::inf(), + (v ? Significand(v) : (Significand::msb() >> 1)))); + } + LIBC_INLINE static constexpr RetT quiet_nan(Sign sign = Sign::POS, + StorageType v = 0) { + return RetT( + encode(sign, Exponent::inf(), Significand::msb() | Significand(v))); + } + + // Observers + LIBC_INLINE constexpr bool is_zero() const { return exp_sig_bits() == 0; } + LIBC_INLINE constexpr bool is_nan() const { + return exp_sig_bits() > encode(Exponent::inf(), Significand::zero()); + } + LIBC_INLINE constexpr bool is_quiet_nan() const { + return exp_sig_bits() >= encode(Exponent::inf(), Significand::msb()); + } + LIBC_INLINE constexpr bool is_signaling_nan() const { + return is_nan() && !is_quiet_nan(); + } + LIBC_INLINE constexpr bool is_inf() const { + return exp_sig_bits() == encode(Exponent::inf(), Significand::zero()); + } + LIBC_INLINE constexpr bool is_finite() const { + return exp_bits() != encode(Exponent::inf()); + } + LIBC_INLINE + constexpr bool is_subnormal() const { + return exp_bits() == encode(Exponent::subnormal()); + } + LIBC_INLINE constexpr bool is_normal() const { + return is_finite() && !is_subnormal(); + } + LIBC_INLINE constexpr RetT next_toward_inf() const { + if (is_finite()) + return RetT(bits + StorageType(1)); + return RetT(bits); + } + + // Returns the mantissa with the implicit bit set iff the current + // value is a valid normal number. + LIBC_INLINE constexpr StorageType get_explicit_mantissa() const { + if (is_subnormal()) + return sig_bits(); + return (StorageType(1) << UP::SIG_LEN) | sig_bits(); + } +}; + +// Specialization for the X86 Extended Precision type. +template <typename RetT> +struct FPRepSem<FPType::X86_Binary80, RetT> + : public FPStorage<FPType::X86_Binary80> { + using UP = FPStorage<FPType::X86_Binary80>; + using typename UP::StorageType; + using UP::FRACTION_LEN; + using UP::FRACTION_MASK; + + // The x86 80 bit float represents the leading digit of the mantissa + // explicitly. This is the mask for that bit. + static constexpr StorageType EXPLICIT_BIT_MASK = StorageType(1) + << FRACTION_LEN; + // The X80 significand is made of an explicit bit and the fractional part. + static_assert((EXPLICIT_BIT_MASK & FRACTION_MASK) == 0, + "the explicit bit and the fractional part should not overlap"); + static_assert((EXPLICIT_BIT_MASK | FRACTION_MASK) == SIG_MASK, + "the explicit bit and the fractional part should cover the " + "whole significand"); + +protected: + using typename UP::Exponent; + using typename UP::Significand; + using UP::encode; + using UP::UP; + +public: + // Builders + LIBC_INLINE static constexpr RetT zero(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::subnormal(), Significand::zero())); + } + LIBC_INLINE static constexpr RetT one(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::zero(), Significand::msb())); + } + LIBC_INLINE static constexpr RetT min_subnormal(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::subnormal(), Significand::lsb())); + } + LIBC_INLINE static constexpr RetT max_subnormal(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::subnormal(), + Significand::bits_all_ones() ^ Significand::msb())); + } + LIBC_INLINE static constexpr RetT min_normal(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::min(), Significand::msb())); + } + LIBC_INLINE static constexpr RetT max_normal(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::max(), Significand::bits_all_ones())); + } + LIBC_INLINE static constexpr RetT inf(Sign sign = Sign::POS) { + return RetT(encode(sign, Exponent::inf(), Significand::msb())); + } + LIBC_INLINE static constexpr RetT signaling_nan(Sign sign = Sign::POS, + StorageType v = 0) { + return RetT(encode(sign, Exponent::inf(), + Significand::msb() | + (v ? Significand(v) : (Significand::msb() >> 2)))); + } + LIBC_INLINE static constexpr RetT quiet_nan(Sign sign = Sign::POS, + StorageType v = 0) { + return RetT(encode(sign, Exponent::inf(), + Significand::msb() | (Significand::msb() >> 1) | + Significand(v))); + } + + // Observers + LIBC_INLINE constexpr bool is_zero() const { return exp_sig_bits() == 0; } + LIBC_INLINE constexpr bool is_nan() const { + // Most encoding forms from the table found in + // https://en.wikipedia.org/wiki/Extended_precision#x86_extended_precision_format + // are interpreted as NaN. + // More precisely : + // - Pseudo-Infinity + // - Pseudo Not a Number + // - Signalling Not a Number + // - Floating-point Indefinite + // - Quiet Not a Number + // - Unnormal + // This can be reduced to the following logic: + if (exp_bits() == encode(Exponent::inf())) + return !is_inf(); + if (exp_bits() != encode(Exponent::subnormal())) + return (sig_bits() & encode(Significand::msb())) == 0; + return false; + } + LIBC_INLINE constexpr bool is_quiet_nan() const { + return exp_sig_bits() >= + encode(Exponent::inf(), + Significand::msb() | (Significand::msb() >> 1)); + } + LIBC_INLINE constexpr bool is_signaling_nan() const { + return is_nan() && !is_quiet_nan(); + } + LIBC_INLINE constexpr bool is_inf() const { + return exp_sig_bits() == encode(Exponent::inf(), Significand::msb()); + } + LIBC_INLINE constexpr bool is_finite() const { + return !is_inf() && !is_nan(); + } + LIBC_INLINE + constexpr bool is_subnormal() const { + return exp_bits() == encode(Exponent::subnormal()); + } + LIBC_INLINE constexpr bool is_normal() const { + const auto exp = exp_bits(); + if (exp == encode(Exponent::subnormal()) || exp == encode(Exponent::inf())) + return false; + return get_implicit_bit(); + } + LIBC_INLINE constexpr RetT next_toward_inf() const { + if (is_finite()) { + if (exp_sig_bits() == max_normal().uintval()) { + return inf(sign()); + } else if (exp_sig_bits() == max_subnormal().uintval()) { + return min_normal(sign()); + } else if (sig_bits() == SIG_MASK) { + return RetT(encode(sign(), ++biased_exponent(), Significand::zero())); + } else { + return RetT(bits + StorageType(1)); + } + } + return RetT(bits); + } + + LIBC_INLINE constexpr StorageType get_explicit_mantissa() const { + return sig_bits(); + } + + // This functions is specific to FPRepSem<FPType::X86_Binary80>. + // TODO: Remove if possible. + LIBC_INLINE constexpr bool get_implicit_bit() const { + return static_cast<bool>(bits & EXPLICIT_BIT_MASK); + } + + // This functions is specific to FPRepSem<FPType::X86_Binary80>. + // TODO: Remove if possible. + LIBC_INLINE constexpr void set_implicit_bit(bool implicitVal) { + if (get_implicit_bit() != implicitVal) + bits ^= EXPLICIT_BIT_MASK; + } +}; + +// 'FPRepImpl' is the bottom of the class hierarchy that only deals with +// 'FPType'. The operations dealing with specific float semantics are +// implemented by 'FPRepSem' above and specialized when needed. +// +// The 'RetT' type is being propagated up to 'FPRepSem' so that the functions +// creating new values (Builders) can return the appropriate type. That is, when +// creating a value through 'FPBits' below the builder will return an 'FPBits' +// value. +// FPBits<float>::zero(); // returns an FPBits<> +// +// When we don't care about specific C++ floating point type we can use +// 'FPRep' and specify the 'FPType' directly. +// FPRep<FPType::IEEE754_Binary32:>::zero() // returns an FPRep<> +template <FPType fp_type, typename RetT> +struct FPRepImpl : public FPRepSem<fp_type, RetT> { + using UP = FPRepSem<fp_type, RetT>; + using StorageType = typename UP::StorageType; + +protected: + using UP::bits; + using UP::encode; + using UP::exp_bits; + using UP::exp_sig_bits; + + using typename UP::BiasedExponent; + using typename UP::Exponent; + using typename UP::Significand; + + using UP::FP_MASK; + +public: + // Constants. + using UP::EXP_BIAS; + using UP::EXP_MASK; + using UP::FRACTION_MASK; + using UP::SIG_LEN; + using UP::SIG_MASK; + using UP::SIGN_MASK; + LIBC_INLINE_VAR static constexpr int MAX_BIASED_EXPONENT = + (1 << UP::EXP_LEN) - 1; + + // CTors + LIBC_INLINE constexpr FPRepImpl() = default; + LIBC_INLINE constexpr explicit FPRepImpl(StorageType x) : UP(x) {} + + // Comparison + LIBC_INLINE constexpr friend bool operator==(FPRepImpl a, FPRepImpl b) { + return a.uintval() == b.uintval(); + } + LIBC_INLINE constexpr friend bool operator!=(FPRepImpl a, FPRepImpl b) { + return a.uintval() != b.uintval(); + } + + // Representation + LIBC_INLINE constexpr StorageType uintval() const { return bits & FP_MASK; } + LIBC_INLINE constexpr void set_uintval(StorageType value) { + bits = (value & FP_MASK); + } + + // Builders + using UP::inf; + using UP::max_normal; + using UP::max_subnormal; + using UP::min_normal; + using UP::min_subnormal; + using UP::one; + using UP::quiet_nan; + using UP::signaling_nan; + using UP::zero; + + // Modifiers + LIBC_INLINE constexpr RetT abs() const { + return RetT(static_cast<StorageType>(bits & UP::EXP_SIG_MASK)); + } + + // Observers + using UP::get_explicit_mantissa; + using UP::is_finite; + using UP::is_inf; + using UP::is_nan; + using UP::is_normal; + using UP::is_quiet_nan; + using UP::is_signaling_nan; + using UP::is_subnormal; + using UP::is_zero; + using UP::next_toward_inf; + using UP::sign; + LIBC_INLINE constexpr bool is_inf_or_nan() const { return !is_finite(); } + LIBC_INLINE constexpr bool is_neg() const { return sign().is_neg(); } + LIBC_INLINE constexpr bool is_pos() const { return sign().is_pos(); } + + LIBC_INLINE constexpr uint16_t get_biased_exponent() const { + return static_cast<uint16_t>(static_cast<uint32_t>(UP::biased_exponent())); + } + + LIBC_INLINE constexpr void set_biased_exponent(StorageType biased) { + UP::set_biased_exponent(BiasedExponent(static_cast<uint32_t>(biased))); + } + + LIBC_INLINE constexpr int get_exponent() const { + return static_cast<int32_t>(Exponent(UP::biased_exponent())); + } + + // If the number is subnormal, the exponent is treated as if it were the + // minimum exponent for a normal number. This is to keep continuity between + // the normal and subnormal ranges, but it causes problems for functions where + // values are calculated from the exponent, since just subtracting the bias + // will give a slightly incorrect result. Additionally, zero has an exponent + // of zero, and that should actually be treated as zero. + LIBC_INLINE constexpr int get_explicit_exponent() const { + Exponent exponent(UP::biased_exponent()); + if (is_zero()) + exponent = Exponent::zero(); + if (exponent == Exponent::subnormal()) + exponent = Exponent::min(); + return static_cast<int32_t>(exponent); + } + + LIBC_INLINE constexpr StorageType get_mantissa() const { + return bits & FRACTION_MASK; + } + + LIBC_INLINE constexpr void set_mantissa(StorageType mantVal) { + bits = UP::merge(bits, mantVal, FRACTION_MASK); + } + + LIBC_INLINE constexpr void set_significand(StorageType sigVal) { + bits = UP::merge(bits, sigVal, SIG_MASK); + } + // Unsafe function to create a floating point representation. + // It simply packs the sign, biased exponent and mantissa values without + // checking bound nor normalization. + // + // WARNING: For X86 Extended Precision, implicit bit needs to be set correctly + // in the 'mantissa' by the caller. This function will not check for its + // validity. + // + // FIXME: Use an uint32_t for 'biased_exp'. + LIBC_INLINE static constexpr RetT + create_value(Sign sign, StorageType biased_exp, StorageType mantissa) { + return RetT(encode(sign, BiasedExponent(static_cast<uint32_t>(biased_exp)), + Significand(mantissa))); + } + + // The function converts integer number and unbiased exponent to proper + // float T type: + // Result = number * 2^(ep+1 - exponent_bias) + // Be careful! + // 1) "ep" is the raw exponent value. + // 2) The function adds +1 to ep for seamless normalized to denormalized + // transition. + // 3) The function does not check exponent high limit. + // 4) "number" zero value is not processed correctly. + // 5) Number is unsigned, so the result can be only positive. + LIBC_INLINE static constexpr RetT make_value(StorageType number, int ep) { + FPRepImpl result(0); + int lz = + UP::FRACTION_LEN + 1 - (UP::STORAGE_LEN - cpp::countl_zero(number)); + + number <<= lz; + ep -= lz; + + if (LIBC_LIKELY(ep >= 0)) { + // Implicit number bit will be removed by mask + result.set_significand(number); + result.set_biased_exponent(static_cast<StorageType>(ep + 1)); + } else { + result.set_significand(number >> static_cast<unsigned>(-ep)); + } + return RetT(result.uintval()); + } +}; + +// A generic class to manipulate floating point formats. +// It derives its functionality to FPRepImpl above. +template <FPType fp_type> +struct FPRep : public FPRepImpl<fp_type, FPRep<fp_type>> { + using UP = FPRepImpl<fp_type, FPRep<fp_type>>; + using StorageType = typename UP::StorageType; + using UP::UP; + + LIBC_INLINE constexpr explicit operator StorageType() const { + return UP::uintval(); + } +}; + +} // namespace internal + +// Returns the FPType corresponding to C++ type T on the host. +template <typename T> LIBC_INLINE static constexpr FPType get_fp_type() { + using UnqualT = cpp::remove_cv_t<T>; + if constexpr (cpp::is_same_v<UnqualT, float> && __FLT_MANT_DIG__ == 24) + return FPType::IEEE754_Binary32; + else if constexpr (cpp::is_same_v<UnqualT, double> && __DBL_MANT_DIG__ == 53) + return FPType::IEEE754_Binary64; + else if constexpr (cpp::is_same_v<UnqualT, long double>) { + if constexpr (__LDBL_MANT_DIG__ == 53) + return FPType::IEEE754_Binary64; + else if constexpr (__LDBL_MANT_DIG__ == 64) + return FPType::X86_Binary80; + else if constexpr (__LDBL_MANT_DIG__ == 113) + return FPType::IEEE754_Binary128; + } +#if defined(LIBC_TYPES_HAS_FLOAT16) + else if constexpr (cpp::is_same_v<UnqualT, float16>) + return FPType::IEEE754_Binary16; +#endif +#if defined(LIBC_TYPES_HAS_FLOAT128) + else if constexpr (cpp::is_same_v<UnqualT, float128>) + return FPType::IEEE754_Binary128; +#endif + else if constexpr (cpp::is_same_v<UnqualT, bfloat16>) + return FPType::BFloat16; + else + static_assert(cpp::always_false<UnqualT>, "Unsupported type"); +} + +// ----------------------------------------------------------------------------- +// **** WARNING **** +// This interface is shared with libc++, if you change this interface you need +// to update it in both libc and libc++. You should also be careful when adding +// dependencies to this file, since it needs to build for all libc++ targets. +// ----------------------------------------------------------------------------- +// A generic class to manipulate C++ floating point formats. +// It derives its functionality to FPRepImpl above. +template <typename T> +struct FPBits final : public internal::FPRepImpl<get_fp_type<T>(), FPBits<T>> { + static_assert(cpp::is_floating_point_v<T>, + "FPBits instantiated with invalid type."); + using UP = internal::FPRepImpl<get_fp_type<T>(), FPBits<T>>; + using StorageType = typename UP::StorageType; + + // Constructors. + LIBC_INLINE constexpr FPBits() = default; + + template <typename XType> LIBC_INLINE constexpr explicit FPBits(XType x) { + using Unqual = typename cpp::remove_cv_t<XType>; + if constexpr (cpp::is_same_v<Unqual, T>) { + UP::bits = cpp::bit_cast<StorageType>(x); + } else if constexpr (cpp::is_same_v<Unqual, StorageType>) { + UP::bits = x; + } else { + // We don't want accidental type promotions/conversions, so we require + // exact type match. + static_assert(cpp::always_false<XType>); + } + } + + // Floating-point conversions. + LIBC_INLINE constexpr T get_val() const { return cpp::bit_cast<T>(UP::bits); } +}; + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_FPBITS_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/Hypot.h b/contrib/llvm-project/libc/src/__support/FPUtil/Hypot.h new file mode 100644 index 000000000000..94da259cd42f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/Hypot.h @@ -0,0 +1,268 @@ +//===-- Implementation of hypotf function ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_HYPOT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_HYPOT_H + +#include "BasicOperations.h" +#include "FEnvImpl.h" +#include "FPBits.h" +#include "rounding_mode.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/uint128.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +namespace internal { + +template <typename T> +LIBC_INLINE T find_leading_one(T mant, int &shift_length) { + shift_length = 0; + if (mant > 0) { + shift_length = (sizeof(mant) * 8) - 1 - cpp::countl_zero(mant); + } + return static_cast<T>((T(1) << shift_length)); +} + +} // namespace internal + +template <typename T> struct DoubleLength; + +template <> struct DoubleLength<uint16_t> { + using Type = uint32_t; +}; + +template <> struct DoubleLength<uint32_t> { + using Type = uint64_t; +}; + +template <> struct DoubleLength<uint64_t> { + using Type = UInt128; +}; + +// Correctly rounded IEEE 754 HYPOT(x, y) with round to nearest, ties to even. +// +// Algorithm: +// - Let a = max(|x|, |y|), b = min(|x|, |y|), then we have that: +// a <= sqrt(a^2 + b^2) <= min(a + b, a*sqrt(2)) +// 1. So if b < eps(a)/2, then HYPOT(x, y) = a. +// +// - Moreover, the exponent part of HYPOT(x, y) is either the same or 1 more +// than the exponent part of a. +// +// 2. For the remaining cases, we will use the digit-by-digit (shift-and-add) +// algorithm to compute SQRT(Z): +// +// - For Y = y0.y1...yn... = SQRT(Z), +// let Y(n) = y0.y1...yn be the first n fractional digits of Y. +// +// - The nth scaled residual R(n) is defined to be: +// R(n) = 2^n * (Z - Y(n)^2) +// +// - Since Y(n) = Y(n - 1) + yn * 2^(-n), the scaled residual +// satisfies the following recurrence formula: +// R(n) = 2*R(n - 1) - yn*(2*Y(n - 1) + 2^(-n)), +// with the initial conditions: +// Y(0) = y0, and R(0) = Z - y0. +// +// - So the nth fractional digit of Y = SQRT(Z) can be decided by: +// yn = 1 if 2*R(n - 1) >= 2*Y(n - 1) + 2^(-n), +// 0 otherwise. +// +// 3. Precision analysis: +// +// - Notice that in the decision function: +// 2*R(n - 1) >= 2*Y(n - 1) + 2^(-n), +// the right hand side only uses up to the 2^(-n)-bit, and both sides are +// non-negative, so R(n - 1) can be truncated at the 2^(-(n + 1))-bit, so +// that 2*R(n - 1) is corrected up to the 2^(-n)-bit. +// +// - Thus, in order to round SQRT(a^2 + b^2) correctly up to n-fractional +// bits, we need to perform the summation (a^2 + b^2) correctly up to (2n + +// 2)-fractional bits, and the remaining bits are sticky bits (i.e. we only +// care if they are 0 or > 0), and the comparisons, additions/subtractions +// can be done in n-fractional bits precision. +// +// - For single precision (float), we can use uint64_t to store the sum a^2 + +// b^2 exact up to (2n + 2)-fractional bits. +// +// - Then we can feed this sum into the digit-by-digit algorithm for SQRT(Z) +// described above. +// +// +// Special cases: +// - HYPOT(x, y) is +Inf if x or y is +Inf or -Inf; else +// - HYPOT(x, y) is NaN if x or y is NaN. +// +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T hypot(T x, T y) { + using FPBits_t = FPBits<T>; + using StorageType = typename FPBits<T>::StorageType; + using DStorageType = typename DoubleLength<StorageType>::Type; + + FPBits_t x_abs = FPBits_t(x).abs(); + FPBits_t y_abs = FPBits_t(y).abs(); + + bool x_abs_larger = x_abs.uintval() >= y_abs.uintval(); + + FPBits_t a_bits = x_abs_larger ? x_abs : y_abs; + FPBits_t b_bits = x_abs_larger ? y_abs : x_abs; + + if (LIBC_UNLIKELY(a_bits.is_inf_or_nan())) { + if (x_abs.is_signaling_nan() || y_abs.is_signaling_nan()) { + fputil::raise_except_if_required(FE_INVALID); + return FPBits_t::quiet_nan().get_val(); + } + if (x_abs.is_inf() || y_abs.is_inf()) + return FPBits_t::inf().get_val(); + if (x_abs.is_nan()) + return x; + // y is nan + return y; + } + + uint16_t a_exp = a_bits.get_biased_exponent(); + uint16_t b_exp = b_bits.get_biased_exponent(); + + if ((a_exp - b_exp >= FPBits_t::FRACTION_LEN + 2) || (x == 0) || (y == 0)) + return x_abs.get_val() + y_abs.get_val(); + + uint64_t out_exp = a_exp; + StorageType a_mant = a_bits.get_mantissa(); + StorageType b_mant = b_bits.get_mantissa(); + DStorageType a_mant_sq, b_mant_sq; + bool sticky_bits; + + // Add an extra bit to simplify the final rounding bit computation. + constexpr StorageType ONE = StorageType(1) << (FPBits_t::FRACTION_LEN + 1); + + a_mant <<= 1; + b_mant <<= 1; + + StorageType leading_one; + int y_mant_width; + if (a_exp != 0) { + leading_one = ONE; + a_mant |= ONE; + y_mant_width = FPBits_t::FRACTION_LEN + 1; + } else { + leading_one = internal::find_leading_one(a_mant, y_mant_width); + a_exp = 1; + } + + if (b_exp != 0) + b_mant |= ONE; + else + b_exp = 1; + + a_mant_sq = static_cast<DStorageType>(a_mant) * a_mant; + b_mant_sq = static_cast<DStorageType>(b_mant) * b_mant; + + // At this point, a_exp >= b_exp > a_exp - 25, so in order to line up aSqMant + // and bSqMant, we need to shift bSqMant to the right by (a_exp - b_exp) bits. + // But before that, remember to store the losing bits to sticky. + // The shift length is for a^2 and b^2, so it's double of the exponent + // difference between a and b. + uint16_t shift_length = static_cast<uint16_t>(2 * (a_exp - b_exp)); + sticky_bits = + ((b_mant_sq & ((DStorageType(1) << shift_length) - DStorageType(1))) != + DStorageType(0)); + b_mant_sq >>= shift_length; + + DStorageType sum = a_mant_sq + b_mant_sq; + if (sum >= (DStorageType(1) << (2 * y_mant_width + 2))) { + // a^2 + b^2 >= 4* leading_one^2, so we will need an extra bit to the left. + if (leading_one == ONE) { + // For normal result, we discard the last 2 bits of the sum and increase + // the exponent. + sticky_bits = sticky_bits || ((sum & 0x3U) != 0); + sum >>= 2; + ++out_exp; + if (out_exp >= FPBits_t::MAX_BIASED_EXPONENT) { + if (int round_mode = quick_get_round(); + round_mode == FE_TONEAREST || round_mode == FE_UPWARD) + return FPBits_t::inf().get_val(); + return FPBits_t::max_normal().get_val(); + } + } else { + // For denormal result, we simply move the leading bit of the result to + // the left by 1. + leading_one <<= 1; + ++y_mant_width; + } + } + + StorageType y_new = leading_one; + StorageType r = static_cast<StorageType>(sum >> y_mant_width) - leading_one; + StorageType tail_bits = static_cast<StorageType>(sum) & (leading_one - 1); + + for (StorageType current_bit = leading_one >> 1; current_bit; + current_bit >>= 1) { + r = static_cast<StorageType>((r << 1)) + + ((tail_bits & current_bit) ? 1 : 0); + StorageType tmp = static_cast<StorageType>((y_new << 1)) + + current_bit; // 2*y_new(n - 1) + 2^(-n) + if (r >= tmp) { + r -= tmp; + y_new += current_bit; + } + } + + bool round_bit = y_new & StorageType(1); + bool lsb = y_new & StorageType(2); + + if (y_new >= ONE) { + y_new -= ONE; + + if (out_exp == 0) { + out_exp = 1; + } + } + + y_new >>= 1; + + // Round to the nearest, tie to even. + int round_mode = quick_get_round(); + switch (round_mode) { + case FE_TONEAREST: + // Round to nearest, ties to even + if (round_bit && (lsb || sticky_bits || (r != 0))) + ++y_new; + break; + case FE_UPWARD: + if (round_bit || sticky_bits || (r != 0)) + ++y_new; + break; + } + + if (y_new >= (ONE >> 1)) { + y_new -= ONE >> 1; + ++out_exp; + if (out_exp >= FPBits_t::MAX_BIASED_EXPONENT) { + if (round_mode == FE_TONEAREST || round_mode == FE_UPWARD) + return FPBits_t::inf().get_val(); + return FPBits_t::max_normal().get_val(); + } + } + + y_new |= static_cast<StorageType>(out_exp) << FPBits_t::FRACTION_LEN; + + if (!(round_bit || sticky_bits || (r != 0))) + fputil::clear_except_if_required(FE_INEXACT); + + return cpp::bit_cast<T>(y_new); +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_HYPOT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/ManipulationFunctions.h b/contrib/llvm-project/libc/src/__support/FPUtil/ManipulationFunctions.h new file mode 100644 index 000000000000..ea9ee5a57c36 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/ManipulationFunctions.h @@ -0,0 +1,279 @@ +//===-- Floating-point manipulation functions -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_MANIPULATIONFUNCTIONS_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_MANIPULATIONFUNCTIONS_H + +#include "FPBits.h" +#include "NearestIntegerOperations.h" +#include "NormalFloat.h" +#include "cast.h" +#include "dyadic_float.h" +#include "rounding_mode.h" + +#include "hdr/math_macros.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/limits.h" // INT_MAX, INT_MIN +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE constexpr T frexp(T x, int &exp) { + FPBits<T> bits(x); + if (bits.is_inf_or_nan()) { +#ifdef LIBC_FREXP_INF_NAN_EXPONENT + // The value written back to the second parameter when calling + // frexp/frexpf/frexpl` with `+/-Inf`/`NaN` is unspecified in the standard. + // Set the exp value for Inf/NaN inputs explicitly to + // LIBC_FREXP_INF_NAN_EXPONENT if it is defined. + exp = LIBC_FREXP_INF_NAN_EXPONENT; +#endif // LIBC_FREXP_INF_NAN_EXPONENT + return x; + } + if (bits.is_zero()) { + exp = 0; + return x; + } + + NormalFloat<T> normal(bits); + exp = normal.exponent + 1; + normal.exponent = -1; + return normal; +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T modf(T x, T &iptr) { + FPBits<T> bits(x); + if (bits.is_zero() || bits.is_nan()) { + iptr = x; + return x; + } else if (bits.is_inf()) { + iptr = x; + return FPBits<T>::zero(bits.sign()).get_val(); + } else { + iptr = trunc(x); + if (x == iptr) { + // If x is already an integer value, then return zero with the right + // sign. + return FPBits<T>::zero(bits.sign()).get_val(); + } else { + return x - iptr; + } + } +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T copysign(T x, T y) { + FPBits<T> xbits(x); + xbits.set_sign(FPBits<T>(y).sign()); + return xbits.get_val(); +} + +template <typename T> struct IntLogbConstants; + +template <> struct IntLogbConstants<int> { + LIBC_INLINE_VAR static constexpr int FP_LOGB0 = FP_ILOGB0; + LIBC_INLINE_VAR static constexpr int FP_LOGBNAN = FP_ILOGBNAN; + LIBC_INLINE_VAR static constexpr int T_MAX = INT_MAX; + LIBC_INLINE_VAR static constexpr int T_MIN = INT_MIN; +}; + +template <> struct IntLogbConstants<long> { + LIBC_INLINE_VAR static constexpr long FP_LOGB0 = FP_ILOGB0; + LIBC_INLINE_VAR static constexpr long FP_LOGBNAN = FP_ILOGBNAN; + LIBC_INLINE_VAR static constexpr long T_MAX = LONG_MAX; + LIBC_INLINE_VAR static constexpr long T_MIN = LONG_MIN; +}; + +template <typename T, typename U> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<U>, T> +intlogb(U x) { + FPBits<U> bits(x); + if (LIBC_UNLIKELY(bits.is_zero() || bits.is_inf_or_nan())) { + set_errno_if_required(EDOM); + raise_except_if_required(FE_INVALID); + + if (bits.is_zero()) + return IntLogbConstants<T>::FP_LOGB0; + if (bits.is_nan()) + return IntLogbConstants<T>::FP_LOGBNAN; + // bits is inf. + return IntLogbConstants<T>::T_MAX; + } + + DyadicFloat<FPBits<U>::STORAGE_LEN> normal(bits.get_val()); + int exponent = normal.get_unbiased_exponent(); + // The C standard does not specify the return value when an exponent is + // out of int range. However, XSI conformance required that INT_MAX or + // INT_MIN are returned. + // NOTE: It is highly unlikely that exponent will be out of int range as + // the exponent is only 15 bits wide even for the 128-bit floating point + // format. + if (LIBC_UNLIKELY(exponent > IntLogbConstants<T>::T_MAX || + exponent < IntLogbConstants<T>::T_MIN)) { + set_errno_if_required(ERANGE); + raise_except_if_required(FE_INVALID); + return exponent > 0 ? IntLogbConstants<T>::T_MAX + : IntLogbConstants<T>::T_MIN; + } + + return static_cast<T>(exponent); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE constexpr T logb(T x) { + FPBits<T> bits(x); + if (LIBC_UNLIKELY(bits.is_zero() || bits.is_inf_or_nan())) { + if (bits.is_nan()) + return x; + + raise_except_if_required(FE_DIVBYZERO); + + if (bits.is_zero()) { + set_errno_if_required(ERANGE); + return FPBits<T>::inf(Sign::NEG).get_val(); + } + // bits is inf. + return FPBits<T>::inf().get_val(); + } + + DyadicFloat<FPBits<T>::STORAGE_LEN> normal(bits.get_val()); + return static_cast<T>(normal.get_unbiased_exponent()); +} + +template <typename T, typename U> +LIBC_INLINE constexpr cpp::enable_if_t< + cpp::is_floating_point_v<T> && cpp::is_integral_v<U>, T> +ldexp(T x, U exp) { + FPBits<T> bits(x); + if (LIBC_UNLIKELY((exp == 0) || bits.is_zero() || bits.is_inf_or_nan())) + return x; + + // NormalFloat uses int32_t to store the true exponent value. We should ensure + // that adding |exp| to it does not lead to integer rollover. But, if |exp| + // value is larger the exponent range for type T, then we can return infinity + // early. Because the result of the ldexp operation can be a subnormal number, + // we need to accommodate the (mantissaWidth + 1) worth of shift in + // calculating the limit. + constexpr int EXP_LIMIT = + FPBits<T>::MAX_BIASED_EXPONENT + FPBits<T>::FRACTION_LEN + 1; + // Make sure that we can safely cast exp to int when not returning early. + static_assert(EXP_LIMIT <= INT_MAX && -EXP_LIMIT >= INT_MIN); + if (LIBC_UNLIKELY(exp > EXP_LIMIT)) { + int rounding_mode = quick_get_round(); + Sign sign = bits.sign(); + + if ((sign == Sign::POS && rounding_mode == FE_DOWNWARD) || + (sign == Sign::NEG && rounding_mode == FE_UPWARD) || + (rounding_mode == FE_TOWARDZERO)) + return FPBits<T>::max_normal(sign).get_val(); + + set_errno_if_required(ERANGE); + raise_except_if_required(FE_OVERFLOW); + return FPBits<T>::inf(sign).get_val(); + } + + // Similarly on the negative side we return zero early if |exp| is too small. + if (LIBC_UNLIKELY(exp < -EXP_LIMIT)) { + int rounding_mode = quick_get_round(); + Sign sign = bits.sign(); + + if ((sign == Sign::POS && rounding_mode == FE_UPWARD) || + (sign == Sign::NEG && rounding_mode == FE_DOWNWARD)) + return FPBits<T>::min_subnormal(sign).get_val(); + + set_errno_if_required(ERANGE); + raise_except_if_required(FE_UNDERFLOW); + return FPBits<T>::zero(sign).get_val(); + } + + // For all other values, NormalFloat to T conversion handles it the right way. + DyadicFloat<FPBits<T>::STORAGE_LEN> normal(bits.get_val()); + normal.exponent += static_cast<int>(exp); + // TODO: Add tests for exceptions. + return normal.template as<T, /*ShouldRaiseExceptions=*/true>(); +} + +template <typename T, typename U, + cpp::enable_if_t<cpp::is_floating_point_v<T> && + cpp::is_floating_point_v<U> && + (sizeof(T) <= sizeof(U)), + int> = 0> +LIBC_INLINE T nextafter(T from, U to) { + FPBits<T> from_bits(from); + if (from_bits.is_nan()) + return from; + + FPBits<U> to_bits(to); + if (to_bits.is_nan()) + return cast<T>(to); + + // NOTE: This would work only if `U` has a greater or equal precision than + // `T`. Otherwise `from` could loose its precision and the following statement + // could incorrectly evaluate to `true`. + if (cast<U>(from) == to) + return cast<T>(to); + + using StorageType = typename FPBits<T>::StorageType; + if (from != T(0)) { + if ((cast<U>(from) < to) == (from > T(0))) { + from_bits = FPBits<T>(StorageType(from_bits.uintval() + 1)); + } else { + from_bits = FPBits<T>(StorageType(from_bits.uintval() - 1)); + } + } else { + from_bits = FPBits<T>::min_subnormal(to_bits.sign()); + } + + if (from_bits.is_subnormal()) + raise_except_if_required(FE_UNDERFLOW | FE_INEXACT); + else if (from_bits.is_inf()) + raise_except_if_required(FE_OVERFLOW | FE_INEXACT); + + return from_bits.get_val(); +} + +template <bool IsDown, typename T, + cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE constexpr T nextupdown(T x) { + constexpr Sign sign = IsDown ? Sign::NEG : Sign::POS; + + FPBits<T> xbits(x); + if (xbits.is_nan() || xbits == FPBits<T>::max_normal(sign) || + xbits == FPBits<T>::inf(sign)) + return x; + + using StorageType = typename FPBits<T>::StorageType; + if (x != T(0)) { + if (xbits.sign() == sign) { + xbits = FPBits<T>(StorageType(xbits.uintval() + 1)); + } else { + xbits = FPBits<T>(StorageType(xbits.uintval() - 1)); + } + } else { + xbits = FPBits<T>::min_subnormal(sign); + } + + return xbits.get_val(); +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#ifdef LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 +#include "x86_64/NextAfterLongDouble.h" +#include "x86_64/NextUpDownLongDouble.h" +#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_MANIPULATIONFUNCTIONS_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/NearestIntegerOperations.h b/contrib/llvm-project/libc/src/__support/FPUtil/NearestIntegerOperations.h new file mode 100644 index 000000000000..93166614cc12 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/NearestIntegerOperations.h @@ -0,0 +1,411 @@ +//===-- Nearest integer floating-point operations ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_NEARESTINTEGEROPERATIONS_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_NEARESTINTEGEROPERATIONS_H + +#include "FEnvImpl.h" +#include "FPBits.h" +#include "rounding_mode.h" + +#include "hdr/math_macros.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T trunc(T x) { + using StorageType = typename FPBits<T>::StorageType; + FPBits<T> bits(x); + + // If x is infinity or NaN, return it. + // If it is zero also we should return it as is, but the logic + // later in this function takes care of it. But not doing a zero + // check, we improve the run time of non-zero values. + if (bits.is_inf_or_nan()) + return x; + + int exponent = bits.get_exponent(); + + // If the exponent is greater than the most negative mantissa + // exponent, then x is already an integer. + if (exponent >= static_cast<int>(FPBits<T>::FRACTION_LEN)) + return x; + + // If the exponent is such that abs(x) is less than 1, then return 0. + if (exponent <= -1) + return FPBits<T>::zero(bits.sign()).get_val(); + + int trim_size = FPBits<T>::FRACTION_LEN - exponent; + StorageType trunc_mantissa = + static_cast<StorageType>((bits.get_mantissa() >> trim_size) << trim_size); + bits.set_mantissa(trunc_mantissa); + return bits.get_val(); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T ceil(T x) { + using StorageType = typename FPBits<T>::StorageType; + FPBits<T> bits(x); + + // If x is infinity NaN or zero, return it. + if (bits.is_inf_or_nan() || bits.is_zero()) + return x; + + bool is_neg = bits.is_neg(); + int exponent = bits.get_exponent(); + + // If the exponent is greater than the most negative mantissa + // exponent, then x is already an integer. + if (exponent >= static_cast<int>(FPBits<T>::FRACTION_LEN)) + return x; + + if (exponent <= -1) { + if (is_neg) + return T(-0.0); + else + return T(1.0); + } + + uint32_t trim_size = FPBits<T>::FRACTION_LEN - exponent; + StorageType x_u = bits.uintval(); + StorageType trunc_u = + static_cast<StorageType>((x_u >> trim_size) << trim_size); + + // If x is already an integer, return it. + if (trunc_u == x_u) + return x; + + bits.set_uintval(trunc_u); + T trunc_value = bits.get_val(); + + // If x is negative, the ceil operation is equivalent to the trunc operation. + if (is_neg) + return trunc_value; + + return trunc_value + T(1.0); +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T floor(T x) { + FPBits<T> bits(x); + if (bits.is_neg()) { + return -ceil(-x); + } else { + return trunc(x); + } +} + +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +LIBC_INLINE T round(T x) { + using StorageType = typename FPBits<T>::StorageType; + FPBits<T> bits(x); + + // If x is infinity NaN or zero, return it. + if (bits.is_inf_or_nan() || bits.is_zero()) + return x; + + int exponent = bits.get_exponent(); + + // If the exponent is greater than the most negative mantissa + // exponent, then x is already an integer. + if (exponent >= static_cast<int>(FPBits<T>::FRACTION_LEN)) + return x; + + if (exponent == -1) { + // Absolute value of x is greater than equal to 0.5 but less than 1. + return FPBits<T>::one(bits.sign()).get_val(); + } + + if (exponent <= -2) { + // Absolute value of x is less than 0.5. + return FPBits<T>::zero(bits.sign()).get_val(); + } + + uint32_t trim_size = FPBits<T>::FRACTION_LEN - exponent; + bool half_bit_set = + bool(bits.get_mantissa() & (StorageType(1) << (trim_size - 1))); + StorageType x_u = bits.uintval(); + StorageType trunc_u = + static_cast<StorageType>((x_u >> trim_size) << trim_size); + + // If x is already an integer, return it. + if (trunc_u == x_u) + return x; + + bits.set_uintval(trunc_u); + T trunc_value = bits.get_val(); + + if (!half_bit_set) { + // Franctional part is less than 0.5 so round value is the + // same as the trunc value. + return trunc_value; + } else { + return bits.is_neg() ? trunc_value - T(1.0) : trunc_value + T(1.0); + } +} + +template <typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<T>, T> +round_using_specific_rounding_mode(T x, int rnd) { + using StorageType = typename FPBits<T>::StorageType; + FPBits<T> bits(x); + + // If x is infinity NaN or zero, return it. + if (bits.is_inf_or_nan() || bits.is_zero()) + return x; + + bool is_neg = bits.is_neg(); + int exponent = bits.get_exponent(); + + // If the exponent is greater than the most negative mantissa + // exponent, then x is already an integer. + if (exponent >= static_cast<int>(FPBits<T>::FRACTION_LEN)) + return x; + + if (exponent <= -1) { + switch (rnd) { + case FP_INT_DOWNWARD: + return is_neg ? T(-1.0) : T(0.0); + case FP_INT_UPWARD: + return is_neg ? T(-0.0) : T(1.0); + case FP_INT_TOWARDZERO: + return is_neg ? T(-0.0) : T(0.0); + case FP_INT_TONEARESTFROMZERO: + if (exponent < -1) + return is_neg ? T(-0.0) : T(0.0); // abs(x) < 0.5 + return is_neg ? T(-1.0) : T(1.0); // abs(x) >= 0.5 + case FP_INT_TONEAREST: + default: + if (exponent <= -2 || bits.get_mantissa() == 0) + return is_neg ? T(-0.0) : T(0.0); // abs(x) <= 0.5 + else + return is_neg ? T(-1.0) : T(1.0); // abs(x) > 0.5 + } + } + + uint32_t trim_size = FPBits<T>::FRACTION_LEN - exponent; + StorageType x_u = bits.uintval(); + StorageType trunc_u = + static_cast<StorageType>((x_u >> trim_size) << trim_size); + + // If x is already an integer, return it. + if (trunc_u == x_u) + return x; + + FPBits<T> new_bits(trunc_u); + T trunc_value = new_bits.get_val(); + + StorageType trim_value = + bits.get_mantissa() & + static_cast<StorageType>(((StorageType(1) << trim_size) - 1)); + StorageType half_value = + static_cast<StorageType>((StorageType(1) << (trim_size - 1))); + // If exponent is 0, trimSize will be equal to the mantissa width, and + // truncIsOdd` will not be correct. So, we handle it as a special case + // below. + StorageType trunc_is_odd = + new_bits.get_mantissa() & (StorageType(1) << trim_size); + + switch (rnd) { + case FP_INT_DOWNWARD: + return is_neg ? trunc_value - T(1.0) : trunc_value; + case FP_INT_UPWARD: + return is_neg ? trunc_value : trunc_value + T(1.0); + case FP_INT_TOWARDZERO: + return trunc_value; + case FP_INT_TONEARESTFROMZERO: + if (trim_value >= half_value) + return is_neg ? trunc_value - T(1.0) : trunc_value + T(1.0); + return trunc_value; + case FP_INT_TONEAREST: + default: + if (trim_value > half_value) { + return is_neg ? trunc_value - T(1.0) : trunc_value + T(1.0); + } else if (trim_value == half_value) { + if (exponent == 0) + return is_neg ? T(-2.0) : T(2.0); + if (trunc_is_odd) + return is_neg ? trunc_value - T(1.0) : trunc_value + T(1.0); + else + return trunc_value; + } else { + return trunc_value; + } + } +} + +template <typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, T> +round_using_current_rounding_mode(T x) { + int rounding_mode = quick_get_round(); + + switch (rounding_mode) { + case FE_DOWNWARD: + return round_using_specific_rounding_mode(x, FP_INT_DOWNWARD); + case FE_UPWARD: + return round_using_specific_rounding_mode(x, FP_INT_UPWARD); + case FE_TOWARDZERO: + return round_using_specific_rounding_mode(x, FP_INT_TOWARDZERO); + case FE_TONEAREST: + return round_using_specific_rounding_mode(x, FP_INT_TONEAREST); + default: + __builtin_unreachable(); + } +} + +template <bool IsSigned, typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<T>, T> +fromfp(T x, int rnd, unsigned int width) { + using StorageType = typename FPBits<T>::StorageType; + + constexpr StorageType EXPLICIT_BIT = + FPBits<T>::SIG_MASK - FPBits<T>::FRACTION_MASK; + + if (width == 0U) { + raise_except_if_required(FE_INVALID); + return FPBits<T>::quiet_nan().get_val(); + } + + FPBits<T> bits(x); + + if (bits.is_inf_or_nan()) { + raise_except_if_required(FE_INVALID); + return FPBits<T>::quiet_nan().get_val(); + } + + T rounded_value = round_using_specific_rounding_mode(x, rnd); + + if constexpr (IsSigned) { + // T can't hold a finite number >= 2.0 * 2^EXP_BIAS. + if (width - 1 > FPBits<T>::EXP_BIAS) + return rounded_value; + + StorageType range_exp = + static_cast<StorageType>(width - 1 + FPBits<T>::EXP_BIAS); + // rounded_value < -2^(width - 1) + T range_min = + FPBits<T>::create_value(Sign::NEG, range_exp, EXPLICIT_BIT).get_val(); + if (rounded_value < range_min) { + raise_except_if_required(FE_INVALID); + return FPBits<T>::quiet_nan().get_val(); + } + // rounded_value > 2^(width - 1) - 1 + T range_max = + FPBits<T>::create_value(Sign::POS, range_exp, EXPLICIT_BIT).get_val() - + T(1.0); + if (rounded_value > range_max) { + raise_except_if_required(FE_INVALID); + return FPBits<T>::quiet_nan().get_val(); + } + + return rounded_value; + } + + if (rounded_value < T(0.0)) { + raise_except_if_required(FE_INVALID); + return FPBits<T>::quiet_nan().get_val(); + } + + // T can't hold a finite number >= 2.0 * 2^EXP_BIAS. + if (width > FPBits<T>::EXP_BIAS) + return rounded_value; + + StorageType range_exp = static_cast<StorageType>(width + FPBits<T>::EXP_BIAS); + // rounded_value > 2^width - 1 + T range_max = + FPBits<T>::create_value(Sign::POS, range_exp, EXPLICIT_BIT).get_val() - + T(1.0); + if (rounded_value > range_max) { + raise_except_if_required(FE_INVALID); + return FPBits<T>::quiet_nan().get_val(); + } + + return rounded_value; +} + +template <bool IsSigned, typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<T>, T> +fromfpx(T x, int rnd, unsigned int width) { + T rounded_value = fromfp<IsSigned>(x, rnd, width); + FPBits<T> bits(rounded_value); + + if (!bits.is_nan() && rounded_value != x) + raise_except_if_required(FE_INEXACT); + + return rounded_value; +} + +namespace internal { + +template <typename FloatType, typename IntType, + cpp::enable_if_t<cpp::is_floating_point_v<FloatType> && + cpp::is_integral_v<IntType>, + int> = 0> +LIBC_INLINE IntType rounded_float_to_signed_integer(FloatType x) { + constexpr IntType INTEGER_MIN = (IntType(1) << (sizeof(IntType) * 8 - 1)); + constexpr IntType INTEGER_MAX = -(INTEGER_MIN + 1); + FPBits<FloatType> bits(x); + auto set_domain_error_and_raise_invalid = []() { + set_errno_if_required(EDOM); + raise_except_if_required(FE_INVALID); + }; + + if (bits.is_inf_or_nan()) { + set_domain_error_and_raise_invalid(); + return bits.is_neg() ? INTEGER_MIN : INTEGER_MAX; + } + + int exponent = bits.get_exponent(); + constexpr int EXPONENT_LIMIT = sizeof(IntType) * 8 - 1; + if (exponent > EXPONENT_LIMIT) { + set_domain_error_and_raise_invalid(); + return bits.is_neg() ? INTEGER_MIN : INTEGER_MAX; + } else if (exponent == EXPONENT_LIMIT) { + if (bits.is_pos() || bits.get_mantissa() != 0) { + set_domain_error_and_raise_invalid(); + return bits.is_neg() ? INTEGER_MIN : INTEGER_MAX; + } + // If the control reaches here, then it means that the rounded + // value is the most negative number for the signed integer type IntType. + } + + // For all other cases, if `x` can fit in the integer type `IntType`, + // we just return `x`. static_cast will convert the floating + // point value to the exact integer value. + return static_cast<IntType>(x); +} + +} // namespace internal + +template <typename FloatType, typename IntType, + cpp::enable_if_t<cpp::is_floating_point_v<FloatType> && + cpp::is_integral_v<IntType>, + int> = 0> +LIBC_INLINE IntType round_to_signed_integer(FloatType x) { + return internal::rounded_float_to_signed_integer<FloatType, IntType>( + round(x)); +} + +template <typename FloatType, typename IntType, + cpp::enable_if_t<cpp::is_floating_point_v<FloatType> && + cpp::is_integral_v<IntType>, + int> = 0> +LIBC_INLINE IntType +round_to_signed_integer_using_current_rounding_mode(FloatType x) { + return internal::rounded_float_to_signed_integer<FloatType, IntType>( + round_using_current_rounding_mode(x)); +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_NEARESTINTEGEROPERATIONS_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/NormalFloat.h b/contrib/llvm-project/libc/src/__support/FPUtil/NormalFloat.h new file mode 100644 index 000000000000..a2f285fc6fb9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/NormalFloat.h @@ -0,0 +1,273 @@ +//===-- A class to store a normalized floating point number -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_NORMALFLOAT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_NORMALFLOAT_H + +#include "FPBits.h" + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +// A class which stores the normalized form of a floating point value. +// The special IEEE-754 bits patterns of Zero, infinity and NaNs are +// are not handled by this class. +// +// A normalized floating point number is of this form: +// (-1)*sign * 2^exponent * <mantissa> +// where <mantissa> is of the form 1.<...>. +template <typename T> struct NormalFloat { + static_assert( + cpp::is_floating_point_v<T>, + "NormalFloat template parameter has to be a floating point type."); + + using StorageType = typename FPBits<T>::StorageType; + static constexpr StorageType ONE = + (StorageType(1) << FPBits<T>::FRACTION_LEN); + + // Unbiased exponent value. + int32_t exponent; + + StorageType mantissa; + // We want |StorageType| to have atleast one bit more than the actual mantissa + // bit width to accommodate the implicit 1 value. + static_assert(sizeof(StorageType) * 8 >= FPBits<T>::FRACTION_LEN + 1, + "Bad type for mantissa in NormalFloat."); + + Sign sign = Sign::POS; + + LIBC_INLINE NormalFloat(Sign s, int32_t e, StorageType m) + : exponent(e), mantissa(m), sign(s) { + if (mantissa >= ONE) + return; + + unsigned normalization_shift = evaluate_normalization_shift(mantissa); + mantissa <<= normalization_shift; + exponent -= normalization_shift; + } + + LIBC_INLINE explicit NormalFloat(T x) { init_from_bits(FPBits<T>(x)); } + + LIBC_INLINE explicit NormalFloat(FPBits<T> bits) { init_from_bits(bits); } + + // Compares this normalized number with another normalized number. + // Returns -1 is this number is less than |other|, 0 if this number is equal + // to |other|, and 1 if this number is greater than |other|. + LIBC_INLINE int cmp(const NormalFloat<T> &other) const { + const int result = sign.is_neg() ? -1 : 1; + if (sign != other.sign) + return result; + + if (exponent > other.exponent) { + return result; + } else if (exponent == other.exponent) { + if (mantissa > other.mantissa) + return result; + else if (mantissa == other.mantissa) + return 0; + else + return -result; + } else { + return -result; + } + } + + // Returns a new normalized floating point number which is equal in value + // to this number multiplied by 2^e. That is: + // new = this * 2^e + LIBC_INLINE NormalFloat<T> mul2(int e) const { + NormalFloat<T> result = *this; + result.exponent += e; + return result; + } + + LIBC_INLINE operator T() const { + int biased_exponent = exponent + FPBits<T>::EXP_BIAS; + // Max exponent is of the form 0xFF...E. That is why -2 and not -1. + constexpr int MAX_EXPONENT_VALUE = (1 << FPBits<T>::EXP_LEN) - 2; + if (biased_exponent > MAX_EXPONENT_VALUE) { + return FPBits<T>::inf(sign).get_val(); + } + + FPBits<T> result(T(0.0)); + result.set_sign(sign); + + constexpr int SUBNORMAL_EXPONENT = -FPBits<T>::EXP_BIAS + 1; + if (exponent < SUBNORMAL_EXPONENT) { + unsigned shift = static_cast<unsigned>(SUBNORMAL_EXPONENT - exponent); + // Since exponent > subnormalExponent, shift is strictly greater than + // zero. + if (shift <= FPBits<T>::FRACTION_LEN + 1) { + // Generate a subnormal number. Might lead to loss of precision. + // We round to nearest and round halfway cases to even. + const StorageType shift_out_mask = + static_cast<StorageType>(StorageType(1) << shift) - 1; + const StorageType shift_out_value = mantissa & shift_out_mask; + const StorageType halfway_value = + static_cast<StorageType>(StorageType(1) << (shift - 1)); + result.set_biased_exponent(0); + result.set_mantissa(mantissa >> shift); + StorageType new_mantissa = result.get_mantissa(); + if (shift_out_value > halfway_value) { + new_mantissa += 1; + } else if (shift_out_value == halfway_value) { + // Round to even. + if (result.get_mantissa() & 0x1) + new_mantissa += 1; + } + result.set_mantissa(new_mantissa); + // Adding 1 to mantissa can lead to overflow. This can only happen if + // mantissa was all ones (0b111..11). For such a case, we will carry + // the overflow into the exponent. + if (new_mantissa == ONE) + result.set_biased_exponent(1); + return result.get_val(); + } else { + return result.get_val(); + } + } + + result.set_biased_exponent( + static_cast<StorageType>(exponent + FPBits<T>::EXP_BIAS)); + result.set_mantissa(mantissa); + return result.get_val(); + } + +private: + LIBC_INLINE void init_from_bits(FPBits<T> bits) { + sign = bits.sign(); + + if (bits.is_inf_or_nan() || bits.is_zero()) { + // Ignore special bit patterns. Implementations deal with them separately + // anyway so this should not be a problem. + exponent = 0; + mantissa = 0; + return; + } + + // Normalize subnormal numbers. + if (bits.is_subnormal()) { + unsigned shift = evaluate_normalization_shift(bits.get_mantissa()); + mantissa = static_cast<StorageType>(bits.get_mantissa() << shift); + exponent = 1 - FPBits<T>::EXP_BIAS - static_cast<int32_t>(shift); + } else { + exponent = bits.get_biased_exponent() - FPBits<T>::EXP_BIAS; + mantissa = ONE | bits.get_mantissa(); + } + } + + LIBC_INLINE unsigned evaluate_normalization_shift(StorageType m) { + unsigned shift = 0; + for (; (ONE & m) == 0 && (shift < FPBits<T>::FRACTION_LEN); + m <<= 1, ++shift) + ; + return shift; + } +}; + +#ifdef LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 +template <> +LIBC_INLINE void +NormalFloat<long double>::init_from_bits(FPBits<long double> bits) { + sign = bits.sign(); + + if (bits.is_inf_or_nan() || bits.is_zero()) { + // Ignore special bit patterns. Implementations deal with them separately + // anyway so this should not be a problem. + exponent = 0; + mantissa = 0; + return; + } + + if (bits.is_subnormal()) { + if (bits.get_implicit_bit() == 0) { + // Since we ignore zero value, the mantissa in this case is non-zero. + int normalization_shift = + evaluate_normalization_shift(bits.get_mantissa()); + exponent = -16382 - normalization_shift; + mantissa = (bits.get_mantissa() << normalization_shift); + } else { + exponent = -16382; + mantissa = ONE | bits.get_mantissa(); + } + } else { + if (bits.get_implicit_bit() == 0) { + // Invalid number so just store 0 similar to a NaN. + exponent = 0; + mantissa = 0; + } else { + exponent = bits.get_biased_exponent() - 16383; + mantissa = ONE | bits.get_mantissa(); + } + } +} + +template <> LIBC_INLINE NormalFloat<long double>::operator long double() const { + using LDBits = FPBits<long double>; + int biased_exponent = exponent + LDBits::EXP_BIAS; + // Max exponent is of the form 0xFF...E. That is why -2 and not -1. + constexpr int MAX_EXPONENT_VALUE = (1 << LDBits::EXP_LEN) - 2; + if (biased_exponent > MAX_EXPONENT_VALUE) { + return LDBits::inf(sign).get_val(); + } + + FPBits<long double> result(0.0l); + result.set_sign(sign); + + constexpr int SUBNORMAL_EXPONENT = -LDBits::EXP_BIAS + 1; + if (exponent < SUBNORMAL_EXPONENT) { + unsigned shift = SUBNORMAL_EXPONENT - exponent; + if (shift <= LDBits::FRACTION_LEN + 1) { + // Generate a subnormal number. Might lead to loss of precision. + // We round to nearest and round halfway cases to even. + const StorageType shift_out_mask = (StorageType(1) << shift) - 1; + const StorageType shift_out_value = mantissa & shift_out_mask; + const StorageType halfway_value = StorageType(1) << (shift - 1); + result.set_biased_exponent(0); + result.set_mantissa(mantissa >> shift); + StorageType new_mantissa = result.get_mantissa(); + if (shift_out_value > halfway_value) { + new_mantissa += 1; + } else if (shift_out_value == halfway_value) { + // Round to even. + if (result.get_mantissa() & 0x1) + new_mantissa += 1; + } + result.set_mantissa(new_mantissa); + // Adding 1 to mantissa can lead to overflow. This can only happen if + // mantissa was all ones (0b111..11). For such a case, we will carry + // the overflow into the exponent and set the implicit bit to 1. + if (new_mantissa == ONE) { + result.set_biased_exponent(1); + result.set_implicit_bit(1); + } else { + result.set_implicit_bit(0); + } + return result.get_val(); + } else { + return result.get_val(); + } + } + + result.set_biased_exponent(biased_exponent); + result.set_mantissa(mantissa); + result.set_implicit_bit(1); + return result.get_val(); +} +#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_NORMALFLOAT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/PolyEval.h b/contrib/llvm-project/libc/src/__support/FPUtil/PolyEval.h new file mode 100644 index 000000000000..41104620ed61 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/PolyEval.h @@ -0,0 +1,54 @@ +//===-- Common header for PolyEval implementations --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_POLYEVAL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_POLYEVAL_H + +#include "multiply_add.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +// Evaluate polynomial using Horner's Scheme: +// With polyeval(x, a_0, a_1, ..., a_n) = a_n * x^n + ... + a_1 * x + a_0, we +// evaluated it as: a_0 + x * (a_1 + x * ( ... (a_(n-1) + x * a_n) ... ) ) ). +// We will use FMA instructions if available. +// Example: to evaluate x^3 + 2*x^2 + 3*x + 4, call +// polyeval( x, 4.0, 3.0, 2.0, 1.0 ) + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <typename T> +LIBC_INLINE cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T> +polyeval(const T &, const T &a0) { + return a0; +} + +template <typename T> +LIBC_INLINE cpp::enable_if_t<(sizeof(T) <= sizeof(void *)), T> polyeval(T, + T a0) { + return a0; +} + +template <typename T, typename... Ts> +LIBC_INLINE cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T> +polyeval(const T &x, const T &a0, const Ts &...a) { + return multiply_add(x, polyeval(x, a...), a0); +} + +template <typename T, typename... Ts> +LIBC_INLINE cpp::enable_if_t<(sizeof(T) <= sizeof(void *)), T> +polyeval(T x, T a0, Ts... a) { + return multiply_add(x, polyeval(x, a...), a0); +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_POLYEVAL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/FEnvImpl.h b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/FEnvImpl.h new file mode 100644 index 000000000000..914155a01631 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/FEnvImpl.h @@ -0,0 +1,285 @@ +//===-- aarch64 floating point env manipulation functions -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_FENVIMPL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_FENVIMPL_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !defined(LIBC_TARGET_ARCH_IS_AARCH64) || defined(__APPLE__) +#error "Invalid include" +#endif + +#include <arm_acle.h> +#include <stdint.h> + +#include "hdr/fenv_macros.h" +#include "hdr/types/fenv_t.h" +#include "src/__support/FPUtil/FPBits.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { +struct FEnv { + struct FPState { + uint32_t ControlWord; + uint32_t StatusWord; + }; + + static_assert( + sizeof(fenv_t) == sizeof(FPState), + "Internal floating point state does not match the public fenv_t type."); + + static constexpr uint32_t TONEAREST = 0x0; + static constexpr uint32_t UPWARD = 0x1; + static constexpr uint32_t DOWNWARD = 0x2; + static constexpr uint32_t TOWARDZERO = 0x3; + + static constexpr uint32_t INVALID_F = 0x1; + static constexpr uint32_t DIVBYZERO_F = 0x2; + static constexpr uint32_t OVERFLOW_F = 0x4; + static constexpr uint32_t UNDERFLOW_F = 0x8; + static constexpr uint32_t INEXACT_F = 0x10; + + // Zero-th bit is the first bit. + static constexpr uint32_t RoundingControlBitPosition = 22; + static constexpr uint32_t ExceptionStatusFlagsBitPosition = 0; + static constexpr uint32_t ExceptionControlFlagsBitPosition = 8; + + LIBC_INLINE static uint32_t getStatusValueForExcept(int excepts) { + return ((excepts & FE_INVALID) ? INVALID_F : 0) | + ((excepts & FE_DIVBYZERO) ? DIVBYZERO_F : 0) | + ((excepts & FE_OVERFLOW) ? OVERFLOW_F : 0) | + ((excepts & FE_UNDERFLOW) ? UNDERFLOW_F : 0) | + ((excepts & FE_INEXACT) ? INEXACT_F : 0); + } + + LIBC_INLINE static int exceptionStatusToMacro(uint32_t status) { + return ((status & INVALID_F) ? FE_INVALID : 0) | + ((status & DIVBYZERO_F) ? FE_DIVBYZERO : 0) | + ((status & OVERFLOW_F) ? FE_OVERFLOW : 0) | + ((status & UNDERFLOW_F) ? FE_UNDERFLOW : 0) | + ((status & INEXACT_F) ? FE_INEXACT : 0); + } + + static uint32_t getControlWord() { +#ifdef __clang__ + // GCC does not currently support __arm_rsr. + return __arm_rsr("fpcr"); +#else + return __builtin_aarch64_get_fpcr(); +#endif + } + + static void writeControlWord(uint32_t fpcr) { +#ifdef __clang__ + // GCC does not currently support __arm_wsr. + __arm_wsr("fpcr", fpcr); +#else + __builtin_aarch64_set_fpcr(fpcr); +#endif + } + + static uint32_t getStatusWord() { +#ifdef __clang__ + return __arm_rsr("fpsr"); +#else + return __builtin_aarch64_get_fpsr(); +#endif + } + + static void writeStatusWord(uint32_t fpsr) { +#ifdef __clang__ + __arm_wsr("fpsr", fpsr); +#else + __builtin_aarch64_set_fpsr(fpsr); +#endif + } +}; + +LIBC_INLINE int enable_except(int excepts) { + uint32_t newExcepts = FEnv::getStatusValueForExcept(excepts); + uint32_t controlWord = FEnv::getControlWord(); + int oldExcepts = + (controlWord >> FEnv::ExceptionControlFlagsBitPosition) & 0x1F; + controlWord |= (newExcepts << FEnv::ExceptionControlFlagsBitPosition); + FEnv::writeControlWord(controlWord); + return FEnv::exceptionStatusToMacro(static_cast<uint32_t>(oldExcepts)); +} + +LIBC_INLINE int disable_except(int excepts) { + uint32_t disabledExcepts = FEnv::getStatusValueForExcept(excepts); + uint32_t controlWord = FEnv::getControlWord(); + int oldExcepts = + (controlWord >> FEnv::ExceptionControlFlagsBitPosition) & 0x1F; + controlWord &= ~(disabledExcepts << FEnv::ExceptionControlFlagsBitPosition); + FEnv::writeControlWord(controlWord); + return FEnv::exceptionStatusToMacro(static_cast<uint32_t>(oldExcepts)); +} + +LIBC_INLINE int get_except() { + uint32_t controlWord = FEnv::getControlWord(); + uint32_t enabledExcepts = + (controlWord >> FEnv::ExceptionControlFlagsBitPosition) & 0x1F; + return FEnv::exceptionStatusToMacro(enabledExcepts); +} + +LIBC_INLINE int clear_except(int excepts) { + uint32_t statusWord = FEnv::getStatusWord(); + uint32_t toClear = FEnv::getStatusValueForExcept(excepts); + statusWord &= ~(toClear << FEnv::ExceptionStatusFlagsBitPosition); + FEnv::writeStatusWord(statusWord); + return 0; +} + +LIBC_INLINE int test_except(int excepts) { + uint32_t toTest = FEnv::getStatusValueForExcept(excepts); + uint32_t statusWord = FEnv::getStatusWord(); + return FEnv::exceptionStatusToMacro( + (statusWord >> FEnv::ExceptionStatusFlagsBitPosition) & toTest); +} + +LIBC_INLINE int set_except(int excepts) { + uint32_t statusWord = FEnv::getStatusWord(); + uint32_t statusValue = FEnv::getStatusValueForExcept(excepts); + statusWord |= (statusValue << FEnv::ExceptionStatusFlagsBitPosition); + FEnv::writeStatusWord(statusWord); + return 0; +} + +LIBC_INLINE int raise_except(int excepts) { + float zero = 0.0f; + float one = 1.0f; + float largeValue = FPBits<float>::max_normal().get_val(); + float smallValue = FPBits<float>::min_normal().get_val(); + auto divfunc = [](float a, float b) { + __asm__ __volatile__("ldr s0, %0\n\t" + "ldr s1, %1\n\t" + "fdiv s0, s0, s1\n\t" + : // No outputs + : "m"(a), "m"(b) + : "s0", "s1" /* s0 and s1 are clobbered */); + }; + + uint32_t toRaise = FEnv::getStatusValueForExcept(excepts); + int result = 0; + + if (toRaise & FEnv::INVALID_F) { + divfunc(zero, zero); + uint32_t statusWord = FEnv::getStatusWord(); + if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) & + FEnv::INVALID_F)) + result = -1; + } + + if (toRaise & FEnv::DIVBYZERO_F) { + divfunc(one, zero); + uint32_t statusWord = FEnv::getStatusWord(); + if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) & + FEnv::DIVBYZERO_F)) + result = -1; + } + if (toRaise & FEnv::OVERFLOW_F) { + divfunc(largeValue, smallValue); + uint32_t statusWord = FEnv::getStatusWord(); + if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) & + FEnv::OVERFLOW_F)) + result = -1; + } + if (toRaise & FEnv::UNDERFLOW_F) { + divfunc(smallValue, largeValue); + uint32_t statusWord = FEnv::getStatusWord(); + if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) & + FEnv::UNDERFLOW_F)) + result = -1; + } + if (toRaise & FEnv::INEXACT_F) { + float two = 2.0f; + float three = 3.0f; + // 2.0 / 3.0 cannot be represented exactly in any radix 2 floating point + // format. + divfunc(two, three); + uint32_t statusWord = FEnv::getStatusWord(); + if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) & + FEnv::INEXACT_F)) + result = -1; + } + return result; +} + +LIBC_INLINE int get_round() { + uint32_t roundingMode = + (FEnv::getControlWord() >> FEnv::RoundingControlBitPosition) & 0x3; + switch (roundingMode) { + case FEnv::TONEAREST: + return FE_TONEAREST; + case FEnv::DOWNWARD: + return FE_DOWNWARD; + case FEnv::UPWARD: + return FE_UPWARD; + case FEnv::TOWARDZERO: + return FE_TOWARDZERO; + default: + return -1; // Error value. + } +} + +LIBC_INLINE int set_round(int mode) { + uint16_t bitValue; + switch (mode) { + case FE_TONEAREST: + bitValue = FEnv::TONEAREST; + break; + case FE_DOWNWARD: + bitValue = FEnv::DOWNWARD; + break; + case FE_UPWARD: + bitValue = FEnv::UPWARD; + break; + case FE_TOWARDZERO: + bitValue = FEnv::TOWARDZERO; + break; + default: + return 1; // To indicate failure + } + + uint32_t controlWord = FEnv::getControlWord(); + controlWord &= + static_cast<uint32_t>(~(0x3 << FEnv::RoundingControlBitPosition)); + controlWord |= + static_cast<uint32_t>(bitValue << FEnv::RoundingControlBitPosition); + FEnv::writeControlWord(controlWord); + + return 0; +} + +LIBC_INLINE int get_env(fenv_t *envp) { + FEnv::FPState *state = reinterpret_cast<FEnv::FPState *>(envp); + state->ControlWord = FEnv::getControlWord(); + state->StatusWord = FEnv::getStatusWord(); + return 0; +} + +LIBC_INLINE int set_env(const fenv_t *envp) { + if (envp == FE_DFL_ENV) { + // Default status and control words bits are all zeros so we just + // write zeros. + FEnv::writeStatusWord(0); + FEnv::writeControlWord(0); + return 0; + } + const FEnv::FPState *state = reinterpret_cast<const FEnv::FPState *>(envp); + FEnv::writeControlWord(state->ControlWord); + FEnv::writeStatusWord(state->StatusWord); + return 0; +} +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_FENVIMPL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/fenv_darwin_impl.h b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/fenv_darwin_impl.h new file mode 100644 index 000000000000..dcce76b6116b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/fenv_darwin_impl.h @@ -0,0 +1,297 @@ +//===- darwin-aarch64 floating point env manipulation functions -*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_FENV_DARWIN_IMPL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_FENV_DARWIN_IMPL_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !defined(LIBC_TARGET_ARCH_IS_AARCH64) || !defined(__APPLE__) +#error "Invalid include" +#endif + +#include <arm_acle.h> +#include <stdint.h> + +#include "hdr/fenv_macros.h" +#include "hdr/types/fenv_t.h" +#include "src/__support/FPUtil/FPBits.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +struct FEnv { + struct FPState { + uint64_t StatusWord; + uint64_t ControlWord; + }; + + static_assert( + sizeof(fenv_t) == sizeof(FPState), + "Internal floating point state does not match the public fenv_t type."); + + static constexpr uint32_t TONEAREST = 0x0; + static constexpr uint32_t UPWARD = 0x1; + static constexpr uint32_t DOWNWARD = 0x2; + static constexpr uint32_t TOWARDZERO = 0x3; + + // These will be the exception flags we use for exception values normalized + // from both status word and control word. + // We add EX_ prefix to the names since macOS <math.h> defines OVERFLOW and + // UNDERFLOW macros. + static constexpr uint32_t EX_INVALID = 0x1; + static constexpr uint32_t EX_DIVBYZERO = 0x2; + static constexpr uint32_t EX_OVERFLOW = 0x4; + static constexpr uint32_t EX_UNDERFLOW = 0x8; + static constexpr uint32_t EX_INEXACT = 0x10; + // __APPLE__ ARM64 has an extra flag that is raised when a denormal is flushed + // to zero. + static constexpr uint32_t EX_FLUSHTOZERO = 0x20; + + // Zero-th bit is the first bit. + static constexpr uint32_t ROUNDING_CONTROL_BIT_POSITION = 22; + + // In addition to the 5 floating point exceptions, macOS on arm64 defines + // another floating point exception: FE_FLUSHTOZERO, which is controlled by + // __fpcr_flush_to_zero bit in the FPCR register. This control bit is + // located in a different place from FE_FLUSHTOZERO status bit relative to + // the other exceptions. + LIBC_INLINE static uint32_t exception_value_from_status(uint32_t status) { + return ((status & FE_INVALID) ? EX_INVALID : 0) | + ((status & FE_DIVBYZERO) ? EX_DIVBYZERO : 0) | + ((status & FE_OVERFLOW) ? EX_OVERFLOW : 0) | + ((status & FE_UNDERFLOW) ? EX_UNDERFLOW : 0) | + ((status & FE_INEXACT) ? EX_INEXACT : 0) | + ((status & FE_FLUSHTOZERO) ? EX_FLUSHTOZERO : 0); + } + + LIBC_INLINE static uint32_t exception_value_from_control(uint32_t control) { + return ((control & __fpcr_trap_invalid) ? EX_INVALID : 0) | + ((control & __fpcr_trap_divbyzero) ? EX_DIVBYZERO : 0) | + ((control & __fpcr_trap_overflow) ? EX_OVERFLOW : 0) | + ((control & __fpcr_trap_underflow) ? EX_UNDERFLOW : 0) | + ((control & __fpcr_trap_inexact) ? EX_INEXACT : 0) | + ((control & __fpcr_flush_to_zero) ? EX_FLUSHTOZERO : 0); + } + + LIBC_INLINE static uint32_t exception_value_to_status(uint32_t excepts) { + return ((excepts & EX_INVALID) ? FE_INVALID : 0) | + ((excepts & EX_DIVBYZERO) ? FE_DIVBYZERO : 0) | + ((excepts & EX_OVERFLOW) ? FE_OVERFLOW : 0) | + ((excepts & EX_UNDERFLOW) ? FE_UNDERFLOW : 0) | + ((excepts & EX_INEXACT) ? FE_INEXACT : 0) | + ((excepts & EX_FLUSHTOZERO) ? FE_FLUSHTOZERO : 0); + } + + LIBC_INLINE static uint32_t exception_value_to_control(uint32_t excepts) { + return ((excepts & EX_INVALID) ? __fpcr_trap_invalid : 0) | + ((excepts & EX_DIVBYZERO) ? __fpcr_trap_divbyzero : 0) | + ((excepts & EX_OVERFLOW) ? __fpcr_trap_overflow : 0) | + ((excepts & EX_UNDERFLOW) ? __fpcr_trap_underflow : 0) | + ((excepts & EX_INEXACT) ? __fpcr_trap_inexact : 0) | + ((excepts & EX_FLUSHTOZERO) ? __fpcr_flush_to_zero : 0); + } + + LIBC_INLINE static uint32_t get_control_word() { return __arm_rsr("fpcr"); } + + LIBC_INLINE static void set_control_word(uint32_t fpcr) { + __arm_wsr("fpcr", fpcr); + } + + LIBC_INLINE static uint32_t get_status_word() { return __arm_rsr("fpsr"); } + + LIBC_INLINE static void set_status_word(uint32_t fpsr) { + __arm_wsr("fpsr", fpsr); + } +}; + +LIBC_INLINE int enable_except(int excepts) { + uint32_t new_excepts = + FEnv::exception_value_from_status(static_cast<uint32_t>(excepts)); + uint32_t control_word = FEnv::get_control_word(); + uint32_t old_excepts = FEnv::exception_value_from_control(control_word); + if (new_excepts != old_excepts) { + control_word |= FEnv::exception_value_to_control(new_excepts); + FEnv::set_control_word(control_word); + } + return static_cast<int>(FEnv::exception_value_to_status(old_excepts)); +} + +LIBC_INLINE int disable_except(int excepts) { + uint32_t disabled_excepts = + FEnv::exception_value_from_status(static_cast<uint32_t>(excepts)); + uint32_t control_word = FEnv::get_control_word(); + uint32_t old_excepts = FEnv::exception_value_from_control(control_word); + control_word &= ~FEnv::exception_value_to_control(disabled_excepts); + FEnv::set_control_word(control_word); + return static_cast<int>(FEnv::exception_value_to_status(old_excepts)); +} + +LIBC_INLINE int get_except() { + uint32_t control_word = FEnv::get_control_word(); + uint32_t enabled_excepts = FEnv::exception_value_from_control(control_word); + return static_cast<int>(FEnv::exception_value_to_status(enabled_excepts)); +} + +LIBC_INLINE int clear_except(int excepts) { + uint32_t status_word = FEnv::get_status_word(); + uint32_t except_value = + FEnv::exception_value_from_status(static_cast<uint32_t>(excepts)); + status_word &= ~FEnv::exception_value_to_status(except_value); + FEnv::set_status_word(status_word); + return 0; +} + +LIBC_INLINE int test_except(int excepts) { + uint32_t statusWord = FEnv::get_status_word(); + uint32_t ex_value = + FEnv::exception_value_from_status(static_cast<uint32_t>(excepts)); + return static_cast<int>(statusWord & + FEnv::exception_value_to_status(ex_value)); +} + +LIBC_INLINE int set_except(int excepts) { + uint32_t status_word = FEnv::get_status_word(); + uint32_t new_exceptions = + FEnv::exception_value_from_status(static_cast<uint32_t>(excepts)); + status_word |= FEnv::exception_value_to_status(new_exceptions); + FEnv::set_status_word(status_word); + return 0; +} + +LIBC_INLINE int raise_except(int excepts) { + float zero = 0.0f; + float one = 1.0f; + float large_value = FPBits<float>::max_normal().get_val(); + float small_value = FPBits<float>::min_normal().get_val(); + auto divfunc = [](float a, float b) { + __asm__ __volatile__("ldr s0, %0\n\t" + "ldr s1, %1\n\t" + "fdiv s0, s0, s1\n\t" + : // No outputs + : "m"(a), "m"(b) + : "s0", "s1" /* s0 and s1 are clobbered */); + }; + + uint32_t to_raise = + FEnv::exception_value_from_status(static_cast<uint32_t>(excepts)); + int result = 0; + + if (to_raise & FEnv::EX_INVALID) { + divfunc(zero, zero); + uint32_t status_word = FEnv::get_status_word(); + if (!(FEnv::exception_value_from_status(status_word) & FEnv::EX_INVALID)) + result = -1; + } + + if (to_raise & FEnv::EX_DIVBYZERO) { + divfunc(one, zero); + uint32_t status_word = FEnv::get_status_word(); + if (!(FEnv::exception_value_from_status(status_word) & FEnv::EX_DIVBYZERO)) + result = -1; + } + if (to_raise & FEnv::EX_OVERFLOW) { + divfunc(large_value, small_value); + uint32_t status_word = FEnv::get_status_word(); + if (!(FEnv::exception_value_from_status(status_word) & FEnv::EX_OVERFLOW)) + result = -1; + } + if (to_raise & FEnv::EX_UNDERFLOW) { + divfunc(small_value, large_value); + uint32_t status_word = FEnv::get_status_word(); + if (!(FEnv::exception_value_from_status(status_word) & FEnv::EX_UNDERFLOW)) + result = -1; + } + if (to_raise & FEnv::EX_INEXACT) { + float two = 2.0f; + float three = 3.0f; + // 2.0 / 3.0 cannot be represented exactly in any radix 2 floating point + // format. + divfunc(two, three); + uint32_t status_word = FEnv::get_status_word(); + if (!(FEnv::exception_value_from_status(status_word) & FEnv::EX_INEXACT)) + result = -1; + } + if (to_raise & FEnv::EX_FLUSHTOZERO) { + // TODO: raise the flush to zero floating point exception. + result = -1; + } + return result; +} + +LIBC_INLINE int get_round() { + uint32_t rounding_mode = + (FEnv::get_control_word() >> FEnv::ROUNDING_CONTROL_BIT_POSITION) & 0x3; + switch (rounding_mode) { + case FEnv::TONEAREST: + return FE_TONEAREST; + case FEnv::DOWNWARD: + return FE_DOWNWARD; + case FEnv::UPWARD: + return FE_UPWARD; + case FEnv::TOWARDZERO: + return FE_TOWARDZERO; + default: + return -1; // Error value. + } +} + +LIBC_INLINE int set_round(int mode) { + uint32_t bit_value; + switch (mode) { + case FE_TONEAREST: + bit_value = FEnv::TONEAREST; + break; + case FE_DOWNWARD: + bit_value = FEnv::DOWNWARD; + break; + case FE_UPWARD: + bit_value = FEnv::UPWARD; + break; + case FE_TOWARDZERO: + bit_value = FEnv::TOWARDZERO; + break; + default: + return 1; // To indicate failure + } + + uint32_t control_word = FEnv::get_control_word(); + control_word &= ~(0x3u << FEnv::ROUNDING_CONTROL_BIT_POSITION); + control_word |= (bit_value << FEnv::ROUNDING_CONTROL_BIT_POSITION); + FEnv::set_control_word(control_word); + + return 0; +} + +LIBC_INLINE int get_env(fenv_t *envp) { + FEnv::FPState *state = reinterpret_cast<FEnv::FPState *>(envp); + state->ControlWord = FEnv::get_control_word(); + state->StatusWord = FEnv::get_status_word(); + return 0; +} + +LIBC_INLINE int set_env(const fenv_t *envp) { + if (envp == FE_DFL_ENV) { + // Default status and control words bits are all zeros so we just + // write zeros. + FEnv::set_status_word(0); + FEnv::set_control_word(0); + return 0; + } + const FEnv::FPState *state = reinterpret_cast<const FEnv::FPState *>(envp); + FEnv::set_control_word(static_cast<uint32_t>(state->ControlWord)); + FEnv::set_status_word(static_cast<uint32_t>(state->StatusWord)); + return 0; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_FENV_DARWIN_IMPL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/nearest_integer.h b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/nearest_integer.h new file mode 100644 index 000000000000..d5ea0678825f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/nearest_integer.h @@ -0,0 +1,38 @@ +//===--- Round floating point to nearest integer on aarch64 -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_NEAREST_INTEGER_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_NEAREST_INTEGER_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !defined(LIBC_TARGET_ARCH_IS_AARCH64) +#error "Invalid include" +#endif + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +LIBC_INLINE float nearest_integer(float x) { + float result; + __asm__ __volatile__("frintn %s0, %s1\n\t" : "=w"(result) : "w"(x)); + return result; +} + +LIBC_INLINE double nearest_integer(double x) { + double result; + __asm__ __volatile__("frintn %d0, %d1\n\t" : "=w"(result) : "w"(x)); + return result; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_NEAREST_INTEGER_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/sqrt.h b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/sqrt.h new file mode 100644 index 000000000000..4eb576bf2244 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/aarch64/sqrt.h @@ -0,0 +1,45 @@ +//===-- Square root of IEEE 754 floating point numbers ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_SQRT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_SQRT_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" + +#if !defined(LIBC_TARGET_ARCH_IS_AARCH64) +#error "Invalid include" +#endif + +#include "src/__support/FPUtil/generic/sqrt.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +#ifdef LIBC_TARGET_CPU_HAS_FPU_FLOAT +template <> LIBC_INLINE float sqrt<float>(float x) { + float y; + asm("fsqrt %s0, %s1\n\t" : "=w"(y) : "w"(x)); + return y; +} +#endif // LIBC_TARGET_CPU_HAS_FPU_FLOAT + +#ifdef LIBC_TARGET_CPU_HAS_FPU_DOUBLE +template <> LIBC_INLINE double sqrt<double>(double x) { + double y; + asm("fsqrt %d0, %d1\n\t" : "=w"(y) : "w"(x)); + return y; +} +#endif // LIBC_TARGET_CPU_HAS_FPU_DOUBLE + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_AARCH64_SQRT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/arm/FEnvImpl.h b/contrib/llvm-project/libc/src/__support/FPUtil/arm/FEnvImpl.h new file mode 100644 index 000000000000..aaf37c0a045a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/arm/FEnvImpl.h @@ -0,0 +1,266 @@ +//===-- arm floating point env manipulation functions -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_ARM_FENVIMPL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_ARM_FENVIMPL_H + +#include "hdr/fenv_macros.h" +#include "hdr/types/fenv_t.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/macros/attributes.h" // For LIBC_INLINE +#include "src/__support/macros/config.h" +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +struct FEnv { + // Arm floating point state is all stored in a single 32-bit register named + // fpscr. + uint32_t fpscr; + static constexpr uint32_t RoundingControlBitPosition = 22; + static constexpr uint32_t ExceptionControlBitPosition = 8; + + static constexpr uint32_t TONEAREST = 0x0; + static constexpr uint32_t UPWARD = 0x1; + static constexpr uint32_t DOWNWARD = 0x2; + static constexpr uint32_t TOWARDZERO = 0x3; + + static constexpr uint32_t INVALID_ENABLE = 0x1; + static constexpr uint32_t DIVBYZERO_ENABLE = 0x2; + static constexpr uint32_t OVERFLOW_ENABLE = 0x4; + static constexpr uint32_t UNDERFLOW_ENABLE = 0x8; + static constexpr uint32_t INEXACT_ENABLE = 0x10; + static constexpr uint32_t DENORMAL_ENABLE = 0x20; + + static constexpr uint32_t INVALID_STATUS = 0x1; + static constexpr uint32_t DIVBYZERO_STATUS = 0x2; + static constexpr uint32_t OVERFLOW_STATUS = 0x4; + static constexpr uint32_t UNDERFLOW_STATUS = 0x8; + static constexpr uint32_t INEXACT_STATUS = 0x10; + static constexpr uint32_t DENORMAL_STATUS = 0x80; + + LIBC_INLINE static uint32_t get_fpscr() { return __builtin_arm_get_fpscr(); } + LIBC_INLINE static void set_fpscr(uint32_t val) { + __builtin_arm_set_fpscr(val); + } + + LIBC_INLINE static int exception_enable_bits_to_macro(uint32_t status) { + return ((status & INVALID_ENABLE) ? FE_INVALID : 0) | + ((status & DIVBYZERO_ENABLE) ? FE_DIVBYZERO : 0) | + ((status & OVERFLOW_ENABLE) ? FE_OVERFLOW : 0) | + ((status & UNDERFLOW_ENABLE) ? FE_UNDERFLOW : 0) | + ((status & INEXACT_ENABLE) ? FE_INEXACT : 0); + } + + LIBC_INLINE static uint32_t exception_macro_to_enable_bits(int except) { + return ((except & FE_INVALID) ? INVALID_ENABLE : 0) | + ((except & FE_DIVBYZERO) ? DIVBYZERO_ENABLE : 0) | + ((except & FE_OVERFLOW) ? OVERFLOW_ENABLE : 0) | + ((except & FE_UNDERFLOW) ? UNDERFLOW_ENABLE : 0) | + ((except & FE_INEXACT) ? INEXACT_ENABLE : 0); + } + + LIBC_INLINE static uint32_t exception_macro_to_status_bits(int except) { + return ((except & FE_INVALID) ? INVALID_STATUS : 0) | + ((except & FE_DIVBYZERO) ? DIVBYZERO_STATUS : 0) | + ((except & FE_OVERFLOW) ? OVERFLOW_STATUS : 0) | + ((except & FE_UNDERFLOW) ? UNDERFLOW_STATUS : 0) | + ((except & FE_INEXACT) ? INEXACT_STATUS : 0); + } + + LIBC_INLINE static uint32_t exception_status_bits_to_macro(int status) { + return ((status & INVALID_STATUS) ? FE_INVALID : 0) | + ((status & DIVBYZERO_STATUS) ? FE_DIVBYZERO : 0) | + ((status & OVERFLOW_STATUS) ? FE_OVERFLOW : 0) | + ((status & UNDERFLOW_STATUS) ? FE_UNDERFLOW : 0) | + ((status & INEXACT_STATUS) ? FE_INEXACT : 0); + } +}; + +// Enables exceptions in |excepts| and returns the previously set exceptions. +LIBC_INLINE int enable_except(int excepts) { + uint32_t new_excepts = FEnv::exception_macro_to_enable_bits(excepts); + uint32_t fpscr = FEnv::get_fpscr(); + int old = (fpscr >> FEnv::ExceptionControlBitPosition) & 0x3F; + fpscr |= (new_excepts << FEnv::ExceptionControlBitPosition); + FEnv::set_fpscr(fpscr); + return FEnv::exception_enable_bits_to_macro(old); +} + +// Disables exceptions in |excepts| and returns the previously set exceptions. +LIBC_INLINE int disable_except(int excepts) { + uint32_t disable_bits = FEnv::exception_macro_to_enable_bits(excepts); + uint32_t fpscr = FEnv::get_fpscr(); + int old = (fpscr >> FEnv::ExceptionControlBitPosition) & 0x3F; + fpscr &= ~(disable_bits << FEnv::ExceptionControlBitPosition); + FEnv::set_fpscr(fpscr); + return FEnv::exception_enable_bits_to_macro(old); +} + +// Returns the currently enabled exceptions. +LIBC_INLINE int get_except() { + uint32_t fpscr = FEnv::get_fpscr(); + int enabled_excepts = (fpscr >> FEnv::ExceptionControlBitPosition) & 0x3F; + return FEnv::exception_enable_bits_to_macro(enabled_excepts); +} + +// Clears the exceptions in |excepts|. +LIBC_INLINE int clear_except(int excepts) { + uint32_t fpscr = FEnv::get_fpscr(); + uint32_t to_clear = FEnv::exception_macro_to_status_bits(excepts); + fpscr &= ~to_clear; + FEnv::set_fpscr(fpscr); + return 0; +} + +// Returns the set of exceptions which are from the input set |excepts|. +LIBC_INLINE int test_except(int excepts) { + uint32_t to_test = FEnv::exception_macro_to_status_bits(excepts); + uint32_t fpscr = FEnv::get_fpscr(); + return FEnv::exception_status_bits_to_macro(fpscr & 0x9F & to_test); +} + +// Set the exceptions in |excepts|. +LIBC_INLINE int set_except(int excepts) { + uint32_t fpscr = FEnv::get_fpscr(); + FEnv::set_fpscr(fpscr | FEnv::exception_macro_to_status_bits(excepts)); + return 0; +} + +LIBC_INLINE int raise_except(int excepts) { + float zero = 0.0f; + float one = 1.0f; + float large_value = FPBits<float>::max_normal().get_val(); + float small_value = FPBits<float>::min_normal().get_val(); + auto divfunc = [](float a, float b) { + __asm__ __volatile__("flds s0, %0\n\t" + "flds s1, %1\n\t" + "fdivs s0, s0, s1\n\t" + : // No outputs + : "m"(a), "m"(b) + : "s0", "s1" /* s0 and s1 are clobbered */); + }; + + uint32_t to_raise = FEnv::exception_macro_to_status_bits(excepts); + int result = 0; + + if (to_raise & FEnv::INVALID_STATUS) { + divfunc(zero, zero); + uint32_t fpscr = FEnv::get_fpscr(); + if (!(fpscr & FEnv::INVALID_STATUS)) + result = -1; + } + if (to_raise & FEnv::DIVBYZERO_STATUS) { + divfunc(one, zero); + uint32_t fpscr = FEnv::get_fpscr(); + if (!(fpscr & FEnv::DIVBYZERO_STATUS)) + result = -1; + } + if (to_raise & FEnv::OVERFLOW_STATUS) { + divfunc(large_value, small_value); + uint32_t fpscr = FEnv::get_fpscr(); + if (!(fpscr & FEnv::OVERFLOW_STATUS)) + result = -1; + } + if (to_raise & FEnv::UNDERFLOW_STATUS) { + divfunc(small_value, large_value); + uint32_t fpscr = FEnv::get_fpscr(); + if (!(fpscr & FEnv::UNDERFLOW_STATUS)) + result = -1; + } + if (to_raise & FEnv::INEXACT_STATUS) { + float two = 2.0f; + float three = 3.0f; + // 2.0 / 3.0 cannot be represented exactly in any radix 2 floating point + // format. + divfunc(two, three); + uint32_t fpscr = FEnv::get_fpscr(); + if (!(fpscr & FEnv::INEXACT_STATUS)) + result = -1; + } + return result; +} + +LIBC_INLINE int get_round() { + uint32_t mode = (FEnv::get_fpscr() >> FEnv::RoundingControlBitPosition) & 0x3; + switch (mode) { + case FEnv::TONEAREST: + return FE_TONEAREST; + case FEnv::DOWNWARD: + return FE_DOWNWARD; + case FEnv::UPWARD: + return FE_UPWARD; + case FEnv::TOWARDZERO: + return FE_TOWARDZERO; + default: + return -1; // Error value. + } + return 0; +} + +LIBC_INLINE int set_round(int mode) { + uint16_t bits; + switch (mode) { + case FE_TONEAREST: + bits = FEnv::TONEAREST; + break; + case FE_DOWNWARD: + bits = FEnv::DOWNWARD; + break; + case FE_UPWARD: + bits = FEnv::UPWARD; + break; + case FE_TOWARDZERO: + bits = FEnv::TOWARDZERO; + break; + default: + return 1; // To indicate failure + } + + uint32_t fpscr = FEnv::get_fpscr(); + fpscr &= ~(0x3 << FEnv::RoundingControlBitPosition); + fpscr |= (bits << FEnv::RoundingControlBitPosition); + FEnv::set_fpscr(fpscr); + + return 0; +} + +LIBC_INLINE int get_env(fenv_t *envp) { + FEnv *state = reinterpret_cast<FEnv *>(envp); + state->fpscr = FEnv::get_fpscr(); + return 0; +} + +LIBC_INLINE int set_env(const fenv_t *envp) { + if (envp == FE_DFL_ENV) { + uint32_t fpscr = FEnv::get_fpscr(); + // Default status implies: + // 1. Round to nearest rounding mode. + fpscr &= ~(0x3 << FEnv::RoundingControlBitPosition); + fpscr |= (FEnv::TONEAREST << FEnv::RoundingControlBitPosition); + // 2. All exceptions are disabled. + fpscr &= ~(0x3F << FEnv::ExceptionControlBitPosition); + // 3. All exceptions are cleared. There are two reserved bits + // at bit 5 and 6 so we just write one full byte (6 bits for + // the exceptions, and 2 reserved bits.) + fpscr &= ~(static_cast<uint32_t>(0xFF)); + + FEnv::set_fpscr(fpscr); + return 0; + } + + const FEnv *state = reinterpret_cast<const FEnv *>(envp); + FEnv::set_fpscr(state->fpscr); + return 0; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_ARM_FENVIMPL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/arm/sqrt.h b/contrib/llvm-project/libc/src/__support/FPUtil/arm/sqrt.h new file mode 100644 index 000000000000..e6cb58c0be81 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/arm/sqrt.h @@ -0,0 +1,45 @@ +//===-- Square root of IEEE 754 floating point numbers ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_ARM_SQRT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_ARM_SQRT_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" + +#if !defined(LIBC_TARGET_ARCH_IS_ARM) +#error "Invalid include" +#endif + +#include "src/__support/FPUtil/generic/sqrt.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +#ifdef LIBC_TARGET_CPU_HAS_FPU_FLOAT +template <> LIBC_INLINE float sqrt<float>(float x) { + float y; + asm("vsqrt %0, %1\n\t" : "=w"(y) : "w"(x)); + return y; +} +#endif // LIBC_TARGET_CPU_HAS_FPU_FLOAT + +#ifdef LIBC_TARGET_CPU_HAS_FPU_DOUBLE +template <> LIBC_INLINE double sqrt<double>(double x) { + double y; + asm("vsqrt %0, %1\n\t" : "=w"(y) : "w"(x)); + return y; +} +#endif // LIBC_TARGET_CPU_HAS_FPU_DOUBLE + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_ARM_SQRT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/bfloat16.h b/contrib/llvm-project/libc/src/__support/FPUtil/bfloat16.h new file mode 100644 index 000000000000..bc0b8b23896f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/bfloat16.h @@ -0,0 +1,65 @@ +//===-- Definition of bfloat16 data type. -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_BFLOAT16_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_BFLOAT16_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/cast.h" +#include "src/__support/FPUtil/dyadic_float.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +struct BFloat16 { + uint16_t bits; + + LIBC_INLINE BFloat16() = default; + + LIBC_INLINE constexpr explicit BFloat16(uint16_t bits) : bits(bits) {} + + template <typename T> LIBC_INLINE constexpr explicit BFloat16(T value) { + if constexpr (cpp::is_floating_point_v<T>) { + bits = fputil::cast<bfloat16>(value).bits; + } else if constexpr (cpp::is_integral_v<T>) { + Sign sign = Sign::POS; + + if constexpr (cpp::is_signed_v<T>) { + if (value < 0) { + sign = Sign::NEG; + value = -value; + } + } + + fputil::DyadicFloat<cpp::numeric_limits<cpp::make_unsigned_t<T>>::digits> + xd(sign, 0, value); + bits = xd.template as<bfloat16, /*ShouldSignalExceptions=*/true>().bits; + + } else { + bits = fputil::cast<bfloat16>(static_cast<float>(value)).bits; + } + } + + template <cpp::enable_if_t<fputil::get_fp_type<float>() == + fputil::FPType::IEEE754_Binary32, + int> = 0> + LIBC_INLINE constexpr operator float() const { + uint32_t x_bits = static_cast<uint32_t>(bits) << 16U; + return cpp::bit_cast<float>(x_bits); + } +}; // struct BFloat16 + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_BFLOAT16_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/cast.h b/contrib/llvm-project/libc/src/__support/FPUtil/cast.h new file mode 100644 index 000000000000..e6fad1be7d05 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/cast.h @@ -0,0 +1,76 @@ +//===-- Conversion between floating-point types -----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_CAST_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_CAST_H + +#include "FPBits.h" +#include "dyadic_float.h" +#include "hdr/fenv_macros.h" +#include "src/__support/CPP/algorithm.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE::fputil { + +// TODO: Add optimization for known good targets with fast +// float to float16 conversion: +// https://github.com/llvm/llvm-project/issues/133517 +template <typename OutType, typename InType> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType>, + OutType> +cast(InType x) { + // Casting to the same type is a no-op. + if constexpr (cpp::is_same_v<InType, OutType>) + return x; + + // bfloat16 is always defined (for now) + if constexpr (cpp::is_same_v<OutType, bfloat16> || + cpp::is_same_v<InType, bfloat16> +#if defined(LIBC_TYPES_HAS_FLOAT16) && !defined(__LIBC_USE_FLOAT16_CONVERSION) + || cpp::is_same_v<OutType, float16> || + cpp::is_same_v<InType, float16> +#endif + ) { + using InFPBits = FPBits<InType>; + using InStorageType = typename InFPBits::StorageType; + using OutFPBits = FPBits<OutType>; + using OutStorageType = typename OutFPBits::StorageType; + + InFPBits x_bits(x); + + if (x_bits.is_nan()) { + if (x_bits.is_signaling_nan()) { + raise_except_if_required(FE_INVALID); + return OutFPBits::quiet_nan().get_val(); + } + + InStorageType x_mant = x_bits.get_mantissa(); + if (InFPBits::FRACTION_LEN > OutFPBits::FRACTION_LEN) + x_mant >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(x_bits.sign(), + static_cast<OutStorageType>(x_mant)) + .get_val(); + } + + if (x_bits.is_inf()) + return OutFPBits::inf(x_bits.sign()).get_val(); + + constexpr size_t MAX_FRACTION_LEN = + cpp::max(OutFPBits::FRACTION_LEN, InFPBits::FRACTION_LEN); + DyadicFloat<cpp::bit_ceil(MAX_FRACTION_LEN)> xd(x); + return xd.template as<OutType, /*ShouldSignalExceptions=*/true>(); + } + + return static_cast<OutType>(x); +} + +} // namespace LIBC_NAMESPACE::fputil + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_CAST_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/double_double.h b/contrib/llvm-project/libc/src/__support/FPUtil/double_double.h new file mode 100644 index 000000000000..c27885aadc02 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/double_double.h @@ -0,0 +1,211 @@ +//===-- Utilities for double-double data type. ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_DOUBLE_DOUBLE_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_DOUBLE_DOUBLE_H + +#include "multiply_add.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/cpu_features.h" // LIBC_TARGET_CPU_HAS_FMA +#include "src/__support/number_pair.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <typename T> struct DefaultSplit; +template <> struct DefaultSplit<float> { + static constexpr size_t VALUE = 12; +}; +template <> struct DefaultSplit<double> { + static constexpr size_t VALUE = 27; +}; + +using DoubleDouble = NumberPair<double>; +using FloatFloat = NumberPair<float>; + +// The output of Dekker's FastTwoSum algorithm is correct, i.e.: +// r.hi + r.lo = a + b exactly +// and |r.lo| < eps(r.lo) +// Assumption: |a| >= |b|, or a = 0. +template <bool FAST2SUM = true, typename T = double> +LIBC_INLINE constexpr NumberPair<T> exact_add(T a, T b) { + NumberPair<T> r{0.0, 0.0}; + if constexpr (FAST2SUM) { + r.hi = a + b; + T t = r.hi - a; + r.lo = b - t; + } else { + r.hi = a + b; + T t1 = r.hi - a; + T t2 = r.hi - t1; + T t3 = b - t1; + T t4 = a - t2; + r.lo = t3 + t4; + } + return r; +} + +// Assumption: |a.hi| >= |b.hi| +template <typename T> +LIBC_INLINE constexpr NumberPair<T> add(const NumberPair<T> &a, + const NumberPair<T> &b) { + NumberPair<T> r = exact_add(a.hi, b.hi); + T lo = a.lo + b.lo; + return exact_add(r.hi, r.lo + lo); +} + +// Assumption: |a.hi| >= |b| +template <typename T> +LIBC_INLINE constexpr NumberPair<T> add(const NumberPair<T> &a, T b) { + NumberPair<T> r = exact_add<false>(a.hi, b); + return exact_add(r.hi, r.lo + a.lo); +} + +// Veltkamp's Splitting for double precision. +// Note: This is proved to be correct for all rounding modes: +// Zimmermann, P., "Note on the Veltkamp/Dekker Algorithms with Directed +// Roundings," https://inria.hal.science/hal-04480440. +// Default splitting constant = 2^ceil(prec(double)/2) + 1 = 2^27 + 1. +template <typename T = double, size_t N = DefaultSplit<T>::VALUE> +LIBC_INLINE constexpr NumberPair<T> split(T a) { + NumberPair<T> r{0.0, 0.0}; + // CN = 2^N. + constexpr T CN = static_cast<T>(1 << N); + constexpr T C = CN + 1.0; + double t1 = C * a; + double t2 = a - t1; + r.hi = t1 + t2; + r.lo = a - r.hi; + return r; +} + +// Helper for non-fma exact mult where the first number is already split. +template <typename T = double, size_t SPLIT_B = DefaultSplit<T>::VALUE> +LIBC_INLINE NumberPair<T> exact_mult(const NumberPair<T> &as, T a, T b) { + NumberPair<T> bs = split<T, SPLIT_B>(b); + NumberPair<T> r{0.0, 0.0}; + + r.hi = a * b; + T t1 = as.hi * bs.hi - r.hi; + T t2 = as.hi * bs.lo + t1; + T t3 = as.lo * bs.hi + t2; + r.lo = as.lo * bs.lo + t3; + + return r; +} + +// The templated exact multiplication needs template version of +// LIBC_TARGET_CPU_HAS_FMA_* macro to correctly select the implementation. +// These can be moved to "src/__support/macros/properties/cpu_features.h" if +// other part of libc needed. +template <typename T> struct TargetHasFmaInstruction { + static constexpr bool VALUE = false; +}; + +#ifdef LIBC_TARGET_CPU_HAS_FMA_FLOAT +template <> struct TargetHasFmaInstruction<float> { + static constexpr bool VALUE = true; +}; +#endif // LIBC_TARGET_CPU_HAS_FMA_FLOAT + +#ifdef LIBC_TARGET_CPU_HAS_FMA_DOUBLE +template <> struct TargetHasFmaInstruction<double> { + static constexpr bool VALUE = true; +}; +#endif // LIBC_TARGET_CPU_HAS_FMA_DOUBLE + +// Note: When FMA instruction is not available, the `exact_mult` function is +// only correct for round-to-nearest mode. See: +// Zimmermann, P., "Note on the Veltkamp/Dekker Algorithms with Directed +// Roundings," https://inria.hal.science/hal-04480440. +// Using Theorem 1 in the paper above, without FMA instruction, if we restrict +// the generated constants to precision <= 51, and splitting it by 2^28 + 1, +// then a * b = r.hi + r.lo is exact for all rounding modes. +template <typename T = double, size_t SPLIT_B = DefaultSplit<T>::VALUE> +LIBC_INLINE NumberPair<T> exact_mult(T a, T b) { + NumberPair<T> r{0.0, 0.0}; + + if constexpr (TargetHasFmaInstruction<T>::VALUE) { + r.hi = a * b; + r.lo = fputil::multiply_add(a, b, -r.hi); + } else { + // Dekker's Product. + NumberPair<T> as = split(a); + + r = exact_mult<T, SPLIT_B>(as, a, b); + } + + return r; +} + +LIBC_INLINE DoubleDouble quick_mult(double a, const DoubleDouble &b) { + DoubleDouble r = exact_mult(a, b.hi); + r.lo = multiply_add(a, b.lo, r.lo); + return r; +} + +template <size_t SPLIT_B = 27> +LIBC_INLINE DoubleDouble quick_mult(const DoubleDouble &a, + const DoubleDouble &b) { + DoubleDouble r = exact_mult<double, SPLIT_B>(a.hi, b.hi); + double t1 = multiply_add(a.hi, b.lo, r.lo); + double t2 = multiply_add(a.lo, b.hi, t1); + r.lo = t2; + return r; +} + +// Assuming |c| >= |a * b|. +template <> +LIBC_INLINE DoubleDouble multiply_add<DoubleDouble>(const DoubleDouble &a, + const DoubleDouble &b, + const DoubleDouble &c) { + return add(c, quick_mult(a, b)); +} + +// Accurate double-double division, following Karp-Markstein's trick for +// division, implemented in the CORE-MATH project at: +// https://gitlab.inria.fr/core-math/core-math/-/blob/master/src/binary64/tan/tan.c#L1855 +// +// Error bounds: +// Let a = ah + al, b = bh + bl. +// Let r = rh + rl be the approximation of (ah + al) / (bh + bl). +// Then: +// (ah + al) / (bh + bl) - rh = +// = ((ah - bh * rh) + (al - bl * rh)) / (bh + bl) +// = (1 + O(bl/bh)) * ((ah - bh * rh) + (al - bl * rh)) / bh +// Let q = round(1/bh), then the above expressions are approximately: +// = (1 + O(bl / bh)) * (1 + O(2^-52)) * q * ((ah - bh * rh) + (al - bl * rh)) +// So we can compute: +// rl = q * (ah - bh * rh) + q * (al - bl * rh) +// as accurate as possible, then the error is bounded by: +// |(ah + al) / (bh + bl) - (rh + rl)| < O(bl/bh) * (2^-52 + al/ah + bl/bh) +template <typename T> +LIBC_INLINE NumberPair<T> div(const NumberPair<T> &a, const NumberPair<T> &b) { + NumberPair<T> r; + T q = T(1) / b.hi; + r.hi = a.hi * q; + +#ifdef LIBC_TARGET_CPU_HAS_FMA + T e_hi = fputil::multiply_add(b.hi, -r.hi, a.hi); + T e_lo = fputil::multiply_add(b.lo, -r.hi, a.lo); +#else + NumberPair<T> b_hi_r_hi = fputil::exact_mult(b.hi, -r.hi); + NumberPair<T> b_lo_r_hi = fputil::exact_mult(b.lo, -r.hi); + T e_hi = (a.hi + b_hi_r_hi.hi) + b_hi_r_hi.lo; + T e_lo = (a.lo + b_lo_r_hi.hi) + b_lo_r_hi.lo; +#endif // LIBC_TARGET_CPU_HAS_FMA + + r.lo = q * (e_hi + e_lo); + return r; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_DOUBLE_DOUBLE_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/dyadic_float.h b/contrib/llvm-project/libc/src/__support/FPUtil/dyadic_float.h new file mode 100644 index 000000000000..3464e4aa9423 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/dyadic_float.h @@ -0,0 +1,714 @@ +//===-- A class to store high precision floating point numbers --*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_DYADIC_FLOAT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_DYADIC_FLOAT_H + +#include "FEnvImpl.h" +#include "FPBits.h" +#include "hdr/errno_macros.h" +#include "hdr/fenv_macros.h" +#include "multiply_add.h" +#include "rounding_mode.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/big_int.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY +#include "src/__support/macros/properties/types.h" + +#include <stddef.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +// Decide whether to round a UInt up, down or not at all at a given bit +// position, based on the current rounding mode. The assumption is that the +// caller is going to make the integer `value >> rshift`, and then might need +// to round it up by 1 depending on the value of the bits shifted off the +// bottom. +// +// `logical_sign` causes the behavior of FE_DOWNWARD and FE_UPWARD to +// be reversed, which is what you'd want if this is the mantissa of a +// negative floating-point number. +// +// Return value is +1 if the value should be rounded up; -1 if it should be +// rounded down; 0 if it's exact and needs no rounding. +template <size_t Bits> +LIBC_INLINE constexpr int +rounding_direction(const LIBC_NAMESPACE::UInt<Bits> &value, size_t rshift, + Sign logical_sign) { + if (rshift == 0 || (rshift < Bits && (value << (Bits - rshift)) == 0) || + (rshift >= Bits && value == 0)) + return 0; // exact + + switch (quick_get_round()) { + case FE_TONEAREST: + if (rshift > 0 && rshift <= Bits && value.get_bit(rshift - 1)) { + // We round up, unless the value is an exact halfway case and + // the bit that will end up in the units place is 0, in which + // case tie-break-to-even says round down. + bool round_bit = rshift < Bits ? value.get_bit(rshift) : 0; + return round_bit != 0 || (value << (Bits - rshift + 1)) != 0 ? +1 : -1; + } else { + return -1; + } + case FE_TOWARDZERO: + return -1; + case FE_DOWNWARD: + return logical_sign.is_neg() && + (rshift < Bits && (value << (Bits - rshift)) != 0) + ? +1 + : -1; + case FE_UPWARD: + return logical_sign.is_pos() && + (rshift < Bits && (value << (Bits - rshift)) != 0) + ? +1 + : -1; + default: + __builtin_unreachable(); + } +} + +// A generic class to perform computations of high precision floating points. +// We store the value in dyadic format, including 3 fields: +// sign : boolean value - false means positive, true means negative +// exponent: the exponent value of the least significant bit of the mantissa. +// mantissa: unsigned integer of length `Bits`. +// So the real value that is stored is: +// real value = (-1)^sign * 2^exponent * (mantissa as unsigned integer) +// The stored data is normal if for non-zero mantissa, the leading bit is 1. +// The outputs of the constructors and most functions will be normalized. +// To simplify and improve the efficiency, many functions will assume that the +// inputs are normal. +template <size_t Bits> struct DyadicFloat { + using MantissaType = LIBC_NAMESPACE::UInt<Bits>; + + Sign sign = Sign::POS; + int exponent = 0; + MantissaType mantissa = MantissaType(0); + + LIBC_INLINE constexpr DyadicFloat() = default; + + template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> + LIBC_INLINE constexpr DyadicFloat(T x) { + static_assert(FPBits<T>::FRACTION_LEN < Bits); + FPBits<T> x_bits(x); + sign = x_bits.sign(); + exponent = x_bits.get_explicit_exponent() - FPBits<T>::FRACTION_LEN; + mantissa = MantissaType(x_bits.get_explicit_mantissa()); + normalize(); + } + + LIBC_INLINE constexpr DyadicFloat(Sign s, int e, const MantissaType &m) + : sign(s), exponent(e), mantissa(m) { + normalize(); + } + + // Normalizing the mantissa, bringing the leading 1 bit to the most + // significant bit. + LIBC_INLINE constexpr DyadicFloat &normalize() { + if (!mantissa.is_zero()) { + int shift_length = cpp::countl_zero(mantissa); + exponent -= shift_length; + mantissa <<= static_cast<size_t>(shift_length); + } + return *this; + } + + // Used for aligning exponents. Output might not be normalized. + LIBC_INLINE constexpr DyadicFloat &shift_left(unsigned shift_length) { + if (shift_length < Bits) { + exponent -= static_cast<int>(shift_length); + mantissa <<= shift_length; + } else { + exponent = 0; + mantissa = MantissaType(0); + } + return *this; + } + + // Used for aligning exponents. Output might not be normalized. + LIBC_INLINE constexpr DyadicFloat &shift_right(unsigned shift_length) { + if (shift_length < Bits) { + exponent += static_cast<int>(shift_length); + mantissa >>= shift_length; + } else { + exponent = 0; + mantissa = MantissaType(0); + } + return *this; + } + + // Assume that it is already normalized. Output the unbiased exponent. + LIBC_INLINE constexpr int get_unbiased_exponent() const { + return exponent + (Bits - 1); + } + + // Produce a correctly rounded DyadicFloat from a too-large mantissa, + // by shifting it down and rounding if necessary. + template <size_t MantissaBits> + LIBC_INLINE constexpr static DyadicFloat<Bits> + round(Sign result_sign, int result_exponent, + const LIBC_NAMESPACE::UInt<MantissaBits> &input_mantissa, + size_t rshift) { + MantissaType result_mantissa(input_mantissa >> rshift); + if (rounding_direction(input_mantissa, rshift, result_sign) > 0) { + ++result_mantissa; + if (result_mantissa == 0) { + // Rounding up made the mantissa integer wrap round to 0, + // carrying a bit off the top. So we've rounded up to the next + // exponent. + result_mantissa.set_bit(Bits - 1); + ++result_exponent; + } + } + return DyadicFloat(result_sign, result_exponent, result_mantissa); + } + + template <typename T, bool ShouldSignalExceptions> + LIBC_INLINE constexpr cpp::enable_if_t< + cpp::is_floating_point_v<T> && (FPBits<T>::FRACTION_LEN < Bits), T> + generic_as() const { + using FPBits = FPBits<T>; + using StorageType = typename FPBits::StorageType; + + constexpr int EXTRA_FRACTION_LEN = Bits - 1 - FPBits::FRACTION_LEN; + + if (mantissa == 0) + return FPBits::zero(sign).get_val(); + + int unbiased_exp = get_unbiased_exponent(); + + if (unbiased_exp + FPBits::EXP_BIAS >= FPBits::MAX_BIASED_EXPONENT) { + if constexpr (ShouldSignalExceptions) { + set_errno_if_required(ERANGE); + raise_except_if_required(FE_OVERFLOW | FE_INEXACT); + } + + switch (quick_get_round()) { + case FE_TONEAREST: + return FPBits::inf(sign).get_val(); + case FE_TOWARDZERO: + return FPBits::max_normal(sign).get_val(); + case FE_DOWNWARD: + if (sign.is_pos()) + return FPBits::max_normal(Sign::POS).get_val(); + return FPBits::inf(Sign::NEG).get_val(); + case FE_UPWARD: + if (sign.is_neg()) + return FPBits::max_normal(Sign::NEG).get_val(); + return FPBits::inf(Sign::POS).get_val(); + default: + __builtin_unreachable(); + } + } + + StorageType out_biased_exp = 0; + StorageType out_mantissa = 0; + bool round = false; + bool sticky = false; + bool underflow = false; + + if (unbiased_exp < -FPBits::EXP_BIAS - FPBits::FRACTION_LEN) { + sticky = true; + underflow = true; + } else if (unbiased_exp == -FPBits::EXP_BIAS - FPBits::FRACTION_LEN) { + round = true; + MantissaType sticky_mask = (MantissaType(1) << (Bits - 1)) - 1; + sticky = (mantissa & sticky_mask) != 0; + } else { + int extra_fraction_len = EXTRA_FRACTION_LEN; + + if (unbiased_exp < 1 - FPBits::EXP_BIAS) { + underflow = true; + extra_fraction_len += 1 - FPBits::EXP_BIAS - unbiased_exp; + } else { + out_biased_exp = + static_cast<StorageType>(unbiased_exp + FPBits::EXP_BIAS); + } + + MantissaType round_mask = MantissaType(1) << (extra_fraction_len - 1); + round = (mantissa & round_mask) != 0; + MantissaType sticky_mask = round_mask - 1; + sticky = (mantissa & sticky_mask) != 0; + + out_mantissa = static_cast<StorageType>(mantissa >> extra_fraction_len); + } + + bool lsb = (out_mantissa & 1) != 0; + + StorageType result = + FPBits::create_value(sign, out_biased_exp, out_mantissa).uintval(); + + switch (quick_get_round()) { + case FE_TONEAREST: + if (round && (lsb || sticky)) + ++result; + break; + case FE_DOWNWARD: + if (sign.is_neg() && (round || sticky)) + ++result; + break; + case FE_UPWARD: + if (sign.is_pos() && (round || sticky)) + ++result; + break; + default: + break; + } + + if (ShouldSignalExceptions && (round || sticky)) { + int excepts = FE_INEXACT; + if (FPBits(result).is_inf()) { + set_errno_if_required(ERANGE); + excepts |= FE_OVERFLOW; + } else if (underflow) { + set_errno_if_required(ERANGE); + excepts |= FE_UNDERFLOW; + } + raise_except_if_required(excepts); + } + + return FPBits(result).get_val(); + } + + template <typename T, bool ShouldSignalExceptions, + typename = cpp::enable_if_t<cpp::is_floating_point_v<T> && + (FPBits<T>::FRACTION_LEN < Bits), + void>> + LIBC_INLINE constexpr T fast_as() const { + if (LIBC_UNLIKELY(mantissa.is_zero())) + return FPBits<T>::zero(sign).get_val(); + + // Assume that it is normalized, and output is also normal. + constexpr uint32_t PRECISION = FPBits<T>::FRACTION_LEN + 1; + using output_bits_t = typename FPBits<T>::StorageType; + constexpr output_bits_t IMPLICIT_MASK = + FPBits<T>::SIG_MASK - FPBits<T>::FRACTION_MASK; + + int exp_hi = exponent + static_cast<int>((Bits - 1) + FPBits<T>::EXP_BIAS); + + if (LIBC_UNLIKELY(exp_hi > 2 * FPBits<T>::EXP_BIAS)) { + // Results overflow. + T d_hi = + FPBits<T>::create_value(sign, 2 * FPBits<T>::EXP_BIAS, IMPLICIT_MASK) + .get_val(); + // volatile prevents constant propagation that would result in infinity + // always being returned no matter the current rounding mode. + volatile T two = static_cast<T>(2.0); + T r = two * d_hi; + + // TODO: Whether rounding down the absolute value to max_normal should + // also raise FE_OVERFLOW and set ERANGE is debatable. + if (ShouldSignalExceptions && FPBits<T>(r).is_inf()) + set_errno_if_required(ERANGE); + + return r; + } + + bool denorm = false; + uint32_t shift = Bits - PRECISION; + if (LIBC_UNLIKELY(exp_hi <= 0)) { + // Output is denormal. + denorm = true; + shift = (Bits - PRECISION) + static_cast<uint32_t>(1 - exp_hi); + + exp_hi = FPBits<T>::EXP_BIAS; + } + + int exp_lo = exp_hi - static_cast<int>(PRECISION) - 1; + + MantissaType m_hi = + shift >= MantissaType::BITS ? MantissaType(0) : mantissa >> shift; + + T d_hi = FPBits<T>::create_value( + sign, static_cast<output_bits_t>(exp_hi), + (static_cast<output_bits_t>(m_hi) & FPBits<T>::SIG_MASK) | + IMPLICIT_MASK) + .get_val(); + + MantissaType round_mask = + shift - 1 >= MantissaType::BITS ? 0 : MantissaType(1) << (shift - 1); + MantissaType sticky_mask = round_mask - MantissaType(1); + + bool round_bit = !(mantissa & round_mask).is_zero(); + bool sticky_bit = !(mantissa & sticky_mask).is_zero(); + int round_and_sticky = int(round_bit) * 2 + int(sticky_bit); + + T d_lo; + + if (LIBC_UNLIKELY(exp_lo <= 0)) { + // d_lo is denormal, but the output is normal. + int scale_up_exponent = 1 - exp_lo; + T scale_up_factor = + FPBits<T>::create_value(Sign::POS, + static_cast<output_bits_t>( + FPBits<T>::EXP_BIAS + scale_up_exponent), + IMPLICIT_MASK) + .get_val(); + T scale_down_factor = + FPBits<T>::create_value(Sign::POS, + static_cast<output_bits_t>( + FPBits<T>::EXP_BIAS - scale_up_exponent), + IMPLICIT_MASK) + .get_val(); + + d_lo = FPBits<T>::create_value( + sign, static_cast<output_bits_t>(exp_lo + scale_up_exponent), + IMPLICIT_MASK) + .get_val(); + + return multiply_add(d_lo, T(round_and_sticky), d_hi * scale_up_factor) * + scale_down_factor; + } + + d_lo = FPBits<T>::create_value(sign, static_cast<output_bits_t>(exp_lo), + IMPLICIT_MASK) + .get_val(); + + // Still correct without FMA instructions if `d_lo` is not underflow. + T r = multiply_add(d_lo, T(round_and_sticky), d_hi); + + if (LIBC_UNLIKELY(denorm)) { + // Exponent before rounding is in denormal range, simply clear the + // exponent field. + output_bits_t clear_exp = static_cast<output_bits_t>( + output_bits_t(exp_hi) << FPBits<T>::SIG_LEN); + output_bits_t r_bits = FPBits<T>(r).uintval() - clear_exp; + + if (!(r_bits & FPBits<T>::EXP_MASK)) { + // Output is denormal after rounding, clear the implicit bit for 80-bit + // long double. + r_bits -= IMPLICIT_MASK; + + // TODO: IEEE Std 754-2019 lets implementers choose whether to check for + // "tininess" before or after rounding for base-2 formats, as long as + // the same choice is made for all operations. Our choice to check after + // rounding might not be the same as the hardware's. + if (ShouldSignalExceptions && round_and_sticky) { + set_errno_if_required(ERANGE); + raise_except_if_required(FE_UNDERFLOW); + } + } + + return FPBits<T>(r_bits).get_val(); + } + + return r; + } + + // Assume that it is already normalized. + // Output is rounded correctly with respect to the current rounding mode. + template <typename T, bool ShouldSignalExceptions, + typename = cpp::enable_if_t<cpp::is_floating_point_v<T> && + (FPBits<T>::FRACTION_LEN < Bits), + void>> + LIBC_INLINE constexpr T as() const { + if constexpr (cpp::is_same_v<T, bfloat16> +#if defined(LIBC_TYPES_HAS_FLOAT16) && !defined(__LIBC_USE_FLOAT16_CONVERSION) + || cpp::is_same_v<T, float16> +#endif + ) + return generic_as<T, ShouldSignalExceptions>(); + else + return fast_as<T, ShouldSignalExceptions>(); + } + + template <typename T, + typename = cpp::enable_if_t<cpp::is_floating_point_v<T> && + (FPBits<T>::FRACTION_LEN < Bits), + void>> + LIBC_INLINE explicit constexpr operator T() const { + return as<T, /*ShouldSignalExceptions=*/false>(); + } + + LIBC_INLINE constexpr MantissaType as_mantissa_type() const { + if (mantissa.is_zero()) + return 0; + + MantissaType new_mant = mantissa; + if (exponent > 0) { + new_mant <<= exponent; + } else { + // Cast the exponent to size_t before negating it, rather than after, + // to avoid undefined behavior negating INT_MIN as an integer (although + // exponents coming in to this function _shouldn't_ be that large). The + // result should always end up as a positive size_t. + size_t shift = -static_cast<size_t>(exponent); + new_mant >>= shift; + } + + if (sign.is_neg()) { + new_mant = (~new_mant) + 1; + } + + return new_mant; + } + + LIBC_INLINE constexpr MantissaType + as_mantissa_type_rounded(int *round_dir_out = nullptr) const { + int round_dir = 0; + MantissaType new_mant; + if (mantissa.is_zero()) { + new_mant = 0; + } else { + new_mant = mantissa; + if (exponent > 0) { + new_mant <<= exponent; + } else if (exponent < 0) { + // Cast the exponent to size_t before negating it, rather than after, + // to avoid undefined behavior negating INT_MIN as an integer (although + // exponents coming in to this function _shouldn't_ be that large). The + // result should always end up as a positive size_t. + size_t shift = -static_cast<size_t>(exponent); + if (shift >= Bits) + new_mant = 0; + else + new_mant >>= shift; + round_dir = rounding_direction(mantissa, shift, sign); + if (round_dir > 0) + ++new_mant; + } + + if (sign.is_neg()) { + new_mant = (~new_mant) + 1; + } + } + + if (round_dir_out) + *round_dir_out = round_dir; + + return new_mant; + } + + LIBC_INLINE constexpr DyadicFloat operator-() const { + return DyadicFloat(sign.negate(), exponent, mantissa); + } +}; + +// Quick add - Add 2 dyadic floats with rounding toward 0 and then normalize the +// output: +// - Align the exponents so that: +// new a.exponent = new b.exponent = max(a.exponent, b.exponent) +// - Add or subtract the mantissas depending on the signs. +// - Normalize the result. +// The absolute errors compared to the mathematical sum is bounded by: +// | quick_add(a, b) - (a + b) | < MSB(a + b) * 2^(-Bits + 2), +// i.e., errors are up to 2 ULPs. +// Assume inputs are normalized (by constructors or other functions) so that we +// don't need to normalize the inputs again in this function. If the inputs are +// not normalized, the results might lose precision significantly. +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> quick_add(DyadicFloat<Bits> a, + DyadicFloat<Bits> b) { + if (LIBC_UNLIKELY(a.mantissa.is_zero())) + return b; + if (LIBC_UNLIKELY(b.mantissa.is_zero())) + return a; + + // Align exponents + if (a.exponent > b.exponent) + b.shift_right(static_cast<unsigned>(a.exponent - b.exponent)); + else if (b.exponent > a.exponent) + a.shift_right(static_cast<unsigned>(b.exponent - a.exponent)); + + DyadicFloat<Bits> result; + + if (a.sign == b.sign) { + // Addition + result.sign = a.sign; + result.exponent = a.exponent; + result.mantissa = a.mantissa; + if (result.mantissa.add_overflow(b.mantissa)) { + // Mantissa addition overflow. + result.shift_right(1); + result.mantissa.val[DyadicFloat<Bits>::MantissaType::WORD_COUNT - 1] |= + (uint64_t(1) << 63); + } + // Result is already normalized. + return result; + } + + // Subtraction + if (a.mantissa >= b.mantissa) { + result.sign = a.sign; + result.exponent = a.exponent; + result.mantissa = a.mantissa - b.mantissa; + } else { + result.sign = b.sign; + result.exponent = b.exponent; + result.mantissa = b.mantissa - a.mantissa; + } + + return result.normalize(); +} + +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> quick_sub(DyadicFloat<Bits> a, + DyadicFloat<Bits> b) { + return quick_add(a, -b); +} + +// Quick Mul - Slightly less accurate but efficient multiplication of 2 dyadic +// floats with rounding toward 0 and then normalize the output: +// result.exponent = a.exponent + b.exponent + Bits, +// result.mantissa = quick_mul_hi(a.mantissa + b.mantissa) +// ~ (full product a.mantissa * b.mantissa) >> Bits. +// The errors compared to the mathematical product is bounded by: +// 2 * errors of quick_mul_hi = 2 * (UInt<Bits>::WORD_COUNT - 1) in ULPs. +// Assume inputs are normalized (by constructors or other functions) so that we +// don't need to normalize the inputs again in this function. If the inputs are +// not normalized, the results might lose precision significantly. +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> quick_mul(const DyadicFloat<Bits> &a, + const DyadicFloat<Bits> &b) { + DyadicFloat<Bits> result; + result.sign = (a.sign != b.sign) ? Sign::NEG : Sign::POS; + result.exponent = a.exponent + b.exponent + static_cast<int>(Bits); + + if (!(a.mantissa.is_zero() || b.mantissa.is_zero())) { + result.mantissa = a.mantissa.quick_mul_hi(b.mantissa); + // Check the leading bit directly, should be faster than using clz in + // normalize(). + if (result.mantissa.val[DyadicFloat<Bits>::MantissaType::WORD_COUNT - 1] >> + 63 == + 0) + result.shift_left(1); + } else { + result.mantissa = (typename DyadicFloat<Bits>::MantissaType)(0); + } + return result; +} + +// Correctly rounded multiplication of 2 dyadic floats, assuming the +// exponent remains within range. +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> +rounded_mul(const DyadicFloat<Bits> &a, const DyadicFloat<Bits> &b) { + using DblMant = LIBC_NAMESPACE::UInt<(2 * Bits)>; + Sign result_sign = (a.sign != b.sign) ? Sign::NEG : Sign::POS; + int result_exponent = a.exponent + b.exponent + static_cast<int>(Bits); + auto product = DblMant(a.mantissa) * DblMant(b.mantissa); + // As in quick_mul(), renormalize by 1 bit manually rather than countl_zero + if (product.get_bit(2 * Bits - 1) == 0) { + product <<= 1; + result_exponent -= 1; + } + + return DyadicFloat<Bits>::round(result_sign, result_exponent, product, Bits); +} + +// Approximate reciprocal - given a nonzero a, make a good approximation to 1/a. +// The method is Newton-Raphson iteration, based on quick_mul. +template <size_t Bits, typename = cpp::enable_if_t<(Bits >= 32)>> +LIBC_INLINE constexpr DyadicFloat<Bits> +approx_reciprocal(const DyadicFloat<Bits> &a) { + // Given an approximation x to 1/a, a better one is x' = x(2-ax). + // + // You can derive this by using the Newton-Raphson formula with the function + // f(x) = 1/x - a. But another way to see that it works is to say: suppose + // that ax = 1-e for some small error e. Then ax' = ax(2-ax) = (1-e)(1+e) = + // 1-e^2. So the error in x' is the square of the error in x, i.e. the number + // of correct bits in x' is double the number in x. + + // An initial approximation to the reciprocal + DyadicFloat<Bits> x(Sign::POS, -32 - a.exponent - int(Bits), + uint64_t(0xFFFFFFFFFFFFFFFF) / + static_cast<uint64_t>(a.mantissa >> (Bits - 32))); + + // The constant 2, which we'll need in every iteration + DyadicFloat<Bits> two(Sign::POS, 1, 1); + + // We expect at least 31 correct bits from our 32-bit starting approximation + size_t ok_bits = 31; + + // The number of good bits doubles in each iteration, except that rounding + // errors introduce a little extra each time. Subtract a bit from our + // accuracy assessment to account for that. + while (ok_bits < Bits) { + x = quick_mul(x, quick_sub(two, quick_mul(a, x))); + ok_bits = 2 * ok_bits - 1; + } + + return x; +} + +// Correctly rounded division of 2 dyadic floats, assuming the +// exponent remains within range. +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> +rounded_div(const DyadicFloat<Bits> &af, const DyadicFloat<Bits> &bf) { + using DblMant = LIBC_NAMESPACE::UInt<(Bits * 2 + 64)>; + + // Make an approximation to the quotient as a * (1/b). Both the + // multiplication and the reciprocal are a bit sloppy, which doesn't + // matter, because we're going to correct for that below. + auto qf = fputil::quick_mul(af, fputil::approx_reciprocal(bf)); + + // Switch to BigInt and stop using quick_add and quick_mul: now + // we're working in exact integers so as to get the true remainder. + DblMant a = af.mantissa, b = bf.mantissa, q = qf.mantissa; + q <<= 2; // leave room for a round bit, even if exponent decreases + a <<= af.exponent - bf.exponent - qf.exponent + 2; + DblMant qb = q * b; + if (qb < a) { + DblMant too_small = a - b; + while (qb <= too_small) { + qb += b; + ++q; + } + } else { + while (qb > a) { + qb -= b; + --q; + } + } + + DyadicFloat<(Bits * 2)> qbig(qf.sign, qf.exponent - 2, q); + return DyadicFloat<Bits>::round(qbig.sign, qbig.exponent + Bits, + qbig.mantissa, Bits); +} + +// Simple polynomial approximation. +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> +multiply_add(const DyadicFloat<Bits> &a, const DyadicFloat<Bits> &b, + const DyadicFloat<Bits> &c) { + return quick_add(c, quick_mul(a, b)); +} + +// Simple exponentiation implementation for printf. Only handles positive +// exponents, since division isn't implemented. +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> pow_n(const DyadicFloat<Bits> &a, + uint32_t power) { + DyadicFloat<Bits> result = 1.0; + DyadicFloat<Bits> cur_power = a; + + while (power > 0) { + if ((power % 2) > 0) { + result = quick_mul(result, cur_power); + } + power = power >> 1; + cur_power = quick_mul(cur_power, cur_power); + } + return result; +} + +template <size_t Bits> +LIBC_INLINE constexpr DyadicFloat<Bits> mul_pow_2(const DyadicFloat<Bits> &a, + int32_t pow_2) { + DyadicFloat<Bits> result = a; + result.exponent += pow_2; + return result; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_DYADIC_FLOAT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/except_value_utils.h b/contrib/llvm-project/libc/src/__support/FPUtil/except_value_utils.h new file mode 100644 index 000000000000..5f767769974d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/except_value_utils.h @@ -0,0 +1,145 @@ +//===-- Common header for helpers to set exceptional values -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_EXCEPT_VALUE_UTILS_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_EXCEPT_VALUE_UTILS_H + +#include "FEnvImpl.h" +#include "FPBits.h" +#include "cast.h" +#include "rounding_mode.h" +#include "src/__support/CPP/optional.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY +#include "src/__support/macros/properties/cpu_features.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace fputil { + +// This file contains utility functions and classes to manage exceptional values +// when there are many of them. +// +// Example usage: +// +// Define list of exceptional inputs and outputs: +// static constexpr int N = ...; // Number of exceptional values. +// static constexpr fputil::ExceptValues<StorageType, N> Excepts { +// <list of input bits, output bits and offsets> +// }; +// +// Check for exceptional inputs: +// if (auto r = Excepts.lookup(x_bits); LIBC_UNLIKELY(r.has_value())) +// return r.value(); + +template <typename T, size_t N> struct ExceptValues { + static_assert(cpp::is_floating_point_v<T>, "Must be a floating point type."); + + using StorageType = typename FPBits<T>::StorageType; + + struct Mapping { + StorageType input; + StorageType rnd_towardzero_result; + StorageType rnd_upward_offset; + StorageType rnd_downward_offset; + StorageType rnd_tonearest_offset; + }; + + Mapping values[N]; + + LIBC_INLINE constexpr cpp::optional<T> lookup(StorageType x_bits) const { + for (size_t i = 0; i < N; ++i) { + if (LIBC_UNLIKELY(x_bits == values[i].input)) { + StorageType out_bits = values[i].rnd_towardzero_result; + switch (fputil::quick_get_round()) { + case FE_UPWARD: + out_bits += values[i].rnd_upward_offset; + break; + case FE_DOWNWARD: + out_bits += values[i].rnd_downward_offset; + break; + case FE_TONEAREST: + out_bits += values[i].rnd_tonearest_offset; + break; + } + return FPBits<T>(out_bits).get_val(); + } + } + return cpp::nullopt; + } + + LIBC_INLINE constexpr cpp::optional<T> lookup_odd(StorageType x_abs, + bool sign) const { + for (size_t i = 0; i < N; ++i) { + if (LIBC_UNLIKELY(x_abs == values[i].input)) { + StorageType out_bits = values[i].rnd_towardzero_result; + switch (fputil::quick_get_round()) { + case FE_UPWARD: + if (sign) + out_bits += values[i].rnd_downward_offset; + else + out_bits += values[i].rnd_upward_offset; + break; + case FE_DOWNWARD: + // Use conditionals instead of ternary operator to work around gcc's + // -Wconversion false positive bug: + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101537 + if (sign) + out_bits += values[i].rnd_upward_offset; + else + out_bits += values[i].rnd_downward_offset; + break; + case FE_TONEAREST: + out_bits += values[i].rnd_tonearest_offset; + break; + } + T result = FPBits<T>(out_bits).get_val(); + if (sign) + result = -result; + + return result; + } + } + return cpp::nullopt; + } +}; + +// Helper functions to set results for exceptional cases. +template <typename T> LIBC_INLINE T round_result_slightly_down(T value_rn) { + volatile T tmp = value_rn; + tmp -= FPBits<T>::min_normal().get_val(); + return tmp; +} + +template <typename T> LIBC_INLINE T round_result_slightly_up(T value_rn) { + volatile T tmp = value_rn; + tmp += FPBits<T>::min_normal().get_val(); + return tmp; +} + +#if defined(LIBC_TYPES_HAS_FLOAT16) && \ + !defined(LIBC_TARGET_CPU_HAS_FAST_FLOAT16_OPS) +template <> LIBC_INLINE float16 round_result_slightly_down(float16 value_rn) { + volatile float tmp = value_rn; + tmp -= FPBits<float16>::min_normal().get_val(); + return cast<float16>(tmp); +} + +template <> LIBC_INLINE float16 round_result_slightly_up(float16 value_rn) { + volatile float tmp = value_rn; + tmp += FPBits<float16>::min_normal().get_val(); + return cast<float16>(tmp); +} +#endif + +} // namespace fputil + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_EXCEPT_VALUE_UTILS_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/fpbits_str.h b/contrib/llvm-project/libc/src/__support/FPUtil/fpbits_str.h new file mode 100644 index 000000000000..92981917561a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/fpbits_str.h @@ -0,0 +1,76 @@ +//===------ Pretty print function for FPBits --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_FPBITS_STR_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_FPBITS_STR_H + +#include "src/__support/CPP/string.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/integer_to_string.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace details { + +// Format T as uppercase hexadecimal number with leading zeros. +template <typename T> +using ZeroPaddedHexFmt = IntegerToString< + T, typename radix::Hex::WithWidth<(sizeof(T) * 2)>::WithPrefix::Uppercase>; + +} // namespace details + +// Converts the bits to a string in the following format: +// "0x<NNN...N> = S: N, E: 0xNNNN, M:0xNNN...N" +// 1. N is a hexadecimal digit. +// 2. The hexadecimal number on the LHS is the raw numerical representation +// of the bits. +// 3. The exponent is always 16 bits wide irrespective of the type of the +// floating encoding. +template <typename T> LIBC_INLINE cpp::string str(fputil::FPBits<T> x) { + using StorageType = typename fputil::FPBits<T>::StorageType; + + if (x.is_nan()) + return "(NaN)"; + if (x.is_inf()) + return x.is_neg() ? "(-Infinity)" : "(+Infinity)"; + + const auto sign_char = [](Sign sign) -> char { + return sign.is_neg() ? '1' : '0'; + }; + + cpp::string s; + + const details::ZeroPaddedHexFmt<StorageType> bits(x.uintval()); + s += bits.view(); + + s += " = (S: "; + s += sign_char(x.sign()); + + s += ", E: "; + const details::ZeroPaddedHexFmt<uint16_t> exponent(x.get_biased_exponent()); + s += exponent.view(); + + if constexpr (fputil::get_fp_type<T>() == fputil::FPType::X86_Binary80) { + s += ", I: "; + s += sign_char(x.get_implicit_bit() ? Sign::NEG : Sign::POS); + } + + s += ", M: "; + const details::ZeroPaddedHexFmt<StorageType> mantissa(x.get_mantissa()); + s += mantissa.view(); + + s += ')'; + return s; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_FPBITS_STR_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/FMA.h b/contrib/llvm-project/libc/src/__support/FPUtil/generic/FMA.h new file mode 100644 index 000000000000..bec312e44b1b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/FMA.h @@ -0,0 +1,288 @@ +//===-- Common header for FMA implementations -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_FMA_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_FMA_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/limits.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/cast.h" +#include "src/__support/FPUtil/dyadic_float.h" +#include "src/__support/FPUtil/rounding_mode.h" +#include "src/__support/big_int.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY + +#include "hdr/fenv_macros.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { +namespace generic { + +template <typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +fma(InType x, InType y, InType z); + +// TODO(lntue): Implement fmaf that is correctly rounded to all rounding modes. +// The implementation below only is only correct for the default rounding mode, +// round-to-nearest tie-to-even. +template <> LIBC_INLINE float fma<float>(float x, float y, float z) { + // Product is exact. + double prod = static_cast<double>(x) * static_cast<double>(y); + double z_d = static_cast<double>(z); + double sum = prod + z_d; + fputil::FPBits<double> bit_prod(prod), bitz(z_d), bit_sum(sum); + + if (!(bit_sum.is_inf_or_nan() || bit_sum.is_zero())) { + // Since the sum is computed in double precision, rounding might happen + // (for instance, when bitz.exponent > bit_prod.exponent + 5, or + // bit_prod.exponent > bitz.exponent + 40). In that case, when we round + // the sum back to float, double rounding error might occur. + // A concrete example of this phenomenon is as follows: + // x = y = 1 + 2^(-12), z = 2^(-53) + // The exact value of x*y + z is 1 + 2^(-11) + 2^(-24) + 2^(-53) + // So when rounding to float, fmaf(x, y, z) = 1 + 2^(-11) + 2^(-23) + // On the other hand, with the default rounding mode, + // double(x*y + z) = 1 + 2^(-11) + 2^(-24) + // and casting again to float gives us: + // float(double(x*y + z)) = 1 + 2^(-11). + // + // In order to correct this possible double rounding error, first we use + // Dekker's 2Sum algorithm to find t such that sum - t = prod + z exactly, + // assuming the (default) rounding mode is round-to-the-nearest, + // tie-to-even. Moreover, t satisfies the condition that t < eps(sum), + // i.e., t.exponent < sum.exponent - 52. So if t is not 0, meaning rounding + // occurs when computing the sum, we just need to use t to adjust (any) last + // bit of sum, so that the sticky bits used when rounding sum to float are + // correct (when it matters). + fputil::FPBits<double> t( + (bit_prod.get_biased_exponent() >= bitz.get_biased_exponent()) + ? ((bit_sum.get_val() - bit_prod.get_val()) - bitz.get_val()) + : ((bit_sum.get_val() - bitz.get_val()) - bit_prod.get_val())); + + // Update sticky bits if t != 0.0 and the least (52 - 23 - 1 = 28) bits are + // zero. + if (!t.is_zero() && ((bit_sum.get_mantissa() & 0xfff'ffffULL) == 0)) { + if (bit_sum.sign() != t.sign()) + bit_sum.set_mantissa(bit_sum.get_mantissa() + 1); + else if (bit_sum.get_mantissa()) + bit_sum.set_mantissa(bit_sum.get_mantissa() - 1); + } + } + + return static_cast<float>(bit_sum.get_val()); +} + +namespace internal { + +// Extract the sticky bits and shift the `mantissa` to the right by +// `shift_length`. +template <typename T> +LIBC_INLINE cpp::enable_if_t<is_unsigned_integral_or_big_int_v<T>, bool> +shift_mantissa(int shift_length, T &mant) { + if (shift_length >= cpp::numeric_limits<T>::digits) { + mant = 0; + return true; // prod_mant is non-zero. + } + T mask = (T(1) << shift_length) - 1; + bool sticky_bits = (mant & mask) != 0; + mant >>= shift_length; + return sticky_bits; +} + +} // namespace internal + +template <typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +fma(InType x, InType y, InType z) { + using OutFPBits = FPBits<OutType>; + using OutStorageType = typename OutFPBits::StorageType; + using InFPBits = FPBits<InType>; + using InStorageType = typename InFPBits::StorageType; + + constexpr int IN_EXPLICIT_MANT_LEN = InFPBits::FRACTION_LEN + 1; + constexpr size_t PROD_LEN = 2 * IN_EXPLICIT_MANT_LEN; + constexpr size_t TMP_RESULT_LEN = cpp::bit_ceil(PROD_LEN + 1); + using TmpResultType = UInt<TMP_RESULT_LEN>; + using DyadicFloat = DyadicFloat<TMP_RESULT_LEN>; + + InFPBits x_bits(x), y_bits(y), z_bits(z); + + if (LIBC_UNLIKELY(x_bits.is_nan() || y_bits.is_nan() || z_bits.is_nan())) { + if (x_bits.is_nan() || y_bits.is_nan()) { + if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan() || + z_bits.is_signaling_nan()) + raise_except_if_required(FE_INVALID); + + if (x_bits.is_quiet_nan()) { + InStorageType x_payload = x_bits.get_mantissa(); + x_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(x_bits.sign(), + static_cast<OutStorageType>(x_payload)) + .get_val(); + } + + if (y_bits.is_quiet_nan()) { + InStorageType y_payload = y_bits.get_mantissa(); + y_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(y_bits.sign(), + static_cast<OutStorageType>(y_payload)) + .get_val(); + } + + if (z_bits.is_quiet_nan()) { + InStorageType z_payload = z_bits.get_mantissa(); + z_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(z_bits.sign(), + static_cast<OutStorageType>(z_payload)) + .get_val(); + } + + return OutFPBits::quiet_nan().get_val(); + } + } + + if (LIBC_UNLIKELY(x == 0 || y == 0 || z == 0)) + return cast<OutType>(x * y + z); + + int x_exp = 0; + int y_exp = 0; + int z_exp = 0; + + // Denormal scaling = 2^(fraction length). + constexpr InStorageType IMPLICIT_MASK = + InFPBits::SIG_MASK - InFPBits::FRACTION_MASK; + + constexpr InType DENORMAL_SCALING = + InFPBits::create_value( + Sign::POS, InFPBits::FRACTION_LEN + InFPBits::EXP_BIAS, IMPLICIT_MASK) + .get_val(); + + // Normalize denormal inputs. + if (LIBC_UNLIKELY(InFPBits(x).is_subnormal())) { + x_exp -= InFPBits::FRACTION_LEN; + x *= DENORMAL_SCALING; + } + if (LIBC_UNLIKELY(InFPBits(y).is_subnormal())) { + y_exp -= InFPBits::FRACTION_LEN; + y *= DENORMAL_SCALING; + } + if (LIBC_UNLIKELY(InFPBits(z).is_subnormal())) { + z_exp -= InFPBits::FRACTION_LEN; + z *= DENORMAL_SCALING; + } + + x_bits = InFPBits(x); + y_bits = InFPBits(y); + z_bits = InFPBits(z); + const Sign z_sign = z_bits.sign(); + Sign prod_sign = (x_bits.sign() == y_bits.sign()) ? Sign::POS : Sign::NEG; + x_exp += x_bits.get_biased_exponent(); + y_exp += y_bits.get_biased_exponent(); + z_exp += z_bits.get_biased_exponent(); + + if (LIBC_UNLIKELY(x_exp == InFPBits::MAX_BIASED_EXPONENT || + y_exp == InFPBits::MAX_BIASED_EXPONENT || + z_exp == InFPBits::MAX_BIASED_EXPONENT)) + return cast<OutType>(x * y + z); + + // Extract mantissa and append hidden leading bits. + InStorageType x_mant = x_bits.get_explicit_mantissa(); + InStorageType y_mant = y_bits.get_explicit_mantissa(); + TmpResultType z_mant = z_bits.get_explicit_mantissa(); + + // If the exponent of the product x*y > the exponent of z, then no extra + // precision beside the entire product x*y is needed. On the other hand, when + // the exponent of z >= the exponent of the product x*y, the worst-case that + // we need extra precision is when there is cancellation and the most + // significant bit of the product is aligned exactly with the second most + // significant bit of z: + // z : 10aa...a + // - prod : 1bb...bb....b + // In that case, in order to store the exact result, we need at least + // (Length of prod) - (Fraction length of z) + // = 2*(Length of input explicit mantissa) - (Fraction length of z) bits. + // Overall, before aligning the mantissas and exponents, we can simply left- + // shift the mantissa of z by that amount. After that, it is enough to align + // the least significant bit, given that we keep track of the round and sticky + // bits after the least significant bit. + + TmpResultType prod_mant = TmpResultType(x_mant) * y_mant; + int prod_lsb_exp = + x_exp + y_exp - (InFPBits::EXP_BIAS + 2 * InFPBits::FRACTION_LEN); + + constexpr int RESULT_MIN_LEN = PROD_LEN - InFPBits::FRACTION_LEN; + z_mant <<= RESULT_MIN_LEN; + int z_lsb_exp = z_exp - (InFPBits::FRACTION_LEN + RESULT_MIN_LEN); + bool sticky_bits = false; + bool z_shifted = false; + + // Align exponents. + if (prod_lsb_exp < z_lsb_exp) { + sticky_bits = internal::shift_mantissa(z_lsb_exp - prod_lsb_exp, prod_mant); + prod_lsb_exp = z_lsb_exp; + } else if (z_lsb_exp < prod_lsb_exp) { + z_shifted = true; + sticky_bits = internal::shift_mantissa(prod_lsb_exp - z_lsb_exp, z_mant); + } + + // Perform the addition: + // (-1)^prod_sign * prod_mant + (-1)^z_sign * z_mant. + // The final result will be stored in prod_sign and prod_mant. + if (prod_sign == z_sign) { + // Effectively an addition. + prod_mant += z_mant; + } else { + // Subtraction cases. + if (prod_mant >= z_mant) { + if (z_shifted && sticky_bits) { + // Add 1 more to the subtrahend so that the sticky bits remain + // positive. This would simplify the rounding logic. + ++z_mant; + } + prod_mant -= z_mant; + } else { + if (!z_shifted && sticky_bits) { + // Add 1 more to the subtrahend so that the sticky bits remain + // positive. This would simplify the rounding logic. + ++prod_mant; + } + prod_mant = z_mant - prod_mant; + prod_sign = z_sign; + } + } + + if (prod_mant == 0) { + // When there is exact cancellation, i.e., x*y == -z exactly, return -0.0 if + // rounding downward and +0.0 for other rounding modes. + if (quick_get_round() == FE_DOWNWARD) + prod_sign = Sign::NEG; + else + prod_sign = Sign::POS; + } + + DyadicFloat result(prod_sign, prod_lsb_exp - InFPBits::EXP_BIAS, prod_mant); + result.mantissa |= static_cast<unsigned int>(sticky_bits); + return result.template as<OutType, /*ShouldSignalExceptions=*/true>(); +} + +} // namespace generic +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_FMA_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/FMod.h b/contrib/llvm-project/libc/src/__support/FPUtil/generic/FMod.h new file mode 100644 index 000000000000..30d6472085f6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/FMod.h @@ -0,0 +1,296 @@ +//===-- Common header for fmod implementations ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_FMOD_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_FMOD_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/limits.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { +namespace generic { + +// Objective: +// The algorithm uses integer arithmetic (max uint64_t) for general case. +// Some common cases, like abs(x) < abs(y) or abs(x) < 1000 * abs(y) are +// treated specially to increase performance. The part of checking special +// cases, numbers NaN, INF etc. treated separately. +// +// Objective: +// 1) FMod definition (https://cplusplus.com/reference/cmath/fmod/): +// fmod = numer - tquot * denom, where tquot is the truncated +// (i.e., rounded towards zero) result of: numer/denom. +// 2) FMod with negative x and/or y can be trivially converted to fmod for +// positive x and y. Therefore the algorithm below works only with +// positive numbers. +// 3) All positive floating point numbers can be represented as m * 2^e, +// where "m" is positive integer and "e" is signed. +// 4) FMod function can be calculated in integer numbers (x > y): +// fmod = m_x * 2^e_x - tquot * m_y * 2^e_y +// = 2^e_y * (m_x * 2^(e_x - e^y) - tquot * m_y). +// All variables in parentheses are unsigned integers. +// +// Mathematical background: +// Input x,y in the algorithm is represented (mathematically) like m_x*2^e_x +// and m_y*2^e_y. This is an ambiguous number representation. For example: +// m * 2^e = (2 * m) * 2^(e-1) +// The algorithm uses the facts that +// r = a % b = (a % (N * b)) % b, +// (a * c) % (b * c) = (a % b) * c +// where N is positive integer number. a, b and c - positive. Let's adopt +// the formula for representation above. +// a = m_x * 2^e_x, b = m_y * 2^e_y, N = 2^k +// r(k) = a % b = (m_x * 2^e_x) % (2^k * m_y * 2^e_y) +// = 2^(e_y + k) * (m_x * 2^(e_x - e_y - k) % m_y) +// r(k) = m_r * 2^e_r = (m_x % m_y) * 2^(m_y + k) +// = (2^p * (m_x % m_y) * 2^(e_y + k - p)) +// m_r = 2^p * (m_x % m_y), e_r = m_y + k - p +// +// Algorithm description: +// First, let write x = m_x * 2^e_x and y = m_y * 2^e_y with m_x, m_y, e_x, e_y +// are integers (m_x amd m_y positive). +// Then the naive implementation of the fmod function with a simple +// for/while loop: +// while (e_x > e_y) { +// m_x *= 2; --e_x; // m_x * 2^e_x == 2 * m_x * 2^(e_x - 1) +// m_x %= m_y; +// } +// On the other hand, the algorithm exploits the fact that m_x, m_y are the +// mantissas of floating point numbers, which use less bits than the storage +// integers: 24 / 32 for floats and 53 / 64 for doubles, so if in each step of +// the iteration, we can left shift m_x as many bits as the storage integer +// type can hold, the exponent reduction per step will be at least 32 - 24 = 8 +// for floats and 64 - 53 = 11 for doubles (double example below): +// while (e_x > e_y) { +// m_x <<= 11; e_x -= 11; // m_x * 2^e_x == 2^11 * m_x * 2^(e_x - 11) +// m_x %= m_y; +// } +// Some extra improvements are done: +// 1) Shift m_y maximum to the right, which can significantly improve +// performance for small integer numbers (y = 3 for example). +// The m_x shift in the loop can be 62 instead of 11 for double. +// 2) For some architectures with very slow division, it can be better to +// calculate inverse value ones, and after do multiplication in the loop. +// 3) "likely" special cases are treated specially to improve performance. +// +// Simple example: +// The examples below use byte for simplicity. +// 1) Shift hy maximum to right without losing bits and increase iy value +// m_y = 0b00101100 e_y = 20 after shift m_y = 0b00001011 e_y = 22. +// 2) m_x = m_x % m_y. +// 3) Move m_x maximum to left. Note that after (m_x = m_x % m_y) CLZ in m_x +// is not lower than CLZ in m_y. m_x=0b00001001 e_x = 100, m_x=0b10010000, +// e_x = 100-4 = 96. +// 4) Repeat (2) until e_x == e_y. +// +// Complexity analysis (double): +// Converting x,y to (m_x,e_x),(m_y, e_y): CTZ/shift/AND/OR/if. Loop count: +// (m_x - m_y) / (64 - "length of m_y"). +// max("length of m_y") = 53, +// max(e_x - e_y) = 2048 +// Maximum operation is 186. For rare "unrealistic" cases. +// +// Special cases (double): +// Supposing that case where |y| > 1e-292 and |x/y|<2000 is very common +// special processing is implemented. No m_y alignment, no loop: +// result = (m_x * 2^(e_x - e_y)) % m_y. +// When x and y are both subnormal (rare case but...) the +// result = m_x % m_y. +// Simplified conversion back to double. + +// Exceptional cases handler according to cppreference.com +// https://en.cppreference.com/w/cpp/numeric/math/fmod +// and POSIX standard described in Linux man +// https://man7.org/linux/man-pages/man3/fmod.3p.html +// C standard for the function is not full, so not by default (although it can +// be implemented in another handler. +// Signaling NaN converted to quiet NaN with FE_INVALID exception. +// https://www.open-std.org/JTC1/SC22/WG14/www/docs/n1011.htm +template <typename T> struct FModDivisionSimpleHelper { + LIBC_INLINE constexpr static T execute(int exp_diff, int sides_zeroes_count, + T m_x, T m_y) { + while (exp_diff > sides_zeroes_count) { + exp_diff -= sides_zeroes_count; + m_x <<= sides_zeroes_count; + m_x %= m_y; + } + m_x <<= exp_diff; + m_x %= m_y; + return m_x; + } +}; + +template <typename T> struct FModDivisionInvMultHelper { + LIBC_INLINE constexpr static T execute(int exp_diff, int sides_zeroes_count, + T m_x, T m_y) { + constexpr int LENGTH = sizeof(T) * CHAR_BIT; + if (exp_diff > sides_zeroes_count) { + T inv_hy = (cpp::numeric_limits<T>::max() / m_y); + while (exp_diff > sides_zeroes_count) { + exp_diff -= sides_zeroes_count; + T hd = (m_x * inv_hy) >> (LENGTH - sides_zeroes_count); + m_x <<= sides_zeroes_count; + m_x -= hd * m_y; + while (LIBC_UNLIKELY(m_x > m_y)) + m_x -= m_y; + } + T hd = (m_x * inv_hy) >> (LENGTH - exp_diff); + m_x <<= exp_diff; + m_x -= hd * m_y; + while (LIBC_UNLIKELY(m_x > m_y)) + m_x -= m_y; + } else { + m_x <<= exp_diff; + m_x %= m_y; + } + return m_x; + } +}; + +template <typename T, typename U = typename FPBits<T>::StorageType, + typename DivisionHelper = FModDivisionSimpleHelper<U>> +class FMod { + static_assert(cpp::is_floating_point_v<T> && + is_unsigned_integral_or_big_int_v<U> && + (sizeof(U) * CHAR_BIT > FPBits<T>::FRACTION_LEN), + "FMod instantiated with invalid type."); + +private: + using FPB = FPBits<T>; + using StorageType = typename FPB::StorageType; + + LIBC_INLINE static bool pre_check(T x, T y, T &out) { + using FPB = fputil::FPBits<T>; + const T quiet_nan = FPB::quiet_nan().get_val(); + FPB sx(x), sy(y); + if (LIBC_LIKELY(!sy.is_zero() && !sy.is_inf_or_nan() && + !sx.is_inf_or_nan())) + return false; + + if (sx.is_nan() || sy.is_nan()) { + if (sx.is_signaling_nan() || sy.is_signaling_nan()) + fputil::raise_except_if_required(FE_INVALID); + out = quiet_nan; + return true; + } + + if (sx.is_inf() || sy.is_zero()) { + fputil::raise_except_if_required(FE_INVALID); + fputil::set_errno_if_required(EDOM); + out = quiet_nan; + return true; + } + + out = x; + return true; + } + + LIBC_INLINE static constexpr FPB eval_internal(FPB sx, FPB sy) { + + if (LIBC_LIKELY(sx.uintval() <= sy.uintval())) { + if (sx.uintval() < sy.uintval()) + return sx; // |x|<|y| return x + return FPB::zero(); // |x|=|y| return 0.0 + } + + int e_x = sx.get_biased_exponent(); + int e_y = sy.get_biased_exponent(); + + // Most common case where |y| is "very normal" and |x/y| < 2^EXP_LEN + if (LIBC_LIKELY(e_y > int(FPB::FRACTION_LEN) && + e_x - e_y <= int(FPB::EXP_LEN))) { + StorageType m_x = sx.get_explicit_mantissa(); + StorageType m_y = sy.get_explicit_mantissa(); + StorageType d = (e_x == e_y) + ? (m_x - m_y) + : static_cast<StorageType>(m_x << (e_x - e_y)) % m_y; + if (d == 0) + return FPB::zero(); + // iy - 1 because of "zero power" for number with power 1 + return FPB::make_value(d, e_y - 1); + } + // Both subnormal special case. + if (LIBC_UNLIKELY(e_x == 0 && e_y == 0)) { + FPB d; + d.set_mantissa(sx.uintval() % sy.uintval()); + return d; + } + + // Note that hx is not subnormal by conditions above. + U m_x = static_cast<U>(sx.get_explicit_mantissa()); + e_x--; + + U m_y = static_cast<U>(sy.get_explicit_mantissa()); + constexpr int DEFAULT_LEAD_ZEROS = + sizeof(U) * CHAR_BIT - FPB::FRACTION_LEN - 1; + int lead_zeros_m_y = DEFAULT_LEAD_ZEROS; + if (LIBC_LIKELY(e_y > 0)) { + e_y--; + } else { + m_y = static_cast<U>(sy.get_mantissa()); + lead_zeros_m_y = cpp::countl_zero(m_y); + } + + // Assume hy != 0 + int tail_zeros_m_y = cpp::countr_zero(m_y); + int sides_zeroes_count = lead_zeros_m_y + tail_zeros_m_y; + // n > 0 by conditions above + int exp_diff = e_x - e_y; + { + // Shift hy right until the end or n = 0 + int right_shift = exp_diff < tail_zeros_m_y ? exp_diff : tail_zeros_m_y; + m_y >>= right_shift; + exp_diff -= right_shift; + e_y += right_shift; + } + + { + // Shift hx left until the end or n = 0 + int left_shift = + exp_diff < DEFAULT_LEAD_ZEROS ? exp_diff : DEFAULT_LEAD_ZEROS; + m_x <<= left_shift; + exp_diff -= left_shift; + } + + m_x %= m_y; + if (LIBC_UNLIKELY(m_x == 0)) + return FPB::zero(); + + if (exp_diff == 0) + return FPB::make_value(static_cast<StorageType>(m_x), e_y); + + // hx next can't be 0, because hx < hy, hy % 2 == 1 hx * 2^i % hy != 0 + m_x = DivisionHelper::execute(exp_diff, sides_zeroes_count, m_x, m_y); + return FPB::make_value(static_cast<StorageType>(m_x), e_y); + } + +public: + LIBC_INLINE static T eval(T x, T y) { + if (T out; LIBC_UNLIKELY(pre_check(x, y, out))) + return out; + FPB sx(x), sy(y); + Sign sign = sx.sign(); + sx.set_sign(Sign::POS); + sy.set_sign(Sign::POS); + FPB result = eval_internal(sx, sy); + result.set_sign(sign); + return result.get_val(); + } +}; + +} // namespace generic +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_FMOD_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/README.md b/contrib/llvm-project/libc/src/__support/FPUtil/generic/README.md new file mode 100644 index 000000000000..e45812cfe120 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/README.md @@ -0,0 +1,28 @@ +This directory contains machine independent implementations of floating point +operations. The implementations are nested in the namespace +`LIBC_NAMESPACE::fputil::generic`. This is to facilitate calling these generic +implementations from machine dependent implementations. Consider the example of +the fuse-multiply-add operation (FMA). The C standard library requires three +different flavors, `fma` which operates double precision numbers, `fmaf` which +operates on single precision numbers, and `fmal` which operates on `long double` +numbers. On aarch64, there are hardware instructions which implement the single +and double precision flavors but not the `long double` flavor. For such targets, +we want to be able to call the generic `long double` implementation from the +`long double` flavor. By putting the generic implementations in a separate +nested namespace, we will be to call them as follows: + +``` +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +long double fmal(long double x, long double y, long double z) { + return generic::fmal(x, y, z); +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL +``` + +Note that actual code might not be as straightforward as above (for example, +we might want to prevent implicit type promotions by using some template +facilities). But, the general idea is very similar. diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/add_sub.h b/contrib/llvm-project/libc/src/__support/FPUtil/generic/add_sub.h new file mode 100644 index 000000000000..fda702931ef6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/add_sub.h @@ -0,0 +1,209 @@ +//===-- Add and subtract IEEE 754 floating-point numbers --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_ADD_SUB_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_ADD_SUB_H + +#include "hdr/fenv_macros.h" +#include "src/__support/CPP/algorithm.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/cast.h" +#include "src/__support/FPUtil/dyadic_float.h" +#include "src/__support/FPUtil/rounding_mode.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil::generic { + +template <bool IsSub, typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +add_or_sub(InType x, InType y) { + using OutFPBits = FPBits<OutType>; + using OutStorageType = typename OutFPBits::StorageType; + using InFPBits = FPBits<InType>; + using InStorageType = typename InFPBits::StorageType; + + constexpr int GUARD_BITS_LEN = 3; + constexpr int RESULT_FRACTION_LEN = InFPBits::FRACTION_LEN + GUARD_BITS_LEN; + constexpr int RESULT_MANTISSA_LEN = RESULT_FRACTION_LEN + 1; + + using DyadicFloat = + DyadicFloat<cpp::bit_ceil(static_cast<size_t>(RESULT_MANTISSA_LEN))>; + + InFPBits x_bits(x); + InFPBits y_bits(y); + + bool is_effectively_add = (x_bits.sign() == y_bits.sign()) != IsSub; + + if (LIBC_UNLIKELY(x_bits.is_inf_or_nan() || y_bits.is_inf_or_nan() || + x_bits.is_zero() || y_bits.is_zero())) { + if (x_bits.is_nan() || y_bits.is_nan()) { + if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan()) + raise_except_if_required(FE_INVALID); + + if (x_bits.is_quiet_nan()) { + InStorageType x_payload = x_bits.get_mantissa(); + x_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(x_bits.sign(), + static_cast<OutStorageType>(x_payload)) + .get_val(); + } + + if (y_bits.is_quiet_nan()) { + InStorageType y_payload = y_bits.get_mantissa(); + y_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(y_bits.sign(), + static_cast<OutStorageType>(y_payload)) + .get_val(); + } + + return OutFPBits::quiet_nan().get_val(); + } + + if (x_bits.is_inf()) { + if (y_bits.is_inf()) { + if (!is_effectively_add) { + raise_except_if_required(FE_INVALID); + return OutFPBits::quiet_nan().get_val(); + } + + return OutFPBits::inf(x_bits.sign()).get_val(); + } + + return OutFPBits::inf(x_bits.sign()).get_val(); + } + + if (y_bits.is_inf()) + return OutFPBits::inf(y_bits.sign()).get_val(); + + if (x_bits.is_zero()) { + if (y_bits.is_zero()) { + switch (quick_get_round()) { + case FE_DOWNWARD: + return OutFPBits::zero(Sign::NEG).get_val(); + default: + return OutFPBits::zero(Sign::POS).get_val(); + } + } + + // volatile prevents Clang from converting tmp to OutType and then + // immediately back to InType before negating it, resulting in double + // rounding. + volatile InType tmp = y; + if constexpr (IsSub) + tmp = -tmp; + return cast<OutType>(tmp); + } + + if (y_bits.is_zero()) + return cast<OutType>(x); + } + + InType x_abs = x_bits.abs().get_val(); + InType y_abs = y_bits.abs().get_val(); + + if (x_abs == y_abs && !is_effectively_add) { + switch (quick_get_round()) { + case FE_DOWNWARD: + return OutFPBits::zero(Sign::NEG).get_val(); + default: + return OutFPBits::zero(Sign::POS).get_val(); + } + } + + Sign result_sign = Sign::POS; + + if (x_abs > y_abs) { + result_sign = x_bits.sign(); + } else if (x_abs < y_abs) { + if (is_effectively_add) + result_sign = y_bits.sign(); + else if (y_bits.is_pos()) + result_sign = Sign::NEG; + } else if (is_effectively_add) { + result_sign = x_bits.sign(); + } + + InFPBits max_bits(cpp::max(x_abs, y_abs)); + InFPBits min_bits(cpp::min(x_abs, y_abs)); + + InStorageType result_mant; + + if (max_bits.is_subnormal()) { + // min_bits must be subnormal too. + + if (is_effectively_add) + result_mant = max_bits.get_mantissa() + min_bits.get_mantissa(); + else + result_mant = max_bits.get_mantissa() - min_bits.get_mantissa(); + + result_mant <<= GUARD_BITS_LEN; + } else { + InStorageType max_mant = max_bits.get_explicit_mantissa() << GUARD_BITS_LEN; + InStorageType min_mant = min_bits.get_explicit_mantissa() << GUARD_BITS_LEN; + + int alignment = (max_bits.get_biased_exponent() - max_bits.is_normal()) - + (min_bits.get_biased_exponent() - min_bits.is_normal()); + + InStorageType aligned_min_mant = + min_mant >> cpp::min(alignment, RESULT_MANTISSA_LEN); + bool aligned_min_mant_sticky; + + if (alignment <= GUARD_BITS_LEN) + aligned_min_mant_sticky = false; + else if (alignment > InFPBits::FRACTION_LEN + GUARD_BITS_LEN) + aligned_min_mant_sticky = true; + else + aligned_min_mant_sticky = + (static_cast<InStorageType>( + min_mant << (InFPBits::STORAGE_LEN - alignment))) != 0; + + InStorageType min_mant_sticky(static_cast<int>(aligned_min_mant_sticky)); + + if (is_effectively_add) + result_mant = max_mant + (aligned_min_mant | min_mant_sticky); + else + result_mant = max_mant - (aligned_min_mant | min_mant_sticky); + } + + int result_exp = max_bits.get_explicit_exponent() - RESULT_FRACTION_LEN; + DyadicFloat result(result_sign, result_exp, result_mant); + return result.template as<OutType, /*ShouldSignalExceptions=*/true>(); +} + +template <typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +add(InType x, InType y) { + return add_or_sub</*IsSub=*/false, OutType>(x, y); +} + +template <typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +sub(InType x, InType y) { + return add_or_sub</*IsSub=*/true, OutType>(x, y); +} + +} // namespace fputil::generic +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_ADD_SUB_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/div.h b/contrib/llvm-project/libc/src/__support/FPUtil/generic/div.h new file mode 100644 index 000000000000..f0e405772e9f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/div.h @@ -0,0 +1,126 @@ +//===-- Division of IEEE 754 floating-point numbers -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_DIV_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_DIV_H + +#include "hdr/errno_macros.h" +#include "hdr/fenv_macros.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/dyadic_float.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil::generic { + +template <typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +div(InType x, InType y) { + using OutFPBits = FPBits<OutType>; + using OutStorageType = typename OutFPBits::StorageType; + using InFPBits = FPBits<InType>; + using InStorageType = typename InFPBits::StorageType; + using DyadicFloat = + DyadicFloat<cpp::bit_ceil(static_cast<size_t>(InFPBits::SIG_LEN + 1))>; + + InFPBits x_bits(x); + InFPBits y_bits(y); + + Sign result_sign = x_bits.sign() == y_bits.sign() ? Sign::POS : Sign::NEG; + + if (LIBC_UNLIKELY(x_bits.is_inf_or_nan() || y_bits.is_inf_or_nan() || + x_bits.is_zero() || y_bits.is_zero())) { + if (x_bits.is_nan() || y_bits.is_nan()) { + if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan()) + raise_except_if_required(FE_INVALID); + + if (x_bits.is_quiet_nan()) { + InStorageType x_payload = x_bits.get_mantissa(); + x_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(x_bits.sign(), + static_cast<OutStorageType>(x_payload)) + .get_val(); + } + + if (y_bits.is_quiet_nan()) { + InStorageType y_payload = y_bits.get_mantissa(); + y_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(y_bits.sign(), + static_cast<OutStorageType>(y_payload)) + .get_val(); + } + + return OutFPBits::quiet_nan().get_val(); + } + + if (x_bits.is_inf()) { + if (y_bits.is_inf()) { + set_errno_if_required(EDOM); + raise_except_if_required(FE_INVALID); + return OutFPBits::quiet_nan().get_val(); + } + + return OutFPBits::inf(result_sign).get_val(); + } + + if (y_bits.is_inf()) + return OutFPBits::inf(result_sign).get_val(); + + if (y_bits.is_zero()) { + if (x_bits.is_zero()) { + raise_except_if_required(FE_INVALID); + return OutFPBits::quiet_nan().get_val(); + } + + raise_except_if_required(FE_DIVBYZERO); + return OutFPBits::inf(result_sign).get_val(); + } + + if (x_bits.is_zero()) + return OutFPBits::zero(result_sign).get_val(); + } + + DyadicFloat xd(x); + DyadicFloat yd(y); + + // Number of iterations = full output precision + 1 rounding bit + 1 potential + // leading 0. + constexpr int NUM_ITERS = OutFPBits::FRACTION_LEN + 3; + int result_exp = xd.exponent - yd.exponent - (NUM_ITERS - 1); + + InStorageType q = 0; + InStorageType r = static_cast<InStorageType>(xd.mantissa >> 2); + InStorageType yd_mant_in = static_cast<InStorageType>(yd.mantissa >> 1); + + for (int i = 0; i < NUM_ITERS; ++i) { + q <<= 1; + r <<= 1; + if (r >= yd_mant_in) { + q += 1; + r -= yd_mant_in; + } + } + + DyadicFloat result(result_sign, result_exp, q); + result.mantissa |= static_cast<unsigned int>(r != 0); + return result.template as<OutType, /*ShouldSignalExceptions=*/true>(); +} + +} // namespace fputil::generic +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_DIV_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/mul.h b/contrib/llvm-project/libc/src/__support/FPUtil/generic/mul.h new file mode 100644 index 000000000000..20d9a7779276 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/mul.h @@ -0,0 +1,105 @@ +//===-- Multiplication of IEEE 754 floating-point numbers -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_MUL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_MUL_H + +#include "hdr/errno_macros.h" +#include "hdr/fenv_macros.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/dyadic_float.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil::generic { + +template <typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +mul(InType x, InType y) { + using OutFPBits = FPBits<OutType>; + using OutStorageType = typename OutFPBits::StorageType; + using InFPBits = FPBits<InType>; + using InStorageType = typename InFPBits::StorageType; + // The product of two p-digit numbers is a 2p-digit number. + using DyadicFloat = + DyadicFloat<cpp::bit_ceil(2 * static_cast<size_t>(InFPBits::SIG_LEN))>; + + InFPBits x_bits(x); + InFPBits y_bits(y); + + Sign result_sign = x_bits.sign() == y_bits.sign() ? Sign::POS : Sign::NEG; + + if (LIBC_UNLIKELY(x_bits.is_inf_or_nan() || y_bits.is_inf_or_nan() || + x_bits.is_zero() || y_bits.is_zero())) { + if (x_bits.is_nan() || y_bits.is_nan()) { + if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan()) + raise_except_if_required(FE_INVALID); + + if (x_bits.is_quiet_nan()) { + InStorageType x_payload = x_bits.get_mantissa(); + x_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(x_bits.sign(), + static_cast<OutStorageType>(x_payload)) + .get_val(); + } + + if (y_bits.is_quiet_nan()) { + InStorageType y_payload = y_bits.get_mantissa(); + y_payload >>= InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN; + return OutFPBits::quiet_nan(y_bits.sign(), + static_cast<OutStorageType>(y_payload)) + .get_val(); + } + + return OutFPBits::quiet_nan().get_val(); + } + + if (x_bits.is_inf()) { + if (y_bits.is_zero()) { + set_errno_if_required(EDOM); + raise_except_if_required(FE_INVALID); + return OutFPBits::quiet_nan().get_val(); + } + + return OutFPBits::inf(result_sign).get_val(); + } + + if (y_bits.is_inf()) { + if (x_bits.is_zero()) { + set_errno_if_required(EDOM); + raise_except_if_required(FE_INVALID); + return OutFPBits::quiet_nan().get_val(); + } + + return OutFPBits::inf(result_sign).get_val(); + } + + // Now either x or y is zero, and the other one is finite. + return OutFPBits::zero(result_sign).get_val(); + } + + DyadicFloat xd(x); + DyadicFloat yd(y); + + DyadicFloat result = quick_mul(xd, yd); + return result.template as<OutType, /*ShouldSignalExceptions=*/true>(); +} + +} // namespace fputil::generic +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_MUL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/sqrt.h b/contrib/llvm-project/libc/src/__support/FPUtil/generic/sqrt.h new file mode 100644 index 000000000000..497ebd145c6b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/sqrt.h @@ -0,0 +1,171 @@ +//===-- Square root of IEEE 754 floating point numbers ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_SQRT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_SQRT_H + +#include "sqrt_80_bit_long_double.h" +#include "src/__support/CPP/bit.h" // countl_zero +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/cast.h" +#include "src/__support/FPUtil/dyadic_float.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/uint128.h" + +#include "hdr/fenv_macros.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +namespace internal { + +template <typename T> struct SpecialLongDouble { + static constexpr bool VALUE = false; +}; + +#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) +template <> struct SpecialLongDouble<long double> { + static constexpr bool VALUE = true; +}; +#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 + +template <typename T> +LIBC_INLINE void normalize(int &exponent, + typename FPBits<T>::StorageType &mantissa) { + const int shift = + cpp::countl_zero(mantissa) - + (8 * static_cast<int>(sizeof(mantissa)) - 1 - FPBits<T>::FRACTION_LEN); + exponent -= shift; + mantissa <<= shift; +} + +#ifdef LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 +template <> +LIBC_INLINE void normalize<long double>(int &exponent, uint64_t &mantissa) { + normalize<double>(exponent, mantissa); +} +#elif !defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) +template <> +LIBC_INLINE void normalize<long double>(int &exponent, UInt128 &mantissa) { + const uint64_t hi_bits = static_cast<uint64_t>(mantissa >> 64); + const int shift = + hi_bits ? (cpp::countl_zero(hi_bits) - 15) + : (cpp::countl_zero(static_cast<uint64_t>(mantissa)) + 49); + exponent -= shift; + mantissa <<= shift; +} +#endif + +} // namespace internal + +// Correctly rounded IEEE 754 SQRT for all rounding modes. +// Shift-and-add algorithm. +template <typename OutType, typename InType> +LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<OutType> && + cpp::is_floating_point_v<InType> && + sizeof(OutType) <= sizeof(InType), + OutType> +sqrt(InType x) { + if constexpr (internal::SpecialLongDouble<OutType>::VALUE && + internal::SpecialLongDouble<InType>::VALUE) { + // Special 80-bit long double. + return x86::sqrt(x); + } else { + // IEEE floating points formats. + using OutFPBits = FPBits<OutType>; + using InFPBits = FPBits<InType>; + using InStorageType = typename InFPBits::StorageType; + using DyadicFloat = + DyadicFloat<cpp::bit_ceil(static_cast<size_t>(InFPBits::STORAGE_LEN))>; + + constexpr InStorageType ONE = InStorageType(1) << InFPBits::FRACTION_LEN; + constexpr auto FLT_NAN = OutFPBits::quiet_nan().get_val(); + + InFPBits bits(x); + + if (bits == InFPBits::inf(Sign::POS) || bits.is_zero() || bits.is_nan()) { + // sqrt(+Inf) = +Inf + // sqrt(+0) = +0 + // sqrt(-0) = -0 + // sqrt(NaN) = NaN + // sqrt(-NaN) = -NaN + return cast<OutType>(x); + } else if (bits.is_neg()) { + // sqrt(-Inf) = NaN + // sqrt(-x) = NaN + return FLT_NAN; + } else { + int x_exp = bits.get_exponent(); + InStorageType x_mant = bits.get_mantissa(); + + // Step 1a: Normalize denormal input and append hidden bit to the mantissa + if (bits.is_subnormal()) { + ++x_exp; // let x_exp be the correct exponent of ONE bit. + internal::normalize<InType>(x_exp, x_mant); + } else { + x_mant |= ONE; + } + + // Step 1b: Make sure the exponent is even. + if (x_exp & 1) { + --x_exp; + x_mant <<= 1; + } + + // After step 1b, x = 2^(x_exp) * x_mant, where x_exp is even, and + // 1 <= x_mant < 4. So sqrt(x) = 2^(x_exp / 2) * y, with 1 <= y < 2. + // Notice that the output of sqrt is always in the normal range. + // To perform shift-and-add algorithm to find y, let denote: + // y(n) = 1.y_1 y_2 ... y_n, we can define the nth residue to be: + // r(n) = 2^n ( x_mant - y(n)^2 ). + // That leads to the following recurrence formula: + // r(n) = 2*r(n-1) - y_n*[ 2*y(n-1) + 2^(-n-1) ] + // with the initial conditions: y(0) = 1, and r(0) = x - 1. + // So the nth digit y_n of the mantissa of sqrt(x) can be found by: + // y_n = 1 if 2*r(n-1) >= 2*y(n - 1) + 2^(-n-1) + // 0 otherwise. + InStorageType y = ONE; + InStorageType r = x_mant - ONE; + + // TODO: Reduce iteration count to OutFPBits::FRACTION_LEN + 2 or + 3. + for (InStorageType current_bit = ONE >> 1; current_bit; + current_bit >>= 1) { + r <<= 1; + // 2*y(n - 1) + 2^(-n-1) + InStorageType tmp = static_cast<InStorageType>((y << 1) + current_bit); + if (r >= tmp) { + r -= tmp; + y += current_bit; + } + } + + // We compute one more iteration in order to round correctly. + r <<= 2; + y <<= 2; + InStorageType tmp = y + 1; + if (r >= tmp) { + r -= tmp; + // Rounding bit. + y |= 2; + } + // Sticky bit. + y |= static_cast<unsigned int>(r != 0); + + DyadicFloat yd(Sign::POS, (x_exp >> 1) - 2 - InFPBits::FRACTION_LEN, y); + return yd.template as<OutType, /*ShouldSignalExceptions=*/true>(); + } + } +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_SQRT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/generic/sqrt_80_bit_long_double.h b/contrib/llvm-project/libc/src/__support/FPUtil/generic/sqrt_80_bit_long_double.h new file mode 100644 index 000000000000..0ba836d17a08 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/generic/sqrt_80_bit_long_double.h @@ -0,0 +1,141 @@ +//===-- Square root of x86 long double numbers ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_SQRT_80_BIT_LONG_DOUBLE_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_SQRT_80_BIT_LONG_DOUBLE_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/rounding_mode.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/uint128.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { +namespace x86 { + +LIBC_INLINE void normalize(int &exponent, + FPBits<long double>::StorageType &mantissa) { + const unsigned int shift = static_cast<unsigned int>( + static_cast<size_t>(cpp::countl_zero(static_cast<uint64_t>(mantissa))) - + (8 * sizeof(uint64_t) - 1 - FPBits<long double>::FRACTION_LEN)); + exponent -= shift; + mantissa <<= shift; +} + +// if constexpr statement in sqrt.h still requires x86::sqrt to be declared +// even when it's not used. +LIBC_INLINE long double sqrt(long double x); + +// Correctly rounded SQRT for all rounding modes. +// Shift-and-add algorithm. +#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) +LIBC_INLINE long double sqrt(long double x) { + using LDBits = FPBits<long double>; + using StorageType = typename LDBits::StorageType; + constexpr StorageType ONE = StorageType(1) << int(LDBits::FRACTION_LEN); + constexpr auto LDNAN = LDBits::quiet_nan().get_val(); + + LDBits bits(x); + + if (bits == LDBits::inf(Sign::POS) || bits.is_zero() || bits.is_nan()) { + // sqrt(+Inf) = +Inf + // sqrt(+0) = +0 + // sqrt(-0) = -0 + // sqrt(NaN) = NaN + // sqrt(-NaN) = -NaN + return x; + } else if (bits.is_neg()) { + // sqrt(-Inf) = NaN + // sqrt(-x) = NaN + return LDNAN; + } else { + int x_exp = bits.get_explicit_exponent(); + StorageType x_mant = bits.get_mantissa(); + + // Step 1a: Normalize denormal input + if (bits.get_implicit_bit()) { + x_mant |= ONE; + } else if (bits.is_subnormal()) { + normalize(x_exp, x_mant); + } + + // Step 1b: Make sure the exponent is even. + if (x_exp & 1) { + --x_exp; + x_mant <<= 1; + } + + // After step 1b, x = 2^(x_exp) * x_mant, where x_exp is even, and + // 1 <= x_mant < 4. So sqrt(x) = 2^(x_exp / 2) * y, with 1 <= y < 2. + // Notice that the output of sqrt is always in the normal range. + // To perform shift-and-add algorithm to find y, let denote: + // y(n) = 1.y_1 y_2 ... y_n, we can define the nth residue to be: + // r(n) = 2^n ( x_mant - y(n)^2 ). + // That leads to the following recurrence formula: + // r(n) = 2*r(n-1) - y_n*[ 2*y(n-1) + 2^(-n-1) ] + // with the initial conditions: y(0) = 1, and r(0) = x - 1. + // So the nth digit y_n of the mantissa of sqrt(x) can be found by: + // y_n = 1 if 2*r(n-1) >= 2*y(n - 1) + 2^(-n-1) + // 0 otherwise. + StorageType y = ONE; + StorageType r = x_mant - ONE; + + for (StorageType current_bit = ONE >> 1; current_bit; current_bit >>= 1) { + r <<= 1; + StorageType tmp = (y << 1) + current_bit; // 2*y(n - 1) + 2^(-n-1) + if (r >= tmp) { + r -= tmp; + y += current_bit; + } + } + + // We compute one more iteration in order to round correctly. + bool lsb = static_cast<bool>(y & 1); // Least significant bit + bool rb = false; // Round bit + r <<= 2; + StorageType tmp = (y << 2) + 1; + if (r >= tmp) { + r -= tmp; + rb = true; + } + + // Append the exponent field. + x_exp = ((x_exp >> 1) + LDBits::EXP_BIAS); + y |= (static_cast<StorageType>(x_exp) << (LDBits::FRACTION_LEN + 1)); + + switch (quick_get_round()) { + case FE_TONEAREST: + // Round to nearest, ties to even + if (rb && (lsb || (r != 0))) + ++y; + break; + case FE_UPWARD: + if (rb || (r != 0)) + ++y; + break; + } + + // Extract output + FPBits<long double> out(0.0L); + out.set_biased_exponent(x_exp); + out.set_implicit_bit(1); + out.set_mantissa((y & (ONE - 1))); + + return out.get_val(); + } +} +#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 + +} // namespace x86 +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_GENERIC_SQRT_80_BIT_LONG_DOUBLE_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/multiply_add.h b/contrib/llvm-project/libc/src/__support/FPUtil/multiply_add.h new file mode 100644 index 000000000000..8260702e2c9f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/multiply_add.h @@ -0,0 +1,74 @@ +//===-- Common header for multiply-add implementations ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_MULTIPLY_ADD_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_MULTIPLY_ADD_H + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" // LIBC_TARGET_CPU_HAS_FMA + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +// Implement a simple wrapper for multiply-add operation: +// multiply_add(x, y, z) = x*y + z +// which uses FMA instructions to speed up if available. + +template <typename T> +LIBC_INLINE cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T> +multiply_add(const T &x, const T &y, const T &z) { + return x * y + z; +} + +template <typename T> +LIBC_INLINE cpp::enable_if_t<(sizeof(T) <= sizeof(void *)), T> +multiply_add(T x, T y, T z) { + return x * y + z; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#if defined(LIBC_TARGET_CPU_HAS_FMA) + +// FMA instructions are available. +// We use builtins directly instead of including FMA.h to avoid a circular +// dependency: multiply_add.h -> FMA.h -> generic/FMA.h -> dyadic_float.h. + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +#ifdef LIBC_TARGET_CPU_HAS_FMA_FLOAT +LIBC_INLINE float multiply_add(float x, float y, float z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else + return __builtin_fmaf(x, y, z); +#endif +} +#endif // LIBC_TARGET_CPU_HAS_FMA_FLOAT + +#ifdef LIBC_TARGET_CPU_HAS_FMA_DOUBLE +LIBC_INLINE double multiply_add(double x, double y, double z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else + return __builtin_fma(x, y, z); +#endif +} +#endif // LIBC_TARGET_CPU_HAS_FMA_DOUBLE + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TARGET_CPU_HAS_FMA + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_MULTIPLY_ADD_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/nearest_integer.h b/contrib/llvm-project/libc/src/__support/FPUtil/nearest_integer.h new file mode 100644 index 000000000000..768f13414bd9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/nearest_integer.h @@ -0,0 +1,79 @@ +//===-- Fast rounding to nearest integer for floating point -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_NEAREST_INTEGER_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_NEAREST_INTEGER_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" + +#if (defined(LIBC_TARGET_ARCH_IS_X86_64) && defined(LIBC_TARGET_CPU_HAS_SSE4_2)) +#include "x86_64/nearest_integer.h" +#elif (defined(LIBC_TARGET_ARCH_IS_AARCH64) && defined(__ARM_FP)) +#include "aarch64/nearest_integer.h" +#elif defined(LIBC_TARGET_ARCH_IS_GPU) + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +LIBC_INLINE float nearest_integer(float x) { return __builtin_rintf(x); } + +LIBC_INLINE double nearest_integer(double x) { return __builtin_rint(x); } + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#else + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +// This is a fast implementation for rounding to a nearest integer that. +// +// Notice that for AARCH64 and x86-64 with SSE4.2 support, we will use their +// corresponding rounding instruction instead. And in those cases, the results +// are rounded to the nearest integer, tie-to-even. +LIBC_INLINE float nearest_integer(float x) { + if (x < 0x1p24f && x > -0x1p24f) { + float r = x < 0 ? (x - 0x1.0p23f) + 0x1.0p23f : (x + 0x1.0p23f) - 0x1.0p23f; + float diff = x - r; + // The expression above is correct for the default rounding mode, round-to- + // nearest, tie-to-even. For other rounding modes, it might be off by 1, + // which is corrected below. + if (LIBC_UNLIKELY(diff > 0.5f)) + return r + 1.0f; + if (LIBC_UNLIKELY(diff < -0.5f)) + return r - 1.0f; + return r; + } + return x; +} + +LIBC_INLINE double nearest_integer(double x) { + if (x < 0x1p53 && x > -0x1p53) { + double r = x < 0 ? (x - 0x1.0p52) + 0x1.0p52 : (x + 0x1.0p52) - 0x1.0p52; + double diff = x - r; + // The expression above is correct for the default rounding mode, round-to- + // nearest, tie-to-even. For other rounding modes, it might be off by 1, + // which is corrected below. + if (LIBC_UNLIKELY(diff > 0.5)) + return r + 1.0; + if (LIBC_UNLIKELY(diff < -0.5)) + return r - 1.0; + return r; + } + return x; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_NEAREST_INTEGER_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/riscv/FEnvImpl.h b/contrib/llvm-project/libc/src/__support/FPUtil/riscv/FEnvImpl.h new file mode 100644 index 000000000000..2f525eb5dac5 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/riscv/FEnvImpl.h @@ -0,0 +1,181 @@ +//===-- riscv floating point env manipulation functions ---------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_RISCV_FENVIMPL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_RISCV_FENVIMPL_H + +#include "hdr/fenv_macros.h" +#include "hdr/types/fenv_t.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/macros/attributes.h" // For LIBC_INLINE_ASM +#include "src/__support/macros/config.h" // For LIBC_INLINE + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +struct FEnv { + // We will ignore RMM and DYN rounding modes. + static constexpr uint32_t TONEAREST = 0x0; + static constexpr uint32_t TOWARDZERO = 0x1; + static constexpr uint32_t DOWNWARD = 0x2; + static constexpr uint32_t UPWARD = 0x3; + + // These are the bit locations of the corresponding exceptions in fcsr. + static constexpr uint32_t INEXACT = 0x1; + static constexpr uint32_t UNDERFLOW = 0x2; + static constexpr uint32_t OVERFLOW = 0x4; + static constexpr uint32_t DIVBYZERO = 0x8; + static constexpr uint32_t INVALID = 0x10; + + LIBC_INLINE static uint32_t get_frm() { + unsigned int rm; + LIBC_INLINE_ASM("frrm %0\n\t" : "=r"(rm)); + return rm; + } + + LIBC_INLINE static void set_frm(uint32_t rm) { + LIBC_INLINE_ASM("fsrm %0, %0\n\t" : "+r"(rm)); + } + + LIBC_INLINE static uint32_t get_fflags() { + unsigned int flags; + LIBC_INLINE_ASM("frflags %0\n\t" : "=r"(flags)); + return flags; + } + + LIBC_INLINE static void set_fflags(uint32_t flags) { + LIBC_INLINE_ASM("fsflags %0, %0\n\t" : "+r"(flags)); + } + + LIBC_INLINE static uint32_t get_fcsr() { + unsigned int fcsr; + LIBC_INLINE_ASM("frcsr %0\n\t" : "=r"(fcsr)); + return fcsr; + } + + LIBC_INLINE static void set_fcsr(uint32_t fcsr) { + LIBC_INLINE_ASM("fscsr %0, %0\n\t" : "+r"(fcsr)); + } + + LIBC_INLINE static int exception_bits_to_macro(uint32_t status) { + return ((status & INVALID) ? FE_INVALID : 0) | + ((status & DIVBYZERO) ? FE_DIVBYZERO : 0) | + ((status & OVERFLOW) ? FE_OVERFLOW : 0) | + ((status & UNDERFLOW) ? FE_UNDERFLOW : 0) | + ((status & INEXACT) ? FE_INEXACT : 0); + } + + LIBC_INLINE static uint32_t exception_macro_to_bits(int except) { + return ((except & FE_INVALID) ? INVALID : 0) | + ((except & FE_DIVBYZERO) ? DIVBYZERO : 0) | + ((except & FE_OVERFLOW) ? OVERFLOW : 0) | + ((except & FE_UNDERFLOW) ? UNDERFLOW : 0) | + ((except & FE_INEXACT) ? INEXACT : 0); + } +}; + +// Since RISCV does not have exception enable bits, we will just return +// the failure indicator. +LIBC_INLINE int enable_except(int) { return -1; } + +// Always succeed. +LIBC_INLINE int disable_except(int) { return 0; } + +// Always return "no exceptions enabled". +LIBC_INLINE int get_except() { return 0; } + +LIBC_INLINE int clear_except(int excepts) { + uint32_t flags = FEnv::get_fflags(); + uint32_t to_clear = FEnv::exception_macro_to_bits(excepts); + flags &= ~to_clear; + FEnv::set_fflags(flags); + return 0; +} + +LIBC_INLINE int test_except(int excepts) { + uint32_t to_test = FEnv::exception_macro_to_bits(excepts); + uint32_t flags = FEnv::get_fflags(); + return FEnv::exception_bits_to_macro(flags & to_test); +} + +LIBC_INLINE int set_except(int excepts) { + uint32_t flags = FEnv::get_fflags(); + FEnv::set_fflags(flags | FEnv::exception_macro_to_bits(excepts)); + return 0; +} + +LIBC_INLINE int raise_except(int excepts) { + // Since there are no traps, we just set the exception flags. + uint32_t flags = FEnv::get_fflags(); + FEnv::set_fflags(flags | FEnv::exception_macro_to_bits(excepts)); + return 0; +} + +LIBC_INLINE int get_round() { + uint32_t rm = FEnv::get_frm(); + switch (rm) { + case FEnv::TONEAREST: + return FE_TONEAREST; + case FEnv::DOWNWARD: + return FE_DOWNWARD; + case FEnv::UPWARD: + return FE_UPWARD; + case FEnv::TOWARDZERO: + return FE_TOWARDZERO; + default: + return -1; // Error value. + } + return 0; +} + +LIBC_INLINE int set_round(int mode) { + uint32_t rm; + switch (mode) { + case FE_TONEAREST: + rm = FEnv::TONEAREST; + break; + case FE_DOWNWARD: + rm = FEnv::DOWNWARD; + break; + case FE_UPWARD: + rm = FEnv::UPWARD; + break; + case FE_TOWARDZERO: + rm = FEnv::TOWARDZERO; + break; + default: + return -1; // To indicate failure + } + FEnv::set_frm(rm); + return 0; +} + +LIBC_INLINE int get_env(fenv_t *envp) { + uint32_t *state = reinterpret_cast<uint32_t *>(envp); + *state = FEnv::get_fcsr(); + return 0; +} + +LIBC_INLINE int set_env(const fenv_t *envp) { + if (envp == FE_DFL_ENV) { + FEnv::set_frm(FEnv::TONEAREST); + FEnv::set_fflags(0); + return 0; + } + uint32_t status = *reinterpret_cast<const uint32_t *>(envp); + // We have to do the masking to preserve the reserved bits. + FEnv::set_fcsr((status & 0xFF) | (FEnv::get_fcsr() & 0xFFFFFF00)); + return 0; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_RISCV_FENVIMPL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/riscv/sqrt.h b/contrib/llvm-project/libc/src/__support/FPUtil/riscv/sqrt.h new file mode 100644 index 000000000000..8cff03a9fc73 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/riscv/sqrt.h @@ -0,0 +1,45 @@ +//===-- Square root of IEEE 754 floating point numbers ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_RISCV_SQRT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_RISCV_SQRT_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" + +#if !defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) +#error "Invalid include" +#endif + +#include "src/__support/FPUtil/generic/sqrt.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +#ifdef LIBC_TARGET_CPU_HAS_FPU_FLOAT +template <> LIBC_INLINE float sqrt<float>(float x) { + float result; + asm("fsqrt.s %0, %1\n\t" : "=f"(result) : "f"(x)); + return result; +} +#endif // LIBC_TARGET_CPU_HAS_FPU_FLOAT + +#ifdef LIBC_TARGET_CPU_HAS_FPU_DOUBLE +template <> LIBC_INLINE double sqrt<double>(double x) { + double result; + asm("fsqrt.d %0, %1\n\t" : "=f"(result) : "f"(x)); + return result; +} +#endif // LIBC_TARGET_CPU_HAS_FPU_FLOAT + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_RISCV_SQRT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/rounding_mode.h b/contrib/llvm-project/libc/src/__support/FPUtil/rounding_mode.h new file mode 100644 index 000000000000..bc66d09b9416 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/rounding_mode.h @@ -0,0 +1,81 @@ +//===---- Free-standing function to detect rounding mode --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_ROUNDING_MODE_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_ROUNDING_MODE_H + +#include "hdr/fenv_macros.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +// Quick free-standing test whether fegetround() == FE_UPWARD. +// Using the following observation: +// 1.0f + 2^-25 = 1.0f for FE_TONEAREST, FE_DOWNWARD, FE_TOWARDZERO +// = 0x1.000002f for FE_UPWARD. +LIBC_INLINE bool fenv_is_round_up() { + volatile float x = 0x1.0p-25f; + return (1.0f + x != 1.0f); +} + +// Quick free-standing test whether fegetround() == FE_DOWNWARD. +// Using the following observation: +// -1.0f - 2^-25 = -1.0f for FE_TONEAREST, FE_UPWARD, FE_TOWARDZERO +// = -0x1.000002f for FE_DOWNWARD. +LIBC_INLINE bool fenv_is_round_down() { + volatile float x = 0x1.0p-25f; + return (-1.0f - x != -1.0f); +} + +// Quick free-standing test whether fegetround() == FE_TONEAREST. +// Using the following observation: +// 1.5f + 2^-24 = 1.5f for FE_TONEAREST, FE_DOWNWARD, FE_TOWARDZERO +// = 0x1.100002p0f for FE_UPWARD, +// 1.5f - 2^-24 = 1.5f for FE_TONEAREST, FE_UPWARD +// = 0x1.0ffffep-1f for FE_DOWNWARD, FE_TOWARDZERO +LIBC_INLINE bool fenv_is_round_to_nearest() { + static volatile float x = 0x1.0p-24f; + float y = x; + return (1.5f + y == 1.5f - y); +} + +// Quick free-standing test whether fegetround() == FE_TOWARDZERO. +// Using the following observation: +// 1.0f + 2^-23 + 2^-24 = 0x1.000002p0f for FE_DOWNWARD, FE_TOWARDZERO +// = 0x1.000004p0f for FE_TONEAREST, FE_UPWARD, +// -1.0f - 2^-24 = -1.0f for FE_TONEAREST, FE_UPWARD, FE_TOWARDZERO +// = -0x1.000002p0f for FE_DOWNWARD +// So: +// (0x1.000002p0f + 2^-24) + (-1.0f - 2^-24) = 2^-23 for FE_TOWARDZERO +// = 2^-22 for FE_TONEAREST, FE_UPWARD +// = 0 for FE_DOWNWARD +LIBC_INLINE bool fenv_is_round_to_zero() { + static volatile float x = 0x1.0p-24f; + float y = x; + return ((0x1.000002p0f + y) + (-1.0f - y) == 0x1.0p-23f); +} + +// Quick free standing get rounding mode based on the above observations. +LIBC_INLINE int quick_get_round() { + static volatile float x = 0x1.0p-24f; + float y = x; + float z = (0x1.000002p0f + y) + (-1.0f - y); + + if (z == 0.0f) + return FE_DOWNWARD; + if (z == 0x1.0p-23f) + return FE_TOWARDZERO; + return (2.0f + y == 2.0f) ? FE_TONEAREST : FE_UPWARD; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_ROUNDING_MODE_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/sqrt.h b/contrib/llvm-project/libc/src/__support/FPUtil/sqrt.h new file mode 100644 index 000000000000..d4ed744b4010 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/sqrt.h @@ -0,0 +1,65 @@ +//===-- Square root of IEEE 754 floating point numbers ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_SQRT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_SQRT_H + +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" + +#include "src/__support/FPUtil/generic/sqrt.h" + +// Generic instruction specializations with __builtin_elementwise_sqrt. +#if defined(LIBC_TARGET_CPU_HAS_FPU_FLOAT) || \ + defined(LIBC_TARGET_CPU_HAS_FPU_DOUBLE) + +#if __has_builtin(__builtin_elementwise_sqrt) + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +#ifdef LIBC_TARGET_CPU_HAS_FPU_FLOAT +template <> LIBC_INLINE float sqrt<float>(float x) { + return __builtin_elementwise_sqrt(x); +} +#endif // LIBC_TARGET_CPU_HAS_FPU_FLOAT + +#ifdef LIBC_TARGET_CPU_HAS_FPU_DOUBLE +template <> LIBC_INLINE double sqrt<double>(double x) { + return __builtin_elementwise_sqrt(x); +} +#endif // LIBC_TARGET_CPU_HAS_FPU_DOUBLE + +// Use 80-bit long double instruction on x86. +// https://godbolt.org/z/oWEaj6hxK +#ifdef LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 +template <> LIBC_INLINE long double sqrt<long double>(long double x) { + return __builtin_elementwise_sqrt(x); +} +#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#else // __builtin_elementwise_sqrt +// Use inline assembly when __builtin_elementwise_sqrt is not available. +#if defined(LIBC_TARGET_CPU_HAS_SSE2) +#include "x86_64/sqrt.h" +#elif defined(LIBC_TARGET_ARCH_IS_AARCH64) && defined(__ARM_FP) +#include "aarch64/sqrt.h" +#elif defined(LIBC_TARGET_ARCH_IS_ARM) +#include "arm/sqrt.h" +#elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) +#include "riscv/sqrt.h" +#endif // Target specific header of inline asm. + +#endif // __builtin_elementwise_sqrt + +#endif // LIBC_TARGET_CPU_HAS_FPU_FLOAT or DOUBLE + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_SQRT_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/triple_double.h b/contrib/llvm-project/libc/src/__support/FPUtil/triple_double.h new file mode 100644 index 000000000000..f3ac5404ca36 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/triple_double.h @@ -0,0 +1,26 @@ +//===-- Utilities for triple-double data type. ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_TRIPLE_DOUBLE_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_TRIPLE_DOUBLE_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +struct TripleDouble { + double lo = 0.0; + double mid = 0.0; + double hi = 0.0; +}; + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_TRIPLE_DOUBLE_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/FEnvImpl.h b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/FEnvImpl.h new file mode 100644 index 000000000000..560727c22978 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/FEnvImpl.h @@ -0,0 +1,651 @@ +//===-- x86_64 floating point env manipulation functions --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_FENVIMPL_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_FENVIMPL_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !defined(LIBC_TARGET_ARCH_IS_X86) +#error "Invalid include" +#endif + +#include <stdint.h> + +#include "hdr/types/fenv_t.h" +#include "src/__support/macros/sanitizer.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +namespace internal { + +// Normally, one should be able to define FE_* macros to the exact rounding mode +// encodings. However, since we want LLVM libc to be compiled against headers +// from other libcs, we cannot assume that FE_* macros are always defined in +// such a manner. So, we will define enums corresponding to the x86_64 bit +// encodings. The implementations can map from FE_* to the corresponding enum +// values. + +// The rounding control values in the x87 control register and the MXCSR +// register have the same 2-bit enoding but have different bit positions. +// See below for the bit positions. +struct RoundingControlValue { + static constexpr uint16_t TO_NEAREST = 0x0; + static constexpr uint16_t DOWNWARD = 0x1; + static constexpr uint16_t UPWARD = 0x2; + static constexpr uint16_t TOWARD_ZERO = 0x3; +}; + +static constexpr uint16_t X87_ROUNDING_CONTROL_BIT_POSITION = 10; +static constexpr uint16_t MXCSR_ROUNDING_CONTROL_BIT_POSITION = 13; + +// The exception flags in the x87 status register and the MXCSR have the same +// encoding as well as the same bit positions. +struct ExceptionFlags { + static constexpr uint16_t INVALID_F = 0x1; + // Some libcs define __FE_DENORM corresponding to the denormal input + // exception and include it in FE_ALL_EXCEPTS. We define and use it to + // support compiling against headers provided by such libcs. + static constexpr uint16_t DENORMAL_F = 0x2; + static constexpr uint16_t DIV_BY_ZERO_F = 0x4; + static constexpr uint16_t OVERFLOW_F = 0x8; + static constexpr uint16_t UNDERFLOW_F = 0x10; + static constexpr uint16_t INEXACT_F = 0x20; +}; + +// The exception control bits occupy six bits, one bit for each exception. +// In the x87 control word, they occupy the first 6 bits. In the MXCSR +// register, they occupy bits 7 to 12. +static constexpr uint16_t X87_EXCEPTION_CONTROL_BIT_POSITION = 0; +static constexpr uint16_t X87_EXCEPTION_CONTROL_BIT_POSITION_HIGH = 24; +static constexpr uint16_t MXCSR_EXCEPTION_CONTOL_BIT_POISTION = 7; + +// Exception flags are individual bits in the corresponding registers. +// So, we just OR the bit values to get the full set of exceptions. +LIBC_INLINE uint16_t get_status_value_for_except(int excepts) { + // We will make use of the fact that exception control bits are single + // bit flags in the control registers. + return ((excepts & FE_INVALID) ? ExceptionFlags::INVALID_F : 0) | +#ifdef __FE_DENORM + ((excepts & __FE_DENORM) ? ExceptionFlags::DENORMAL_F : 0) | +#endif // __FE_DENORM + ((excepts & FE_DIVBYZERO) ? ExceptionFlags::DIV_BY_ZERO_F : 0) | + ((excepts & FE_OVERFLOW) ? ExceptionFlags::OVERFLOW_F : 0) | + ((excepts & FE_UNDERFLOW) ? ExceptionFlags::UNDERFLOW_F : 0) | + ((excepts & FE_INEXACT) ? ExceptionFlags::INEXACT_F : 0); +} + +LIBC_INLINE int exception_status_to_macro(uint16_t status) { + return ((status & ExceptionFlags::INVALID_F) ? FE_INVALID : 0) | +#ifdef __FE_DENORM + ((status & ExceptionFlags::DENORMAL_F) ? __FE_DENORM : 0) | +#endif // __FE_DENORM + ((status & ExceptionFlags::DIV_BY_ZERO_F) ? FE_DIVBYZERO : 0) | + ((status & ExceptionFlags::OVERFLOW_F) ? FE_OVERFLOW : 0) | + ((status & ExceptionFlags::UNDERFLOW_F) ? FE_UNDERFLOW : 0) | + ((status & ExceptionFlags::INEXACT_F) ? FE_INEXACT : 0); +} + +struct X87StateDescriptor { + uint16_t control_word; + uint16_t unused1; + uint16_t status_word; + uint16_t unused2; + // TODO: Elaborate the remaining 20 bytes as required. + uint32_t _[5]; +}; + +LIBC_INLINE uint16_t get_x87_control_word() { + uint16_t w; + __asm__ __volatile__("fnstcw %0" : "=m"(w)::); + MSAN_UNPOISON(&w, sizeof(w)); + return w; +} + +LIBC_INLINE void write_x87_control_word(uint16_t w) { + __asm__ __volatile__("fldcw %0" : : "m"(w) :); +} + +LIBC_INLINE uint16_t get_x87_status_word() { + uint16_t w; + __asm__ __volatile__("fnstsw %0" : "=m"(w)::); + MSAN_UNPOISON(&w, sizeof(w)); + return w; +} + +LIBC_INLINE void clear_x87_exceptions() { + __asm__ __volatile__("fnclex" : : :); +} + +LIBC_INLINE uint32_t get_mxcsr() { + uint32_t w; + __asm__ __volatile__("stmxcsr %0" : "=m"(w)::); + MSAN_UNPOISON(&w, sizeof(w)); + return w; +} + +LIBC_INLINE void write_mxcsr(uint32_t w) { + __asm__ __volatile__("ldmxcsr %0" : : "m"(w) :); +} + +LIBC_INLINE void get_x87_state_descriptor(X87StateDescriptor &s) { + __asm__ __volatile__("fnstenv %0" : "=m"(s)); + MSAN_UNPOISON(&s, sizeof(s)); +} + +LIBC_INLINE void write_x87_state_descriptor(const X87StateDescriptor &s) { + __asm__ __volatile__("fldenv %0" : : "m"(s) :); +} + +LIBC_INLINE void fwait() { __asm__ __volatile__("fwait"); } + +} // namespace internal + +LIBC_INLINE int enable_except(int excepts) { + // In the x87 control word and in MXCSR, an exception is blocked + // if the corresponding bit is set. That is the reason for all the + // bit-flip operations below as we need to turn the bits to zero + // to enable them. + + uint16_t bit_mask = internal::get_status_value_for_except(excepts); + + uint16_t x87_cw = internal::get_x87_control_word(); + uint16_t old_excepts = ~x87_cw & 0x3F; // Save previously enabled exceptions. + x87_cw &= ~bit_mask; + internal::write_x87_control_word(x87_cw); + + // Enabling SSE exceptions via MXCSR is a nice thing to do but + // might not be of much use practically as SSE exceptions and the x87 + // exceptions are independent of each other. + uint32_t mxcsr = internal::get_mxcsr(); + mxcsr &= ~(bit_mask << internal::MXCSR_EXCEPTION_CONTOL_BIT_POISTION); + internal::write_mxcsr(mxcsr); + + // Since the x87 exceptions and SSE exceptions are independent of each, + // it doesn't make much sence to report both in the return value. Most + // often, the standard floating point functions deal with FPU operations + // so we will retrun only the old x87 exceptions. + return internal::exception_status_to_macro(old_excepts); +} + +LIBC_INLINE int disable_except(int excepts) { + // In the x87 control word and in MXCSR, an exception is blocked + // if the corresponding bit is set. + + uint16_t bit_mask = internal::get_status_value_for_except(excepts); + + uint16_t x87_cw = internal::get_x87_control_word(); + uint16_t old_excepts = ~x87_cw & 0x3F; // Save previously enabled exceptions. + x87_cw |= bit_mask; + internal::write_x87_control_word(x87_cw); + + // Just like in enable_except, it is not clear if disabling SSE exceptions + // is required. But, we will still do it only as a "nice thing to do". + uint32_t mxcsr = internal::get_mxcsr(); + mxcsr |= (bit_mask << internal::MXCSR_EXCEPTION_CONTOL_BIT_POISTION); + internal::write_mxcsr(mxcsr); + + return internal::exception_status_to_macro(old_excepts); +} + +LIBC_INLINE int get_except() { + uint16_t mxcsr = static_cast<uint16_t>(internal::get_mxcsr()); + uint16_t enabled_excepts = ~(mxcsr >> 7) & 0x3F; + return internal::exception_status_to_macro(enabled_excepts); +} + +LIBC_INLINE int clear_except(int excepts) { + internal::X87StateDescriptor state; + internal::get_x87_state_descriptor(state); + state.status_word &= + static_cast<uint16_t>(~internal::get_status_value_for_except(excepts)); + internal::write_x87_state_descriptor(state); + + uint32_t mxcsr = internal::get_mxcsr(); + mxcsr &= ~internal::get_status_value_for_except(excepts); + internal::write_mxcsr(mxcsr); + return 0; +} + +LIBC_INLINE int test_except(int excepts) { + uint16_t status_word = internal::get_x87_status_word(); + uint32_t mxcsr = internal::get_mxcsr(); + // Check both x87 status word and MXCSR. + uint16_t status_value = internal::get_status_value_for_except(excepts); + return internal::exception_status_to_macro( + static_cast<uint16_t>(status_value & (status_word | mxcsr))); +} + +// Sets the exception flags but does not trigger the exception handler. +LIBC_INLINE int set_except(int excepts) { + uint16_t status_value = internal::get_status_value_for_except(excepts); + internal::X87StateDescriptor state; + internal::get_x87_state_descriptor(state); + state.status_word |= status_value; + internal::write_x87_state_descriptor(state); + + uint32_t mxcsr = internal::get_mxcsr(); + mxcsr |= status_value; + internal::write_mxcsr(mxcsr); + + return 0; +} + +template <bool SKIP_X87_FPU = false> LIBC_INLINE int raise_except(int excepts) { + uint16_t status_value = internal::get_status_value_for_except(excepts); + + // We set the status flag for exception one at a time and call the + // fwait instruction to actually get the processor to raise the + // exception by calling the exception handler. This scheme is per + // the description in "8.6 X87 FPU EXCEPTION SYNCHRONIZATION" + // of the "Intel 64 and IA-32 Architectures Software Developer's + // Manual, Vol 1". + + // FPU status word is read for each exception separately as the + // exception handler can potentially write to it (typically to clear + // the corresponding exception flag). By reading it separately, we + // ensure that the writes by the exception handler are maintained + // when raising the next exception. + + auto raise_helper = [](uint16_t singleExceptFlag) { + if constexpr (!SKIP_X87_FPU) { + internal::X87StateDescriptor state; + internal::get_x87_state_descriptor(state); + state.status_word |= singleExceptFlag; + internal::write_x87_state_descriptor(state); + } + + uint32_t mxcsr = 0; + mxcsr = internal::get_mxcsr(); + mxcsr |= singleExceptFlag; + internal::write_mxcsr(mxcsr); + internal::fwait(); + }; + + if (status_value & internal::ExceptionFlags::INVALID_F) + raise_helper(internal::ExceptionFlags::INVALID_F); + if (status_value & internal::ExceptionFlags::DIV_BY_ZERO_F) + raise_helper(internal::ExceptionFlags::DIV_BY_ZERO_F); + if (status_value & internal::ExceptionFlags::OVERFLOW_F) + raise_helper(internal::ExceptionFlags::OVERFLOW_F); + if (status_value & internal::ExceptionFlags::UNDERFLOW_F) + raise_helper(internal::ExceptionFlags::UNDERFLOW_F); + if (status_value & internal::ExceptionFlags::INEXACT_F) + raise_helper(internal::ExceptionFlags::INEXACT_F); +#ifdef __FE_DENORM + if (status_value & internal::ExceptionFlags::DENORMAL_F) { + raise_helper(internal::ExceptionFlags::DENORMAL_F); + } +#endif // __FE_DENORM + + // There is no special synchronization scheme available to + // raise SEE exceptions. So, we will ignore that for now. + // Just plain writing to the MXCSR register does not guarantee + // the exception handler will be called. + + return 0; +} + +LIBC_INLINE int get_round() { + uint16_t bit_value = + (internal::get_mxcsr() >> internal::MXCSR_ROUNDING_CONTROL_BIT_POSITION) & + 0x3; + switch (bit_value) { + case internal::RoundingControlValue::TO_NEAREST: + return FE_TONEAREST; + case internal::RoundingControlValue::DOWNWARD: + return FE_DOWNWARD; + case internal::RoundingControlValue::UPWARD: + return FE_UPWARD; + case internal::RoundingControlValue::TOWARD_ZERO: + return FE_TOWARDZERO; + default: + return -1; // Error value. + } +} + +LIBC_INLINE int set_round(int mode) { + uint16_t bit_value; + switch (mode) { + case FE_TONEAREST: + bit_value = internal::RoundingControlValue::TO_NEAREST; + break; + case FE_DOWNWARD: + bit_value = internal::RoundingControlValue::DOWNWARD; + break; + case FE_UPWARD: + bit_value = internal::RoundingControlValue::UPWARD; + break; + case FE_TOWARDZERO: + bit_value = internal::RoundingControlValue::TOWARD_ZERO; + break; + default: + return 1; // To indicate failure + } + + uint16_t x87_value = static_cast<uint16_t>( + bit_value << internal::X87_ROUNDING_CONTROL_BIT_POSITION); + uint16_t x87_control = internal::get_x87_control_word(); + x87_control = static_cast<uint16_t>( + (x87_control & + ~(uint16_t(0x3) << internal::X87_ROUNDING_CONTROL_BIT_POSITION)) | + x87_value); + internal::write_x87_control_word(x87_control); + + uint32_t mxcsr_value = bit_value + << internal::MXCSR_ROUNDING_CONTROL_BIT_POSITION; + uint32_t mxcsr_control = internal::get_mxcsr(); + mxcsr_control = (mxcsr_control & + ~(0x3 << internal::MXCSR_ROUNDING_CONTROL_BIT_POSITION)) | + mxcsr_value; + internal::write_mxcsr(mxcsr_control); + + return 0; +} + +namespace internal { + +#if defined(_WIN32) +// MSVC fenv.h defines a very simple representation of the floating point state +// which just consists of control and status words of the x87 unit. +struct FPState { + uint32_t control_word; + uint32_t status_word; +}; +#elif defined(__APPLE__) +struct FPState { + uint16_t control_word; + uint16_t status_word; + uint32_t mxcsr; + uint8_t reserved[8]; +}; +#else +struct FPState { + X87StateDescriptor x87_status; + uint32_t mxcsr; +}; +#endif // _WIN32 + +} // namespace internal + +static_assert( + sizeof(fenv_t) == sizeof(internal::FPState), + "Internal floating point state does not match the public fenv_t type."); + +#ifdef _WIN32 + +// The exception flags in the Windows FEnv struct and the MXCSR have almost +// reversed bit positions. +struct WinExceptionFlags { + static constexpr uint32_t INEXACT_WIN = 0x01; + static constexpr uint32_t UNDERFLOW_WIN = 0x02; + static constexpr uint32_t OVERFLOW_WIN = 0x04; + static constexpr uint32_t DIV_BY_ZERO_WIN = 0x08; + static constexpr uint32_t INVALID_WIN = 0x10; + static constexpr uint32_t DENORMAL_WIN = 0x20; + + // The Windows FEnv struct has a second copy of all of these bits in the high + // byte of the 32 bit control word. These are used as the source of truth when + // calling fesetenv. + static constexpr uint32_t HIGH_OFFSET = 24; + + static constexpr uint32_t HIGH_INEXACT = INEXACT_WIN << HIGH_OFFSET; + static constexpr uint32_t HIGH_UNDERFLOW = UNDERFLOW_WIN << HIGH_OFFSET; + static constexpr uint32_t HIGH_OVERFLOW = OVERFLOW_WIN << HIGH_OFFSET; + static constexpr uint32_t HIGH_DIV_BY_ZERO = DIV_BY_ZERO_WIN << HIGH_OFFSET; + static constexpr uint32_t HIGH_INVALID = INVALID_WIN << HIGH_OFFSET; + static constexpr uint32_t HIGH_DENORMAL = DENORMAL_WIN << HIGH_OFFSET; +}; + +/* + fenv_t control word format: + + Windows (at least for x64) uses a 4 byte control fenv control word stored in + a 32 bit integer. The first byte contains just the rounding mode and the + exception masks, while the last two bytes contain that same information as + well as the flush-to-zero and denormals-are-zero flags. The flags are + represented with a truth table: + + 00 - No flags set + 01 - Flush-to-zero and Denormals-are-zero set + 11 - Flush-to-zero set + 10 - Denormals-are-zero set + + U represents unused. + + +-----Rounding Mode-----+ + | | + ++ ++ + || || + RRMMMMMM UUUUUUUU UUUUFFRR UUMMMMMM + | | || | | + +----+ flags---++ +----+ + | | + +------Exception Masks-----+ + + + fenv_t status word format: + + The status word is a lot simpler for this conversion, since only the + exception flags are used in the MXCSR. + + +----+---Exception Flags---+----+ + | | | | + UUEEEEEE UUUUUUUU UUUUUUUU UUEEEEEE + + + + MXCSR Format: + + The MXCSR format is the same information, just organized differently. Since + the fenv_t struct for windows doesn't include the mxcsr bits, they must be + generated from the control word bits. + + Exception Masks---+ +---Exception Flags + | | + Flush-to-zero---+ +----+ +----+ + | | | | | + FRRMMMMMMDEEEEEE + || | + ++ +---Denormals-are-zero + | + +---Rounding Mode + + + The mask and flag order is as follows: + + fenv_t mxcsr + + denormal inexact + invalid underflow + div by 0 overflow + overflow div by 0 + underflow denormal + inexact invalid + + This is almost reverse, except for denormal and invalid which are in the + same order in both. + */ + +LIBC_INLINE int get_env(fenv_t *envp) { + internal::FPState *state = reinterpret_cast<internal::FPState *>(envp); + + uint32_t status_word = 0; + uint32_t control_word = 0; + + uint32_t mxcsr = internal::get_mxcsr(); + + // Set exception flags in the status word + status_word |= (mxcsr & (internal::ExceptionFlags::INVALID_F | + internal::ExceptionFlags::DENORMAL_F)) + << 4; + status_word |= (mxcsr & internal::ExceptionFlags::DIV_BY_ZERO_F) << 1; + status_word |= (mxcsr & internal::ExceptionFlags::OVERFLOW_F) >> 1; + status_word |= (mxcsr & internal::ExceptionFlags::UNDERFLOW_F) >> 3; + status_word |= (mxcsr & internal::ExceptionFlags::INEXACT_F) >> 5; + status_word |= status_word << WinExceptionFlags::HIGH_OFFSET; + + // Set exception masks in bits 0-5 and 24-29 + control_word |= (mxcsr & ((internal::ExceptionFlags::INVALID_F | + internal::ExceptionFlags::DENORMAL_F) + << 7)) >> + 3; + control_word |= (mxcsr & (internal::ExceptionFlags::DIV_BY_ZERO_F << 7)) >> 6; + control_word |= (mxcsr & (internal::ExceptionFlags::OVERFLOW_F << 7)) >> 8; + control_word |= (mxcsr & (internal::ExceptionFlags::UNDERFLOW_F << 7)) >> 10; + control_word |= (mxcsr & (internal::ExceptionFlags::INEXACT_F << 7)) >> 12; + control_word |= control_word << WinExceptionFlags::HIGH_OFFSET; + + // Set rounding in bits 8-9 and 30-31 + control_word |= (mxcsr & 0x6000) >> 5; + control_word |= (mxcsr & 0x6000) << 17; + + // Set flush-to-zero in bit 10 + control_word |= (mxcsr & 0x8000) >> 5; + + // Set denormals-are-zero xor flush-to-zero in bit 11 + control_word |= (((mxcsr & 0x8000) >> 9) ^ (mxcsr & 0x0040)) << 5; + + state->control_word = control_word; + state->status_word = status_word; + return 0; +} + +LIBC_INLINE int set_env(const fenv_t *envp) { + const internal::FPState *state = + reinterpret_cast<const internal::FPState *>(envp); + + uint32_t mxcsr = 0; + + // Set exception flags from the status word + mxcsr |= static_cast<uint16_t>( + (state->status_word & + (WinExceptionFlags::HIGH_DENORMAL | WinExceptionFlags::HIGH_INVALID)) >> + 28); + mxcsr |= static_cast<uint16_t>( + (state->status_word & WinExceptionFlags::HIGH_DIV_BY_ZERO) >> 25); + mxcsr |= static_cast<uint16_t>( + (state->status_word & WinExceptionFlags::HIGH_OVERFLOW) >> 23); + mxcsr |= static_cast<uint16_t>( + (state->status_word & WinExceptionFlags::HIGH_UNDERFLOW) >> 21); + mxcsr |= static_cast<uint16_t>( + (state->status_word & WinExceptionFlags::HIGH_INEXACT) >> 19); + + // Set denormals-are-zero from bit 10 xor bit 11 + mxcsr |= static_cast<uint16_t>( + (((state->control_word & 0x800) >> 1) ^ (state->control_word & 0x400)) >> + 4); + + // Set exception masks from bits 24-29 + mxcsr |= static_cast<uint16_t>( + (state->control_word & + (WinExceptionFlags::HIGH_DENORMAL | WinExceptionFlags::HIGH_INVALID)) >> + 21); + mxcsr |= static_cast<uint16_t>( + (state->control_word & WinExceptionFlags::HIGH_DIV_BY_ZERO) >> 18); + mxcsr |= static_cast<uint16_t>( + (state->control_word & WinExceptionFlags::HIGH_OVERFLOW) >> 16); + mxcsr |= static_cast<uint16_t>( + (state->control_word & WinExceptionFlags::HIGH_UNDERFLOW) >> 14); + mxcsr |= static_cast<uint16_t>( + (state->control_word & WinExceptionFlags::HIGH_INEXACT) >> 12); + + // Set rounding from bits 30-31 + mxcsr |= static_cast<uint16_t>((state->control_word & 0xc0000000) >> 17); + + // Set flush-to-zero from bit 10 + mxcsr |= static_cast<uint16_t>((state->control_word & 0x400) << 5); + + internal::write_mxcsr(mxcsr); + return 0; +} +#else +LIBC_INLINE int get_env(fenv_t *envp) { + internal::FPState *state = reinterpret_cast<internal::FPState *>(envp); +#ifdef __APPLE__ + internal::X87StateDescriptor x87_status; + internal::get_x87_state_descriptor(x87_status); + state->control_word = x87_status.control_word; + state->status_word = x87_status.status_word; +#else + internal::get_x87_state_descriptor(state->x87_status); +#endif // __APPLE__ + state->mxcsr = internal::get_mxcsr(); + return 0; +} + +LIBC_INLINE int set_env(const fenv_t *envp) { + // envp contains everything including pieces like the current + // top of FPU stack. We cannot arbitrarily change them. So, we first + // read the current status and update only those pieces which are + // not disruptive. + internal::X87StateDescriptor x87_status; + internal::get_x87_state_descriptor(x87_status); + + if (envp == FE_DFL_ENV) { + // Reset the exception flags in the status word. + x87_status.status_word &= ~uint16_t(0x3F); + // Reset other non-sensitive parts of the status word. + for (int i = 0; i < 5; i++) + x87_status._[i] = 0; + // In the control word, we do the following: + // 1. Mask all exceptions + // 2. Set rounding mode to round-to-nearest + // 3. Set the internal precision to double extended precision. + x87_status.control_word |= uint16_t(0x3F); // Mask all exceptions. + x87_status.control_word &= ~(uint16_t(0x3) << 10); // Round to nearest. + x87_status.control_word |= (uint16_t(0x3) << 8); // Extended precision. + internal::write_x87_state_descriptor(x87_status); + + // We take the exact same approach MXCSR register as well. + // MXCSR has two additional fields, "flush-to-zero" and + // "denormals-are-zero". We reset those bits. Also, MXCSR does not + // have a field which controls the precision of internal operations. + uint32_t mxcsr = internal::get_mxcsr(); + mxcsr &= ~uint16_t(0x3F); // Clear exception flags. + mxcsr &= ~(uint16_t(0x1) << 6); // Reset denormals-are-zero + mxcsr |= (uint16_t(0x3F) << 7); // Mask exceptions + mxcsr &= ~(uint16_t(0x3) << 13); // Round to nearest. + mxcsr &= ~(uint16_t(0x1) << 15); // Reset flush-to-zero + internal::write_mxcsr(mxcsr); + + return 0; + } + + const internal::FPState *fpstate = + reinterpret_cast<const internal::FPState *>(envp); + + // Copy the exception status flags from envp. + x87_status.status_word &= ~uint16_t(0x3F); +#ifdef __APPLE__ + x87_status.status_word |= (fpstate->status_word & 0x3F); + // We can set the x87 control word as is as there no sensitive bits. + x87_status.control_word = fpstate->control_word; +#else + x87_status.status_word |= (fpstate->x87_status.status_word & 0x3F); + // Copy other non-sensitive parts of the status word. + for (int i = 0; i < 5; i++) + x87_status._[i] = fpstate->x87_status._[i]; + // We can set the x87 control word as is as there no sensitive bits. + x87_status.control_word = fpstate->x87_status.control_word; +#endif // __APPLE__ + internal::write_x87_state_descriptor(x87_status); + + // We can write the MXCSR state as is as there are no sensitive bits. + internal::write_mxcsr(fpstate->mxcsr); + return 0; +} +#endif + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_FENVIMPL_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/NextAfterLongDouble.h b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/NextAfterLongDouble.h new file mode 100644 index 000000000000..2e6b297ae934 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/NextAfterLongDouble.h @@ -0,0 +1,125 @@ +//===-- nextafter implementation for x86 long double numbers ----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEXTAFTERLONGDOUBLE_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEXTAFTERLONGDOUBLE_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !defined(LIBC_TARGET_ARCH_IS_X86) +#error "Invalid include" +#endif + +#include "src/__support/CPP/bit.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +LIBC_INLINE long double nextafter(long double from, long double to) { + using FPBits = FPBits<long double>; + FPBits from_bits(from); + if (from_bits.is_nan()) + return from; + + FPBits to_bits(to); + if (to_bits.is_nan()) + return to; + + if (from == to) + return to; + + // Convert pseudo subnormal number to normal number. + if (from_bits.get_implicit_bit() == 1 && from_bits.is_subnormal()) { + from_bits.set_biased_exponent(1); + } + + using StorageType = FPBits::StorageType; + + constexpr StorageType FRACTION_MASK = FPBits::FRACTION_MASK; + // StorageType int_val = from_bits.uintval(); + if (from == 0.0l) { // +0.0 / -0.0 + from_bits = FPBits::min_subnormal(from > to ? Sign::NEG : Sign::POS); + } else if (from < 0.0l) { + if (to < from) { // toward -inf + if (from_bits == FPBits::max_subnormal(Sign::NEG)) { + // We deal with normal/subnormal boundary separately to avoid + // dealing with the implicit bit. + from_bits = FPBits::min_normal(Sign::NEG); + } else if (from_bits.get_mantissa() == FRACTION_MASK) { + from_bits.set_mantissa(0); + // Incrementing exponent might overflow the value to infinity, + // which is what is expected. Since NaNs are handling separately, + // it will never overflow "beyond" infinity. + from_bits.set_biased_exponent(from_bits.get_biased_exponent() + 1); + if (from_bits.is_inf()) + raise_except_if_required(FE_OVERFLOW | FE_INEXACT); + return from_bits.get_val(); + } else { + from_bits = FPBits(StorageType(from_bits.uintval() + 1)); + } + } else { // toward +inf + if (from_bits == FPBits::min_normal(Sign::NEG)) { + // We deal with normal/subnormal boundary separately to avoid + // dealing with the implicit bit. + from_bits = FPBits::max_subnormal(Sign::NEG); + } else if (from_bits.get_mantissa() == 0) { + from_bits.set_mantissa(FRACTION_MASK); + // from == 0 is handled separately so decrementing the exponent will not + // lead to underflow. + from_bits.set_biased_exponent(from_bits.get_biased_exponent() - 1); + return from_bits.get_val(); + } else { + from_bits = FPBits(StorageType(from_bits.uintval() - 1)); + } + } + } else { + if (to < from) { // toward -inf + if (from_bits == FPBits::min_normal(Sign::POS)) { + from_bits = FPBits::max_subnormal(Sign::POS); + } else if (from_bits.get_mantissa() == 0) { + from_bits.set_mantissa(FRACTION_MASK); + // from == 0 is handled separately so decrementing the exponent will not + // lead to underflow. + from_bits.set_biased_exponent(from_bits.get_biased_exponent() - 1); + return from_bits.get_val(); + } else { + from_bits = FPBits(StorageType(from_bits.uintval() - 1)); + } + } else { // toward +inf + if (from_bits == FPBits::max_subnormal(Sign::POS)) { + from_bits = FPBits::min_normal(Sign::POS); + } else if (from_bits.get_mantissa() == FRACTION_MASK) { + from_bits.set_mantissa(0); + // Incrementing exponent might overflow the value to infinity, + // which is what is expected. Since NaNs are handling separately, + // it will never overflow "beyond" infinity. + from_bits.set_biased_exponent(from_bits.get_biased_exponent() + 1); + if (from_bits.is_inf()) + raise_except_if_required(FE_OVERFLOW | FE_INEXACT); + return from_bits.get_val(); + } else { + from_bits = FPBits(StorageType(from_bits.uintval() + 1)); + } + } + } + + if (!from_bits.get_implicit_bit()) + raise_except_if_required(FE_UNDERFLOW | FE_INEXACT); + + return from_bits.get_val(); +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEXTAFTERLONGDOUBLE_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/NextUpDownLongDouble.h b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/NextUpDownLongDouble.h new file mode 100644 index 000000000000..31869975ac5a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/NextUpDownLongDouble.h @@ -0,0 +1,63 @@ +//===-- nextupdown implementation for x86 long double numbers ---*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEXTUPDOWNLONGDOUBLE_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEXTUPDOWNLONGDOUBLE_H + +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !defined(LIBC_TARGET_ARCH_IS_X86) +#error "Invalid include" +#endif + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <bool IsDown> +LIBC_INLINE constexpr long double nextupdown(long double x) { + constexpr Sign sign = IsDown ? Sign::NEG : Sign::POS; + + using FPBits_t = FPBits<long double>; + FPBits_t xbits(x); + if (xbits.is_nan() || xbits == FPBits_t::max_normal(sign) || + xbits == FPBits_t::inf(sign)) + return x; + + if (x == 0.0l) + return FPBits_t::min_subnormal(sign).get_val(); + + using StorageType = typename FPBits_t::StorageType; + + if (xbits.sign() == sign) { + if (xbits.get_mantissa() == FPBits_t::FRACTION_MASK) { + xbits.set_mantissa(0); + xbits.set_biased_exponent(xbits.get_biased_exponent() + 1); + } else { + xbits = FPBits_t(StorageType(xbits.uintval() + 1)); + } + + return xbits.get_val(); + } + + if (xbits.get_mantissa() == 0) { + xbits.set_mantissa(FPBits_t::FRACTION_MASK); + xbits.set_biased_exponent(xbits.get_biased_exponent() - 1); + } else { + xbits = FPBits_t(StorageType(xbits.uintval() - 1)); + } + + return xbits.get_val(); +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEXTUPDOWNLONGDOUBLE_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/nearest_integer.h b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/nearest_integer.h new file mode 100644 index 000000000000..4eae5ffe816b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/nearest_integer.h @@ -0,0 +1,46 @@ +//===--- Round floating point to nearest integer on x86-64 ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEAREST_INTEGER_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEAREST_INTEGER_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !defined(LIBC_TARGET_ARCH_IS_X86_64) +#error "Invalid include" +#endif + +#if !defined(__SSE4_2__) +#error "SSE4.2 instruction set is not supported" +#endif + +#include <immintrin.h> + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +LIBC_INLINE float nearest_integer(float x) { + __m128 xmm = _mm_set_ss(x); // NOLINT + __m128 ymm = + _mm_round_ss(xmm, xmm, _MM_ROUND_NEAREST | _MM_FROUND_NO_EXC); // NOLINT + return ymm[0]; +} + +LIBC_INLINE double nearest_integer(double x) { + __m128d xmm = _mm_set_sd(x); // NOLINT + __m128d ymm = + _mm_round_sd(xmm, xmm, _MM_ROUND_NEAREST | _MM_FROUND_NO_EXC); // NOLINT + return ymm[0]; +} + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_NEAREST_INTEGER_H diff --git a/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/sqrt.h b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/sqrt.h new file mode 100644 index 000000000000..e10447751d21 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/FPUtil/x86_64/sqrt.h @@ -0,0 +1,54 @@ +//===-- Square root of IEEE 754 floating point numbers ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_SQRT_H +#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_SQRT_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/cpu_features.h" + +#if !(defined(LIBC_TARGET_ARCH_IS_X86_64) && defined(LIBC_TARGET_CPU_HAS_SSE2)) +#error "sqrtss / sqrtsd need SSE2" +#endif + +#include "src/__support/FPUtil/generic/sqrt.h" + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { + +template <> LIBC_INLINE float sqrt<float>(float x) { + float result; + __asm__ __volatile__("sqrtss %x1, %x0" : "=x"(result) : "x"(x)); + return result; +} + +template <> LIBC_INLINE double sqrt<double>(double x) { + double result; + __asm__ __volatile__("sqrtsd %x1, %x0" : "=x"(result) : "x"(x)); + return result; +} + +#ifdef LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 +template <> LIBC_INLINE long double sqrt<long double>(long double x) { + long double result; + __asm__ __volatile__("sqrtsd %x1, %x0" : "=x"(result) : "x"(x)); + return result; +} +#else +template <> LIBC_INLINE long double sqrt<long double>(long double x) { + __asm__ __volatile__("fsqrt" : "+t"(x)); + return x; +} +#endif + +} // namespace fputil +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_SQRT_H diff --git a/contrib/llvm-project/libc/src/__support/File/dir.cpp b/contrib/llvm-project/libc/src/__support/File/dir.cpp new file mode 100644 index 000000000000..aea8862c15f7 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/dir.cpp @@ -0,0 +1,65 @@ +//===--- Implementation of a platform independent Dir data structure ------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "dir.h" + +#include "src/__support/CPP/mutex.h" // lock_guard +#include "src/__support/CPP/new.h" +#include "src/__support/error_or.h" +#include "src/__support/libc_errno.h" // For error macros +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +ErrorOr<Dir *> Dir::open(const char *path) { + auto fd = platform_opendir(path); + if (!fd) + return LIBC_NAMESPACE::Error(fd.error()); + + LIBC_NAMESPACE::AllocChecker ac; + Dir *dir = new (ac) Dir(fd.value()); + if (!ac) + return LIBC_NAMESPACE::Error(ENOMEM); + return dir; +} + +ErrorOr<struct ::dirent *> Dir::read() { + cpp::lock_guard lock(mutex); + if (readptr >= fillsize) { + auto readsize = platform_fetch_dirents(fd, buffer); + if (!readsize) + return LIBC_NAMESPACE::Error(readsize.error()); + fillsize = readsize.value(); + readptr = 0; + } + if (fillsize == 0) + return nullptr; + + struct ::dirent *d = reinterpret_cast<struct ::dirent *>(buffer + readptr); +#ifdef __linux__ + // The d_reclen field is available on Linux but not required by POSIX. + readptr += d->d_reclen; +#else + // Other platforms have to implement how the read pointer is to be updated. +#error "DIR read pointer update is missing." +#endif + return d; +} + +int Dir::close() { + { + cpp::lock_guard lock(mutex); + int retval = platform_closedir(fd); + if (retval != 0) + return retval; + } + delete this; + return 0; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/File/dir.h b/contrib/llvm-project/libc/src/__support/File/dir.h new file mode 100644 index 000000000000..247ac1225cee --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/dir.h @@ -0,0 +1,79 @@ +//===--- A platform independent Dir class ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FILE_DIR_H +#define LLVM_LIBC_SRC___SUPPORT_FILE_DIR_H + +#include "src/__support/CPP/span.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" +#include "src/__support/threads/mutex.h" + +#include <dirent.h> + +namespace LIBC_NAMESPACE_DECL { + +// Platform specific function which will open the directory |name| +// and return its file descriptor. Upon failure, the error value is returned. +ErrorOr<int> platform_opendir(const char *name); + +// Platform specific function which will close the directory with +// file descriptor |fd|. Returns 0 on success, or the error number on failure. +int platform_closedir(int fd); + +// Platform specific function which will fetch dirents in to buffer. +// Returns the number of bytes written into buffer or the error number on +// failure. +ErrorOr<size_t> platform_fetch_dirents(int fd, cpp::span<uint8_t> buffer); + +// This class is designed to allow implementation of the POSIX dirent.h API. +// By itself, it is platform independent but calls platform specific +// functions to perform OS operations. +class Dir { + static constexpr size_t BUFSIZE = 1024; + int fd; + size_t readptr = 0; // The current read pointer. + size_t fillsize = 0; // The number of valid bytes availabe in the buffer. + + // This is a buffer of struct dirent values which will be fetched + // from the OS. Since the d_name of struct dirent can be of a variable + // size, we store the data in a byte array. + uint8_t buffer[BUFSIZE]; + + Mutex mutex; + + // A directory is to be opened by the static method open and closed + // by the close method. So, all constructors and destructor are declared + // as private. Inappropriate constructors are declared as deleted. + LIBC_INLINE Dir() = delete; + LIBC_INLINE Dir(const Dir &) = delete; + + LIBC_INLINE explicit Dir(int fdesc) + : fd(fdesc), readptr(0), fillsize(0), + mutex(/*timed=*/false, /*recursive=*/false, /*robust=*/false, + /*pshared=*/false) {} + LIBC_INLINE ~Dir() = default; + + LIBC_INLINE Dir &operator=(const Dir &) = delete; + +public: + static ErrorOr<Dir *> open(const char *path); + + ErrorOr<struct ::dirent *> read(); + + // Returns 0 on success or the error number on failure. If an error number + // was returned, then the resources associated with the directory are not + // cleaned up. + int close(); + + LIBC_INLINE int getfd() { return fd; } +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FILE_DIR_H diff --git a/contrib/llvm-project/libc/src/__support/File/file.cpp b/contrib/llvm-project/libc/src/__support/File/file.cpp new file mode 100644 index 000000000000..303852dbbb71 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/file.cpp @@ -0,0 +1,477 @@ +//===--- Implementation of a platform independent file data structure -----===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "file.h" + +#include "hdr/func/realloc.h" +#include "hdr/stdio_macros.h" +#include "hdr/types/off_t.h" +#include "src/__support/CPP/new.h" +#include "src/__support/CPP/span.h" +#include "src/__support/libc_errno.h" // For error macros +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +FileIOResult File::write_unlocked(const void *data, size_t len) { + if (!write_allowed()) { + err = true; + return {0, EBADF}; + } + + prev_op = FileOp::WRITE; + + if (bufmode == _IONBF) { // unbuffered. + size_t ret_val = + write_unlocked_nbf(static_cast<const uint8_t *>(data), len); + flush_unlocked(); + return ret_val; + } else if (bufmode == _IOFBF) { // fully buffered + return write_unlocked_fbf(static_cast<const uint8_t *>(data), len); + } else /*if (bufmode == _IOLBF) */ { // line buffered + return write_unlocked_lbf(static_cast<const uint8_t *>(data), len); + } +} + +FileIOResult File::write_unlocked_nbf(const uint8_t *data, size_t len) { + if (pos > 0) { // If the buffer is not empty + // Flush the buffer + const size_t write_size = pos; + FileIOResult write_result = platform_write(this, buf, write_size); + pos = 0; // Buffer is now empty so reset pos to the beginning. + // If less bytes were written than expected, then an error occurred. + if (write_result < write_size) { + err = true; + // No bytes from data were written, so return 0. + return {0, write_result.error}; + } + } + + FileIOResult write_result = platform_write(this, data, len); + if (write_result < len) + err = true; + return write_result; +} + +FileIOResult File::write_unlocked_fbf(const uint8_t *data, size_t len) { + const size_t init_pos = pos; + const size_t bufspace = bufsize - pos; + + // If data is too large to be buffered at all, then just write it unbuffered. + if (len > bufspace + bufsize) + return write_unlocked_nbf(data, len); + + // we split |data| (conceptually) using the split point. Then we handle the + // two pieces separately. + const size_t split_point = len < bufspace ? len : bufspace; + + // The primary piece is the piece of |data| we want to write to the buffer + // before flushing. It will always fit into the buffer, since the split point + // is defined as being min(len, bufspace), and it will always exist if len is + // non-zero. + cpp::span<const uint8_t> primary(data, split_point); + + // The second piece is the remainder of |data|. It is written to the buffer if + // it fits, or written directly to the output if it doesn't. If the primary + // piece fits entirely in the buffer, the remainder may be nothing. + cpp::span<const uint8_t> remainder( + static_cast<const uint8_t *>(data) + split_point, len - split_point); + + cpp::span<uint8_t> bufref(static_cast<uint8_t *>(buf), bufsize); + + // Copy the first piece into the buffer. + // TODO: Replace the for loop below with a call to internal memcpy. + for (size_t i = 0; i < primary.size(); ++i) + bufref[pos + i] = primary[i]; + pos += primary.size(); + + // If there is no remainder, we can return early, since the first piece has + // fit completely into the buffer. + if (remainder.size() == 0) + return len; + + // We need to flush the buffer now, since there is still data and the buffer + // is full. + const size_t write_size = pos; + + FileIOResult buf_result = platform_write(this, buf, write_size); + size_t bytes_written = buf_result.value; + + pos = 0; // Buffer is now empty so reset pos to the beginning. + // If less bytes were written than expected, then an error occurred. Return + // the number of bytes that have been written from |data|. + if (buf_result.has_error() || bytes_written < write_size) { + err = true; + return {bytes_written <= init_pos ? 0 : bytes_written - init_pos, + buf_result.error}; + } + + // The second piece is handled basically the same as the first, although we + // know that if the second piece has data in it then the buffer has been + // flushed, meaning that pos is always 0. + if (remainder.size() < bufsize) { + // TODO: Replace the for loop below with a call to internal memcpy. + for (size_t i = 0; i < remainder.size(); ++i) + bufref[i] = remainder[i]; + pos = remainder.size(); + } else { + + FileIOResult result = + platform_write(this, remainder.data(), remainder.size()); + size_t bytes_written = buf_result.value; + + // If less bytes were written than expected, then an error occurred. Return + // the number of bytes that have been written from |data|. + if (result.has_error() || bytes_written < remainder.size()) { + err = true; + return {primary.size() + bytes_written, result.error}; + } + } + + return len; +} + +FileIOResult File::write_unlocked_lbf(const uint8_t *data, size_t len) { + constexpr uint8_t NEWLINE_CHAR = '\n'; + size_t last_newline = len; + for (size_t i = len; i >= 1; --i) { + if (data[i - 1] == NEWLINE_CHAR) { + last_newline = i - 1; + break; + } + } + + // If there is no newline, treat this as fully buffered. + if (last_newline == len) { + return write_unlocked_fbf(data, len); + } + + // we split |data| (conceptually) using the split point. Then we handle the + // two pieces separately. + const size_t split_point = last_newline + 1; + + // The primary piece is everything in |data| up to the newline. It's written + // unbuffered to the output. + cpp::span<const uint8_t> primary(data, split_point); + + // The second piece is the remainder of |data|. It is written fully buffered, + // meaning it may stay in the buffer if it fits. + cpp::span<const uint8_t> remainder( + static_cast<const uint8_t *>(data) + split_point, len - split_point); + + size_t written = 0; + + written = write_unlocked_nbf(primary.data(), primary.size()); + if (written < primary.size()) { + err = true; + return written; + } + + flush_unlocked(); + + written += write_unlocked_fbf(remainder.data(), remainder.size()); + if (written < len) { + err = true; + return written; + } + + return len; +} + +FileIOResult File::read_unlocked(void *data, size_t len) { + if (!read_allowed()) { + err = true; + return {0, EBADF}; + } + + prev_op = FileOp::READ; + + if (bufmode == _IONBF) { // unbuffered. + return read_unlocked_nbf(static_cast<uint8_t *>(data), len); + } else if (bufmode == _IOFBF) { // fully buffered + return read_unlocked_fbf(static_cast<uint8_t *>(data), len); + } else /*if (bufmode == _IOLBF) */ { // line buffered + // There is no line buffered mode for read. Use fully buffered instead. + return read_unlocked_fbf(static_cast<uint8_t *>(data), len); + } +} + +size_t File::copy_data_from_buf(uint8_t *data, size_t len) { + cpp::span<uint8_t> bufref(static_cast<uint8_t *>(buf), bufsize); + cpp::span<uint8_t> dataref(static_cast<uint8_t *>(data), len); + + // Because read_limit is always greater than equal to pos, + // available_data is never a wrapped around value. + size_t available_data = read_limit - pos; + if (len <= available_data) { + // TODO: Replace the for loop below with a call to internal memcpy. + for (size_t i = 0; i < len; ++i) + dataref[i] = bufref[i + pos]; + pos += len; + return len; + } + + // Copy all of the available data. + // TODO: Replace the for loop with a call to internal memcpy. + for (size_t i = 0; i < available_data; ++i) + dataref[i] = bufref[i + pos]; + read_limit = pos = 0; // Reset the pointers. + + return available_data; +} + +FileIOResult File::read_unlocked_fbf(uint8_t *data, size_t len) { + // Read data from the buffer first. + size_t available_data = copy_data_from_buf(data, len); + if (available_data == len) + return available_data; + + // Update the dataref to reflect that fact that we have already + // copied |available_data| into |data|. + size_t to_fetch = len - available_data; + cpp::span<uint8_t> dataref(static_cast<uint8_t *>(data) + available_data, + to_fetch); + + if (to_fetch > bufsize) { + FileIOResult result = platform_read(this, dataref.data(), to_fetch); + size_t fetched_size = result.value; + if (result.has_error() || fetched_size < to_fetch) { + if (!result.has_error()) + eof = true; + else + err = true; + return {available_data + fetched_size, result.error}; + } + return len; + } + + // Fetch and buffer another buffer worth of data. + FileIOResult result = platform_read(this, buf, bufsize); + size_t fetched_size = result.value; + read_limit += fetched_size; + size_t transfer_size = fetched_size >= to_fetch ? to_fetch : fetched_size; + for (size_t i = 0; i < transfer_size; ++i) + dataref[i] = buf[i]; + pos += transfer_size; + if (result.has_error() || fetched_size < to_fetch) { + if (!result.has_error()) + eof = true; + else + err = true; + } + return {transfer_size + available_data, result.error}; +} + +FileIOResult File::read_unlocked_nbf(uint8_t *data, size_t len) { + // Check whether there is a character in the ungetc buffer. + size_t available_data = copy_data_from_buf(data, len); + if (available_data == len) + return available_data; + + // Directly copy the data into |data|. + cpp::span<uint8_t> dataref(static_cast<uint8_t *>(data) + available_data, + len - available_data); + FileIOResult result = platform_read(this, dataref.data(), dataref.size()); + + if (result.has_error() || result < dataref.size()) { + if (!result.has_error()) + eof = true; + else + err = true; + } + return {result + available_data, result.error}; +} + +int File::ungetc_unlocked(int c) { + // There is no meaning to unget if: + // 1. You are trying to push back EOF. + // 2. Read operations are not allowed on this file. + // 3. The previous operation was a write operation. + if (c == EOF || !read_allowed() || (prev_op == FileOp::WRITE)) + return EOF; + + cpp::span<uint8_t> bufref(static_cast<uint8_t *>(buf), bufsize); + if (read_limit == 0) { + // If |read_limit| is zero, it can mean three things: + // a. This file was just created. + // b. The previous operation was a seek operation. + // c. The previous operation was a read operation which emptied + // the buffer. + // For all the above cases, we simply write |c| at the beginning + // of the buffer and bump |read_limit|. Note that |pos| will also + // be zero in this case, so we don't need to adjust it. + bufref[0] = static_cast<unsigned char>(c); + ++read_limit; + } else { + // If |read_limit| is non-zero, it means that there is data in the buffer + // from a previous read operation. Which would also mean that |pos| is not + // zero. So, we decrement |pos| and write |c| in to the buffer at the new + // |pos|. If too many ungetc operations are performed without reads, it + // can lead to (pos == 0 but read_limit != 0). We will just error out in + // such a case. + if (pos == 0) + return EOF; + --pos; + bufref[pos] = static_cast<unsigned char>(c); + } + + eof = false; // There is atleast one character that can be read now. + err = false; // This operation was a success. + return c; +} + +ErrorOr<int> File::seek(off_t offset, int whence) { + FileLock lock(this); + if (prev_op == FileOp::WRITE && pos > 0) { + + FileIOResult buf_result = platform_write(this, buf, pos); + if (buf_result.has_error() || buf_result.value < pos) { + err = true; + return Error(buf_result.error); + } + } else if (prev_op == FileOp::READ && whence == SEEK_CUR) { + // More data could have been read out from the platform file than was + // required. So, we have to adjust the offset we pass to platform seek + // function. Note that read_limit >= pos is always true. + offset -= (read_limit - pos); + } + pos = read_limit = 0; + prev_op = FileOp::SEEK; + // Reset the eof flag as a seek might move the file positon to some place + // readable. + eof = false; + auto result = platform_seek(this, offset, whence); + if (!result.has_value()) + return Error(result.error()); + return 0; +} + +ErrorOr<off_t> File::tell() { + FileLock lock(this); + auto seek_target = eof ? SEEK_END : SEEK_CUR; + auto result = platform_seek(this, 0, seek_target); + if (!result.has_value() || result.value() < 0) + return Error(result.error()); + off_t platform_offset = result.value(); + if (prev_op == FileOp::READ) + return platform_offset - (read_limit - pos); + if (prev_op == FileOp::WRITE) + return platform_offset + pos; + return platform_offset; +} + +int File::flush_unlocked() { + if (prev_op == FileOp::WRITE && pos > 0) { + FileIOResult buf_result = platform_write(this, buf, pos); + if (buf_result.has_error() || buf_result.value < pos) { + err = true; + return buf_result.error; + } + pos = 0; + } + // TODO: Add POSIX behavior for input streams. + return 0; +} + +int File::set_buffer(void *buffer, size_t size, int buffer_mode) { + // We do not need to lock the file as this method should be called before + // other operations are performed on the file. + if (buffer != nullptr && size == 0) + return EINVAL; + + switch (buffer_mode) { + case _IOFBF: + case _IOLBF: + case _IONBF: + break; + default: + return EINVAL; + } + + if (buffer == nullptr && size != 0 && buffer_mode != _IONBF) { + // We exclude the case of buffer_mode == _IONBF in this branch + // because we don't need to allocate buffer in such a case. + if (own_buf) { + // This is one of the places where use a C allocation functon + // as C++ does not have an equivalent of realloc. + buf = reinterpret_cast<uint8_t *>(realloc(buf, size)); + if (buf == nullptr) + return ENOMEM; + } else { + AllocChecker ac; + buf = new (ac) uint8_t[size]; + if (!ac) + return ENOMEM; + own_buf = true; + } + bufsize = size; + // TODO: Handle allocation failures. + } else { + if (own_buf) + delete buf; + if (buffer_mode != _IONBF) { + buf = static_cast<uint8_t *>(buffer); + bufsize = size; + } else { + // We don't need any buffer. + buf = nullptr; + bufsize = 0; + } + own_buf = false; + } + bufmode = buffer_mode; + adjust_buf(); + return 0; +} + +File::ModeFlags File::mode_flags(const char *mode) { + // First character in |mode| should be 'a', 'r' or 'w'. + if (*mode != 'a' && *mode != 'r' && *mode != 'w') + return 0; + + // There should be exaclty one main mode ('a', 'r' or 'w') character. + // If there are more than one main mode characters listed, then + // we will consider |mode| as incorrect and return 0; + int main_mode_count = 0; + + ModeFlags flags = 0; + for (; *mode != '\0'; ++mode) { + switch (*mode) { + case 'r': + flags |= static_cast<ModeFlags>(OpenMode::READ); + ++main_mode_count; + break; + case 'w': + flags |= static_cast<ModeFlags>(OpenMode::WRITE); + ++main_mode_count; + break; + case '+': + flags |= static_cast<ModeFlags>(OpenMode::PLUS); + break; + case 'b': + flags |= static_cast<ModeFlags>(ContentType::BINARY); + break; + case 'a': + flags |= static_cast<ModeFlags>(OpenMode::APPEND); + ++main_mode_count; + break; + case 'x': + flags |= static_cast<ModeFlags>(CreateType::EXCLUSIVE); + break; + default: + return 0; + } + } + + if (main_mode_count != 1) + return 0; + + return flags; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/File/file.h b/contrib/llvm-project/libc/src/__support/File/file.h new file mode 100644 index 000000000000..5c97a9c6419f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/file.h @@ -0,0 +1,324 @@ +//===--- A platform independent file data structure -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FILE_FILE_H +#define LLVM_LIBC_SRC___SUPPORT_FILE_FILE_H + +#include "hdr/stdio_macros.h" +#include "hdr/types/off_t.h" +#include "src/__support/CPP/new.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/threads/mutex.h" + +#include <stddef.h> +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { + +struct FileIOResult { + size_t value; + int error; + + constexpr FileIOResult(size_t val) : value(val), error(0) {} + constexpr FileIOResult(size_t val, int error) : value(val), error(error) {} + + constexpr bool has_error() { return error != 0; } + + constexpr operator size_t() { return value; } +}; + +// This a generic base class to encapsulate a platform independent file data +// structure. Platform specific specializations should create a subclass as +// suitable for their platform. +class File { +public: + static constexpr size_t DEFAULT_BUFFER_SIZE = 1024; + + using LockFunc = void(File *); + using UnlockFunc = void(File *); + + using WriteFunc = FileIOResult(File *, const void *, size_t); + using ReadFunc = FileIOResult(File *, void *, size_t); + // The SeekFunc is expected to return the current offset of the external + // file position indicator. + using SeekFunc = ErrorOr<off_t>(File *, off_t, int); + using CloseFunc = int(File *); + + using ModeFlags = uint32_t; + + // The three different types of flags below are to be used with '|' operator. + // Their values correspond to mutually exclusive bits in a 32-bit unsigned + // integer value. A flag set can include both READ and WRITE if the file + // is opened in update mode (ie. if the file was opened with a '+' the mode + // string.) + enum class OpenMode : ModeFlags { + READ = 0x1, + WRITE = 0x2, + APPEND = 0x4, + PLUS = 0x8, + }; + + // Denotes a file opened in binary mode (which is specified by including + // the 'b' character in teh mode string.) + enum class ContentType : ModeFlags { + BINARY = 0x10, + }; + + // Denotes a file to be created for writing. + enum class CreateType : ModeFlags { + EXCLUSIVE = 0x100, + }; + +private: + enum class FileOp : uint8_t { NONE, READ, WRITE, SEEK }; + + // Platform specific functions which create new file objects should initialize + // these fields suitably via the constructor. Typically, they should be simple + // syscall wrappers for the corresponding functionality. + WriteFunc *platform_write; + ReadFunc *platform_read; + SeekFunc *platform_seek; + CloseFunc *platform_close; + + Mutex mutex; + + // For files which are readable, we should be able to support one ungetc + // operation even if |buf| is nullptr. So, in the constructor of File, we + // set |buf| to point to this buffer character. + uint8_t ungetc_buf; + + uint8_t *buf; // Pointer to the stream buffer for buffered streams + size_t bufsize; // Size of the buffer pointed to by |buf|. + + // Buffering mode to used to buffer. + int bufmode; + + // If own_buf is true, the |buf| is owned by the stream and will be + // free-ed when close method is called on the stream. + bool own_buf; + + // The mode in which the file was opened. + ModeFlags mode; + + // Current read or write pointer. + size_t pos; + + // Represents the previous operation that was performed. + FileOp prev_op; + + // When the buffer is used as a read buffer, read_limit is the upper limit + // of the index to which the buffer can be read until. + size_t read_limit; + + bool eof; + bool err; + + // This is a convenience RAII class to lock and unlock file objects. + class FileLock { + File *file; + + public: + explicit FileLock(File *f) : file(f) { file->lock(); } + + ~FileLock() { file->unlock(); } + + FileLock(const FileLock &) = delete; + FileLock(FileLock &&) = delete; + }; + +protected: + constexpr bool write_allowed() const { + return mode & (static_cast<ModeFlags>(OpenMode::WRITE) | + static_cast<ModeFlags>(OpenMode::APPEND) | + static_cast<ModeFlags>(OpenMode::PLUS)); + } + + constexpr bool read_allowed() const { + return mode & (static_cast<ModeFlags>(OpenMode::READ) | + static_cast<ModeFlags>(OpenMode::PLUS)); + } + +public: + // We want this constructor to be constexpr so that global file objects + // like stdout do not require invocation of the constructor which can + // potentially lead to static initialization order fiasco. Consequently, + // we will assume that the |buffer| and |buffer_size| argument are + // meaningful - that is, |buffer| is nullptr if and only if |buffer_size| + // is zero. This way, we will not have to employ the semantics of + // the set_buffer method and allocate a buffer. + constexpr File(WriteFunc *wf, ReadFunc *rf, SeekFunc *sf, CloseFunc *cf, + uint8_t *buffer, size_t buffer_size, int buffer_mode, + bool owned, ModeFlags modeflags) + : platform_write(wf), platform_read(rf), platform_seek(sf), + platform_close(cf), mutex(/*timed=*/false, /*recursive=*/false, + /*robust=*/false, /*pshared=*/false), + ungetc_buf(0), buf(buffer), bufsize(buffer_size), bufmode(buffer_mode), + own_buf(owned), mode(modeflags), pos(0), prev_op(FileOp::NONE), + read_limit(0), eof(false), err(false) { + adjust_buf(); + } + + // Buffered write of |len| bytes from |data| without the file lock. + FileIOResult write_unlocked(const void *data, size_t len); + + // Buffered write of |len| bytes from |data| under the file lock. + FileIOResult write(const void *data, size_t len) { + FileLock l(this); + return write_unlocked(data, len); + } + + // Buffered read of |len| bytes into |data| without the file lock. + FileIOResult read_unlocked(void *data, size_t len); + + // Buffered read of |len| bytes into |data| under the file lock. + FileIOResult read(void *data, size_t len) { + FileLock l(this); + return read_unlocked(data, len); + } + + ErrorOr<int> seek(off_t offset, int whence); + + ErrorOr<off_t> tell(); + + // If buffer has data written to it, flush it out. Does nothing if the + // buffer is currently being used as a read buffer. + int flush() { + FileLock lock(this); + return flush_unlocked(); + } + + int flush_unlocked(); + + // Returns EOF on error and keeps the file unchanged. + int ungetc_unlocked(int c); + + int ungetc(int c) { + FileLock lock(this); + return ungetc_unlocked(c); + } + + // Does the following: + // 1. If in write mode, Write out any data present in the buffer. + // 2. Call platform_close. + // platform_close is expected to cleanup the complete file object. + int close() { + { + FileLock lock(this); + if (prev_op == FileOp::WRITE && pos > 0) { + auto buf_result = platform_write(this, buf, pos); + if (buf_result.has_error() || buf_result.value < pos) { + err = true; + return buf_result.error; + } + } + } + + // If we own the buffer, delete it before calling the platform close + // implementation. The platform close should not need to access the buffer + // and we need to clean it up before the entire structure is removed. + if (own_buf) + delete buf; + + // Platform close is expected to cleanup the file data structure which + // includes the file mutex. Hence, we call platform_close after releasing + // the file lock. Another thread doing file operations while a thread is + // closing the file is undefined behavior as per POSIX. + return platform_close(this); + } + + // Sets the internal buffer to |buffer| with buffering mode |mode|. + // |size| is the size of |buffer|. If |size| is non-zero, but |buffer| + // is nullptr, then a buffer owned by this file will be allocated. + // Else, |buffer| will not be owned by this file. + // + // Will return zero on success, or an error value on failure. Will fail + // if: + // 1. |buffer| is not a nullptr but |size| is zero. + // 2. |buffer_mode| is not one of _IOLBF, IOFBF or _IONBF. + // 3. If an allocation was required but the allocation failed. + // For cases 1 and 2, the error returned in EINVAL. For case 3, error returned + // is ENOMEM. + int set_buffer(void *buffer, size_t size, int buffer_mode); + + void lock() { mutex.lock(); } + void unlock() { mutex.unlock(); } + + bool error_unlocked() const { return err; } + + bool error() { + FileLock l(this); + return error_unlocked(); + } + + void clearerr_unlocked() { err = false; } + + void clearerr() { + FileLock l(this); + clearerr_unlocked(); + } + + bool iseof_unlocked() { return eof; } + + bool iseof() { + FileLock l(this); + return iseof_unlocked(); + } + + // Returns an bit map of flags corresponding to enumerations of + // OpenMode, ContentType and CreateType. + static ModeFlags mode_flags(const char *mode); + +private: + FileIOResult write_unlocked_lbf(const uint8_t *data, size_t len); + FileIOResult write_unlocked_fbf(const uint8_t *data, size_t len); + FileIOResult write_unlocked_nbf(const uint8_t *data, size_t len); + + FileIOResult read_unlocked_fbf(uint8_t *data, size_t len); + FileIOResult read_unlocked_nbf(uint8_t *data, size_t len); + size_t copy_data_from_buf(uint8_t *data, size_t len); + + constexpr void adjust_buf() { + if (read_allowed() && (buf == nullptr || bufsize == 0)) { + // We should allow atleast one ungetc operation. + // This might give an impression that a buffer will be used even when + // the user does not want a buffer. But, that will not be the case. + // For reading, the buffering does not come into play. For writing, let + // us take up the three different kinds of buffering separately: + // 1. If user wants _IOFBF but gives a zero buffer, buffering still + // happens in the OS layer until the user flushes. So, from the user's + // point of view, this single byte buffer does not affect their + // experience. + // 2. If user wants _IOLBF but gives a zero buffer, the reasoning is + // very similar to the _IOFBF case. + // 3. If user wants _IONBF, then the buffer is ignored for writing. + // So, all of the above cases, having a single ungetc buffer does not + // affect the behavior experienced by the user. + buf = &ungetc_buf; + bufsize = 1; + own_buf = false; // We shouldn't call free on |buf| when closing the file. + } + } +}; + +// The implementaiton of this function is provided by the platform_file +// library. +ErrorOr<File *> openfile(const char *path, const char *mode); + +// The platform_file library should implement it if it relevant for that +// platform. +int get_fileno(File *f); + +extern File *stdin; +extern File *stdout; +extern File *stderr; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FILE_FILE_H diff --git a/contrib/llvm-project/libc/src/__support/File/linux/dir.cpp b/contrib/llvm-project/libc/src/__support/File/linux/dir.cpp new file mode 100644 index 000000000000..5fe44fa8297b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/linux/dir.cpp @@ -0,0 +1,60 @@ +//===--- Linux implementation of the Dir helpers --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/File/dir.h" + +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" + +#include "hdr/fcntl_macros.h" // For open flags +#include <sys/syscall.h> // For syscall numbers + +namespace LIBC_NAMESPACE_DECL { + +ErrorOr<int> platform_opendir(const char *name) { + int open_flags = O_RDONLY | O_DIRECTORY | O_CLOEXEC; +#ifdef SYS_open + int fd = LIBC_NAMESPACE::syscall_impl<int>(SYS_open, name, open_flags); +#elif defined(SYS_openat) + int fd = + LIBC_NAMESPACE::syscall_impl<int>(SYS_openat, AT_FDCWD, name, open_flags); +#else +#error \ + "SYS_open and SYS_openat syscalls not available to perform an open operation." +#endif + + if (fd < 0) { + return LIBC_NAMESPACE::Error(-fd); + } + return fd; +} + +ErrorOr<size_t> platform_fetch_dirents(int fd, cpp::span<uint8_t> buffer) { +#ifdef SYS_getdents64 + long size = LIBC_NAMESPACE::syscall_impl<long>(SYS_getdents64, fd, + buffer.data(), buffer.size()); +#else +#error "getdents64 syscalls not available to perform a fetch dirents operation." +#endif + + if (size < 0) { + return LIBC_NAMESPACE::Error(static_cast<int>(-size)); + } + return size; +} + +int platform_closedir(int fd) { + int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_close, fd); + if (ret < 0) { + return static_cast<int>(-ret); + } + return 0; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/File/linux/file.cpp b/contrib/llvm-project/libc/src/__support/File/linux/file.cpp new file mode 100644 index 000000000000..4594dadf1ccd --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/linux/file.cpp @@ -0,0 +1,185 @@ +//===--- Implementation of the Linux specialization of File ---------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "file.h" + +#include "hdr/stdio_macros.h" +#include "hdr/types/off_t.h" +#include "src/__support/CPP/new.h" +#include "src/__support/File/file.h" +#include "src/__support/File/linux/lseekImpl.h" +#include "src/__support/OSUtil/fcntl.h" +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/libc_errno.h" // For error macros +#include "src/__support/macros/config.h" + +#include "hdr/fcntl_macros.h" // For mode_t and other flags to the open syscall +#include <sys/stat.h> // For S_IS*, S_IF*, and S_IR* flags. +#include <sys/syscall.h> // For syscall numbers + +namespace LIBC_NAMESPACE_DECL { + +FileIOResult linux_file_write(File *f, const void *data, size_t size) { + auto *lf = reinterpret_cast<LinuxFile *>(f); + int ret = + LIBC_NAMESPACE::syscall_impl<int>(SYS_write, lf->get_fd(), data, size); + if (ret < 0) { + return {0, -ret}; + } + return ret; +} + +FileIOResult linux_file_read(File *f, void *buf, size_t size) { + auto *lf = reinterpret_cast<LinuxFile *>(f); + int ret = + LIBC_NAMESPACE::syscall_impl<int>(SYS_read, lf->get_fd(), buf, size); + if (ret < 0) { + return {0, -ret}; + } + return ret; +} + +ErrorOr<off_t> linux_file_seek(File *f, off_t offset, int whence) { + auto *lf = reinterpret_cast<LinuxFile *>(f); + auto result = internal::lseekimpl(lf->get_fd(), offset, whence); + if (!result.has_value()) + return result.error(); + return result.value(); +} + +int linux_file_close(File *f) { + auto *lf = reinterpret_cast<LinuxFile *>(f); + int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_close, lf->get_fd()); + if (ret < 0) { + return -ret; + } + delete lf; + return 0; +} + +ErrorOr<File *> openfile(const char *path, const char *mode) { + using ModeFlags = File::ModeFlags; + auto modeflags = File::mode_flags(mode); + if (modeflags == 0) { + // return {nullptr, EINVAL}; + return Error(EINVAL); + } + long open_flags = 0; + if (modeflags & ModeFlags(File::OpenMode::APPEND)) { + open_flags = O_CREAT | O_APPEND; + if (modeflags & ModeFlags(File::OpenMode::PLUS)) + open_flags |= O_RDWR; + else + open_flags |= O_WRONLY; + } else if (modeflags & ModeFlags(File::OpenMode::WRITE)) { + open_flags = O_CREAT | O_TRUNC; + if (modeflags & ModeFlags(File::OpenMode::PLUS)) + open_flags |= O_RDWR; + else + open_flags |= O_WRONLY; + } else { + if (modeflags & ModeFlags(File::OpenMode::PLUS)) + open_flags |= O_RDWR; + else + open_flags |= O_RDONLY; + } + + // File created will have 0666 permissions. + constexpr long OPEN_MODE = + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + +#ifdef SYS_open + int fd = + LIBC_NAMESPACE::syscall_impl<int>(SYS_open, path, open_flags, OPEN_MODE); +#elif defined(SYS_openat) + int fd = LIBC_NAMESPACE::syscall_impl<int>(SYS_openat, AT_FDCWD, path, + open_flags, OPEN_MODE); +#else +#error "open and openat syscalls not available." +#endif + + if (fd < 0) + return Error(-fd); + + uint8_t *buffer; + { + AllocChecker ac; + buffer = new (ac) uint8_t[File::DEFAULT_BUFFER_SIZE]; + if (!ac) + return Error(ENOMEM); + } + AllocChecker ac; + auto *file = new (ac) + LinuxFile(fd, buffer, File::DEFAULT_BUFFER_SIZE, _IOFBF, true, modeflags); + if (!ac) + return Error(ENOMEM); + return file; +} + +ErrorOr<LinuxFile *> create_file_from_fd(int fd, const char *mode) { + using ModeFlags = File::ModeFlags; + ModeFlags modeflags = File::mode_flags(mode); + if (modeflags == 0) { + return Error(EINVAL); + } + + auto result = internal::fcntl(fd, F_GETFL); + if (!result.has_value()) { + return Error(EBADF); + } + int fd_flags = result.value(); + + using OpenMode = File::OpenMode; + if (((fd_flags & O_ACCMODE) == O_RDONLY && + !(modeflags & static_cast<ModeFlags>(OpenMode::READ))) || + ((fd_flags & O_ACCMODE) == O_WRONLY && + !(modeflags & static_cast<ModeFlags>(OpenMode::WRITE)))) { + return Error(EINVAL); + } + + bool do_seek = false; + if ((modeflags & static_cast<ModeFlags>(OpenMode::APPEND)) && + !(fd_flags & O_APPEND)) { + do_seek = true; + if (!internal::fcntl(fd, F_SETFL, + reinterpret_cast<void *>(fd_flags | O_APPEND)) + .has_value()) { + return Error(EBADF); + } + } + + uint8_t *buffer; + { + AllocChecker ac; + buffer = new (ac) uint8_t[File::DEFAULT_BUFFER_SIZE]; + if (!ac) { + return Error(ENOMEM); + } + } + AllocChecker ac; + auto *file = new (ac) + LinuxFile(fd, buffer, File::DEFAULT_BUFFER_SIZE, _IOFBF, true, modeflags); + if (!ac) { + return Error(ENOMEM); + } + if (do_seek) { + auto result = file->seek(0, SEEK_END); + if (!result.has_value()) { + free(file); + return Error(result.error()); + } + } + return file; +} + +int get_fileno(File *f) { + auto *lf = reinterpret_cast<LinuxFile *>(f); + return lf->get_fd(); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/File/linux/file.h b/contrib/llvm-project/libc/src/__support/File/linux/file.h new file mode 100644 index 000000000000..16d72a60f863 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/linux/file.h @@ -0,0 +1,37 @@ +//===--- Linux specialization of the File data structure ------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "hdr/types/off_t.h" +#include "src/__support/File/file.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +FileIOResult linux_file_write(File *, const void *, size_t); +FileIOResult linux_file_read(File *, void *, size_t); +ErrorOr<off_t> linux_file_seek(File *, off_t, int); +int linux_file_close(File *); + +class LinuxFile : public File { + int fd; + +public: + constexpr LinuxFile(int file_descriptor, uint8_t *buffer, size_t buffer_size, + int buffer_mode, bool owned, File::ModeFlags modeflags) + : File(&linux_file_write, &linux_file_read, &linux_file_seek, + &linux_file_close, buffer, buffer_size, buffer_mode, owned, + modeflags), + fd(file_descriptor) {} + + int get_fd() const { return fd; } +}; + +// Create a File object and associate it with a fd. +ErrorOr<LinuxFile *> create_file_from_fd(int fd, const char *mode); + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/File/linux/lseekImpl.h b/contrib/llvm-project/libc/src/__support/File/linux/lseekImpl.h new file mode 100644 index 000000000000..300e5c5dd55b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/linux/lseekImpl.h @@ -0,0 +1,51 @@ +//===-- Linux implementation of lseek -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FILE_LINUX_LSEEKIMPL_H +#define LLVM_LIBC_SRC___SUPPORT_FILE_LINUX_LSEEKIMPL_H + +#include "hdr/types/off_t.h" +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" +#include "src/__support/error_or.h" +#include "src/__support/libc_errno.h" +#include "src/__support/macros/config.h" + +#include <stdint.h> // For uint64_t. +#include <sys/syscall.h> // For syscall numbers. + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +LIBC_INLINE ErrorOr<off_t> lseekimpl(int fd, off_t offset, int whence) { + off_t result; +#ifdef SYS_lseek + int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_lseek, fd, offset, whence); + result = ret; +#elif defined(SYS_llseek) || defined(SYS__llseek) + static_assert(sizeof(size_t) == 4, "size_t must be 32 bits."); +#ifdef SYS_llseek + constexpr long LLSEEK_SYSCALL_NO = SYS_llseek; +#elif defined(SYS__llseek) + constexpr long LLSEEK_SYSCALL_NO = SYS__llseek; +#endif + off_t offset_64 = offset; + int ret = LIBC_NAMESPACE::syscall_impl<int>( + LLSEEK_SYSCALL_NO, fd, offset_64 >> 32, offset_64, &result, whence); +#else +#error "lseek, llseek and _llseek syscalls not available." +#endif + if (ret < 0) + return Error(-ret); + return result; +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FILE_LINUX_LSEEKIMPL_H diff --git a/contrib/llvm-project/libc/src/__support/File/linux/stderr.cpp b/contrib/llvm-project/libc/src/__support/File/linux/stderr.cpp new file mode 100644 index 000000000000..bc174792856e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/linux/stderr.cpp @@ -0,0 +1,25 @@ +//===--- Definition of Linux stderr ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "file.h" +#include "hdr/stdio_macros.h" +#include "hdr/types/FILE.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +constexpr size_t STDERR_BUFFER_SIZE = 0; +static LinuxFile StdErr(2, nullptr, STDERR_BUFFER_SIZE, _IONBF, false, + File::ModeFlags(File::OpenMode::APPEND)); +File *stderr = &StdErr; + +} // namespace LIBC_NAMESPACE_DECL + +extern "C" { +FILE *stderr = reinterpret_cast<FILE *>(&LIBC_NAMESPACE::StdErr); +} diff --git a/contrib/llvm-project/libc/src/__support/File/linux/stdin.cpp b/contrib/llvm-project/libc/src/__support/File/linux/stdin.cpp new file mode 100644 index 000000000000..e7b6ede85dde --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/linux/stdin.cpp @@ -0,0 +1,26 @@ +//===--- Definition of Linux stdin ----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "file.h" +#include "hdr/stdio_macros.h" +#include "hdr/types/FILE.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +constexpr size_t STDIN_BUFFER_SIZE = 512; +uint8_t stdin_buffer[STDIN_BUFFER_SIZE]; +static LinuxFile StdIn(0, stdin_buffer, STDIN_BUFFER_SIZE, _IOFBF, false, + File::ModeFlags(File::OpenMode::READ)); +File *stdin = &StdIn; + +} // namespace LIBC_NAMESPACE_DECL + +extern "C" { +FILE *stdin = reinterpret_cast<FILE *>(&LIBC_NAMESPACE::StdIn); +} // extern "C" diff --git a/contrib/llvm-project/libc/src/__support/File/linux/stdout.cpp b/contrib/llvm-project/libc/src/__support/File/linux/stdout.cpp new file mode 100644 index 000000000000..0d3b9f3d0376 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/File/linux/stdout.cpp @@ -0,0 +1,26 @@ +//===--- Definition of Linux stdout ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "file.h" +#include "hdr/stdio_macros.h" +#include "hdr/types/FILE.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +constexpr size_t STDOUT_BUFFER_SIZE = 1024; +uint8_t stdout_buffer[STDOUT_BUFFER_SIZE]; +static LinuxFile StdOut(1, stdout_buffer, STDOUT_BUFFER_SIZE, _IOLBF, false, + File::ModeFlags(File::OpenMode::APPEND)); +File *stdout = &StdOut; + +} // namespace LIBC_NAMESPACE_DECL + +extern "C" { +FILE *stdout = reinterpret_cast<FILE *>(&LIBC_NAMESPACE::StdOut); +} // extern "C" diff --git a/contrib/llvm-project/libc/src/__support/GPU/allocator.cpp b/contrib/llvm-project/libc/src/__support/GPU/allocator.cpp new file mode 100644 index 000000000000..7923fbb2c1c2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/GPU/allocator.cpp @@ -0,0 +1,605 @@ +//===-- GPU memory allocator implementation ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements a parallel allocator intended for use on a GPU device. +// The core algorithm is slab allocator using a random walk over a bitfield for +// maximum parallel progress. Slab handling is done by a wait-free reference +// counted guard. The first use of a slab will create it from system memory for +// re-use. The last use will invalidate it and free the memory. +// +//===----------------------------------------------------------------------===// + +#include "allocator.h" + +#include "src/__support/CPP/atomic.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/new.h" +#include "src/__support/GPU/utils.h" +#include "src/__support/RPC/rpc_client.h" +#include "src/__support/threads/sleep.h" +#include "src/string/memory_utils/inline_memcpy.h" + +namespace LIBC_NAMESPACE_DECL { + +constexpr static uint64_t MAX_SIZE = /* 64 GiB */ 64ull * 1024 * 1024 * 1024; +constexpr static uint64_t SLAB_SIZE = /* 2 MiB */ 2ull * 1024 * 1024; +constexpr static uint64_t ARRAY_SIZE = MAX_SIZE / SLAB_SIZE; +constexpr static uint64_t SLAB_ALIGNMENT = SLAB_SIZE - 1; +constexpr static uint32_t BITS_IN_WORD = sizeof(uint32_t) * 8; +constexpr static uint32_t MIN_SIZE = 16; +constexpr static uint32_t MIN_ALIGNMENT = MIN_SIZE - 1; + +// A sentinel used to indicate an invalid but non-null pointer value. +constexpr static uint64_t SENTINEL = cpp::numeric_limits<uint64_t>::max(); + +// The number of times we will try starting on a single index before skipping +// past it. +constexpr static uint32_t MAX_TRIES = 512; + +static_assert(!(ARRAY_SIZE & (ARRAY_SIZE - 1)), "Must be a power of two"); + +namespace impl { +// Allocates more memory from the system through the RPC interface. All +// allocations from the system MUST be aligned on a 2MiB barrier. The default +// HSA allocator has this behavior for any allocation >= 2MiB and the CUDA +// driver provides an alignment field for virtual memory allocations. +static void *rpc_allocate(uint64_t size) { + void *ptr = nullptr; + rpc::Client::Port port = rpc::client.open<LIBC_MALLOC>(); + port.send_and_recv( + [=](rpc::Buffer *buffer, uint32_t) { buffer->data[0] = size; }, + [&](rpc::Buffer *buffer, uint32_t) { + ptr = reinterpret_cast<void *>(buffer->data[0]); + }); + port.close(); + return ptr; +} + +// Deallocates the associated system memory. +static void rpc_free(void *ptr) { + rpc::Client::Port port = rpc::client.open<LIBC_FREE>(); + port.send([=](rpc::Buffer *buffer, uint32_t) { + buffer->data[0] = reinterpret_cast<uintptr_t>(ptr); + }); + port.close(); +} + +// Convert a potentially disjoint bitmask into an increasing integer per-lane +// for use with indexing between gpu lanes. +static inline uint32_t lane_count(uint64_t lane_mask) { + return cpp::popcount(lane_mask & ((uint64_t(1) << gpu::get_lane_id()) - 1)); +} + +// Obtain an initial value to seed a random number generator. We use the rounded +// multiples of the golden ratio from xorshift* as additional spreading. +static inline uint32_t entropy() { + return (static_cast<uint32_t>(gpu::processor_clock()) ^ + (gpu::get_thread_id_x() * 0x632be59b) ^ + (gpu::get_block_id_x() * 0x85157af5)) * + 0x9e3779bb; +} + +// Generate a random number and update the state using the xorshift32* PRNG. +static inline uint32_t xorshift32(uint32_t &state) { + state ^= state << 13; + state ^= state >> 17; + state ^= state << 5; + return state * 0x9e3779bb; +} + +// Final stage of murmurhash used to get a unique index for the global array +static inline uint32_t hash(uint32_t x) { + x ^= x >> 16; + x *= 0x85ebca6b; + x ^= x >> 13; + x *= 0xc2b2ae35; + x ^= x >> 16; + return x; +} + +// Rounds the input value to the closest permitted chunk size. Here we accept +// the sum of the closest three powers of two. For a 2MiB slab size this is 48 +// different chunk sizes. This gives us average internal fragmentation of 87.5%. +static inline uint32_t get_chunk_size(uint32_t x) { + uint32_t y = x < MIN_SIZE ? MIN_SIZE : x; + uint32_t pow2 = BITS_IN_WORD - cpp::countl_zero(y - 1); + + uint32_t s0 = 0b0100 << (pow2 - 3); + uint32_t s1 = 0b0110 << (pow2 - 3); + uint32_t s2 = 0b0111 << (pow2 - 3); + uint32_t s3 = 0b1000 << (pow2 - 3); + + if (s0 > y) + return (s0 + MIN_ALIGNMENT) & ~MIN_ALIGNMENT; + if (s1 > y) + return (s1 + MIN_ALIGNMENT) & ~MIN_ALIGNMENT; + if (s2 > y) + return (s2 + MIN_ALIGNMENT) & ~MIN_ALIGNMENT; + return (s3 + MIN_ALIGNMENT) & ~MIN_ALIGNMENT; +} + +// Rounds to the nearest power of two. +template <uint32_t N, typename T> +static inline constexpr T round_up(const T x) { + static_assert(((N - 1) & N) == 0, "N must be a power of two"); + return (x + N) & ~(N - 1); +} + +// Perform a lane parallel memset on a uint32_t pointer. +void uniform_memset(uint32_t *s, uint32_t c, uint32_t n, uint64_t uniform) { + uint64_t mask = gpu::get_lane_mask(); + uint32_t workers = cpp::popcount(uniform); + for (uint32_t i = impl::lane_count(mask & uniform); i < n; i += workers) + s[i] = c; +} + +// Indicates that the provided value is a power of two. +static inline constexpr bool is_pow2(uint64_t x) { + return x && (x & (x - 1)) == 0; +} + +} // namespace impl + +/// A slab allocator used to hand out identically sized slabs of memory. +/// Allocation is done through random walks of a bitfield until a free bit is +/// encountered. This reduces contention and is highly parallel on a GPU. +/// +/// 0 4 8 16 ... 2 MiB +/// ┌────────┬──────────┬────────┬──────────────────┬──────────────────────────┐ +/// │ chunk │ index │ pad │ bitfield[] │ memory[] │ +/// └────────┴──────────┴────────┴──────────────────┴──────────────────────────┘ +/// +/// The size of the bitfield is the slab size divided by the chunk size divided +/// by the number of bits per word. We pad the interface to ensure 16 byte +/// alignment and to indicate that if the pointer is not aligned by 2MiB it +/// belongs to a slab rather than the global allocator. +struct Slab { + // Header metadata for the slab, aligned to the minimum alignment. + struct alignas(MIN_SIZE) Header { + uint32_t chunk_size; + uint32_t global_index; + }; + + // Initialize the slab with its chunk size and index in the global table for + // use when freeing. + Slab(uint32_t chunk_size, uint32_t global_index) { + Header *header = reinterpret_cast<Header *>(memory); + header->chunk_size = chunk_size; + header->global_index = global_index; + } + + // Set the necessary bitfield bytes to zero in parallel using many lanes. This + // must be called before the bitfield can be accessed safely, memory is not + // guaranteed to be zero initialized in the current implementation. + void initialize(uint64_t uniform) { + uint32_t size = (bitfield_bytes(get_chunk_size()) + sizeof(uint32_t) - 1) / + sizeof(uint32_t); + impl::uniform_memset(get_bitfield(), 0, size, uniform); + } + + // Get the number of chunks that can theoretically fit inside this slab. + constexpr static uint32_t num_chunks(uint32_t chunk_size) { + return SLAB_SIZE / chunk_size; + } + + // Get the number of bytes needed to contain the bitfield bits. + constexpr static uint32_t bitfield_bytes(uint32_t chunk_size) { + return __builtin_align_up( + ((num_chunks(chunk_size) + BITS_IN_WORD - 1) / BITS_IN_WORD) * 8, + MIN_ALIGNMENT + 1); + } + + // The actual amount of memory available excluding the bitfield and metadata. + constexpr static uint32_t available_bytes(uint32_t chunk_size) { + return SLAB_SIZE - bitfield_bytes(chunk_size) - sizeof(Header); + } + + // The number of chunks that can be stored in this slab. + constexpr static uint32_t available_chunks(uint32_t chunk_size) { + return available_bytes(chunk_size) / chunk_size; + } + + // The length in bits of the bitfield. + constexpr static uint32_t usable_bits(uint32_t chunk_size) { + return available_bytes(chunk_size) / chunk_size; + } + + // Get the location in the memory where we will store the chunk size. + uint32_t get_chunk_size() const { + return reinterpret_cast<const Header *>(memory)->chunk_size; + } + + // Get the location in the memory where we will store the global index. + uint32_t get_global_index() const { + return reinterpret_cast<const Header *>(memory)->global_index; + } + + // Get a pointer to where the bitfield is located in the memory. + uint32_t *get_bitfield() { + return reinterpret_cast<uint32_t *>(memory + sizeof(Header)); + } + + // Get a pointer to where the actual memory to be allocated lives. + uint8_t *get_memory(uint32_t chunk_size) { + return reinterpret_cast<uint8_t *>(get_bitfield()) + + bitfield_bytes(chunk_size); + } + + // Get a pointer to the actual memory given an index into the bitfield. + void *ptr_from_index(uint32_t index, uint32_t chunk_size) { + return get_memory(chunk_size) + index * chunk_size; + } + + // Convert a pointer back into its bitfield index using its offset. + uint32_t index_from_ptr(void *ptr, uint32_t chunk_size) { + return static_cast<uint32_t>(reinterpret_cast<uint8_t *>(ptr) - + get_memory(chunk_size)) / + chunk_size; + } + + // Randomly walks the bitfield until it finds a free bit. Allocations attempt + // to put lanes right next to each other for better caching and convergence. + void *allocate(uint64_t lane_mask, uint64_t uniform) { + uint32_t chunk_size = get_chunk_size(); + uint32_t state = impl::entropy(); + + // The uniform mask represents which lanes contain a uniform target pointer. + // We attempt to place these next to each other. + void *result = nullptr; + for (uint64_t mask = lane_mask; mask; + mask = gpu::ballot(lane_mask, !result)) { + if (result) + continue; + + uint32_t start = gpu::broadcast_value(lane_mask, impl::xorshift32(state)); + + uint32_t id = impl::lane_count(uniform & mask); + uint32_t index = (start + id) % usable_bits(chunk_size); + uint32_t slot = index / BITS_IN_WORD; + uint32_t bit = index % BITS_IN_WORD; + + // Get the mask of bits destined for the same slot and coalesce it. + uint64_t match = uniform & gpu::match_any(mask, slot); + uint32_t length = cpp::popcount(match); + uint32_t bitmask = static_cast<uint32_t>((uint64_t(1) << length) - 1) + << bit; + + uint32_t before = 0; + if (gpu::get_lane_id() == static_cast<uint32_t>(cpp::countr_zero(match))) + before = cpp::AtomicRef(get_bitfield()[slot]) + .fetch_or(bitmask, cpp::MemoryOrder::RELAXED); + before = gpu::shuffle(mask, cpp::countr_zero(match), before); + if (~before & (1 << bit)) + result = ptr_from_index(index, chunk_size); + else + sleep_briefly(); + } + + cpp::atomic_thread_fence(cpp::MemoryOrder::ACQUIRE); + return result; + } + + // Deallocates memory by resetting its corresponding bit in the bitfield. + void deallocate(void *ptr) { + uint32_t chunk_size = get_chunk_size(); + uint32_t index = index_from_ptr(ptr, chunk_size); + uint32_t slot = index / BITS_IN_WORD; + uint32_t bit = index % BITS_IN_WORD; + + cpp::atomic_thread_fence(cpp::MemoryOrder::RELEASE); + cpp::AtomicRef(get_bitfield()[slot]) + .fetch_and(~(1u << bit), cpp::MemoryOrder::RELAXED); + } + + // The actual memory the slab will manage. All offsets are calculated at + // runtime with the chunk size to keep the interface convergent when a warp or + // wavefront is handling multiple sizes at once. + uint8_t memory[SLAB_SIZE]; +}; + +/// A wait-free guard around a pointer resource to be created dynamically if +/// space is available and freed once there are no more users. +struct GuardPtr { +private: + struct RefCounter { + // Indicates that the object is in its deallocation phase and thus invalid. + static constexpr uint64_t INVALID = uint64_t(1) << 63; + + // If a read preempts an unlock call we indicate this so the following + // unlock call can swap out the helped bit and maintain exclusive ownership. + static constexpr uint64_t HELPED = uint64_t(1) << 62; + + // Resets the reference counter, cannot be reset to zero safely. + void reset(uint32_t n, uint64_t &count) { + counter.store(n, cpp::MemoryOrder::RELAXED); + count = n; + } + + // Acquire a slot in the reference counter if it is not invalid. + bool acquire(uint32_t n, uint64_t &count) { + count = counter.fetch_add(n, cpp::MemoryOrder::RELAXED) + n; + return (count & INVALID) == 0; + } + + // Release a slot in the reference counter. This function should only be + // called following a valid acquire call. + bool release(uint32_t n) { + // If this thread caused the counter to reach zero we try to invalidate it + // and obtain exclusive rights to deconstruct it. If the CAS failed either + // another thread resurrected the counter and we quit, or a parallel read + // helped us invalidating it. For the latter, claim that flag and return. + if (counter.fetch_sub(n, cpp::MemoryOrder::RELAXED) == n) { + uint64_t expected = 0; + if (counter.compare_exchange_strong(expected, INVALID, + cpp::MemoryOrder::RELAXED, + cpp::MemoryOrder::RELAXED)) + return true; + else if ((expected & HELPED) && + (counter.exchange(INVALID, cpp::MemoryOrder::RELAXED) & + HELPED)) + return true; + } + return false; + } + + // Returns the current reference count, potentially helping a releasing + // thread. + uint64_t read() { + auto val = counter.load(cpp::MemoryOrder::RELAXED); + if (val == 0 && counter.compare_exchange_strong( + val, INVALID | HELPED, cpp::MemoryOrder::RELAXED)) + return 0; + return (val & INVALID) ? 0 : val; + } + + cpp::Atomic<uint64_t> counter{0}; + }; + + cpp::Atomic<Slab *> ptr{nullptr}; + RefCounter ref{}; + + // Should be called be a single lane for each different pointer. + template <typename... Args> + Slab *try_lock_impl(uint32_t n, uint64_t &count, Args &&...args) { + Slab *expected = ptr.load(cpp::MemoryOrder::RELAXED); + if (!expected && + ptr.compare_exchange_strong( + expected, reinterpret_cast<Slab *>(SENTINEL), + cpp::MemoryOrder::RELAXED, cpp::MemoryOrder::RELAXED)) { + count = cpp::numeric_limits<uint64_t>::max(); + void *raw = impl::rpc_allocate(sizeof(Slab)); + if (!raw) + return nullptr; + return new (raw) Slab(cpp::forward<Args>(args)...); + } + + if (!expected || expected == reinterpret_cast<Slab *>(SENTINEL)) + return nullptr; + + if (!ref.acquire(n, count)) + return nullptr; + + cpp::atomic_thread_fence(cpp::MemoryOrder::ACQUIRE); + return ptr.load(cpp::MemoryOrder::RELAXED); + } + + // Finalize the associated memory and signal that it is ready to use by + // resetting the counter. + void finalize(Slab *mem, uint32_t n, uint64_t &count) { + cpp::atomic_thread_fence(cpp::MemoryOrder::RELEASE); + ptr.store(mem, cpp::MemoryOrder::RELAXED); + cpp::atomic_thread_fence(cpp::MemoryOrder::ACQUIRE); + if (!ref.acquire(n, count)) + ref.reset(n, count); + } + +public: + // Attempt to lock access to the pointer, potentially creating it if empty. + // The uniform mask represents which lanes share the same pointer. For each + // uniform value we elect a leader to handle it on behalf of the other lanes. + template <typename... Args> + Slab *try_lock(uint64_t lane_mask, uint64_t uniform, uint64_t &count, + Args &&...args) { + count = 0; + Slab *result = nullptr; + if (gpu::get_lane_id() == uint32_t(cpp::countr_zero(uniform))) + result = try_lock_impl(cpp::popcount(uniform), count, + cpp::forward<Args>(args)...); + result = gpu::shuffle(lane_mask, cpp::countr_zero(uniform), result); + count = gpu::shuffle(lane_mask, cpp::countr_zero(uniform), count); + + if (!result) + return nullptr; + + // We defer storing the newly allocated slab until now so that we can use + // multiple lanes to initialize it and release it for use. + if (count == cpp::numeric_limits<uint64_t>::max()) { + result->initialize(uniform); + if (gpu::get_lane_id() == uint32_t(cpp::countr_zero(uniform))) + finalize(result, cpp::popcount(uniform), count); + } + + if (count != cpp::numeric_limits<uint64_t>::max()) + count = count - cpp::popcount(uniform) + impl::lane_count(uniform) + 1; + + return result; + } + + // Release the associated lock on the pointer, potentially destroying it. + void unlock(uint64_t lane_mask, uint64_t mask) { + cpp::atomic_thread_fence(cpp::MemoryOrder::RELEASE); + if (gpu::get_lane_id() == uint32_t(cpp::countr_zero(mask)) && + ref.release(cpp::popcount(mask))) { + Slab *p = ptr.load(cpp::MemoryOrder::RELAXED); + p->~Slab(); + impl::rpc_free(p); + cpp::atomic_thread_fence(cpp::MemoryOrder::RELEASE); + ptr.store(nullptr, cpp::MemoryOrder::RELAXED); + } + gpu::sync_lane(lane_mask); + } + + // Get the current value of the reference counter. + uint64_t use_count() { return ref.read(); } +}; + +// The global array used to search for a valid slab to allocate from. +static GuardPtr slots[ARRAY_SIZE] = {}; + +// Tries to find a slab in the table that can support the given chunk size. +static Slab *find_slab(uint32_t chunk_size) { + // We start at a hashed value to spread out different chunk sizes. + uint32_t start = impl::hash(chunk_size); + uint64_t lane_mask = gpu::get_lane_mask(); + uint64_t uniform = gpu::match_any(lane_mask, chunk_size); + + Slab *result = nullptr; + uint32_t nudge = 0; + for (uint64_t mask = lane_mask; mask; + mask = gpu::ballot(lane_mask, !result), ++nudge) { + uint32_t index = cpp::numeric_limits<uint32_t>::max(); + for (uint32_t offset = nudge / MAX_TRIES; + gpu::ballot(lane_mask, index == cpp::numeric_limits<uint32_t>::max()); + offset += cpp::popcount(uniform & lane_mask)) { + uint32_t candidate = + (start + offset + impl::lane_count(uniform & lane_mask)) % ARRAY_SIZE; + uint64_t available = + gpu::ballot(lane_mask, slots[candidate].use_count() < + Slab::available_chunks(chunk_size)); + uint32_t new_index = gpu::shuffle( + lane_mask, cpp::countr_zero(available & uniform), candidate); + + // Each uniform group will use the first empty slot they find. + if ((index == cpp::numeric_limits<uint32_t>::max() && + (available & uniform))) + index = new_index; + + // Guaruntees that this loop will eventuall exit if there is no space. + if (offset >= ARRAY_SIZE) { + result = reinterpret_cast<Slab *>(SENTINEL); + index = 0; + } + } + + // Try to claim a slot for the found slot. + if (!result) { + uint64_t reserved = 0; + Slab *slab = slots[index].try_lock(lane_mask & mask, uniform & mask, + reserved, chunk_size, index); + // If we find a slab with a matching chunk size then we store the result. + // Otherwise, we need to free the claimed lock and continue. In the case + // of out-of-memory we return a sentinel value. + if (slab && reserved <= Slab::available_chunks(chunk_size) && + slab->get_chunk_size() == chunk_size) { + result = slab; + } else if (slab && (reserved > Slab::available_chunks(chunk_size) || + slab->get_chunk_size() != chunk_size)) { + if (slab->get_chunk_size() != chunk_size) + start = index + 1; + slots[index].unlock(gpu::get_lane_mask(), + gpu::get_lane_mask() & uniform); + } else if (!slab && reserved == cpp::numeric_limits<uint64_t>::max()) { + result = reinterpret_cast<Slab *>(SENTINEL); + } else { + sleep_briefly(); + } + } + } + return result; +} + +// Release the lock associated with a given slab. +static void release_slab(Slab *slab) { + uint32_t index = slab->get_global_index(); + uint64_t lane_mask = gpu::get_lane_mask(); + uint64_t uniform = gpu::match_any(lane_mask, index); + slots[index].unlock(lane_mask, uniform); +} + +namespace gpu { + +void *allocate(uint64_t size) { + if (!size) + return nullptr; + + // Allocations requiring a full slab or more go directly to memory. + if (size >= SLAB_SIZE / 2) + return impl::rpc_allocate(impl::round_up<SLAB_SIZE>(size)); + + // Try to find a slab for the rounded up chunk size and allocate from it. + uint32_t chunk_size = impl::get_chunk_size(static_cast<uint32_t>(size)); + Slab *slab = find_slab(chunk_size); + if (!slab || slab == reinterpret_cast<Slab *>(SENTINEL)) + return nullptr; + + uint64_t lane_mask = gpu::get_lane_mask(); + uint64_t uniform = gpu::match_any(lane_mask, slab->get_global_index()); + void *ptr = slab->allocate(lane_mask, uniform); + return ptr; +} + +void deallocate(void *ptr) { + if (!ptr) + return; + + // All non-slab allocations will be aligned on a 2MiB boundary. + if (__builtin_is_aligned(ptr, SLAB_ALIGNMENT + 1)) + return impl::rpc_free(ptr); + + // The original slab pointer is the 2MiB boundary using the given pointer. + Slab *slab = cpp::launder(reinterpret_cast<Slab *>( + (reinterpret_cast<uintptr_t>(ptr) & ~SLAB_ALIGNMENT))); + slab->deallocate(ptr); + release_slab(slab); +} + +void *reallocate(void *ptr, uint64_t size) { + if (ptr == nullptr) + return gpu::allocate(size); + + // Non-slab allocations are considered foreign pointers so we fail. + if (__builtin_is_aligned(ptr, SLAB_ALIGNMENT + 1)) + return nullptr; + + // The original slab pointer is the 2MiB boundary using the given pointer. + Slab *slab = cpp::launder(reinterpret_cast<Slab *>( + (reinterpret_cast<uintptr_t>(ptr) & ~SLAB_ALIGNMENT))); + if (slab->get_chunk_size() >= size) + return ptr; + + // If we need a new chunk we reallocate and copy it over. + void *new_ptr = gpu::allocate(size); + inline_memcpy(new_ptr, ptr, slab->get_chunk_size()); + gpu::deallocate(ptr); + return new_ptr; +} + +void *aligned_allocate(uint32_t alignment, uint64_t size) { + // All alignment values must be a non-zero power of two. + if (!impl::is_pow2(alignment)) + return nullptr; + + // If the requested alignment is less than what we already provide this is + // just a normal allocation. + if (alignment <= MIN_ALIGNMENT + 1) + return gpu::allocate(size); + + // We can't handle alignments greater than 2MiB so we simply fail. + if (alignment > SLAB_ALIGNMENT + 1) + return nullptr; + + // Trying to handle allocation internally would break the assumption that each + // chunk is identical to eachother. Allocate enough memory with worst-case + // alignment and then round up. The index logic will round down properly. + uint64_t rounded = size + alignment - MIN_ALIGNMENT; + void *ptr = gpu::allocate(rounded); + return __builtin_align_up(ptr, alignment); +} + +} // namespace gpu +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/GPU/allocator.h b/contrib/llvm-project/libc/src/__support/GPU/allocator.h new file mode 100644 index 000000000000..a7cf8bceef27 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/GPU/allocator.h @@ -0,0 +1,26 @@ +//===-- GPU memory allocator implementation ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_GPU_ALLOCATOR_H +#define LLVM_LIBC_SRC___SUPPORT_GPU_ALLOCATOR_H + +#include "src/__support/macros/config.h" +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace gpu { + +void *allocate(uint64_t size); +void deallocate(void *ptr); +void *reallocate(void *ptr, uint64_t size); +void *aligned_allocate(uint32_t alignment, uint64_t size); + +} // namespace gpu +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_GPU_ALLOCATOR_H diff --git a/contrib/llvm-project/libc/src/__support/GPU/utils.h b/contrib/llvm-project/libc/src/__support/GPU/utils.h new file mode 100644 index 000000000000..1b3e6edfc4e0 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/GPU/utils.h @@ -0,0 +1,138 @@ +//===---------------- Implementation of GPU utils ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_GPU_UTILS_H +#define LLVM_LIBC_SRC___SUPPORT_GPU_UTILS_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#if !__has_include(<gpuintrin.h>) +#error "Unsupported compiler" +#endif + +#include <gpuintrin.h> + +namespace LIBC_NAMESPACE_DECL { +namespace gpu { + +template <typename T> using Private = __gpu_private T; +template <typename T> using Constant = __gpu_constant T; +template <typename T> using Local = __gpu_local T; +template <typename T> using Global = __gpu_local T; + +LIBC_INLINE uint32_t get_num_blocks_x() { return __gpu_num_blocks(0); } + +LIBC_INLINE uint32_t get_num_blocks_y() { return __gpu_num_blocks(1); } + +LIBC_INLINE uint32_t get_num_blocks_z() { return __gpu_num_blocks(2); } + +LIBC_INLINE uint64_t get_num_blocks() { + return get_num_blocks_x() * get_num_blocks_y() * get_num_blocks_z(); +} + +LIBC_INLINE uint32_t get_block_id_x() { return __gpu_block_id(0); } + +LIBC_INLINE uint32_t get_block_id_y() { return __gpu_block_id(1); } + +LIBC_INLINE uint32_t get_block_id_z() { return __gpu_block_id(2); } + +LIBC_INLINE uint64_t get_block_id() { + return get_block_id_x() + get_num_blocks_x() * get_block_id_y() + + get_num_blocks_x() * get_num_blocks_y() * get_block_id_z(); +} + +LIBC_INLINE uint32_t get_num_threads_x() { return __gpu_num_threads(0); } + +LIBC_INLINE uint32_t get_num_threads_y() { return __gpu_num_threads(1); } + +LIBC_INLINE uint32_t get_num_threads_z() { return __gpu_num_threads(2); } + +LIBC_INLINE uint64_t get_num_threads() { + return get_num_threads_x() * get_num_threads_y() * get_num_threads_z(); +} + +LIBC_INLINE uint32_t get_thread_id_x() { return __gpu_thread_id(0); } + +LIBC_INLINE uint32_t get_thread_id_y() { return __gpu_thread_id(1); } + +LIBC_INLINE uint32_t get_thread_id_z() { return __gpu_thread_id(2); } + +LIBC_INLINE uint64_t get_thread_id() { + return get_thread_id_x() + get_num_threads_x() * get_thread_id_y() + + get_num_threads_x() * get_num_threads_y() * get_thread_id_z(); +} + +LIBC_INLINE uint32_t get_lane_size() { return __gpu_num_lanes(); } + +LIBC_INLINE uint32_t get_lane_id() { return __gpu_lane_id(); } + +LIBC_INLINE uint64_t get_lane_mask() { return __gpu_lane_mask(); } + +LIBC_INLINE uint32_t broadcast_value(uint64_t lane_mask, uint32_t x) { + return __gpu_read_first_lane_u32(lane_mask, x); +} + +LIBC_INLINE uint64_t ballot(uint64_t lane_mask, bool x) { + return __gpu_ballot(lane_mask, x); +} + +LIBC_INLINE void sync_threads() { __gpu_sync_threads(); } + +LIBC_INLINE void sync_lane(uint64_t lane_mask) { __gpu_sync_lane(lane_mask); } + +LIBC_INLINE uint32_t shuffle(uint64_t lane_mask, uint32_t idx, uint32_t x, + uint32_t width = __gpu_num_lanes()) { + return __gpu_shuffle_idx_u32(lane_mask, idx, x, width); +} + +LIBC_INLINE uint64_t shuffle(uint64_t lane_mask, uint32_t idx, uint64_t x, + uint32_t width = __gpu_num_lanes()) { + return __gpu_shuffle_idx_u64(lane_mask, idx, x, width); +} + +template <typename T> +LIBC_INLINE T *shuffle(uint64_t lane_mask, uint32_t idx, T *x, + uint32_t width = __gpu_num_lanes()) { + return reinterpret_cast<T *>(__gpu_shuffle_idx_u64( + lane_mask, idx, reinterpret_cast<uintptr_t>(x), width)); +} + +LIBC_INLINE uint64_t match_any(uint64_t lane_mask, uint32_t x) { + return __gpu_match_any_u32(lane_mask, x); +} + +LIBC_INLINE uint64_t match_all(uint64_t lane_mask, uint32_t x) { + return __gpu_match_all_u32(lane_mask, x); +} + +[[noreturn]] LIBC_INLINE void end_program() { __gpu_exit(); } + +LIBC_INLINE bool is_first_lane(uint64_t lane_mask) { + return __gpu_is_first_in_lane(lane_mask); +} + +LIBC_INLINE uint32_t reduce(uint64_t lane_mask, uint32_t x) { + return __gpu_lane_sum_u32(lane_mask, x); +} + +LIBC_INLINE uint32_t scan(uint64_t lane_mask, uint32_t x) { + return __gpu_lane_scan_u32(lane_mask, x); +} + +LIBC_INLINE uint64_t fixed_frequency_clock() { + return __builtin_readsteadycounter(); +} + +LIBC_INLINE uint64_t processor_clock() { return __builtin_readcyclecounter(); } + +} // namespace gpu +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_GPU_UTILS_H diff --git a/contrib/llvm-project/libc/src/__support/HashTable/bitmask.h b/contrib/llvm-project/libc/src/__support/HashTable/bitmask.h new file mode 100644 index 000000000000..3cac481b8060 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/HashTable/bitmask.h @@ -0,0 +1,93 @@ +//===-- HashTable BitMasks --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_HASHTABLE_BITMASK_H +#define LLVM_LIBC_SRC___SUPPORT_HASHTABLE_BITMASK_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/cpu_features.h" +#include <stddef.h> // size_t +#include <stdint.h> // uint8_t, uint64_t + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// Implementations of the bitmask. +// The backend word type may vary depending on different microarchitectures. +// For example, with X86 SSE2, the bitmask is just the 16bit unsigned integer +// corresponding to lanes in a SIMD register. +// +// Notice that this implementation is simplified from traditional swisstable: +// since we do not support deletion, we only need to care about if the highest +// bit is set or not: +// ============================= +// | Slot Status | Bitmask | +// ============================= +// | Available | 0b1xxx'xxxx | +// | Occupied | 0b0xxx'xxxx | +// ============================= +template <typename T, size_t WORD_STRIDE> struct BitMaskAdaptor { + // A stride in the bitmask may use multiple bits. + LIBC_INLINE_VAR constexpr static size_t STRIDE = WORD_STRIDE; + + T word; + + // Check if any bit is set inside the word. + LIBC_INLINE constexpr bool any_bit_set() const { return word != 0; } + + // Count trailing zeros with respect to stride. (Assume the bitmask is none + // zero.) + LIBC_INLINE constexpr size_t lowest_set_bit_nonzero() const { + return cpp::countr_zero<T>(word) / WORD_STRIDE; + } +}; + +// Not all bitmasks are iterable --- only those who has only MSB set in each +// lane. Hence, we make the types nomially different to distinguish them. +template <class BitMask> struct IteratableBitMaskAdaptor : public BitMask { + // Use the bitmask as an iterator. Update the state and return current lowest + // set bit. To make the bitmask iterable, each stride must contain 0 or exact + // 1 set bit. + LIBC_INLINE void remove_lowest_bit() { + // Remove the last set bit inside the word: + // word = 011110100 (original value) + // word - 1 = 011110011 (invert all bits up to the last set bit) + // word & (word - 1) = 011110000 (value with the last bit cleared) + this->word = this->word & (this->word - 1); + } + using value_type = size_t; + using iterator = BitMask; + using const_iterator = BitMask; + LIBC_INLINE size_t operator*() const { + return this->lowest_set_bit_nonzero(); + } + LIBC_INLINE IteratableBitMaskAdaptor &operator++() { + this->remove_lowest_bit(); + return *this; + } + LIBC_INLINE IteratableBitMaskAdaptor begin() { return *this; } + LIBC_INLINE IteratableBitMaskAdaptor end() { return {BitMask{0}}; } + LIBC_INLINE bool operator==(const IteratableBitMaskAdaptor &other) { + return this->word == other.word; + } + LIBC_INLINE bool operator!=(const IteratableBitMaskAdaptor &other) { + return this->word != other.word; + } +}; + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#if defined(LIBC_TARGET_CPU_HAS_SSE2) && defined(__LIBC_EXPLICIT_SIMD_OPT) +#include "sse2/bitmask_impl.inc" +#else +#include "generic/bitmask_impl.inc" +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_HASHTABLE_BITMASK_H diff --git a/contrib/llvm-project/libc/src/__support/HashTable/generic/bitmask_impl.inc b/contrib/llvm-project/libc/src/__support/HashTable/generic/bitmask_impl.inc new file mode 100644 index 000000000000..d526dc1ece29 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/HashTable/generic/bitmask_impl.inc @@ -0,0 +1,124 @@ +//===-- HashTable BitMasks Generic Implementation ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" +#include "src/__support/endian_internal.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// GPU architectures are 64-bit but use 32-bit general purpose registers. +#ifdef LIBC_TARGET_ARCH_IS_GPU +using bitmask_t = uint32_t; +#else +using bitmask_t = uintptr_t; +#endif + +// Helper function to spread a byte across the whole word. +// Accumutively, the procedure looks like: +// byte = 0x00000000000000ff +// byte | (byte << 8) = 0x000000000000ffff +// byte | (byte << 16) = 0x00000000ffffffff +// byte | (byte << 32) = 0xffffffffffffffff +LIBC_INLINE constexpr bitmask_t repeat_byte(bitmask_t byte) { + size_t shift_amount = 8; + while (shift_amount < sizeof(bitmask_t) * 8) { + byte |= byte << shift_amount; + shift_amount <<= 1; + } + return byte; +} + +using BitMask = BitMaskAdaptor<bitmask_t, 0x8ul>; +using IteratableBitMask = IteratableBitMaskAdaptor<BitMask>; + +struct Group { + LIBC_INLINE_VAR static constexpr bitmask_t MASK = repeat_byte(0x80ul); + bitmask_t data; + + // Load a group of control words from an arbitary address. + LIBC_INLINE static Group load(const void *addr) { + char bytes[sizeof(bitmask_t)]; + + for (size_t i = 0; i < sizeof(bitmask_t); ++i) + bytes[i] = static_cast<const char *>(addr)[i]; + return Group{cpp::bit_cast<bitmask_t>(bytes)}; + } + + // Load a group of control words from an aligned address. + LIBC_INLINE static Group load_aligned(const void *addr) { + return *static_cast<const Group *>(addr); + } + + // Find out the lanes equal to the given byte and return the bitmask + // with corresponding bits set. + LIBC_INLINE IteratableBitMask match_byte(uint8_t byte) const { + // Given byte = 0x10, suppose the data is: + // + // data = [ 0x10 | 0x10 | 0x00 | 0xF1 | ... ] + // + // First, we compare the byte using XOR operation: + // + // [ 0x10 | 0x10 | 0x10 | 0x10 | ... ] (0) + // ^ [ 0x10 | 0x10 | 0x00 | 0xF1 | ... ] (1) + // = [ 0x00 | 0x00 | 0x10 | 0xE1 | ... ] (2) + // + // Notice that the equal positions will now be 0x00, so if we substract 0x01 + // respective to every byte, it will need to carry the substraction to upper + // bits (assume no carry from the hidden parts) + // [ 0x00 | 0x00 | 0x10 | 0xE1 | ... ] (2) + // - [ 0x01 | 0x01 | 0x01 | 0x01 | ... ] (3) + // = [ 0xFE | 0xFF | 0x0F | 0xE0 | ... ] (4) + // + // But there may be some bytes whose highest bit is already set after the + // xor operation. To rule out these positions, we AND them with the NOT + // of the XOR result: + // + // [ 0xFF | 0xFF | 0xEF | 0x1E | ... ] (5, NOT (2)) + // & [ 0xFE | 0xFF | 0x0F | 0xE0 | ... ] (4) + // = [ 0xFE | 0xFF | 0x0F | 0x10 | ... ] (6) + // + // To make the bitmask iteratable, only one bit can be set in each stride. + // So we AND each byte with 0x80 and keep only the highest bit: + // + // [ 0xFE | 0xFF | 0x0F | 0x10 | ... ] (6) + // & [ 0x80 | 0x80 | 0x80 | 0x80 | ... ] (7) + // = [ 0x80 | 0x80 | 0x00 | 0x00 | ... ] (8) + // + // However, there are possitbilites for false positives. For example, if the + // data is [ 0x10 | 0x11 | 0x10 | 0xF1 | ... ]. This only happens when there + // is a key only differs from the searched by the lowest bit. The claims + // are: + // + // - This never happens for `EMPTY` and `DELETED`, only full entries. + // - The check for key equality will catch these. + // - This only happens if there is at least 1 true match. + // - The chance of this happening is very low (< 1% chance per byte). + static constexpr bitmask_t ONES = repeat_byte(0x01ul); + auto cmp = data ^ repeat_byte(static_cast<bitmask_t>(byte) & 0xFFul); + auto result = + LIBC_NAMESPACE::Endian::to_little_endian((cmp - ONES) & ~cmp & MASK); + return {BitMask{result}}; + } + + // Find out the lanes equal to EMPTY or DELETE (highest bit set) and + // return the bitmask with corresponding bits set. + LIBC_INLINE BitMask mask_available() const { + bitmask_t le_data = LIBC_NAMESPACE::Endian::to_little_endian(data); + return {le_data & MASK}; + } + + LIBC_INLINE IteratableBitMask occupied() const { + bitmask_t available = mask_available().word; + return {BitMask{available ^ MASK}}; + } +}; +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/HashTable/randomness.h b/contrib/llvm-project/libc/src/__support/HashTable/randomness.h new file mode 100644 index 000000000000..7e54c9aa6ad1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/HashTable/randomness.h @@ -0,0 +1,61 @@ +//===-- HashTable Randomness ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_HASHTABLE_RANDOMNESS_H +#define LLVM_LIBC_SRC___SUPPORT_HASHTABLE_RANDOMNESS_H + +#include "src/__support/common.h" +#include "src/__support/hash.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#if defined(LIBC_HASHTABLE_USE_GETRANDOM) +#include "hdr/errno_macros.h" +#include "src/__support/OSUtil/linux/getrandom.h" +#endif + +namespace LIBC_NAMESPACE_DECL { +namespace internal { +namespace randomness { +// We need an initial state for the hash function. More entropy are to be added +// at the first use and each round of reseeding. The following random numbers +// are generated from https://www.random.org/cgi-bin/randbyte?nbytes=64&format=h +LIBC_INLINE_VAR thread_local HashState state = { + 0x38049a7ea6f5a79b, 0x45cb02147c3f718a, 0x53eb431c12770718, + 0x5b55742bd20a2fcb}; +LIBC_INLINE_VAR thread_local uint64_t counter = 0; +LIBC_INLINE_VAR constexpr uint64_t RESEED_PERIOD = 1024; +LIBC_INLINE uint64_t next_random_seed() { + if (counter % RESEED_PERIOD == 0) { + uint64_t entropy[2]; + entropy[0] = reinterpret_cast<uint64_t>(&entropy); + entropy[1] = reinterpret_cast<uint64_t>(&state); +#if defined(LIBC_HASHTABLE_USE_GETRANDOM) + size_t count = sizeof(entropy); + uint8_t *buffer = reinterpret_cast<uint8_t *>(entropy); + while (count > 0) { + auto len = internal::getrandom(buffer, count, 0); + if (!len.has_value()) { + if (len.error() == ENOSYS) + break; + continue; + } + count -= len.value(); + buffer += len.value(); + } +#endif + state.update(&entropy, sizeof(entropy)); + } + state.update(&counter, sizeof(counter)); + counter++; + return state.finish(); +} + +} // namespace randomness +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_HASHTABLE_RANDOMNESS_H diff --git a/contrib/llvm-project/libc/src/__support/HashTable/sse2/bitmask_impl.inc b/contrib/llvm-project/libc/src/__support/HashTable/sse2/bitmask_impl.inc new file mode 100644 index 000000000000..eb4b3b5119f2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/HashTable/sse2/bitmask_impl.inc @@ -0,0 +1,52 @@ +//===-- HashTable BitMasks SSE2 Implementation ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <immintrin.h> + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { +// With SSE2, every bitmask is iteratable as +// we use single bit to encode the data. + +using BitMask = BitMaskAdaptor<uint16_t, 0x1u>; +using IteratableBitMask = IteratableBitMaskAdaptor<BitMask>; + +struct Group { + __m128i data; + + // Load a group of control words from an arbitary address. + LIBC_INLINE static Group load(const void *addr) { + return {_mm_loadu_si128(static_cast<const __m128i *>(addr))}; + } + + // Load a group of control words from an aligned address. + LIBC_INLINE static Group load_aligned(const void *addr) { + return {_mm_load_si128(static_cast<const __m128i *>(addr))}; + } + + // Find out the lanes equal to the given byte and return the bitmask + // with corresponding bits set. + LIBC_INLINE IteratableBitMask match_byte(uint8_t byte) const { + auto cmp = _mm_cmpeq_epi8(data, _mm_set1_epi8(byte)); + auto bitmask = static_cast<uint16_t>(_mm_movemask_epi8(cmp)); + return {{bitmask}}; + } + + LIBC_INLINE BitMask mask_available() const { + auto bitmask = static_cast<uint16_t>(_mm_movemask_epi8(data)); + return {bitmask}; + } + + LIBC_INLINE IteratableBitMask occupied() const { + return {{static_cast<uint16_t>(~mask_available().word)}}; + } +}; +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/HashTable/table.h b/contrib/llvm-project/libc/src/__support/HashTable/table.h new file mode 100644 index 000000000000..10dd9711afbf --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/HashTable/table.h @@ -0,0 +1,356 @@ +//===-- Resizable Monotonic HashTable ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_HASHTABLE_TABLE_H +#define LLVM_LIBC_SRC___SUPPORT_HASHTABLE_TABLE_H + +#include "hdr/types/ENTRY.h" +#include "src/__support/CPP/bit.h" // bit_ceil +#include "src/__support/CPP/new.h" +#include "src/__support/HashTable/bitmask.h" +#include "src/__support/hash.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" +#include "src/__support/memory_size.h" +#include "src/string/memory_utils/inline_strcmp.h" +#include "src/string/string_utils.h" +#include <stddef.h> +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +LIBC_INLINE uint8_t secondary_hash(uint64_t hash) { + // top 7 bits of the hash. + return static_cast<uint8_t>(hash >> 57); +} + +// Probe sequence based on triangular numbers, which is guaranteed (since our +// table size is a power of two) to visit every group of elements exactly once. +// +// A triangular probe has us jump by 1 more group every time. So first we +// jump by 1 group (meaning we just continue our linear scan), then 2 groups +// (skipping over 1 group), then 3 groups (skipping over 2 groups), and so on. +// +// If we set sizeof(Group) to be one unit: +// T[k] = sum {1 + 2 + ... + k} = k * (k + 1) / 2 +// It is provable that T[k] mod 2^m generates a permutation of +// 0, 1, 2, 3, ..., 2^m - 2, 2^m - 1 +// Detailed proof is available at: +// https://fgiesen.wordpress.com/2015/02/22/triangular-numbers-mod-2n/ +struct ProbeSequence { + size_t position; + size_t stride; + size_t entries_mask; + + LIBC_INLINE size_t next() { + position += stride; + position &= entries_mask; + stride += sizeof(Group); + return position; + } +}; + +// The number of entries is at least group width: we do not +// need to do the fixup when we set the control bytes. +// The number of entries is at least 8: we don't have to worry +// about special sizes when check the fullness of the table. +LIBC_INLINE size_t capacity_to_entries(size_t cap) { + if (8 >= sizeof(Group) && cap < 8) + return 8; + if (16 >= sizeof(Group) && cap < 15) + return 16; + if (cap < sizeof(Group)) + cap = sizeof(Group); + // overflow is always checked in allocate() + return cpp::bit_ceil(cap * 8 / 7); +} + +// The heap memory layout for N buckets HashTable is as follows: +// +// ======================= +// | N * Entry | +// ======================= <- align boundary +// | Header | +// ======================= <- align boundary (for fast resize) +// | (N + 1) * Byte | +// ======================= +// +// The trailing group part is to make sure we can always load +// a whole group of control bytes. + +struct HashTable { + HashState state; + size_t entries_mask; // number of buckets - 1 + size_t available_slots; // less than capacity +private: + // How many entries are there in the table. + LIBC_INLINE size_t num_of_entries() const { return entries_mask + 1; } + + // How many entries can we store in the table before resizing. + LIBC_INLINE size_t full_capacity() const { return num_of_entries() / 8 * 7; } + + // The alignment of the whole memory area is the maximum of the alignment + // among the following types: + // - HashTable + // - ENTRY + // - Group + LIBC_INLINE constexpr static size_t table_alignment() { + size_t left_align = alignof(HashTable) > alignof(ENTRY) ? alignof(HashTable) + : alignof(ENTRY); + return left_align > alignof(Group) ? left_align : alignof(Group); + } + + LIBC_INLINE bool is_full() const { return available_slots == 0; } + + LIBC_INLINE size_t offset_from_entries() const { + size_t entries_size = num_of_entries() * sizeof(ENTRY); + return entries_size + + SafeMemSize::offset_to(entries_size, table_alignment()); + } + + LIBC_INLINE constexpr static size_t offset_to_groups() { + size_t header_size = sizeof(HashTable); + return header_size + SafeMemSize::offset_to(header_size, table_alignment()); + } + + LIBC_INLINE ENTRY &entry(size_t i) { + return reinterpret_cast<ENTRY *>(this)[-i - 1]; + } + + LIBC_INLINE const ENTRY &entry(size_t i) const { + return reinterpret_cast<const ENTRY *>(this)[-i - 1]; + } + + LIBC_INLINE uint8_t &control(size_t i) { + uint8_t *ptr = reinterpret_cast<uint8_t *>(this) + offset_to_groups(); + return ptr[i]; + } + + LIBC_INLINE const uint8_t &control(size_t i) const { + const uint8_t *ptr = + reinterpret_cast<const uint8_t *>(this) + offset_to_groups(); + return ptr[i]; + } + + // We duplicate a group of control bytes to the end. Thus, it is possible that + // we need to set two control bytes at the same time. + LIBC_INLINE void set_ctrl(size_t index, uint8_t value) { + size_t index2 = ((index - sizeof(Group)) & entries_mask) + sizeof(Group); + control(index) = value; + control(index2) = value; + } + + LIBC_INLINE size_t find(const char *key, uint64_t primary) { + uint8_t secondary = secondary_hash(primary); + ProbeSequence sequence{static_cast<size_t>(primary), 0, entries_mask}; + while (true) { + size_t pos = sequence.next(); + Group ctrls = Group::load(&control(pos)); + IteratableBitMask masks = ctrls.match_byte(secondary); + for (size_t i : masks) { + size_t index = (pos + i) & entries_mask; + ENTRY &entry = this->entry(index); + auto comp = [](char l, char r) -> int { return l - r; }; + if (LIBC_LIKELY(entry.key != nullptr && + inline_strcmp(entry.key, key, comp) == 0)) + return index; + } + BitMask available = ctrls.mask_available(); + // Since there is no deletion, the first time we find an available slot + // it is also ready to be used as an insertion point. Therefore, we also + // return the first available slot we find. If such entry is empty, the + // key will be nullptr. + if (LIBC_LIKELY(available.any_bit_set())) { + size_t index = + (pos + available.lowest_set_bit_nonzero()) & entries_mask; + return index; + } + } + } + + LIBC_INLINE uint64_t oneshot_hash(const char *key) const { + LIBC_NAMESPACE::internal::HashState hasher = state; + hasher.update(key, internal::string_length(key)); + return hasher.finish(); + } + + // A fast insertion routine without checking if a key already exists. + // Nor does the routine check if the table is full. + // This is only to be used in grow() where we insert all existing entries + // into a new table. Hence, the requirements are naturally satisfied. + LIBC_INLINE ENTRY *unsafe_insert(ENTRY item) { + uint64_t primary = oneshot_hash(item.key); + uint8_t secondary = secondary_hash(primary); + ProbeSequence sequence{static_cast<size_t>(primary), 0, entries_mask}; + while (true) { + size_t pos = sequence.next(); + Group ctrls = Group::load(&control(pos)); + BitMask available = ctrls.mask_available(); + if (available.any_bit_set()) { + size_t index = + (pos + available.lowest_set_bit_nonzero()) & entries_mask; + set_ctrl(index, secondary); + entry(index).key = item.key; + entry(index).data = item.data; + available_slots--; + return &entry(index); + } + } + } + + LIBC_INLINE HashTable *grow() const { + size_t hint = full_capacity() + 1; + HashState state = this->state; + // migrate to a new random state + state.update(&hint, sizeof(hint)); + HashTable *new_table = allocate(hint, state.finish()); + // It is safe to call unsafe_insert() because we know that: + // - the new table has enough capacity to hold all the entries + // - there is no duplicate key in the old table + if (new_table != nullptr) + for (ENTRY e : *this) + new_table->unsafe_insert(e); + return new_table; + } + + LIBC_INLINE static ENTRY *insert(HashTable *&table, ENTRY item, + uint64_t primary) { + auto index = table->find(item.key, primary); + auto slot = &table->entry(index); + // SVr4 and POSIX.1-2001 specify that action is significant only for + // unsuccessful searches, so that an ENTER should not do anything + // for a successful search. + if (slot->key != nullptr) + return slot; + + // if table of full, we try to grow the table + if (table->is_full()) { + HashTable *new_table = table->grow(); + // allocation failed, return nullptr to indicate failure + if (new_table == nullptr) + return nullptr; + // resized sccuessfully: clean up the old table and use the new one + deallocate(table); + table = new_table; + // it is still valid to use the fastpath insertion. + return table->unsafe_insert(item); + } + + table->set_ctrl(index, secondary_hash(primary)); + slot->key = item.key; + slot->data = item.data; + table->available_slots--; + return slot; + } + +public: + LIBC_INLINE static void deallocate(HashTable *table) { + if (table) { + void *ptr = + reinterpret_cast<uint8_t *>(table) - table->offset_from_entries(); + operator delete(ptr, std::align_val_t{table_alignment()}); + } + } + + LIBC_INLINE static HashTable *allocate(size_t capacity, uint64_t randomness) { + // check if capacity_to_entries overflows MAX_MEM_SIZE + if (capacity > size_t{1} << (8 * sizeof(size_t) - 1 - 3)) + return nullptr; + SafeMemSize entries{capacity_to_entries(capacity)}; + SafeMemSize entries_size = entries * SafeMemSize{sizeof(ENTRY)}; + SafeMemSize align_boundary = entries_size.align_up(table_alignment()); + SafeMemSize ctrl_sizes = entries + SafeMemSize{sizeof(Group)}; + SafeMemSize header_size{offset_to_groups()}; + SafeMemSize total_size = + (align_boundary + header_size + ctrl_sizes).align_up(table_alignment()); + if (!total_size.valid()) + return nullptr; + AllocChecker ac; + + void *mem = operator new(total_size, std::align_val_t{table_alignment()}, + ac); + + HashTable *table = reinterpret_cast<HashTable *>( + static_cast<uint8_t *>(mem) + align_boundary); + if (ac) { + table->entries_mask = entries - 1u; + table->available_slots = entries / 8 * 7; + table->state = HashState{randomness}; + __builtin_memset(&table->control(0), 0x80, ctrl_sizes); + __builtin_memset(mem, 0, table->offset_from_entries()); + } + return table; + } + + struct FullTableIterator { + size_t current_offset; + size_t remaining; + IteratableBitMask current_mask; + const HashTable &table; + + // It is fine to use remaining to represent the iterator: + // - this comparison only happens with the same table + // - hashtable will not be mutated during the iteration + LIBC_INLINE bool operator==(const FullTableIterator &other) const { + return remaining == other.remaining; + } + LIBC_INLINE bool operator!=(const FullTableIterator &other) const { + return remaining != other.remaining; + } + + LIBC_INLINE FullTableIterator &operator++() { + this->ensure_valid_group(); + current_mask.remove_lowest_bit(); + remaining--; + return *this; + } + LIBC_INLINE const ENTRY &operator*() { + this->ensure_valid_group(); + return table.entry( + (current_offset + current_mask.lowest_set_bit_nonzero()) & + table.entries_mask); + } + + private: + LIBC_INLINE void ensure_valid_group() { + while (!current_mask.any_bit_set()) { + current_offset += sizeof(Group); + // It is ensured that the load will only happen at aligned boundaries. + current_mask = + Group::load_aligned(&table.control(current_offset)).occupied(); + } + } + }; + + using value_type = ENTRY; + using iterator = FullTableIterator; + iterator begin() const { + return {0, full_capacity() - available_slots, + Group::load_aligned(&control(0)).occupied(), *this}; + } + iterator end() const { return {0, 0, {BitMask{0}}, *this}; } + + LIBC_INLINE ENTRY *find(const char *key) { + uint64_t primary = oneshot_hash(key); + ENTRY &entry = this->entry(find(key, primary)); + if (entry.key == nullptr) + return nullptr; + return &entry; + } + + LIBC_INLINE static ENTRY *insert(HashTable *&table, ENTRY item) { + uint64_t primary = table->oneshot_hash(item.key); + return insert(table, item, primary); + } +}; +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_HASHTABLE_TABLE_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/exit.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/exit.cpp new file mode 100644 index 000000000000..64d3862422b6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/exit.cpp @@ -0,0 +1,21 @@ +//===-------- Baremetal implementation of an exit function ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/OSUtil/exit.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// This is intended to be provided by the vendor. +extern "C" [[noreturn]] void __llvm_libc_exit(int status); + +[[noreturn]] void exit(int status) { __llvm_libc_exit(status); } + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/io.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/io.cpp new file mode 100644 index 000000000000..2a9ef6bfa657 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/io.cpp @@ -0,0 +1,70 @@ +//===---------- Baremetal implementation of IO utils ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "io.h" + +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +// These are intended to be provided by the vendor. +// +// The signature of these types and functions intentionally match `fopencookie` +// which allows the following: +// +// ``` +// struct __llvm_libc_stdio_cookie { ... }; +// ... +// struct __llvm_libc_stdio_cookie __llvm_libc_stdin_cookie; +// cookie_io_functions_t stdin_func = { .read = __llvm_libc_stdio_read }; +// FILE *stdin = fopencookie(&__llvm_libc_stdin_cookie, "r", stdin_func); +// ... +// struct __llvm_libc_stdio_cookie __llvm_libc_stdout_cookie; +// cookie_io_functions_t stdout_func = { .write = __llvm_libc_stdio_write }; +// FILE *stdout = fopencookie(&__llvm_libc_stdout_cookie, "w", stdout_func); +// ... +// struct __llvm_libc_stdio_cookie __llvm_libc_stderr_cookie; +// cookie_io_functions_t stderr_func = { .write = __llvm_libc_stdio_write }; +// FILE *stderr = fopencookie(&__llvm_libc_stderr_cookie, "w", stderr_func); +// ``` +// +// At the same time, implementation of functions like `printf` and `scanf` can +// use `__llvm_libc_stdio_read` and `__llvm_libc_stdio_write` directly to avoid +// the extra indirection. +// +// All three symbols `__llvm_libc_stdin_cookie`, `__llvm_libc_stdout_cookie`, +// and `__llvm_libc_stderr_cookie` must be provided, even if they don't point +// at anything. + +struct __llvm_libc_stdio_cookie; + +extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stdin_cookie; +extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stdout_cookie; +extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stderr_cookie; + +extern "C" ssize_t __llvm_libc_stdio_read(void *cookie, char *buf, size_t size); +extern "C" ssize_t __llvm_libc_stdio_write(void *cookie, const char *buf, + size_t size); + +ssize_t read_from_stdin(char *buf, size_t size) { + return __llvm_libc_stdio_read(static_cast<void *>(&__llvm_libc_stdin_cookie), + buf, size); +} + +void write_to_stdout(cpp::string_view msg) { + __llvm_libc_stdio_write(static_cast<void *>(&__llvm_libc_stdout_cookie), + msg.data(), msg.size()); +} + +void write_to_stderr(cpp::string_view msg) { + __llvm_libc_stdio_write(static_cast<void *>(&__llvm_libc_stderr_cookie), + msg.data(), msg.size()); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/io.h new file mode 100644 index 000000000000..aed34ec7e62e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/baremetal/io.h @@ -0,0 +1,25 @@ +//===---------- Baremetal implementation of IO utils ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_BAREMETAL_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_BAREMETAL_IO_H + +#include "include/llvm-libc-types/size_t.h" +#include "include/llvm-libc-types/ssize_t.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +ssize_t read_from_stdin(char *buf, size_t size); +void write_to_stderr(cpp::string_view msg); +void write_to_stdout(cpp::string_view msg); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_BAREMETAL_IO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/darwin/aarch64/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/darwin/aarch64/syscall.h new file mode 100644 index 000000000000..dc98c07a8ba3 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/darwin/aarch64/syscall.h @@ -0,0 +1,113 @@ +//===------ inline implementation of Darwin arm64 syscalls --------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_ARM_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_ARM_SYSCALL_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#define REGISTER_DECL_0 \ + register long x16 __asm__("x16") = number; \ + register long x0 __asm__("x0"); +#define REGISTER_DECL_1 \ + register long x16 __asm__("x16") = number; \ + register long x0 __asm__("x0") = arg1; +#define REGISTER_DECL_2 \ + REGISTER_DECL_1 \ + register long x1 __asm__("x1") = arg2; +#define REGISTER_DECL_3 \ + REGISTER_DECL_2 \ + register long x2 __asm__("x2") = arg3; +#define REGISTER_DECL_4 \ + REGISTER_DECL_3 \ + register long x3 __asm__("x3") = arg4; +#define REGISTER_DECL_5 \ + REGISTER_DECL_4 \ + register long x4 __asm__("x4") = arg5; +#define REGISTER_DECL_6 \ + REGISTER_DECL_5 \ + register long x5 __asm__("x5") = arg6; + +#define REGISTER_CONSTRAINT_0 "r"(x16) +#define REGISTER_CONSTRAINT_1 REGISTER_CONSTRAINT_0, "r"(x0) +#define REGISTER_CONSTRAINT_2 REGISTER_CONSTRAINT_1, "r"(x1) +#define REGISTER_CONSTRAINT_3 REGISTER_CONSTRAINT_2, "r"(x2) +#define REGISTER_CONSTRAINT_4 REGISTER_CONSTRAINT_3, "r"(x3) +#define REGISTER_CONSTRAINT_5 REGISTER_CONSTRAINT_4, "r"(x4) +#define REGISTER_CONSTRAINT_6 REGISTER_CONSTRAINT_5, "r"(x5) + +#define SYSCALL_INSTR(input_constraint) \ + LIBC_INLINE_ASM("svc 0x80" : "=r"(x0) : input_constraint : "memory", "cc") + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE long syscall_impl(long number) { + REGISTER_DECL_0; + SYSCALL_INSTR(REGISTER_CONSTRAINT_0); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1) { + REGISTER_DECL_1; + SYSCALL_INSTR(REGISTER_CONSTRAINT_1); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2) { + REGISTER_DECL_2; + SYSCALL_INSTR(REGISTER_CONSTRAINT_2); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3) { + REGISTER_DECL_3; + SYSCALL_INSTR(REGISTER_CONSTRAINT_3); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4) { + REGISTER_DECL_4; + SYSCALL_INSTR(REGISTER_CONSTRAINT_4); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5) { + REGISTER_DECL_5; + SYSCALL_INSTR(REGISTER_CONSTRAINT_5); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5, long arg6) { + REGISTER_DECL_6; + SYSCALL_INSTR(REGISTER_CONSTRAINT_6); + return x0; +} + +} // namespace LIBC_NAMESPACE_DECL + +#undef REGISTER_DECL_0 +#undef REGISTER_DECL_1 +#undef REGISTER_DECL_2 +#undef REGISTER_DECL_3 +#undef REGISTER_DECL_4 +#undef REGISTER_DECL_5 +#undef REGISTER_DECL_6 + +#undef REGISTER_CONSTRAINT_0 +#undef REGISTER_CONSTRAINT_1 +#undef REGISTER_CONSTRAINT_2 +#undef REGISTER_CONSTRAINT_3 +#undef REGISTER_CONSTRAINT_4 +#undef REGISTER_CONSTRAINT_5 +#undef REGISTER_CONSTRAINT_6 + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_ARM_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/darwin/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/darwin/io.h new file mode 100644 index 000000000000..69df99da522f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/darwin/io.h @@ -0,0 +1,26 @@ +//===------------- Darwin implementation of IO utils ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_IO_H + +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" +#include "syscall.h" // For internal syscall function. + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE void write_to_stderr(cpp::string_view msg) { + LIBC_NAMESPACE::syscall_impl(4 /*SYS_write*/, 2 /* stderr */, + reinterpret_cast<long>(msg.data()), + static_cast<long>(msg.size())); +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_IO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/darwin/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/darwin/syscall.h new file mode 100644 index 000000000000..463407dbe19e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/darwin/syscall.h @@ -0,0 +1,33 @@ +//===---------------------- Darwin syscalls ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_SYSCALL_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#ifdef LIBC_TARGET_ARCH_IS_ANY_ARM +#include "aarch64/syscall.h" +#else +#error "Unsupported architecture" +#endif + +namespace LIBC_NAMESPACE_DECL { + +template <typename R, typename... Ts> +LIBC_INLINE R syscall_impl(long __number, Ts... ts) { + static_assert(sizeof...(Ts) <= 6, "Too many arguments for syscall"); + return cpp::bit_or_static_cast<R>(syscall_impl(__number, (long)ts...)); +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/exit.h b/contrib/llvm-project/libc/src/__support/OSUtil/exit.h new file mode 100644 index 000000000000..e784ca0cb00b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/exit.h @@ -0,0 +1,22 @@ +//===------------ Implementation of an exit function ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_EXIT_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_EXIT_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +[[noreturn]] void exit(int status); + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_EXIT_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/fcntl.h b/contrib/llvm-project/libc/src/__support/OSUtil/fcntl.h new file mode 100644 index 000000000000..3983d78f7f89 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/fcntl.h @@ -0,0 +1,27 @@ +//===-- Implementation header of internal fcntl function ------------------===// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_FCNTL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_FCNTL_H + +#include "hdr/types/mode_t.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +ErrorOr<int> fcntl(int fd, int cmd, void *arg = nullptr); + +ErrorOr<int> open(const char *path, int flags, mode_t mode_flags = 0); + +ErrorOr<int> close(int fd); + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_FCNTL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/fuchsia/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/fuchsia/io.h new file mode 100644 index 000000000000..3953afce079d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/fuchsia/io.h @@ -0,0 +1,34 @@ +//===------------- Fuchsia implementation of IO utils -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_FUCHSIA_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_FUCHSIA_IO_H + +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +#include <iostream> +#include <zircon/sanitizer.h> + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE void write_to_stderr(cpp::string_view msg) { +#if defined(LIBC_COPT_TEST_USE_ZXTEST) + // This is used in standalone context where there is nothing like POSIX I/O. + __sanitizer_log_write(msg.data(), msg.size()); +#elif defined(LIBC_COPT_TEST_USE_GTEST) + // The gtest framework already relies on full standard C++ I/O via fdio. + std::cerr << std::string_view{msg.data(), msg.size()}; +#else +#error this file should only be used by tests +#endif +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_FUCHSIA_IO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/gpu/exit.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/gpu/exit.cpp new file mode 100644 index 000000000000..85f8183aafa9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/gpu/exit.cpp @@ -0,0 +1,33 @@ +//===------------- GPU implementation of an exit function -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/OSUtil/exit.h" + +#include "src/__support/GPU/utils.h" +#include "src/__support/RPC/rpc_client.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +[[noreturn]] void exit(int status) { + // We want to first make sure the server is listening before we exit. + rpc::Client::Port port = rpc::client.open<LIBC_EXIT>(); + port.send_and_recv([](rpc::Buffer *, uint32_t) {}, + [](rpc::Buffer *, uint32_t) {}); + port.send([&](rpc::Buffer *buffer, uint32_t) { + reinterpret_cast<uint32_t *>(buffer->data)[0] = status; + }); + port.close(); + + gpu::end_program(); +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/gpu/io.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/gpu/io.cpp new file mode 100644 index 000000000000..5d107ab50ae8 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/gpu/io.cpp @@ -0,0 +1,24 @@ +//===-------------- GPU implementation of IO utils --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "io.h" + +#include "src/__support/CPP/string_view.h" +#include "src/__support/RPC/rpc_client.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +void write_to_stderr(cpp::string_view msg) { + rpc::Client::Port port = rpc::client.open<LIBC_WRITE_TO_STDERR>(); + port.send_n(msg.data(), msg.size()); + port.recv([](rpc::Buffer *, uint32_t) { /* void */ }); + port.close(); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/gpu/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/gpu/io.h new file mode 100644 index 000000000000..e23db8acdaec --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/gpu/io.h @@ -0,0 +1,22 @@ +//===-------------- GPU implementation of IO utils --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_GPU_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_GPU_IO_H + +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +void write_to_stderr(cpp::string_view msg); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_GPU_IO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/io.h new file mode 100644 index 000000000000..66af31f3cc8c --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/io.h @@ -0,0 +1,31 @@ +//===---------------- Implementation of IO utils ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_IO_H + +#include "src/__support/macros/properties/architectures.h" + +#if defined(LIBC_TARGET_ARCH_IS_GPU) +#include "gpu/io.h" +#elif defined(__APPLE__) +#include "darwin/io.h" +#elif defined(__linux__) +#include "linux/io.h" +#elif defined(__Fuchsia__) +#include "fuchsia/io.h" +#elif defined(_WIN32) +#include "windows/io.h" +#elif defined(__ELF__) +// TODO: Ideally we would have LIBC_TARGET_OS_IS_BAREMETAL. +#include "baremetal/io.h" +#elif defined(__UEFI__) +#include "uefi/io.h" +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_IO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/aarch64/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/aarch64/syscall.h new file mode 100644 index 000000000000..f28392de5dce --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/aarch64/syscall.h @@ -0,0 +1,111 @@ +//===--------- inline implementation of aarch64 syscalls ----------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_AARCH64_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_AARCH64_SYSCALL_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#define REGISTER_DECL_0 \ + register long x8 __asm__("x8") = number; \ + register long x0 __asm__("x0"); +#define REGISTER_DECL_1 \ + register long x8 __asm__("x8") = number; \ + register long x0 __asm__("x0") = arg1; +#define REGISTER_DECL_2 REGISTER_DECL_1 register long x1 __asm__("x1") = arg2; +#define REGISTER_DECL_3 \ + REGISTER_DECL_2 \ + register long x2 __asm__("x2") = arg3; +#define REGISTER_DECL_4 \ + REGISTER_DECL_3 \ + register long x3 __asm__("x3") = arg4; +#define REGISTER_DECL_5 \ + REGISTER_DECL_4 \ + register long x4 __asm__("x4") = arg5; +#define REGISTER_DECL_6 \ + REGISTER_DECL_5 \ + register long x5 __asm__("x5") = arg6; + +#define REGISTER_CONSTRAINT_0 "r"(x8) +#define REGISTER_CONSTRAINT_1 REGISTER_CONSTRAINT_0, "r"(x0) +#define REGISTER_CONSTRAINT_2 REGISTER_CONSTRAINT_1, "r"(x1) +#define REGISTER_CONSTRAINT_3 REGISTER_CONSTRAINT_2, "r"(x2) +#define REGISTER_CONSTRAINT_4 REGISTER_CONSTRAINT_3, "r"(x3) +#define REGISTER_CONSTRAINT_5 REGISTER_CONSTRAINT_4, "r"(x4) +#define REGISTER_CONSTRAINT_6 REGISTER_CONSTRAINT_5, "r"(x5) + +#define SYSCALL_INSTR(input_constraint) \ + LIBC_INLINE_ASM("svc 0" : "=r"(x0) : input_constraint : "memory", "cc") + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE long syscall_impl(long number) { + REGISTER_DECL_0; + SYSCALL_INSTR(REGISTER_CONSTRAINT_0); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1) { + REGISTER_DECL_1; + SYSCALL_INSTR(REGISTER_CONSTRAINT_1); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2) { + REGISTER_DECL_2; + SYSCALL_INSTR(REGISTER_CONSTRAINT_2); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3) { + REGISTER_DECL_3; + SYSCALL_INSTR(REGISTER_CONSTRAINT_3); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4) { + REGISTER_DECL_4; + SYSCALL_INSTR(REGISTER_CONSTRAINT_4); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5) { + REGISTER_DECL_5; + SYSCALL_INSTR(REGISTER_CONSTRAINT_5); + return x0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5, long arg6) { + REGISTER_DECL_6; + SYSCALL_INSTR(REGISTER_CONSTRAINT_6); + return x0; +} + +} // namespace LIBC_NAMESPACE_DECL + +#undef REGISTER_DECL_0 +#undef REGISTER_DECL_1 +#undef REGISTER_DECL_2 +#undef REGISTER_DECL_3 +#undef REGISTER_DECL_4 +#undef REGISTER_DECL_5 +#undef REGISTER_DECL_6 + +#undef REGISTER_CONSTRAINT_0 +#undef REGISTER_CONSTRAINT_1 +#undef REGISTER_CONSTRAINT_2 +#undef REGISTER_CONSTRAINT_3 +#undef REGISTER_CONSTRAINT_4 +#undef REGISTER_CONSTRAINT_5 +#undef REGISTER_CONSTRAINT_6 + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_AARCH64_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/aarch64/vdso.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/aarch64/vdso.h new file mode 100644 index 000000000000..3c4c6205071d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/aarch64/vdso.h @@ -0,0 +1,37 @@ +//===---------- aarch64 vdso configuration ------------------------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_AARCH64_VDSO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_AARCH64_VDSO_H +#include "src/__support/CPP/string_view.h" +#include "src/__support/OSUtil/linux/vdso_sym.h" +namespace LIBC_NAMESPACE_DECL { +namespace vdso { +// translate VDSOSym to symbol names +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/kernel/vdso/vdso.lds.S +LIBC_INLINE constexpr cpp::string_view symbol_name(VDSOSym sym) { + switch (sym) { + case VDSOSym::RTSigReturn: + return "__kernel_rt_sigreturn"; + case VDSOSym::GetTimeOfDay: + return "__kernel_gettimeofday"; + case VDSOSym::ClockGetTime: + return "__kernel_clock_gettime"; + case VDSOSym::ClockGetRes: + return "__kernel_clock_getres"; + default: + return ""; + } +} + +// symbol versions +LIBC_INLINE constexpr cpp::string_view symbol_version(VDSOSym) { + return "LINUX_2.6.39"; +} +} // namespace vdso +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_AARCH64_VDSO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/arm/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/arm/syscall.h new file mode 100644 index 000000000000..d1058c84281f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/arm/syscall.h @@ -0,0 +1,129 @@ +//===--------- inline implementation of arm syscalls --------------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_SYSCALL_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#ifdef __thumb__ +#define R7 long r7 = number +#define SYSCALL_INSTR(input_constraint) \ + int temp; \ + LIBC_INLINE_ASM(R"( + mov %[temp], r7 + mov r7, %2 + svc #0 + mov r7, %[temp] + )" \ + : "=r"(r0), [temp] "=&r"(temp) \ + : input_constraint \ + : "memory", "cc") +#else +#define R7 register long r7 asm("r7") = number +#define SYSCALL_INSTR(input_constraint) \ + LIBC_INLINE_ASM("svc 0" : "=r"(r0) : input_constraint : "memory", "cc") +#endif + +#define REGISTER_DECL_0 \ + R7; \ + register long r0 __asm__("r0"); +#define REGISTER_DECL_1 \ + R7; \ + register long r0 __asm__("r0") = arg1; +#define REGISTER_DECL_2 \ + REGISTER_DECL_1 \ + register long r1 __asm__("r1") = arg2; +#define REGISTER_DECL_3 \ + REGISTER_DECL_2 \ + register long r2 __asm__("r2") = arg3; +#define REGISTER_DECL_4 \ + REGISTER_DECL_3 \ + register long r3 __asm__("r3") = arg4; +#define REGISTER_DECL_5 \ + REGISTER_DECL_4 \ + register long r4 __asm__("r4") = arg5; +#define REGISTER_DECL_6 \ + REGISTER_DECL_5 \ + register long r5 __asm__("r5") = arg6; + +#define REGISTER_CONSTRAINT_0 "r"(r7) +#define REGISTER_CONSTRAINT_1 REGISTER_CONSTRAINT_0, "r"(r0) +#define REGISTER_CONSTRAINT_2 REGISTER_CONSTRAINT_1, "r"(r1) +#define REGISTER_CONSTRAINT_3 REGISTER_CONSTRAINT_2, "r"(r2) +#define REGISTER_CONSTRAINT_4 REGISTER_CONSTRAINT_3, "r"(r3) +#define REGISTER_CONSTRAINT_5 REGISTER_CONSTRAINT_4, "r"(r4) +#define REGISTER_CONSTRAINT_6 REGISTER_CONSTRAINT_5, "r"(r5) + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE long syscall_impl(long number) { + REGISTER_DECL_0; + SYSCALL_INSTR(REGISTER_CONSTRAINT_0); + return r0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1) { + REGISTER_DECL_1; + SYSCALL_INSTR(REGISTER_CONSTRAINT_1); + return r0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2) { + REGISTER_DECL_2; + SYSCALL_INSTR(REGISTER_CONSTRAINT_2); + return r0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3) { + REGISTER_DECL_3; + SYSCALL_INSTR(REGISTER_CONSTRAINT_3); + return r0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4) { + REGISTER_DECL_4; + SYSCALL_INSTR(REGISTER_CONSTRAINT_4); + return r0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5) { + REGISTER_DECL_5; + SYSCALL_INSTR(REGISTER_CONSTRAINT_5); + return r0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5, long arg6) { + REGISTER_DECL_6; + SYSCALL_INSTR(REGISTER_CONSTRAINT_6); + return r0; +} + +} // namespace LIBC_NAMESPACE_DECL + +#undef REGISTER_DECL_0 +#undef REGISTER_DECL_1 +#undef REGISTER_DECL_2 +#undef REGISTER_DECL_3 +#undef REGISTER_DECL_4 +#undef REGISTER_DECL_5 +#undef REGISTER_DECL_6 + +#undef REGISTER_CONSTRAINT_0 +#undef REGISTER_CONSTRAINT_1 +#undef REGISTER_CONSTRAINT_2 +#undef REGISTER_CONSTRAINT_3 +#undef REGISTER_CONSTRAINT_4 +#undef REGISTER_CONSTRAINT_5 +#undef REGISTER_CONSTRAINT_6 + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/arm/vdso.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/arm/vdso.h new file mode 100644 index 000000000000..3de5860359c1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/arm/vdso.h @@ -0,0 +1,37 @@ +//===---------- arm vdso configuration ----------------------------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_VDSO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_VDSO_H +#include "src/__support/CPP/string_view.h" +#include "src/__support/OSUtil/linux/vdso_sym.h" +namespace LIBC_NAMESPACE_DECL { +namespace vdso { +// translate VDSOSym to symbol names +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/vdso/vdso.lds.S +LIBC_INLINE constexpr cpp::string_view symbol_name(VDSOSym sym) { + switch (sym) { + case VDSOSym::ClockGetTime: + return "__vdso_clock_gettime"; + case VDSOSym::GetTimeOfDay: + return "__vdso_gettimeofday"; + case VDSOSym::ClockGetRes: + return "__vdso_clock_getres"; + case VDSOSym::ClockGetTime64: + return "__vdso_clock_gettime64"; + default: + return ""; + } +} + +// symbol versions +LIBC_INLINE constexpr cpp::string_view symbol_version(VDSOSym) { + return "LINUX_2.6"; +} +} // namespace vdso +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_VDSO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/exit.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/linux/exit.cpp new file mode 100644 index 000000000000..e26b90f6b18e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/exit.cpp @@ -0,0 +1,31 @@ +//===------------ Linux implementation of an exit function ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include <sys/syscall.h> // For syscall numbers. + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// mark as no_stack_protector for x86 since TLS can be torn down before calling +// exit so that the stack protector canary cannot be loaded. +#ifdef LIBC_TARGET_ARCH_IS_X86 +__attribute__((no_stack_protector)) +#endif +__attribute__((noreturn)) void +exit(int status) { + for (;;) { + LIBC_NAMESPACE::syscall_impl<long>(SYS_exit_group, status); + LIBC_NAMESPACE::syscall_impl<long>(SYS_exit, status); + } +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/fcntl.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/linux/fcntl.cpp new file mode 100644 index 000000000000..bb76eee90efd --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/fcntl.cpp @@ -0,0 +1,142 @@ +//===-- Implementation of internal fcntl ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/OSUtil/fcntl.h" + +#include "hdr/errno_macros.h" +#include "hdr/fcntl_macros.h" +#include "hdr/types/mode_t.h" +#include "hdr/types/off_t.h" +#include "hdr/types/struct_f_owner_ex.h" +#include "hdr/types/struct_flock.h" +#include "hdr/types/struct_flock64.h" +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" + +#include <sys/syscall.h> // For syscall numbers. + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +ErrorOr<int> fcntl(int fd, int cmd, void *arg) { +#if SYS_fcntl + constexpr auto FCNTL_SYSCALL_ID = SYS_fcntl; +#elif defined(SYS_fcntl64) + constexpr auto FCNTL_SYSCALL_ID = SYS_fcntl64; +#else +#error "fcntl and fcntl64 syscalls not available." +#endif + + switch (cmd) { + case F_OFD_SETLKW: { + struct flock *flk = reinterpret_cast<struct flock *>(arg); + // convert the struct to a flock64 + struct flock64 flk64; + flk64.l_type = flk->l_type; + flk64.l_whence = flk->l_whence; + flk64.l_start = flk->l_start; + flk64.l_len = flk->l_len; + flk64.l_pid = flk->l_pid; + // create a syscall + int ret = + LIBC_NAMESPACE::syscall_impl<int>(FCNTL_SYSCALL_ID, fd, cmd, &flk64); + if (ret < 0) + return Error(-ret); + return ret; + } + case F_OFD_GETLK: + case F_OFD_SETLK: { + struct flock *flk = reinterpret_cast<struct flock *>(arg); + // convert the struct to a flock64 + struct flock64 flk64; + flk64.l_type = flk->l_type; + flk64.l_whence = flk->l_whence; + flk64.l_start = flk->l_start; + flk64.l_len = flk->l_len; + flk64.l_pid = flk->l_pid; + // create a syscall + int ret = + LIBC_NAMESPACE::syscall_impl<int>(FCNTL_SYSCALL_ID, fd, cmd, &flk64); + // On failure, return + if (ret < 0) + return Error(-1); + // Check for overflow, i.e. the offsets are not the same when cast + // to off_t from off64_t. + if (static_cast<off_t>(flk64.l_len) != flk64.l_len || + static_cast<off_t>(flk64.l_start) != flk64.l_start) + return Error(EOVERFLOW); + + // Now copy back into flk, in case flk64 got modified + flk->l_type = flk64.l_type; + flk->l_whence = flk64.l_whence; + flk->l_start = static_cast<decltype(flk->l_start)>(flk64.l_start); + flk->l_len = static_cast<decltype(flk->l_len)>(flk64.l_len); + flk->l_pid = flk64.l_pid; + return ret; + } + case F_GETOWN: { + struct f_owner_ex fex; + int ret = LIBC_NAMESPACE::syscall_impl<int>(FCNTL_SYSCALL_ID, fd, + F_GETOWN_EX, &fex); + if (ret < 0) + return Error(-ret); + return fex.type == F_OWNER_PGRP ? -fex.pid : fex.pid; + } +#ifdef SYS_fcntl64 + case F_GETLK: { + if constexpr (FCNTL_SYSCALL_ID == SYS_fcntl64) + cmd = F_GETLK64; + break; + } + case F_SETLK: { + if constexpr (FCNTL_SYSCALL_ID == SYS_fcntl64) + cmd = F_SETLK64; + break; + } + case F_SETLKW: { + if constexpr (FCNTL_SYSCALL_ID == SYS_fcntl64) + cmd = F_SETLKW64; + break; + } +#endif + } + + // default, but may use rewritten cmd from above. + int ret = LIBC_NAMESPACE::syscall_impl<int>(FCNTL_SYSCALL_ID, fd, cmd, + reinterpret_cast<void *>(arg)); + if (ret < 0) + return Error(-ret); + return ret; +} + +ErrorOr<int> open(const char *path, int flags, mode_t mode_flags) { +#ifdef SYS_open + int fd = LIBC_NAMESPACE::syscall_impl<int>(SYS_open, path, flags, mode_flags); +#else + int fd = LIBC_NAMESPACE::syscall_impl<int>(SYS_openat, AT_FDCWD, path, flags, + mode_flags); +#endif + if (fd < 0) + return Error(-fd); + + return fd; +} + +ErrorOr<int> close(int fd) { + int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_close, fd); + + if (ret < 0) + return Error(-ret); + + return ret; +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/getrandom.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/getrandom.h new file mode 100644 index 000000000000..793639472fee --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/getrandom.h @@ -0,0 +1,35 @@ +//===------------ Implementation of getrandom function ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H + +#include "hdr/types/ssize_t.h" +#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl +#include "src/__support/common.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" +#include <sys/syscall.h> // For syscall numbers + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +LIBC_INLINE static ErrorOr<ssize_t> getrandom(void *buf, size_t buflen, + unsigned int flags) { + ssize_t ret = + LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_getrandom, buf, buflen, flags); + if (ret < 0) { + return Error(-static_cast<int>(ret)); + } + return ret; +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/i386/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/i386/syscall.h new file mode 100644 index 000000000000..88d7f2fb2c49 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/i386/syscall.h @@ -0,0 +1,88 @@ +//===---------- inline implementation of i386 syscalls ------------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE long syscall_impl(long num) { + long ret; + LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num) : "memory"); + return ret; +} + +LIBC_INLINE long syscall_impl(long num, long arg1) { + long ret; + LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num), "b"(arg1) : "memory"); + return ret; +} + +LIBC_INLINE long syscall_impl(long num, long arg1, long arg2) { + long ret; + LIBC_INLINE_ASM("int $128" + : "=a"(ret) + : "a"(num), "b"(arg1), "c"(arg2) + : "memory"); + return ret; +} + +LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3) { + long ret; + LIBC_INLINE_ASM("int $128" + : "=a"(ret) + : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3) + : "memory"); + return ret; +} + +LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3, + long arg4) { + long ret; + LIBC_INLINE_ASM("int $128" + : "=a"(ret) + : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4) + : "memory"); + return ret; +} + +LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3, + long arg4, long arg5) { + long ret; + LIBC_INLINE_ASM("int $128" + : "=a"(ret) + : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4), + "D"(arg5) + : "memory"); + return ret; +} + +LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3, + long arg4, long arg5, long arg6) { + long ret; + LIBC_INLINE_ASM(R"( + push %[arg6] + push %%ebp + mov 4(%%esp), %%ebp + int $128 + pop %%ebp + add $4, %%esp + )" + : "=a"(ret) + : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4), + "D"(arg5), [arg6] "m"(arg6) + : "memory"); + return ret; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/i386/vdso.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/i386/vdso.h new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/i386/vdso.h diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/io.h new file mode 100644 index 000000000000..63e5b120d5c6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/io.h @@ -0,0 +1,27 @@ +//===-------------- Linux implementation of IO utils ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_IO_H + +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" +#include "syscall.h" // For internal syscall function. + +#include <sys/syscall.h> // For syscall numbers. + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE void write_to_stderr(cpp::string_view msg) { + LIBC_NAMESPACE::syscall_impl<long>(SYS_write, 2 /* stderr */, msg.data(), + msg.size()); +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_IO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/riscv/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/riscv/syscall.h new file mode 100644 index 000000000000..e460e9bb56e6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/riscv/syscall.h @@ -0,0 +1,111 @@ +//===--------- inline implementation of riscv syscalls ------------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_RISCV_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_RISCV_SYSCALL_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#define REGISTER_DECL_0 \ + register long a7 __asm__("a7") = number; \ + register long a0 __asm__("a0"); +#define REGISTER_DECL_1 \ + register long a7 __asm__("a7") = number; \ + register long a0 __asm__("a0") = arg1; +#define REGISTER_DECL_2 REGISTER_DECL_1 register long a1 __asm__("a1") = arg2; +#define REGISTER_DECL_3 \ + REGISTER_DECL_2 \ + register long a2 __asm__("a2") = arg3; +#define REGISTER_DECL_4 \ + REGISTER_DECL_3 \ + register long a3 __asm__("a3") = arg4; +#define REGISTER_DECL_5 \ + REGISTER_DECL_4 \ + register long a4 __asm__("a4") = arg5; +#define REGISTER_DECL_6 \ + REGISTER_DECL_5 \ + register long a5 __asm__("a5") = arg6; + +#define REGISTER_CONSTRAINT_0 "r"(a7) +#define REGISTER_CONSTRAINT_1 REGISTER_CONSTRAINT_0, "r"(a0) +#define REGISTER_CONSTRAINT_2 REGISTER_CONSTRAINT_1, "r"(a1) +#define REGISTER_CONSTRAINT_3 REGISTER_CONSTRAINT_2, "r"(a2) +#define REGISTER_CONSTRAINT_4 REGISTER_CONSTRAINT_3, "r"(a3) +#define REGISTER_CONSTRAINT_5 REGISTER_CONSTRAINT_4, "r"(a4) +#define REGISTER_CONSTRAINT_6 REGISTER_CONSTRAINT_5, "r"(a5) + +#define SYSCALL_INSTR(input_constraint) \ + LIBC_INLINE_ASM("ecall\n\t" : "=r"(a0) : input_constraint : "memory") + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE long syscall_impl(long number) { + REGISTER_DECL_0; + SYSCALL_INSTR(REGISTER_CONSTRAINT_0); + return a0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1) { + REGISTER_DECL_1; + SYSCALL_INSTR(REGISTER_CONSTRAINT_1); + return a0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2) { + REGISTER_DECL_2; + SYSCALL_INSTR(REGISTER_CONSTRAINT_2); + return a0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3) { + REGISTER_DECL_3; + SYSCALL_INSTR(REGISTER_CONSTRAINT_3); + return a0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4) { + REGISTER_DECL_4; + SYSCALL_INSTR(REGISTER_CONSTRAINT_4); + return a0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5) { + REGISTER_DECL_5; + SYSCALL_INSTR(REGISTER_CONSTRAINT_5); + return a0; +} + +LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3, + long arg4, long arg5, long arg6) { + REGISTER_DECL_6; + SYSCALL_INSTR(REGISTER_CONSTRAINT_6); + return a0; +} + +} // namespace LIBC_NAMESPACE_DECL + +#undef REGISTER_DECL_0 +#undef REGISTER_DECL_1 +#undef REGISTER_DECL_2 +#undef REGISTER_DECL_3 +#undef REGISTER_DECL_4 +#undef REGISTER_DECL_5 +#undef REGISTER_DECL_6 + +#undef REGISTER_CONSTRAINT_0 +#undef REGISTER_CONSTRAINT_1 +#undef REGISTER_CONSTRAINT_2 +#undef REGISTER_CONSTRAINT_3 +#undef REGISTER_CONSTRAINT_4 +#undef REGISTER_CONSTRAINT_5 +#undef REGISTER_CONSTRAINT_6 + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_RISCV_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/riscv/vdso.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/riscv/vdso.h new file mode 100644 index 000000000000..24ddb25ea980 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/riscv/vdso.h @@ -0,0 +1,43 @@ +//===---------- RISC-V vdso configuration -------------------------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_RISCV_VDSO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_RISCV_VDSO_H +#include "src/__support/CPP/string_view.h" +#include "src/__support/OSUtil/linux/vdso_sym.h" +namespace LIBC_NAMESPACE_DECL { +namespace vdso { +// translate VDSOSym to symbol names +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/riscv/kernel/vdso/vdso.lds.S +LIBC_INLINE constexpr cpp::string_view symbol_name(VDSOSym sym) { + switch (sym) { + case VDSOSym::RTSigReturn: + return "__vdso_rt_sigreturn"; + case VDSOSym::GetTimeOfDay: + return "__vdso_gettimeofday"; + case VDSOSym::ClockGetTime: + return "__vdso_clock_gettime"; + case VDSOSym::ClockGetRes: + return "__vdso_clock_getres"; + case VDSOSym::GetCpu: + return "__vdso_getcpu"; + case VDSOSym::FlushICache: + return "__vdso_flush_icache"; + case VDSOSym::RiscvHwProbe: + return "__vdso_riscv_hwprobe"; + default: + return ""; + } +} + +// symbol versions +LIBC_INLINE constexpr cpp::string_view symbol_version(VDSOSym) { + return "LINUX_4.15"; +} +} // namespace vdso +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_RISCV_VDSO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/syscall.h new file mode 100644 index 000000000000..24e0fca73c16 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/syscall.h @@ -0,0 +1,39 @@ +//===----------------------- Linux syscalls ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_H + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#ifdef LIBC_TARGET_ARCH_IS_X86_32 +#include "i386/syscall.h" +#elif defined(LIBC_TARGET_ARCH_IS_X86_64) +#include "x86_64/syscall.h" +#elif defined(LIBC_TARGET_ARCH_IS_AARCH64) +#include "aarch64/syscall.h" +#elif defined(LIBC_TARGET_ARCH_IS_ARM) +#include "arm/syscall.h" +#elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) +#include "riscv/syscall.h" +#endif + +namespace LIBC_NAMESPACE_DECL { + +template <typename R, typename... Ts> +LIBC_INLINE R syscall_impl(long __number, Ts... ts) { + static_assert(sizeof...(Ts) <= 6, "Too many arguments for syscall"); + return cpp::bit_or_static_cast<R>(syscall_impl(__number, (long)ts...)); +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso.cpp new file mode 100644 index 000000000000..e4e53c3c2a0f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso.cpp @@ -0,0 +1,239 @@ +//===------------- Linux VDSO Implementation --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#include "src/__support/OSUtil/linux/vdso.h" +#include "hdr/link_macros.h" +#include "hdr/sys_auxv_macros.h" +#include "src/__support/CPP/array.h" +#include "src/__support/CPP/optional.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/libc_errno.h" +#include "src/__support/threads/callonce.h" +#include "src/__support/threads/linux/futex_word.h" +#include "src/sys/auxv/getauxval.h" +#include <linux/auxvec.h> + +// TODO: This is a temporary workaround to avoid including elf.h +// Include our own headers for ElfW and friends once we have them. +namespace LIBC_NAMESPACE_DECL { + +namespace vdso { + +Symbol::VDSOArray Symbol::global_cache{}; +CallOnceFlag Symbol::once_flag = callonce_impl::NOT_CALLED; + +namespace { +// See https://refspecs.linuxfoundation.org/LSB_1.3.0/gLSB/gLSB/symverdefs.html +struct Verdaux { + ElfW(Word) vda_name; /* Version or dependency names */ + ElfW(Word) vda_next; /* Offset in bytes to next verdaux + entry */ +}; +struct Verdef { + ElfW(Half) vd_version; /* Version revision */ + ElfW(Half) vd_flags; /* Version information */ + ElfW(Half) vd_ndx; /* Version Index */ + ElfW(Half) vd_cnt; /* Number of associated aux entries */ + ElfW(Word) vd_hash; /* Version name hash value */ + ElfW(Word) vd_aux; /* Offset in bytes to verdaux array */ + ElfW(Word) vd_next; /* Offset in bytes to next verdef entry */ + Verdef *next() const { + if (vd_next == 0) + return nullptr; + return reinterpret_cast<Verdef *>(reinterpret_cast<uintptr_t>(this) + + vd_next); + } + Verdaux *aux() const { + return reinterpret_cast<Verdaux *>(reinterpret_cast<uintptr_t>(this) + + vd_aux); + } +}; + +// version search procedure specified by +// https://refspecs.linuxfoundation.org/LSB_1.3.0/gLSB/gLSB/symversion.html#SYMVERTBL +cpp::string_view find_version(Verdef *verdef, ElfW(Half) * versym, + const char *strtab, size_t idx) { +#ifndef VER_FLG_BASE + constexpr ElfW(Half) VER_FLG_BASE = 0x1; +#endif + if (!versym) + return ""; + ElfW(Half) identifier = versym[idx] & 0x7FFF; + // iterate through all version definitions + for (Verdef *def = verdef; def != nullptr; def = def->next()) { + // skip if this is a file-level version + if (def->vd_flags & VER_FLG_BASE) + continue; + // check if the version identifier matches. Highest bit is used to determine + // whether the symbol is local. Only lower 15 bits are used for version + // identifier. + if ((def->vd_ndx & 0x7FFF) == identifier) { + Verdaux *aux = def->aux(); + return strtab + aux->vda_name; + } + } + return ""; +} + +size_t shdr_get_symbol_count(ElfW(Shdr) * vdso_shdr, size_t e_shnum) { + if (!vdso_shdr) + return 0; + // iterate all sections until we locate the dynamic symbol section + for (size_t i = 0; i < e_shnum; ++i) { + // dynamic symbol section is a table section + // therefore, the number of entries can be computed as the ratio + // of the section size to the size of a single entry + if (vdso_shdr[i].sh_type == SHT_DYNSYM) + return vdso_shdr[i].sh_size / vdso_shdr[i].sh_entsize; + } + return 0; +} + +struct VDSOSymbolTable { + const char *strtab; + ElfW(Sym) * symtab; + // The following can be nullptr if the vDSO does not have versioning + ElfW(Half) * versym; + Verdef *verdef; + + void populate_symbol_cache(Symbol::VDSOArray &symbol_table, + size_t symbol_count, ElfW(Addr) vdso_addr) { + for (size_t i = 0, e = symbol_table.size(); i < e; ++i) { + Symbol sym = i; + cpp::string_view name = sym.name(); + cpp::string_view version = sym.version(); + if (name.empty()) + continue; + + for (size_t j = 0; j < symbol_count; ++j) { + if (name == strtab + symtab[j].st_name) { + // we find a symbol with desired name + // now we need to check if it has the right version + if (versym && verdef && + version != find_version(verdef, versym, strtab, j)) + continue; + + // put the symbol address into the symbol table + symbol_table[i] = + reinterpret_cast<void *>(vdso_addr + symtab[j].st_value); + } + } + } + } +}; + +struct PhdrInfo { + ElfW(Addr) vdso_addr; + ElfW(Dyn) * vdso_dyn; + static cpp::optional<PhdrInfo> from(ElfW(Phdr) * vdso_phdr, size_t e_phnum, + uintptr_t vdso_ehdr_addr) { + constexpr ElfW(Addr) INVALID_ADDR = static_cast<ElfW(Addr)>(-1); + ElfW(Addr) vdso_addr = INVALID_ADDR; + ElfW(Dyn) *vdso_dyn = nullptr; + if (!vdso_phdr) + return cpp::nullopt; + // iterate through all the program headers until we get the desired pieces + for (size_t i = 0; i < e_phnum; ++i) { + if (vdso_phdr[i].p_type == PT_DYNAMIC) + vdso_dyn = reinterpret_cast<ElfW(Dyn) *>(vdso_ehdr_addr + + vdso_phdr[i].p_offset); + + if (vdso_phdr[i].p_type == PT_LOAD) + vdso_addr = + vdso_ehdr_addr + vdso_phdr[i].p_offset - vdso_phdr[i].p_vaddr; + + if (vdso_addr && vdso_dyn) + return PhdrInfo{vdso_addr, vdso_dyn}; + } + + return cpp::nullopt; + } + + cpp::optional<VDSOSymbolTable> populate_symbol_table() { + const char *strtab = nullptr; + ElfW(Sym) *symtab = nullptr; + ElfW(Half) *versym = nullptr; + Verdef *verdef = nullptr; + for (ElfW(Dyn) *d = vdso_dyn; d->d_tag != DT_NULL; ++d) { + switch (d->d_tag) { + case DT_STRTAB: + strtab = reinterpret_cast<const char *>(vdso_addr + d->d_un.d_ptr); + break; + case DT_SYMTAB: + symtab = reinterpret_cast<ElfW(Sym) *>(vdso_addr + d->d_un.d_ptr); + break; + case DT_VERSYM: + versym = reinterpret_cast<uint16_t *>(vdso_addr + d->d_un.d_ptr); + break; + case DT_VERDEF: + verdef = reinterpret_cast<Verdef *>(vdso_addr + d->d_un.d_ptr); + break; + } + if (strtab && symtab && versym && verdef) + break; + } + if (strtab == nullptr || symtab == nullptr) + return cpp::nullopt; + + return VDSOSymbolTable{strtab, symtab, versym, verdef}; + } +}; +} // namespace + +void Symbol::initialize_vdso_global_cache() { + // first clear the symbol table + for (auto &i : global_cache) + i = nullptr; + + // get the address of the VDSO, protect errno since getauxval may change + // it + int errno_backup = libc_errno; + uintptr_t vdso_ehdr_addr = getauxval(AT_SYSINFO_EHDR); + // Get the memory address of the vDSO ELF header. + auto vdso_ehdr = reinterpret_cast<ElfW(Ehdr) *>(vdso_ehdr_addr); + // leave the table unpopulated if we don't have vDSO + if (vdso_ehdr == nullptr) { + libc_errno = errno_backup; + return; + } + + // locate the section header inside the elf using the section header + // offset + auto vdso_shdr = + reinterpret_cast<ElfW(Shdr) *>(vdso_ehdr_addr + vdso_ehdr->e_shoff); + size_t symbol_count = shdr_get_symbol_count(vdso_shdr, vdso_ehdr->e_shnum); + + // early return if no symbol is found + if (symbol_count == 0) + return; + + // We need to find both the loadable segment and the dynamic linking of + // the vDSO. compute vdso_phdr as the program header using the program + // header offset + ElfW(Phdr) *vdso_phdr = + reinterpret_cast<ElfW(Phdr) *>(vdso_ehdr_addr + vdso_ehdr->e_phoff); + cpp::optional<PhdrInfo> phdr_info = + PhdrInfo::from(vdso_phdr, vdso_ehdr->e_phnum, vdso_ehdr_addr); + // early return if either the dynamic linking or the loadable segment is + // not found + if (!phdr_info.has_value()) + return; + + // now, locate several more tables inside the dynmaic linking section + cpp::optional<VDSOSymbolTable> vdso_symbol_table = + phdr_info->populate_symbol_table(); + + // early return if we can't find any required fields of the symbol table + if (!vdso_symbol_table.has_value()) + return; + + // finally, populate the global symbol table cache + vdso_symbol_table->populate_symbol_cache(global_cache, symbol_count, + phdr_info->vdso_addr); +} +} // namespace vdso +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso.h new file mode 100644 index 000000000000..a5108b3a1fb5 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso.h @@ -0,0 +1,81 @@ +//===------------- Linux VDSO Header ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_VDSO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_VDSO_H +#include "src/__support/CPP/array.h" +#include "src/__support/common.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/threads/callonce.h" + +#if defined(LIBC_TARGET_ARCH_IS_X86) +#include "x86_64/vdso.h" +#elif defined(LIBC_TARGET_ARCH_IS_AARCH64) +#include "aarch64/vdso.h" +#elif defined(LIBC_TARGET_ARCH_IS_ARM) +#include "arm/vdso.h" +#elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) +#include "riscv/vdso.h" +#else +#error "unknown arch" +#endif + +namespace LIBC_NAMESPACE_DECL { +namespace vdso { + +class Symbol { + VDSOSym sym; + +public: + LIBC_INLINE_VAR static constexpr size_t COUNT = + static_cast<size_t>(VDSOSym::VDSOSymCount); + LIBC_INLINE constexpr explicit Symbol(VDSOSym sym) : sym(sym) {} + LIBC_INLINE constexpr Symbol(size_t idx) : sym(static_cast<VDSOSym>(idx)) {} + LIBC_INLINE constexpr cpp::string_view name() const { + return symbol_name(sym); + } + LIBC_INLINE constexpr cpp::string_view version() const { + return symbol_version(sym); + } + LIBC_INLINE constexpr operator size_t() const { + return static_cast<size_t>(sym); + } + LIBC_INLINE constexpr bool is_valid() const { + return *this < Symbol::global_cache.size(); + } + using VDSOArray = cpp::array<void *, Symbol::COUNT>; + +private: + static CallOnceFlag once_flag; + static VDSOArray global_cache; + static void initialize_vdso_global_cache(); + + LIBC_INLINE void *get() const { + if (name().empty() || !is_valid()) + return nullptr; + + callonce(&once_flag, Symbol::initialize_vdso_global_cache); + return (global_cache[*this]); + } + template <VDSOSym sym> friend struct TypedSymbol; +}; + +template <VDSOSym sym> struct TypedSymbol { + LIBC_INLINE constexpr operator VDSOSymType<sym>() const { + return cpp::bit_cast<VDSOSymType<sym>>(Symbol{sym}.get()); + } + template <typename... Args> + LIBC_INLINE auto operator()(Args &&...args) const { + return this->operator VDSOSymType<sym>()(cpp::forward<Args>(args)...); + } +}; + +} // namespace vdso + +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_VDSO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso_sym.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso_sym.h new file mode 100644 index 000000000000..968e1536c4d2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/vdso_sym.h @@ -0,0 +1,70 @@ +//===------------- Linux VDSO Symbols ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#include "hdr/types/clock_t.h" +#include "hdr/types/clockid_t.h" +#include "hdr/types/struct_timespec.h" +#include "hdr/types/struct_timeval.h" +#include "hdr/types/time_t.h" +#include "src/__support/common.h" +#include <stddef.h> // For size_t. + +// NOLINTBEGIN(llvmlibc-implementation-in-namespace) +// TODO: some of the following can be defined via proxy headers. +struct __kernel_timespec; +struct timezone; +struct riscv_hwprobe; +struct getcpu_cache; +struct cpu_set_t; +// NOLINTEND(llvmlibc-implementation-in-namespace) + +namespace LIBC_NAMESPACE_DECL { +namespace vdso { + +enum class VDSOSym { + ClockGetTime, + ClockGetTime64, + GetTimeOfDay, + GetCpu, + Time, + ClockGetRes, + RTSigReturn, + FlushICache, + RiscvHwProbe, + VDSOSymCount +}; + +template <VDSOSym sym> LIBC_INLINE constexpr auto dispatcher() { + if constexpr (sym == VDSOSym::ClockGetTime) + return static_cast<int (*)(clockid_t, timespec *)>(nullptr); + else if constexpr (sym == VDSOSym::ClockGetTime64) + return static_cast<int (*)(clockid_t, __kernel_timespec *)>(nullptr); + else if constexpr (sym == VDSOSym::GetTimeOfDay) + return static_cast<int (*)(timeval *__restrict, + struct timezone *__restrict)>(nullptr); + else if constexpr (sym == VDSOSym::GetCpu) + return static_cast<int (*)(unsigned *, unsigned *, getcpu_cache *)>( + nullptr); + else if constexpr (sym == VDSOSym::Time) + return static_cast<time_t (*)(time_t *)>(nullptr); + else if constexpr (sym == VDSOSym::ClockGetRes) + return static_cast<int (*)(clockid_t, timespec *)>(nullptr); + else if constexpr (sym == VDSOSym::RTSigReturn) + return static_cast<void (*)(void)>(nullptr); + else if constexpr (sym == VDSOSym::FlushICache) + return static_cast<void (*)(void *, void *, unsigned int)>(nullptr); + else if constexpr (sym == VDSOSym::RiscvHwProbe) + return static_cast<int (*)(riscv_hwprobe *, size_t, size_t, cpu_set_t *, + unsigned)>(nullptr); + else + return static_cast<void *>(nullptr); +} + +template <VDSOSym sym> using VDSOSymType = decltype(dispatcher<sym>()); + +} // namespace vdso +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/x86_64/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/x86_64/syscall.h new file mode 100644 index 000000000000..ebd77980af6a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/x86_64/syscall.h @@ -0,0 +1,99 @@ +//===---------- inline implementation of x86_64 syscalls ----------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_SYSCALL_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#define SYSCALL_CLOBBER_LIST "rcx", "r11", "memory" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE long syscall_impl(long __number) { + long retcode; + LIBC_INLINE_ASM("syscall" + : "=a"(retcode) + : "a"(__number) + : SYSCALL_CLOBBER_LIST); + return retcode; +} + +LIBC_INLINE long syscall_impl(long __number, long __arg1) { + long retcode; + LIBC_INLINE_ASM("syscall" + : "=a"(retcode) + : "a"(__number), "D"(__arg1) + : SYSCALL_CLOBBER_LIST); + return retcode; +} + +LIBC_INLINE long syscall_impl(long __number, long __arg1, long __arg2) { + long retcode; + LIBC_INLINE_ASM("syscall" + : "=a"(retcode) + : "a"(__number), "D"(__arg1), "S"(__arg2) + : SYSCALL_CLOBBER_LIST); + return retcode; +} + +LIBC_INLINE long syscall_impl(long __number, long __arg1, long __arg2, + long __arg3) { + long retcode; + LIBC_INLINE_ASM("syscall" + : "=a"(retcode) + : "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3) + : SYSCALL_CLOBBER_LIST); + return retcode; +} + +LIBC_INLINE long syscall_impl(long __number, long __arg1, long __arg2, + long __arg3, long __arg4) { + long retcode; + register long r10 __asm__("r10") = __arg4; + LIBC_INLINE_ASM("syscall" + : "=a"(retcode) + : "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), + "r"(r10) + : SYSCALL_CLOBBER_LIST); + return retcode; +} + +LIBC_INLINE long syscall_impl(long __number, long __arg1, long __arg2, + long __arg3, long __arg4, long __arg5) { + long retcode; + register long r10 __asm__("r10") = __arg4; + register long r8 __asm__("r8") = __arg5; + LIBC_INLINE_ASM("syscall" + : "=a"(retcode) + : "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), + "r"(r10), "r"(r8) + : SYSCALL_CLOBBER_LIST); + return retcode; +} + +LIBC_INLINE long syscall_impl(long __number, long __arg1, long __arg2, + long __arg3, long __arg4, long __arg5, + long __arg6) { + long retcode; + register long r10 __asm__("r10") = __arg4; + register long r8 __asm__("r8") = __arg5; + register long r9 __asm__("r9") = __arg6; + LIBC_INLINE_ASM("syscall" + : "=a"(retcode) + : "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), + "r"(r10), "r"(r8), "r"(r9) + : SYSCALL_CLOBBER_LIST); + return retcode; +} + +#undef SYSCALL_CLOBBER_LIST +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/linux/x86_64/vdso.h b/contrib/llvm-project/libc/src/__support/OSUtil/linux/x86_64/vdso.h new file mode 100644 index 000000000000..abe7c33e07cf --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/linux/x86_64/vdso.h @@ -0,0 +1,43 @@ +//===---------- x86/x86_64 vdso configuration ---------------------* C++ *-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_VDSO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_VDSO_H +#include "src/__support/CPP/string_view.h" +#include "src/__support/OSUtil/linux/vdso_sym.h" +namespace LIBC_NAMESPACE_DECL { +namespace vdso { +// translate VDSOSym to symbol names +// On x86, there are symbols defined without the __vdso_ prefix, however, +// it is suggested that one should use the __vdso_ prefix. +// Additionally, there is also an __vdso_sgx_enter_enclave, it is for the SGX +// support, we do not include it here for now. +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/entry/vdso/vdso.lds.S +LIBC_INLINE constexpr cpp::string_view symbol_name(VDSOSym sym) { + switch (sym) { + case VDSOSym::ClockGetTime: + return "__vdso_clock_gettime"; + case VDSOSym::GetTimeOfDay: + return "__vdso_gettimeofday"; + case VDSOSym::GetCpu: + return "__vdso_getcpu"; + case VDSOSym::Time: + return "__vdso_time"; + case VDSOSym::ClockGetRes: + return "__vdso_clock_getres"; + default: + return ""; + } +} + +// symbol versions +LIBC_INLINE constexpr cpp::string_view symbol_version(VDSOSym) { + return "LINUX_2.6"; +} +} // namespace vdso +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_VDSO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/syscall.h b/contrib/llvm-project/libc/src/__support/OSUtil/syscall.h new file mode 100644 index 000000000000..fc697a7c0982 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/syscall.h @@ -0,0 +1,18 @@ +//===--------------- Internal syscall declarations --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_H + +#ifdef __APPLE__ +#include "darwin/syscall.h" +#elif defined(__linux__) +#include "linux/syscall.h" +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/uefi/error.h b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/error.h new file mode 100644 index 000000000000..9fdc569bab57 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/error.h @@ -0,0 +1,104 @@ +//===----------- UEFI implementation of error utils --------------*- C++-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H + +#include "hdr/errno_macros.h" +#include "include/llvm-libc-types/EFI_STATUS.h" +#include "src/__support/CPP/array.h" +#include "src/__support/CPP/limits.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +static constexpr int EFI_ERROR_MAX_BIT = cpp::numeric_limits<EFI_STATUS>::max(); + +static constexpr int EFI_ENCODE_ERROR(int value) { + return EFI_ERROR_MAX_BIT | (EFI_ERROR_MAX_BIT >> 2) | (value); +} + +static constexpr int EFI_ENCODE_WARNING(int value) { + return (EFI_ERROR_MAX_BIT >> 2) | (value); +} + +struct UefiStatusErrnoEntry { + EFI_STATUS status; + int errno_value; +}; + +static constexpr cpp::array<UefiStatusErrnoEntry, 43> UEFI_STATUS_ERRNO_MAP = {{ + {EFI_SUCCESS, 0}, + {EFI_ENCODE_ERROR(EFI_LOAD_ERROR), EINVAL}, + {EFI_ENCODE_ERROR(EFI_INVALID_PARAMETER), EINVAL}, + {EFI_ENCODE_ERROR(EFI_BAD_BUFFER_SIZE), EINVAL}, + {EFI_ENCODE_ERROR(EFI_NOT_READY), EBUSY}, + {EFI_ENCODE_ERROR(EFI_DEVICE_ERROR), EIO}, + {EFI_ENCODE_ERROR(EFI_WRITE_PROTECTED), EPERM}, + {EFI_ENCODE_ERROR(EFI_OUT_OF_RESOURCES), ENOMEM}, + {EFI_ENCODE_ERROR(EFI_VOLUME_CORRUPTED), EROFS}, + {EFI_ENCODE_ERROR(EFI_VOLUME_FULL), ENOSPC}, + {EFI_ENCODE_ERROR(EFI_NO_MEDIA), ENODEV}, + {EFI_ENCODE_ERROR(EFI_MEDIA_CHANGED), ENXIO}, + {EFI_ENCODE_ERROR(EFI_NOT_FOUND), ENOENT}, + {EFI_ENCODE_ERROR(EFI_ACCESS_DENIED), EACCES}, + {EFI_ENCODE_ERROR(EFI_NO_RESPONSE), EBUSY}, + {EFI_ENCODE_ERROR(EFI_NO_MAPPING), ENODEV}, + {EFI_ENCODE_ERROR(EFI_TIMEOUT), EBUSY}, + {EFI_ENCODE_ERROR(EFI_NOT_STARTED), EAGAIN}, + {EFI_ENCODE_ERROR(EFI_ALREADY_STARTED), EINVAL}, + {EFI_ENCODE_ERROR(EFI_ABORTED), EFAULT}, + {EFI_ENCODE_ERROR(EFI_ICMP_ERROR), EIO}, + {EFI_ENCODE_ERROR(EFI_TFTP_ERROR), EIO}, + {EFI_ENCODE_ERROR(EFI_PROTOCOL_ERROR), EINVAL}, + {EFI_ENCODE_ERROR(EFI_INCOMPATIBLE_VERSION), EINVAL}, + {EFI_ENCODE_ERROR(EFI_SECURITY_VIOLATION), EPERM}, + {EFI_ENCODE_ERROR(EFI_CRC_ERROR), EINVAL}, + {EFI_ENCODE_ERROR(EFI_END_OF_MEDIA), EPIPE}, + {EFI_ENCODE_ERROR(EFI_END_OF_FILE), EPIPE}, + {EFI_ENCODE_ERROR(EFI_INVALID_LANGUAGE), EINVAL}, + {EFI_ENCODE_ERROR(EFI_COMPROMISED_DATA), EINVAL}, + {EFI_ENCODE_ERROR(EFI_IP_ADDRESS_CONFLICT), EINVAL}, + {EFI_ENCODE_ERROR(EFI_HTTP_ERROR), EIO}, + {EFI_ENCODE_WARNING(EFI_WARN_UNKNOWN_GLYPH), EINVAL}, + {EFI_ENCODE_WARNING(EFI_WARN_DELETE_FAILURE), EROFS}, + {EFI_ENCODE_WARNING(EFI_WARN_WRITE_FAILURE), EROFS}, + {EFI_ENCODE_WARNING(EFI_WARN_BUFFER_TOO_SMALL), E2BIG}, + {EFI_ENCODE_WARNING(EFI_WARN_STALE_DATA), EINVAL}, + {EFI_ENCODE_WARNING(EFI_WARN_FILE_SYSTEM), EROFS}, + {EFI_ENCODE_WARNING(EFI_WARN_RESET_REQUIRED), EINTR}, +}}; + +LIBC_INLINE int uefi_status_to_errno(EFI_STATUS status) { + for (auto it = UEFI_STATUS_ERRNO_MAP.begin(); + it != UEFI_STATUS_ERRNO_MAP.end(); it++) { + const struct UefiStatusErrnoEntry entry = *it; + if (entry.status == status) + return entry.errno_value; + } + + // Unknown type + return EINVAL; +} + +LIBC_INLINE EFI_STATUS errno_to_uefi_status(int errno_value) { + for (auto it = UEFI_STATUS_ERRNO_MAP.begin(); + it != UEFI_STATUS_ERRNO_MAP.end(); it++) { + const struct UefiStatusErrnoEntry entry = *it; + if (entry.errno_value == errno_value) + return entry.status; + } + + // Unknown type + return EFI_INVALID_PARAMETER; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/uefi/exit.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/exit.cpp new file mode 100644 index 000000000000..e734983cd125 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/exit.cpp @@ -0,0 +1,24 @@ +//===-------- UEFI implementation of an exit function ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===-----------------------------------------------------------------===// + +#include "src/__support/OSUtil/exit.h" +#include "config/uefi.h" +#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +[[noreturn]] void exit(int status) { + app.system_table->BootServices->Exit(__llvm_libc_efi_image_handle, status, 0, + nullptr); + __builtin_unreachable(); +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/uefi/io.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/io.cpp new file mode 100644 index 000000000000..e1e50fbad393 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/io.cpp @@ -0,0 +1,41 @@ +//===---------- UEFI implementation of IO utils ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===-----------------------------------------------------------------===// + +#include "io.h" + +#include "Uefi.h" +#include "config/app.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +ssize_t read_from_stdin([[gnu::unused]] char *buf, + [[gnu::unused]] size_t size) { + return 0; +} + +void write_to_stdout(cpp::string_view msg) { + // TODO: use mbstowcs once implemented + for (size_t i = 0; i < msg.size(); i++) { + char16_t e[2] = {msg[i], 0}; + app.system_table->ConOut->OutputString( + app.system_table->ConOut, reinterpret_cast<const char16_t *>(&e)); + } +} + +void write_to_stderr(cpp::string_view msg) { + // TODO: use mbstowcs once implemented + for (size_t i = 0; i < msg.size(); i++) { + char16_t e[2] = {msg[i], 0}; + app.system_table->StdErr->OutputString( + app.system_table->StdErr, reinterpret_cast<const char16_t *>(&e)); + } +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/uefi/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/io.h new file mode 100644 index 000000000000..088ae09b8c60 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/uefi/io.h @@ -0,0 +1,25 @@ +//===---------- UEFI implementation of IO utils ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===-----------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_IO_H + +#include "include/llvm-libc-types/size_t.h" +#include "include/llvm-libc-types/ssize_t.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +ssize_t read_from_stdin(char *buf, size_t size); +void write_to_stderr(cpp::string_view msg); +void write_to_stdout(cpp::string_view msg); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_IO_H diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/windows/exit.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/windows/exit.cpp new file mode 100644 index 000000000000..369b07b84887 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/windows/exit.cpp @@ -0,0 +1,23 @@ +//===-- Windows implementation of an exit function ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/macros/config.h" + +// On Windows we cannot make direct syscalls since Microsoft changes system call +// IDs periodically. We must rely on functions exported from ntdll.dll or +// kernel32.dll to invoke system service procedures. +#define WIN32_LEAN_AND_MEAN +#include <Windows.h> + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +[[noreturn]] void exit(int status) { ::ExitProcess(status); } + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/windows/io.cpp b/contrib/llvm-project/libc/src/__support/OSUtil/windows/io.cpp new file mode 100644 index 000000000000..af3d1b9e4397 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/windows/io.cpp @@ -0,0 +1,25 @@ +//===------------- Windows implementation of IO utils -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "io.h" +#include "src/__support/macros/config.h" + +// On Windows we cannot make direct syscalls since Microsoft changes system call +// IDs periodically. We must rely on functions exported from ntdll.dll or +// kernel32.dll to invoke system service procedures. +#define WIN32_LEAN_AND_MEAN +#include <Windows.h> + +namespace LIBC_NAMESPACE_DECL { + +void write_to_stderr(cpp::string_view msg) { + ::HANDLE stream = ::GetStdHandle(STD_ERROR_HANDLE); + ::WriteFile(stream, msg.data(), msg.size(), nullptr, nullptr); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/OSUtil/windows/io.h b/contrib/llvm-project/libc/src/__support/OSUtil/windows/io.h new file mode 100644 index 000000000000..bafc00254a7c --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/OSUtil/windows/io.h @@ -0,0 +1,21 @@ +//===------------- Windows implementation of IO utils -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_WINDOWS_IO_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_WINDOWS_IO_H + +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +void write_to_stderr(cpp::string_view msg); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_WINDOWS_IO_H diff --git a/contrib/llvm-project/libc/src/__support/RPC/rpc_client.cpp b/contrib/llvm-project/libc/src/__support/RPC/rpc_client.cpp new file mode 100644 index 000000000000..625e474a4678 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/RPC/rpc_client.cpp @@ -0,0 +1,22 @@ +//===-- Shared memory RPC client instantiation ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "rpc_client.h" + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace rpc { + +/// The libc client instance used to communicate with the server. Externally +/// visible symbol to signify the usage of an RPC client to whomever needs to +/// run the server as well as provide a way to initialize the client. +[[gnu::visibility("protected")]] Client client; + +} // namespace rpc +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/RPC/rpc_client.h b/contrib/llvm-project/libc/src/__support/RPC/rpc_client.h new file mode 100644 index 000000000000..199803badf1a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/RPC/rpc_client.h @@ -0,0 +1,37 @@ +//===-- Shared memory RPC client instantiation ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_RPC_RPC_CLIENT_H +#define LLVM_LIBC_SRC___SUPPORT_RPC_RPC_CLIENT_H + +#include "shared/rpc.h" +#include "shared/rpc_opcodes.h" + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace rpc { + +using ::rpc::Buffer; +using ::rpc::Client; +using ::rpc::Port; +using ::rpc::Process; +using ::rpc::Server; + +static_assert(cpp::is_trivially_copyable<Client>::value && + sizeof(Process<true>) == sizeof(Process<false>), + "The client is not trivially copyable from the server"); + +/// The libc client instance used to communicate with the server. +[[gnu::visibility("protected")]] extern Client client asm("__llvm_rpc_client"); + +} // namespace rpc +} // namespace LIBC_NAMESPACE_DECL + +#endif diff --git a/contrib/llvm-project/libc/src/__support/RPC/rpc_server.h b/contrib/llvm-project/libc/src/__support/RPC/rpc_server.h new file mode 100644 index 000000000000..dc3d8030caa4 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/RPC/rpc_server.h @@ -0,0 +1,551 @@ +//===-- Shared memory RPC server instantiation ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is intended to be used externally as part of the `shared/` +// interface. For that purpose, we manually define a few options normally +// handled by the libc build system. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_RPC_RPC_SERVER_H +#define LLVM_LIBC_SRC___SUPPORT_RPC_RPC_SERVER_H + +// Workaround for missing __has_builtin in < GCC 10. +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +// Workaround for missing __builtin_is_constant_evaluated in < GCC 10. +#ifndef __builtin_is_constant_evaluated +#define __builtin_is_constant_evaluated(x) 0 +#endif + +// Configs for using the LLVM libc writer interface. +#define LIBC_COPT_USE_C_ASSERT +#define LIBC_COPT_MEMCPY_USE_EMBEDDED_TINY +#define LIBC_COPT_ARRAY_ARG_LIST +#define LIBC_COPT_PRINTF_DISABLE_WRITE_INT +#define LIBC_COPT_PRINTF_DISABLE_INDEX_MODE +#define LIBC_COPT_PRINTF_DISABLE_STRERROR + +// The 'long double' type is 8 bytes. +#define LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 + +#include "shared/rpc.h" +#include "shared/rpc_opcodes.h" + +#include "src/__support/arg_list.h" +#include "src/stdio/printf_core/converter.h" +#include "src/stdio/printf_core/parser.h" +#include "src/stdio/printf_core/writer.h" + +#include "hdr/stdio_overlay.h" +#include "hdr/stdlib_overlay.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// Minimal replacement for 'std::vector' that works for trivial types. +template <typename T> class TempVector { + static_assert(cpp::is_trivially_constructible<T>::value && + cpp::is_trivially_destructible<T>::value, + "Not a trivial type."); + T *data; + size_t current; + size_t capacity; + +public: + LIBC_INLINE TempVector() : data(nullptr), current(0), capacity(0) {} + + LIBC_INLINE ~TempVector() { free(data); } + + LIBC_INLINE void push_back(const T &value) { + if (current == capacity) + grow(); + data[current] = T(value); + ++current; + } + + LIBC_INLINE void push_back(T &&value) { + if (current == capacity) + grow(); + data[current] = T(static_cast<T &&>(value)); + ++current; + } + + LIBC_INLINE void pop_back() { --current; } + + LIBC_INLINE bool empty() { return current == 0; } + + LIBC_INLINE size_t size() { return current; } + + LIBC_INLINE T &operator[](size_t index) { return data[index]; } + + LIBC_INLINE T &back() { return data[current - 1]; } + +private: + LIBC_INLINE void grow() { + size_t new_capacity = capacity ? capacity * 2 : 1; + void *new_data = realloc(data, new_capacity * sizeof(T)); + data = static_cast<T *>(new_data); + capacity = new_capacity; + } +}; + +struct TempStorage { + LIBC_INLINE char *alloc(size_t size) { + storage.push_back(reinterpret_cast<char *>(malloc(size))); + return storage.back(); + } + + LIBC_INLINE ~TempStorage() { + for (size_t i = 0; i < storage.size(); ++i) + free(storage[i]); + } + + TempVector<char *> storage; +}; + +// Get the associated stream out of an encoded number. +LIBC_INLINE static ::FILE *to_stream(uintptr_t f) { + enum Stream { + File = 0, + Stdin = 1, + Stdout = 2, + Stderr = 3, + }; + + ::FILE *stream = reinterpret_cast<FILE *>(f & ~0x3ull); + Stream type = static_cast<Stream>(f & 0x3ull); + if (type == Stdin) + return stdin; + if (type == Stdout) + return stdout; + if (type == Stderr) + return stderr; + return stream; +} + +template <bool packed, uint32_t num_lanes> +LIBC_INLINE static void handle_printf(rpc::Server::Port &port, + TempStorage &temp_storage) { + FILE *files[num_lanes] = {nullptr}; + // Get the appropriate output stream to use. + if (port.get_opcode() == LIBC_PRINTF_TO_STREAM || + port.get_opcode() == LIBC_PRINTF_TO_STREAM_PACKED) { + port.recv([&](rpc::Buffer *buffer, uint32_t id) { + files[id] = reinterpret_cast<FILE *>(buffer->data[0]); + }); + } else if (port.get_opcode() == LIBC_PRINTF_TO_STDOUT || + port.get_opcode() == LIBC_PRINTF_TO_STDOUT_PACKED) { + for (uint32_t i = 0; i < num_lanes; ++i) + files[i] = stdout; + } else { + for (uint32_t i = 0; i < num_lanes; ++i) + files[i] = stderr; + } + + uint64_t format_sizes[num_lanes] = {0}; + void *format[num_lanes] = {nullptr}; + + uint64_t args_sizes[num_lanes] = {0}; + void *args[num_lanes] = {nullptr}; + + // Recieve the format string and arguments from the client. + port.recv_n(format, format_sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + + // Parse the format string to get the expected size of the buffer. + for (uint32_t lane = 0; lane < num_lanes; ++lane) { + if (!format[lane]) + continue; + + printf_core::WriteBuffer< + printf_core::WriteMode::FILL_BUFF_AND_DROP_OVERFLOW> + wb(nullptr, 0); + printf_core::Writer writer(wb); + + internal::DummyArgList<packed> printf_args; + printf_core::Parser<internal::DummyArgList<packed> &> parser( + reinterpret_cast<const char *>(format[lane]), printf_args); + + for (printf_core::FormatSection cur_section = parser.get_next_section(); + !cur_section.raw_string.empty(); + cur_section = parser.get_next_section()) + ; + args_sizes[lane] = printf_args.read_count(); + } + port.send([&](rpc::Buffer *buffer, uint32_t id) { + buffer->data[0] = args_sizes[id]; + }); + port.recv_n(args, args_sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + + // Identify any arguments that are actually pointers to strings on the client. + // Additionally we want to determine how much buffer space we need to print. + TempVector<void *> strs_to_copy[num_lanes]; + int buffer_size[num_lanes] = {0}; + for (uint32_t lane = 0; lane < num_lanes; ++lane) { + if (!format[lane]) + continue; + + printf_core::WriteBuffer< + printf_core::WriteMode::FILL_BUFF_AND_DROP_OVERFLOW> + wb(nullptr, 0); + printf_core::Writer writer(wb); + + internal::StructArgList<packed> printf_args(args[lane], args_sizes[lane]); + printf_core::Parser<internal::StructArgList<packed>> parser( + reinterpret_cast<const char *>(format[lane]), printf_args); + + for (printf_core::FormatSection cur_section = parser.get_next_section(); + !cur_section.raw_string.empty(); + cur_section = parser.get_next_section()) { + if (cur_section.has_conv && cur_section.conv_name == 's' && + cur_section.conv_val_ptr) { + strs_to_copy[lane].push_back(cur_section.conv_val_ptr); + // Get the minimum size of the string in the case of padding. + char c = '\0'; + cur_section.conv_val_ptr = &c; + convert(&writer, cur_section); + } else if (cur_section.has_conv) { + // Ignore conversion errors for the first pass. + convert(&writer, cur_section); + } else { + writer.write(cur_section.raw_string); + } + } + buffer_size[lane] = writer.get_chars_written(); + } + + // Recieve any strings from the client and push them into a buffer. + TempVector<void *> copied_strs[num_lanes]; + auto HasPendingCopies = [](TempVector<void *> v[num_lanes]) { + for (uint32_t i = 0; i < num_lanes; ++i) + if (!v[i].empty() && v[i].back()) + return true; + return false; + }; + while (HasPendingCopies(strs_to_copy)) { + port.send([&](rpc::Buffer *buffer, uint32_t id) { + void *ptr = !strs_to_copy[id].empty() ? strs_to_copy[id].back() : nullptr; + buffer->data[1] = reinterpret_cast<uintptr_t>(ptr); + if (!strs_to_copy[id].empty()) + strs_to_copy[id].pop_back(); + }); + uint64_t str_sizes[num_lanes] = {0}; + void *strs[num_lanes] = {nullptr}; + port.recv_n(strs, str_sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + for (uint32_t lane = 0; lane < num_lanes; ++lane) { + if (!strs[lane]) + continue; + + copied_strs[lane].push_back(strs[lane]); + buffer_size[lane] += str_sizes[lane]; + } + } + + // Perform the final formatting and printing using the LLVM C library printf. + int results[num_lanes] = {0}; + for (uint32_t lane = 0; lane < num_lanes; ++lane) { + if (!format[lane]) + continue; + + char *buffer = temp_storage.alloc(buffer_size[lane]); + printf_core::WriteBuffer< + printf_core::WriteMode::FILL_BUFF_AND_DROP_OVERFLOW> + wb(buffer, buffer_size[lane]); + printf_core::Writer writer(wb); + + internal::StructArgList<packed> printf_args(args[lane], args_sizes[lane]); + printf_core::Parser<internal::StructArgList<packed>> parser( + reinterpret_cast<const char *>(format[lane]), printf_args); + + // Parse and print the format string using the arguments we copied from + // the client. + int ret = 0; + for (printf_core::FormatSection cur_section = parser.get_next_section(); + !cur_section.raw_string.empty(); + cur_section = parser.get_next_section()) { + // If this argument was a string we use the memory buffer we copied from + // the client by replacing the raw pointer with the copied one. + if (cur_section.has_conv && cur_section.conv_name == 's') { + if (!copied_strs[lane].empty()) { + cur_section.conv_val_ptr = copied_strs[lane].back(); + copied_strs[lane].pop_back(); + } else { + cur_section.conv_val_ptr = nullptr; + } + } + if (cur_section.has_conv) { + ret = convert(&writer, cur_section); + if (ret == -1) + break; + } else { + writer.write(cur_section.raw_string); + } + } + + results[lane] = static_cast<int>( + fwrite(buffer, 1, writer.get_chars_written(), files[lane])); + if (results[lane] != writer.get_chars_written() || ret == -1) + results[lane] = -1; + } + + // Send the final return value and signal completion by setting the string + // argument to null. + port.send([&](rpc::Buffer *buffer, uint32_t id) { + buffer->data[0] = static_cast<uint64_t>(results[id]); + buffer->data[1] = reinterpret_cast<uintptr_t>(nullptr); + }); +} + +template <uint32_t num_lanes> +LIBC_INLINE static rpc::Status handle_port_impl(rpc::Server::Port &port) { + TempStorage temp_storage; + + switch (port.get_opcode()) { + case LIBC_WRITE_TO_STREAM: + case LIBC_WRITE_TO_STDERR: + case LIBC_WRITE_TO_STDOUT: + case LIBC_WRITE_TO_STDOUT_NEWLINE: { + uint64_t sizes[num_lanes] = {0}; + void *strs[num_lanes] = {nullptr}; + FILE *files[num_lanes] = {nullptr}; + if (port.get_opcode() == LIBC_WRITE_TO_STREAM) { + port.recv([&](rpc::Buffer *buffer, uint32_t id) { + files[id] = reinterpret_cast<FILE *>(buffer->data[0]); + }); + } else { + for (uint32_t i = 0; i < num_lanes; ++i) + files[i] = port.get_opcode() == LIBC_WRITE_TO_STDERR ? stderr : stdout; + } + + port.recv_n(strs, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + port.send([&](rpc::Buffer *buffer, uint32_t id) { + flockfile(files[id]); + buffer->data[0] = fwrite_unlocked(strs[id], 1, sizes[id], files[id]); + if (port.get_opcode() == LIBC_WRITE_TO_STDOUT_NEWLINE && + buffer->data[0] == sizes[id]) + buffer->data[0] += fwrite_unlocked("\n", 1, 1, files[id]); + funlockfile(files[id]); + }); + break; + } + case LIBC_READ_FROM_STREAM: { + uint64_t sizes[num_lanes] = {0}; + void *data[num_lanes] = {nullptr}; + port.recv([&](rpc::Buffer *buffer, uint32_t id) { + data[id] = temp_storage.alloc(buffer->data[0]); + sizes[id] = + fread(data[id], 1, buffer->data[0], to_stream(buffer->data[1])); + }); + port.send_n(data, sizes); + port.send([&](rpc::Buffer *buffer, uint32_t id) { + __builtin_memcpy(buffer->data, &sizes[id], sizeof(uint64_t)); + }); + break; + } + case LIBC_READ_FGETS: { + uint64_t sizes[num_lanes] = {0}; + void *data[num_lanes] = {nullptr}; + port.recv([&](rpc::Buffer *buffer, uint32_t id) { + data[id] = temp_storage.alloc(buffer->data[0]); + const char *str = ::fgets(reinterpret_cast<char *>(data[id]), + static_cast<int>(buffer->data[0]), + to_stream(buffer->data[1])); + sizes[id] = !str ? 0 : __builtin_strlen(str) + 1; + }); + port.send_n(data, sizes); + break; + } + case LIBC_OPEN_FILE: { + uint64_t sizes[num_lanes] = {0}; + void *paths[num_lanes] = {nullptr}; + port.recv_n(paths, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + port.recv_and_send([&](rpc::Buffer *buffer, uint32_t id) { + FILE *file = fopen(reinterpret_cast<char *>(paths[id]), + reinterpret_cast<char *>(buffer->data)); + buffer->data[0] = reinterpret_cast<uintptr_t>(file); + }); + break; + } + case LIBC_CLOSE_FILE: { + port.recv_and_send([&](rpc::Buffer *buffer, uint32_t) { + FILE *file = reinterpret_cast<FILE *>(buffer->data[0]); + buffer->data[0] = ::fclose(file); + }); + break; + } + case LIBC_EXIT: { + // Send a response to the client to signal that we are ready to exit. + port.recv_and_send([](rpc::Buffer *, uint32_t) {}); + port.recv([](rpc::Buffer *buffer, uint32_t) { + int status = 0; + __builtin_memcpy(&status, buffer->data, sizeof(int)); + exit(status); + }); + break; + } + case LIBC_ABORT: { + // Send a response to the client to signal that we are ready to abort. + port.recv_and_send([](rpc::Buffer *, uint32_t) {}); + port.recv([](rpc::Buffer *, uint32_t) {}); + abort(); + break; + } + case LIBC_HOST_CALL: { + uint64_t sizes[num_lanes] = {0}; + unsigned long long results[num_lanes] = {0}; + void *args[num_lanes] = {nullptr}; + port.recv_n(args, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + port.recv([&](rpc::Buffer *buffer, uint32_t id) { + using func_ptr_t = unsigned long long (*)(void *); + auto func = reinterpret_cast<func_ptr_t>(buffer->data[0]); + results[id] = func(args[id]); + }); + port.send([&](rpc::Buffer *buffer, uint32_t id) { + buffer->data[0] = static_cast<uint64_t>(results[id]); + }); + break; + } + case LIBC_FEOF: { + port.recv_and_send([](rpc::Buffer *buffer, uint32_t) { + buffer->data[0] = feof(to_stream(buffer->data[0])); + }); + break; + } + case LIBC_FERROR: { + port.recv_and_send([](rpc::Buffer *buffer, uint32_t) { + buffer->data[0] = ferror(to_stream(buffer->data[0])); + }); + break; + } + case LIBC_CLEARERR: { + port.recv_and_send([](rpc::Buffer *buffer, uint32_t) { + clearerr(to_stream(buffer->data[0])); + }); + break; + } + case LIBC_FSEEK: { + port.recv_and_send([](rpc::Buffer *buffer, uint32_t) { + buffer->data[0] = + fseek(to_stream(buffer->data[0]), static_cast<long>(buffer->data[1]), + static_cast<int>(buffer->data[2])); + }); + break; + } + case LIBC_FTELL: { + port.recv_and_send([](rpc::Buffer *buffer, uint32_t) { + buffer->data[0] = ftell(to_stream(buffer->data[0])); + }); + break; + } + case LIBC_FFLUSH: { + port.recv_and_send([](rpc::Buffer *buffer, uint32_t) { + buffer->data[0] = fflush(to_stream(buffer->data[0])); + }); + break; + } + case LIBC_UNGETC: { + port.recv_and_send([](rpc::Buffer *buffer, uint32_t) { + buffer->data[0] = + ungetc(static_cast<int>(buffer->data[0]), to_stream(buffer->data[1])); + }); + break; + } + case LIBC_PRINTF_TO_STREAM_PACKED: + case LIBC_PRINTF_TO_STDOUT_PACKED: + case LIBC_PRINTF_TO_STDERR_PACKED: { + handle_printf<true, num_lanes>(port, temp_storage); + break; + } + case LIBC_PRINTF_TO_STREAM: + case LIBC_PRINTF_TO_STDOUT: + case LIBC_PRINTF_TO_STDERR: { + handle_printf<false, num_lanes>(port, temp_storage); + break; + } + case LIBC_REMOVE: { + uint64_t sizes[num_lanes] = {0}; + void *args[num_lanes] = {nullptr}; + port.recv_n(args, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + port.send([&](rpc::Buffer *buffer, uint32_t id) { + buffer->data[0] = static_cast<uint64_t>( + remove(reinterpret_cast<const char *>(args[id]))); + }); + break; + } + case LIBC_RENAME: { + uint64_t oldsizes[num_lanes] = {0}; + uint64_t newsizes[num_lanes] = {0}; + void *oldpath[num_lanes] = {nullptr}; + void *newpath[num_lanes] = {nullptr}; + port.recv_n(oldpath, oldsizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + port.recv_n(newpath, newsizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + port.send([&](rpc::Buffer *buffer, uint32_t id) { + buffer->data[0] = static_cast<uint64_t>( + rename(reinterpret_cast<const char *>(oldpath[id]), + reinterpret_cast<const char *>(newpath[id]))); + }); + break; + } + case LIBC_SYSTEM: { + uint64_t sizes[num_lanes] = {0}; + void *args[num_lanes] = {nullptr}; + port.recv_n(args, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); + port.send([&](rpc::Buffer *buffer, uint32_t id) { + buffer->data[0] = static_cast<uint64_t>( + system(reinterpret_cast<const char *>(args[id]))); + }); + break; + } + case LIBC_NOOP: { + port.recv([](rpc::Buffer *, uint32_t) {}); + break; + } + default: + return rpc::RPC_UNHANDLED_OPCODE; + } + + return rpc::RPC_SUCCESS; +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +namespace LIBC_NAMESPACE_DECL { +namespace rpc { + +// Handles any opcode generated from the 'libc' client code. +LIBC_INLINE ::rpc::Status handle_libc_opcodes(::rpc::Server::Port &port, + uint32_t num_lanes) { + switch (num_lanes) { + case 1: + return internal::handle_port_impl<1>(port); + case 32: + return internal::handle_port_impl<32>(port); + case 64: + return internal::handle_port_impl<64>(port); + default: + return ::rpc::RPC_ERROR; + } +} + +} // namespace rpc +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_RPC_RPC_SERVER_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/error_to_string.cpp b/contrib/llvm-project/libc/src/__support/StringUtil/error_to_string.cpp new file mode 100644 index 000000000000..3b22021706bb --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/error_to_string.cpp @@ -0,0 +1,85 @@ +//===-- Implementation of a class for mapping errors to strings -----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "error_to_string.h" +#include "platform_errors.h" + +#include "src/__support/CPP/span.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/CPP/stringstream.h" +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/integer_to_string.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +#include <stddef.h> + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +constexpr size_t max_buff_size() { + constexpr size_t unknown_str_len = sizeof("Unknown error"); + // the buffer should be able to hold "Unknown error" + ' ' + num_str + return (unknown_str_len + 1 + IntegerToString<int>::buffer_size()) * + sizeof(char); +} + +// This is to hold error strings that have to be custom built. It may be +// rewritten on every call to strerror (or other error to string function). +constexpr size_t ERR_BUFFER_SIZE = max_buff_size(); +LIBC_THREAD_LOCAL char error_buffer[ERR_BUFFER_SIZE]; + +constexpr size_t TOTAL_STR_LEN = total_str_len(PLATFORM_ERRORS); + +// Since the StringMappings array is a map from error numbers to their +// corresponding strings, we have to have an array large enough we can use the +// error numbers as indexes. The current linux configuration has 132 values with +// the maximum value being 133 (41 and 58 are skipped). If other platforms use +// negative numbers or discontiguous ranges, then the array should be turned +// into a proper hashmap. +constexpr size_t ERR_ARRAY_SIZE = max_key_val(PLATFORM_ERRORS) + 1; + +constexpr MessageMapper<ERR_ARRAY_SIZE, TOTAL_STR_LEN> + ERROR_MAPPER(PLATFORM_ERRORS); + +constexpr MessageMapper<ERR_ARRAY_SIZE, TOTAL_STR_LEN> + ERRNO_NAME_MAPPER(PLATFORM_ERRNO_NAMES); + +cpp::string_view build_error_string(int err_num, cpp::span<char> buffer) { + // if the buffer can't hold "Unknown error" + ' ' + num_str, then just + // return "Unknown error". + if (buffer.size() < + (sizeof("Unknown error") + 1 + IntegerToString<int>::buffer_size())) + return const_cast<char *>("Unknown error"); + + cpp::StringStream buffer_stream( + {const_cast<char *>(buffer.data()), buffer.size()}); + buffer_stream << "Unknown error" << ' ' << err_num << '\0'; + return buffer_stream.str(); +} + +} // namespace internal + +cpp::string_view get_error_string(int err_num) { + return get_error_string(err_num, + {internal::error_buffer, internal::ERR_BUFFER_SIZE}); +} + +cpp::string_view get_error_string(int err_num, cpp::span<char> buffer) { + auto opt_str = internal::ERROR_MAPPER.get_str(err_num); + if (opt_str) + return *opt_str; + else + return internal::build_error_string(err_num, buffer); +} + +cpp::optional<cpp::string_view> try_get_errno_name(int err_num) { + return internal::ERRNO_NAME_MAPPER.get_str(err_num); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/error_to_string.h b/contrib/llvm-project/libc/src/__support/StringUtil/error_to_string.h new file mode 100644 index 000000000000..dfbd03f0703b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/error_to_string.h @@ -0,0 +1,27 @@ +//===-- Definition of a class for mapping errors to strings -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_ERROR_TO_STRING_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_ERROR_TO_STRING_H + +#include "src/__support/CPP/optional.h" +#include "src/__support/CPP/span.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +cpp::string_view get_error_string(int err_num); + +cpp::string_view get_error_string(int err_num, cpp::span<char> buffer); + +cpp::optional<cpp::string_view> try_get_errno_name(int err_num); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_ERROR_TO_STRING_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/message_mapper.h b/contrib/llvm-project/libc/src/__support/StringUtil/message_mapper.h new file mode 100644 index 000000000000..df7506a2f3ec --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/message_mapper.h @@ -0,0 +1,104 @@ +//===-- A class for number to string mappings -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_MESSAGE_MAPPER_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_MESSAGE_MAPPER_H + +#include "src/__support/CPP/array.h" +#include "src/__support/CPP/optional.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" +#include <stddef.h> + +namespace LIBC_NAMESPACE_DECL { + +struct MsgMapping { + int num; + cpp::string_view msg; + + constexpr MsgMapping() : num(0), msg() { ; } + + constexpr MsgMapping(int init_num, const char *init_msg) + : num(init_num), msg(init_msg) { + ; + } +}; + +template <size_t N> using MsgTable = cpp::array<MsgMapping, N>; + +template <size_t N> constexpr size_t total_str_len(const MsgTable<N> &table) { + size_t total = 0; + for (size_t i = 0; i < table.size(); ++i) { + // add 1 for the null terminator. + total += table[i].msg.size() + 1; + } + return total; +} + +template <size_t N> constexpr size_t max_key_val(const MsgTable<N> &table) { + int max = 0; + for (size_t i = 0; i < table.size(); ++i) { + if (table[i].num > max) { + max = table[i].num; + } + } + // max will never be negative since the starting value is 0. This is good, + // since it's used as a length. + return static_cast<size_t>(max); +} + +template <size_t ARR_SIZE, size_t TOTAL_STR_LEN> class MessageMapper { + int msg_offsets[ARR_SIZE] = {-1}; + char string_array[TOTAL_STR_LEN] = {'\0'}; + +public: + template <size_t N> constexpr MessageMapper(const MsgTable<N> &table) { + cpp::string_view string_mappings[ARR_SIZE] = {""}; + for (size_t i = 0; i < table.size(); ++i) + string_mappings[table[i].num] = table[i].msg; + + int string_array_index = 0; + for (size_t cur_num = 0; cur_num < ARR_SIZE; ++cur_num) { + if (string_mappings[cur_num].size() != 0) { + msg_offsets[cur_num] = string_array_index; + // No need to replace with proper strcpy, this is evaluated at compile + // time. + for (size_t i = 0; i < string_mappings[cur_num].size() + 1; + ++i, ++string_array_index) { + string_array[string_array_index] = string_mappings[cur_num][i]; + } + } else { + msg_offsets[cur_num] = -1; + } + } + } + + cpp::optional<cpp::string_view> get_str(int num) const { + if (num >= 0 && static_cast<size_t>(num) < ARR_SIZE && + msg_offsets[num] != -1) { + return {string_array + msg_offsets[num]}; + } else { + return cpp::optional<cpp::string_view>(); + } + } +}; + +template <size_t N1, size_t N2> +constexpr MsgTable<N1 + N2> operator+(const MsgTable<N1> &t1, + const MsgTable<N2> &t2) { + MsgTable<N1 + N2> res{}; + for (size_t i = 0; i < N1; ++i) + res[i] = t1[i]; + for (size_t i = 0; i < N2; ++i) + res[N1 + i] = t2[i]; + return res; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_MESSAGE_MAPPER_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/platform_errors.h b/contrib/llvm-project/libc/src/__support/StringUtil/platform_errors.h new file mode 100644 index 000000000000..32e8414b3e3d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/platform_errors.h @@ -0,0 +1,18 @@ +//===-- The error table for the current platform ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_PLATFORM_ERRORS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_PLATFORM_ERRORS_H + +#if defined(__linux__) || defined(__Fuchsia__) +#include "tables/linux_platform_errors.h" +#else +#include "tables/minimal_platform_errors.h" +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_PLATFORM_ERRORS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/platform_signals.h b/contrib/llvm-project/libc/src/__support/StringUtil/platform_signals.h new file mode 100644 index 000000000000..52da082649bf --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/platform_signals.h @@ -0,0 +1,18 @@ +//===-- The signal table for the current platform ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_PLATFORM_SIGNALS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_PLATFORM_SIGNALS_H + +#if defined(__linux__) || defined(__Fuchsia__) +#include "tables/linux_platform_signals.h" +#else +#include "tables/minimal_platform_signals.h" +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_PLATFORM_SIGNALS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/signal_to_string.cpp b/contrib/llvm-project/libc/src/__support/StringUtil/signal_to_string.cpp new file mode 100644 index 000000000000..b67d28814816 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/signal_to_string.cpp @@ -0,0 +1,81 @@ +//===-- Implementation of a class for mapping signals to strings ----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "signal_to_string.h" +#include "platform_signals.h" + +#include "src/__support/CPP/span.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/CPP/stringstream.h" +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/integer_to_string.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +#include <signal.h> +#include <stddef.h> + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +constexpr size_t max_buff_size() { + constexpr size_t base_str_len = sizeof("Real-time signal"); + // the buffer should be able to hold "Real-time signal" + ' ' + num_str + return (base_str_len + 1 + IntegerToString<int>::buffer_size()) * + sizeof(char); +} + +// This is to hold signal strings that have to be custom built. It may be +// rewritten on every call to strsignal (or other signal to string function). +constexpr size_t SIG_BUFFER_SIZE = max_buff_size(); +LIBC_THREAD_LOCAL char signal_buffer[SIG_BUFFER_SIZE]; + +constexpr size_t TOTAL_STR_LEN = total_str_len(PLATFORM_SIGNALS); + +constexpr size_t SIG_ARRAY_SIZE = max_key_val(PLATFORM_SIGNALS) + 1; + +constexpr MessageMapper<SIG_ARRAY_SIZE, TOTAL_STR_LEN> + signal_mapper(PLATFORM_SIGNALS); + +cpp::string_view build_signal_string(int sig_num, cpp::span<char> buffer) { + cpp::string_view base_str; + if (sig_num >= SIGRTMIN && sig_num <= SIGRTMAX) { + base_str = cpp::string_view("Real-time signal"); + sig_num -= SIGRTMIN; + } else { + base_str = cpp::string_view("Unknown signal"); + } + + // if the buffer can't hold "Unknown signal" + ' ' + num_str, then just + // return "Unknown signal". + if (buffer.size() < + (base_str.size() + 1 + IntegerToString<int>::buffer_size())) + return base_str; + + cpp::StringStream buffer_stream( + {const_cast<char *>(buffer.data()), buffer.size()}); + buffer_stream << base_str << ' ' << sig_num << '\0'; + return buffer_stream.str(); +} + +} // namespace internal + +cpp::string_view get_signal_string(int sig_num) { + return get_signal_string( + sig_num, {internal::signal_buffer, internal::SIG_BUFFER_SIZE}); +} + +cpp::string_view get_signal_string(int sig_num, cpp::span<char> buffer) { + auto opt_str = internal::signal_mapper.get_str(sig_num); + if (opt_str) + return *opt_str; + else + return internal::build_signal_string(sig_num, buffer); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/signal_to_string.h b/contrib/llvm-project/libc/src/__support/StringUtil/signal_to_string.h new file mode 100644 index 000000000000..a162486d134e --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/signal_to_string.h @@ -0,0 +1,25 @@ +//===-- Function prototype for mapping signals to strings -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_SIGNAL_TO_STRING_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_SIGNAL_TO_STRING_H + +#include "src/__support/CPP/span.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +cpp::string_view get_signal_string(int err_num); + +cpp::string_view get_signal_string(int err_num, cpp::span<char> buffer); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_SIGNAL_TO_STRING_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_extension_errors.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_extension_errors.h new file mode 100644 index 000000000000..de637d60bea9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_extension_errors.h @@ -0,0 +1,130 @@ +//===-- Map of Linux extension error numbers to strings ---------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_ERRORS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_ERRORS_H + +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/libc_errno.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +constexpr MsgTable<52> LINUX_ERRORS = { + MsgMapping(ENOTBLK, "Block device required"), + MsgMapping(ECHRNG, "Channel number out of range"), + MsgMapping(EL2NSYNC, "Level 2 not synchronized"), + MsgMapping(EL3HLT, "Level 3 halted"), + MsgMapping(EL3RST, "Level 3 reset"), + MsgMapping(ELNRNG, "Link number out of range"), + MsgMapping(EUNATCH, "Protocol driver not attached"), + MsgMapping(ENOCSI, "No CSI structure available"), + MsgMapping(EL2HLT, "Level 2 halted"), + MsgMapping(EBADE, "Invalid exchange"), + MsgMapping(EBADR, "Invalid request descriptor"), + MsgMapping(EXFULL, "Exchange full"), + MsgMapping(ENOANO, "No anode"), + MsgMapping(EBADRQC, "Invalid request code"), + MsgMapping(EBADSLT, "Invalid slot"), + MsgMapping(EBFONT, "Bad font file format"), + MsgMapping(ENONET, "Machine is not on the network"), + MsgMapping(ENOPKG, "Package not installed"), + MsgMapping(EREMOTE, "Object is remote"), + MsgMapping(EADV, "Advertise error"), + MsgMapping(ESRMNT, "Srmount error"), + MsgMapping(ECOMM, "Communication error on send"), + MsgMapping(EDOTDOT, "RFS specific error"), + MsgMapping(ENOTUNIQ, "Name not unique on network"), + MsgMapping(EBADFD, "File descriptor in bad state"), + MsgMapping(EREMCHG, "Remote address changed"), + MsgMapping(ELIBACC, "Can not access a needed shared library"), + MsgMapping(ELIBBAD, "Accessing a corrupted shared library"), + MsgMapping(ELIBSCN, ".lib section in a.out corrupted"), + MsgMapping(ELIBMAX, "Attempting to link in too many shared libraries"), + MsgMapping(ELIBEXEC, "Cannot exec a shared library directly"), + MsgMapping(ERESTART, "Interrupted system call should be restarted"), + MsgMapping(ESTRPIPE, "Streams pipe error"), + MsgMapping(EUSERS, "Too many users"), + MsgMapping(ESOCKTNOSUPPORT, "Socket type not supported"), + MsgMapping(EPFNOSUPPORT, "Protocol family not supported"), + MsgMapping(ESHUTDOWN, "Cannot send after transport endpoint shutdown"), + MsgMapping(ETOOMANYREFS, "Too many references: cannot splice"), + MsgMapping(EHOSTDOWN, "Host is down"), + MsgMapping(EUCLEAN, "Structure needs cleaning"), + MsgMapping(ENOTNAM, "Not a XENIX named type file"), + MsgMapping(ENAVAIL, "No XENIX semaphores available"), + MsgMapping(EISNAM, "Is a named type file"), + MsgMapping(EREMOTEIO, "Remote I/O error"), + MsgMapping(ENOMEDIUM, "No medium found"), + MsgMapping(EMEDIUMTYPE, "Wrong medium type"), + MsgMapping(ENOKEY, "Required key not available"), + MsgMapping(EKEYEXPIRED, "Key has expired"), + MsgMapping(EKEYREVOKED, "Key has been revoked"), + MsgMapping(EKEYREJECTED, "Key was rejected by service"), + MsgMapping(ERFKILL, "Operation not possible due to RF-kill"), + MsgMapping(EHWPOISON, "Memory page has hardware error"), +}; + +constexpr MsgTable<52> LINUX_ERRNO_NAMES = { + MsgMapping(ENOTBLK, "ENOTBLK"), + MsgMapping(ECHRNG, "ECHRNG"), + MsgMapping(EL2NSYNC, "EL2NSYNC"), + MsgMapping(EL3HLT, "EL3HLT"), + MsgMapping(EL3RST, "EL3RST"), + MsgMapping(ELNRNG, "ELNRNG"), + MsgMapping(EUNATCH, "EUNATCH"), + MsgMapping(ENOCSI, "ENOCSI"), + MsgMapping(EL2HLT, "EL2HLT"), + MsgMapping(EBADE, "EBADE"), + MsgMapping(EBADR, "EBADR"), + MsgMapping(EXFULL, "EXFULL"), + MsgMapping(ENOANO, "ENOANO"), + MsgMapping(EBADRQC, "EBADRQC"), + MsgMapping(EBADSLT, "EBADSLT"), + MsgMapping(EBFONT, "EBFONT"), + MsgMapping(ENONET, "ENONET"), + MsgMapping(ENOPKG, "ENOPKG"), + MsgMapping(EREMOTE, "EREMOTE"), + MsgMapping(EADV, "EADV"), + MsgMapping(ESRMNT, "ESRMNT"), + MsgMapping(ECOMM, "ECOMM"), + MsgMapping(EDOTDOT, "EDOTDOT"), + MsgMapping(ENOTUNIQ, "ENOTUNIQ"), + MsgMapping(EBADFD, "EBADFD"), + MsgMapping(EREMCHG, "EREMCHG"), + MsgMapping(ELIBACC, "ELIBACC"), + MsgMapping(ELIBBAD, "ELIBBAD"), + MsgMapping(ELIBSCN, "ELIBSCN"), + MsgMapping(ELIBMAX, "ELIBMAX"), + MsgMapping(ELIBEXEC, "ELIBEXEC"), + MsgMapping(ERESTART, "ERESTART"), + MsgMapping(ESTRPIPE, "ESTRPIPE"), + MsgMapping(EUSERS, "EUSERS"), + MsgMapping(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT"), + MsgMapping(EPFNOSUPPORT, "EPFNOSUPPORT"), + MsgMapping(ESHUTDOWN, "ESHUTDOWN"), + MsgMapping(ETOOMANYREFS, "ETOOMANYREFS"), + MsgMapping(EHOSTDOWN, "EHOSTDOWN"), + MsgMapping(EUCLEAN, "EUCLEAN"), + MsgMapping(ENOTNAM, "ENOTNAM"), + MsgMapping(ENAVAIL, "ENAVAIL"), + MsgMapping(EISNAM, "EISNAM"), + MsgMapping(EREMOTEIO, "EREMOTEIO"), + MsgMapping(ENOMEDIUM, "ENOMEDIUM"), + MsgMapping(EMEDIUMTYPE, "EMEDIUMTYPE"), + MsgMapping(ENOKEY, "ENOKEY"), + MsgMapping(EKEYEXPIRED, "EKEYEXPIRED"), + MsgMapping(EKEYREVOKED, "EKEYREVOKED"), + MsgMapping(EKEYREJECTED, "EKEYREJECTED"), + MsgMapping(ERFKILL, "ERFKILL"), + MsgMapping(EHWPOISON, "EHWPOISON"), +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_ERRORS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_extension_signals.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_extension_signals.h new file mode 100644 index 000000000000..c9cb26b785a1 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_extension_signals.h @@ -0,0 +1,34 @@ +//===-- Map of Linux extension signal numbers to strings --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_SIGNALS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_SIGNALS_H + +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/macros/config.h" + +#include <signal.h> // For signal numbers + +namespace LIBC_NAMESPACE_DECL { + +// The array being larger than necessary isn't a problem. The MsgMappings will +// be set to their default state which maps 0 to an empty string. This will get +// filtered out in the MessageMapper building stage. +LIBC_INLINE_VAR constexpr const MsgTable<3> LINUX_SIGNALS = { +#ifdef SIGSTKFLT + MsgMapping(SIGSTKFLT, "Stack fault"), // unused +#endif + MsgMapping(SIGWINCH, "Window changed"), +#ifdef SIGPWR + MsgMapping(SIGPWR, "Power failure"), // ignored +#endif +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_SIGNALS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_platform_errors.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_platform_errors.h new file mode 100644 index 000000000000..ce5ee380d6b5 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_platform_errors.h @@ -0,0 +1,27 @@ +//===-- Map of error numbers to strings for the Linux platform --*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_PLATFORM_ERRORS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_PLATFORM_ERRORS_H + +#include "linux_extension_errors.h" +#include "posix_errors.h" +#include "src/__support/macros/config.h" +#include "stdc_errors.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr auto PLATFORM_ERRORS = + STDC_ERRORS + POSIX_ERRORS + LINUX_ERRORS; + +LIBC_INLINE_VAR constexpr auto PLATFORM_ERRNO_NAMES = + STDC_ERRNO_NAMES + POSIX_ERRNO_NAMES + LINUX_ERRNO_NAMES; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_PLATFORM_ERRORS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_platform_signals.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_platform_signals.h new file mode 100644 index 000000000000..7c816aaf504f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/linux_platform_signals.h @@ -0,0 +1,24 @@ +//===-- Map of error numbers to strings for the Linux platform --*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_PLATFORM_SIGNALS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_PLATFORM_SIGNALS_H + +#include "linux_extension_signals.h" +#include "posix_signals.h" +#include "src/__support/macros/config.h" +#include "stdc_signals.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr auto PLATFORM_SIGNALS = + STDC_SIGNALS + POSIX_SIGNALS + LINUX_SIGNALS; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_PLATFORM_SIGNALS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/minimal_platform_errors.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/minimal_platform_errors.h new file mode 100644 index 000000000000..a9dcb365ca11 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/minimal_platform_errors.h @@ -0,0 +1,23 @@ +//===-- Map of error numbers to strings for a stdc platform -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_MINIMAL_PLATFORM_ERRORS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_MINIMAL_PLATFORM_ERRORS_H + +#include "src/__support/macros/config.h" +#include "stdc_errors.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr auto PLATFORM_ERRORS = STDC_ERRORS; + +LIBC_INLINE_VAR constexpr auto PLATFORM_ERRNO_NAMES = STDC_ERRNO_NAMES; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_MINIMAL_PLATFORM_ERRORS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/minimal_platform_signals.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/minimal_platform_signals.h new file mode 100644 index 000000000000..d4cecb3b35e5 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/minimal_platform_signals.h @@ -0,0 +1,21 @@ +//===-- Map of error numbers to strings for a stdc platform -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_MINIMAL_PLATFORM_SIGNALS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_MINIMAL_PLATFORM_SIGNALS_H + +#include "src/__support/macros/config.h" +#include "stdc_signals.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr auto PLATFORM_SIGNALS = STDC_SIGNALS; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_MINIMAL_PLATFORM_SIGNALS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/posix_errors.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/posix_errors.h new file mode 100644 index 000000000000..b21f28f0b132 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/posix_errors.h @@ -0,0 +1,178 @@ +//===-- Map of POSIX error numbers to strings -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_POSIX_ERRORS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_POSIX_ERRORS_H + +#include "hdr/errno_macros.h" +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr MsgTable<76> POSIX_ERRORS = { + MsgMapping(EPERM, "Operation not permitted"), + MsgMapping(ENOENT, "No such file or directory"), + MsgMapping(ESRCH, "No such process"), + MsgMapping(EINTR, "Interrupted system call"), + MsgMapping(EIO, "Input/output error"), + MsgMapping(ENXIO, "No such device or address"), + MsgMapping(E2BIG, "Argument list too long"), + MsgMapping(ENOEXEC, "Exec format error"), + MsgMapping(EBADF, "Bad file descriptor"), + MsgMapping(ECHILD, "No child processes"), + MsgMapping(EAGAIN, "Resource temporarily unavailable"), + MsgMapping(ENOMEM, "Cannot allocate memory"), + MsgMapping(EACCES, "Permission denied"), + MsgMapping(EFAULT, "Bad address"), + MsgMapping(EBUSY, "Device or resource busy"), + MsgMapping(EEXIST, "File exists"), + MsgMapping(EXDEV, "Invalid cross-device link"), + MsgMapping(ENODEV, "No such device"), + MsgMapping(ENOTDIR, "Not a directory"), + MsgMapping(EISDIR, "Is a directory"), + MsgMapping(EINVAL, "Invalid argument"), + MsgMapping(ENFILE, "Too many open files in system"), + MsgMapping(EMFILE, "Too many open files"), + MsgMapping(ENOTTY, "Inappropriate ioctl for device"), + MsgMapping(ETXTBSY, "Text file busy"), + MsgMapping(EFBIG, "File too large"), + MsgMapping(ENOSPC, "No space left on device"), + MsgMapping(ESPIPE, "Illegal seek"), + MsgMapping(EROFS, "Read-only file system"), + MsgMapping(EMLINK, "Too many links"), + MsgMapping(EPIPE, "Broken pipe"), + MsgMapping(EDEADLK, "Resource deadlock avoided"), + MsgMapping(ENAMETOOLONG, "File name too long"), + MsgMapping(ENOLCK, "No locks available"), + MsgMapping(ENOSYS, "Function not implemented"), + MsgMapping(ENOTEMPTY, "Directory not empty"), + MsgMapping(ELOOP, "Too many levels of symbolic links"), + MsgMapping(ENOMSG, "No message of desired type"), + MsgMapping(EIDRM, "Identifier removed"), + MsgMapping(ENOSTR, "Device not a stream"), + MsgMapping(ENODATA, "No data available"), + MsgMapping(ETIME, "Timer expired"), + MsgMapping(ENOSR, "Out of streams resources"), + MsgMapping(ENOLINK, "Link has been severed"), + MsgMapping(EPROTO, "Protocol error"), + MsgMapping(EMULTIHOP, "Multihop attempted"), + MsgMapping(EBADMSG, "Bad message"), + MsgMapping(EOVERFLOW, "Value too large for defined data type"), + MsgMapping(ENOTSOCK, "Socket operation on non-socket"), + MsgMapping(EDESTADDRREQ, "Destination address required"), + MsgMapping(EMSGSIZE, "Message too long"), + MsgMapping(EPROTOTYPE, "Protocol wrong type for socket"), + MsgMapping(ENOPROTOOPT, "Protocol not available"), + MsgMapping(EPROTONOSUPPORT, "Protocol not supported"), + MsgMapping(ENOTSUP, "Operation not supported"), + MsgMapping(EAFNOSUPPORT, "Address family not supported by protocol"), + MsgMapping(EADDRINUSE, "Address already in use"), + MsgMapping(EADDRNOTAVAIL, "Cannot assign requested address"), + MsgMapping(ENETDOWN, "Network is down"), + MsgMapping(ENETUNREACH, "Network is unreachable"), + MsgMapping(ENETRESET, "Network dropped connection on reset"), + MsgMapping(ECONNABORTED, "Software caused connection abort"), + MsgMapping(ECONNRESET, "Connection reset by peer"), + MsgMapping(ENOBUFS, "No buffer space available"), + MsgMapping(EISCONN, "Transport endpoint is already connected"), + MsgMapping(ENOTCONN, "Transport endpoint is not connected"), + MsgMapping(ETIMEDOUT, "Connection timed out"), + MsgMapping(ECONNREFUSED, "Connection refused"), + MsgMapping(EHOSTUNREACH, "No route to host"), + MsgMapping(EALREADY, "Operation already in progress"), + MsgMapping(EINPROGRESS, "Operation now in progress"), + MsgMapping(ESTALE, "Stale file handle"), + MsgMapping(EDQUOT, "Disk quota exceeded"), + MsgMapping(ECANCELED, "Operation canceled"), + MsgMapping(EOWNERDEAD, "Owner died"), + MsgMapping(ENOTRECOVERABLE, "State not recoverable"), +}; + +LIBC_INLINE_VAR constexpr MsgTable<76> POSIX_ERRNO_NAMES = { + MsgMapping(EPERM, "EPERM"), + MsgMapping(ENOENT, "ENOENT"), + MsgMapping(ESRCH, "ESRCH"), + MsgMapping(EINTR, "EINTR"), + MsgMapping(EIO, "EIO"), + MsgMapping(ENXIO, "ENXIO"), + MsgMapping(E2BIG, "E2BIG"), + MsgMapping(ENOEXEC, "ENOEXEC"), + MsgMapping(EBADF, "EBADF"), + MsgMapping(ECHILD, "ECHILD"), + MsgMapping(EAGAIN, "EAGAIN"), + MsgMapping(ENOMEM, "ENOMEM"), + MsgMapping(EACCES, "EACCES"), + MsgMapping(EFAULT, "EFAULT"), + MsgMapping(EBUSY, "EBUSY"), + MsgMapping(EEXIST, "EEXIST"), + MsgMapping(EXDEV, "EXDEV"), + MsgMapping(ENODEV, "ENODEV"), + MsgMapping(ENOTDIR, "ENOTDIR"), + MsgMapping(EISDIR, "EISDIR"), + MsgMapping(EINVAL, "EINVAL"), + MsgMapping(ENFILE, "ENFILE"), + MsgMapping(EMFILE, "EMFILE"), + MsgMapping(ENOTTY, "ENOTTY"), + MsgMapping(ETXTBSY, "ETXTBSY"), + MsgMapping(EFBIG, "EFBIG"), + MsgMapping(ENOSPC, "ENOSPC"), + MsgMapping(ESPIPE, "ESPIPE"), + MsgMapping(EROFS, "EROFS"), + MsgMapping(EMLINK, "EMLINK"), + MsgMapping(EPIPE, "EPIPE"), + MsgMapping(EDEADLK, "EDEADLK"), + MsgMapping(ENAMETOOLONG, "ENAMETOOLONG"), + MsgMapping(ENOLCK, "ENOLCK"), + MsgMapping(ENOSYS, "ENOSYS"), + MsgMapping(ENOTEMPTY, "ENOTEMPTY"), + MsgMapping(ELOOP, "ELOOP"), + MsgMapping(ENOMSG, "ENOMSG"), + MsgMapping(EIDRM, "EIDRM"), + MsgMapping(ENOSTR, "ENOSTR"), + MsgMapping(ENODATA, "ENODATA"), + MsgMapping(ETIME, "ETIME"), + MsgMapping(ENOSR, "ENOSR"), + MsgMapping(ENOLINK, "ENOLINK"), + MsgMapping(EPROTO, "EPROTO"), + MsgMapping(EMULTIHOP, "EMULTIHOP"), + MsgMapping(EBADMSG, "EBADMSG"), + MsgMapping(EOVERFLOW, "EOVERFLOW"), + MsgMapping(ENOTSOCK, "ENOTSOCK"), + MsgMapping(EDESTADDRREQ, "EDESTADDRREQ"), + MsgMapping(EMSGSIZE, "EMSGSIZE"), + MsgMapping(EPROTOTYPE, "EPROTOTYPE"), + MsgMapping(ENOPROTOOPT, "ENOPROTOOPT"), + MsgMapping(EPROTONOSUPPORT, "EPROTONOSUPPORT"), + MsgMapping(ENOTSUP, "ENOTSUP"), + MsgMapping(EAFNOSUPPORT, "EAFNOSUPPORT"), + MsgMapping(EADDRINUSE, "EADDRINUSE"), + MsgMapping(EADDRNOTAVAIL, "EADDRNOTAVAIL"), + MsgMapping(ENETDOWN, "ENETDOWN"), + MsgMapping(ENETUNREACH, "ENETUNREACH"), + MsgMapping(ENETRESET, "ENETRESET"), + MsgMapping(ECONNABORTED, "ECONNABORTED"), + MsgMapping(ECONNRESET, "ECONNRESET"), + MsgMapping(ENOBUFS, "ENOBUFS"), + MsgMapping(EISCONN, "EISCONN"), + MsgMapping(ENOTCONN, "ENOTCONN"), + MsgMapping(ETIMEDOUT, "ETIMEDOUT"), + MsgMapping(ECONNREFUSED, "ECONNREFUSED"), + MsgMapping(EHOSTUNREACH, "EHOSTUNREACH"), + MsgMapping(EALREADY, "EALREADY"), + MsgMapping(EINPROGRESS, "EINPROGRESS"), + MsgMapping(ESTALE, "ESTALE"), + MsgMapping(EDQUOT, "EDQUOT"), + MsgMapping(ECANCELED, "ECANCELED"), + MsgMapping(EOWNERDEAD, "EOWNERDEAD"), + MsgMapping(ENOTRECOVERABLE, "ENOTRECOVERABLE"), +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_POSIX_ERRORS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/posix_signals.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/posix_signals.h new file mode 100644 index 000000000000..7c70f71837e2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/posix_signals.h @@ -0,0 +1,47 @@ +//===-- Map of POSIX signal numbers to strings ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_POSIX_SIGNALS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_POSIX_SIGNALS_H + +#include "src/__support/CPP/array.h" +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/macros/config.h" + +#include <signal.h> // For signal numbers + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr MsgTable<22> POSIX_SIGNALS = { + MsgMapping(SIGHUP, "Hangup"), + MsgMapping(SIGQUIT, "Quit"), + MsgMapping(SIGTRAP, "Trace/breakpoint trap"), + MsgMapping(SIGBUS, "Bus error"), + MsgMapping(SIGKILL, "Killed"), + MsgMapping(SIGUSR1, "User defined signal 1"), + MsgMapping(SIGUSR2, "User defined signal 2"), + MsgMapping(SIGPIPE, "Broken pipe"), + MsgMapping(SIGALRM, "Alarm clock"), + MsgMapping(SIGCHLD, "Child exited"), + MsgMapping(SIGCONT, "Continued"), + MsgMapping(SIGSTOP, "Stopped (signal)"), + MsgMapping(SIGTSTP, "Stopped"), + MsgMapping(SIGTTIN, "Stopped (tty input)"), + MsgMapping(SIGTTOU, "Stopped (tty output)"), + MsgMapping(SIGURG, "Urgent I/O condition"), + MsgMapping(SIGXCPU, "CPU time limit exceeded"), + MsgMapping(SIGXFSZ, "File size limit exceeded"), + MsgMapping(SIGVTALRM, "Virtual timer expired"), + MsgMapping(SIGPROF, "Profiling timer expired"), + MsgMapping(SIGPOLL, "I/O possible"), + MsgMapping(SIGSYS, "Bad system call"), +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_POSIX_SIGNALS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/signal_table.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/signal_table.h new file mode 100644 index 000000000000..bfec39b52f1a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/signal_table.h @@ -0,0 +1,42 @@ +//===-- Map from signal numbers to strings ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_SIGNAL_TABLE_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_SIGNAL_TABLE_H + +#include "src/__support/StringUtil/message_mapper.h" + +#include "posix_signals.h" +#include "src/__support/macros/config.h" +#include "stdc_signals.h" + +#if defined(__linux__) || defined(__Fuchsia__) +#define USE_LINUX_PLATFORM_SIGNALS 1 +#else +#define USE_LINUX_PLATFORM_SIGNALS 0 +#endif + +#if USE_LINUX_PLATFORM_SIGNALS +#include "linux_extension_signals.h" +#endif + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +LIBC_INLINE_VAR constexpr auto PLATFORM_SIGNALS = []() { + if constexpr (USE_LINUX_PLATFORM_SIGNALS) { + return STDC_SIGNALS + POSIX_SIGNALS + LINUX_SIGNALS; + } else { + return STDC_SIGNALS; + } +}(); + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_SIGNAL_TABLE_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/stdc_errors.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/stdc_errors.h new file mode 100644 index 000000000000..a326616f20ef --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/stdc_errors.h @@ -0,0 +1,34 @@ +//===-- Map of C standard error numbers to strings --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_STDC_ERRORS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_STDC_ERRORS_H + +#include "hdr/errno_macros.h" +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr const MsgTable<4> STDC_ERRORS = { + MsgMapping(0, "Success"), + MsgMapping(EDOM, "Numerical argument out of domain"), + MsgMapping(ERANGE, "Numerical result out of range"), + MsgMapping(EILSEQ, "Invalid or incomplete multibyte or wide character"), +}; + +LIBC_INLINE_VAR constexpr const MsgTable<4> STDC_ERRNO_NAMES = { + MsgMapping(0, "0"), + MsgMapping(EDOM, "EDOM"), + MsgMapping(ERANGE, "ERANGE"), + MsgMapping(EILSEQ, "EILSEQ"), +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_STDC_ERRORS_H diff --git a/contrib/llvm-project/libc/src/__support/StringUtil/tables/stdc_signals.h b/contrib/llvm-project/libc/src/__support/StringUtil/tables/stdc_signals.h new file mode 100644 index 000000000000..094b59b4ba64 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/StringUtil/tables/stdc_signals.h @@ -0,0 +1,30 @@ +//===-- Map of C standard signal numbers to strings -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_STDC_SIGNALS_H +#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_STDC_SIGNALS_H + +#include <signal.h> // For signal numbers + +#include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE_VAR constexpr const MsgTable<6> STDC_SIGNALS = { + MsgMapping(SIGINT, "Interrupt"), + MsgMapping(SIGILL, "Illegal instruction"), + MsgMapping(SIGABRT, "Aborted"), + MsgMapping(SIGFPE, "Floating point exception"), + MsgMapping(SIGSEGV, "Segmentation fault"), + MsgMapping(SIGTERM, "Terminated"), +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_STDC_SIGNALS_H diff --git a/contrib/llvm-project/libc/src/__support/arg_list.h b/contrib/llvm-project/libc/src/__support/arg_list.h new file mode 100644 index 000000000000..66afa67e320b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/arg_list.h @@ -0,0 +1,140 @@ +//===-- Holder Class for manipulating va_lists ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_ARG_LIST_H +#define LLVM_LIBC_SRC___SUPPORT_ARG_LIST_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#include <stdarg.h> +#include <stddef.h> +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +template <typename V, typename A> +LIBC_INLINE constexpr V align_up(V val, A align) { + return ((val + V(align) - 1) / V(align)) * V(align); +} + +class ArgList { + va_list vlist; + +public: + LIBC_INLINE ArgList(va_list vlist) { va_copy(this->vlist, vlist); } + LIBC_INLINE ArgList(ArgList &other) { va_copy(this->vlist, other.vlist); } + LIBC_INLINE ~ArgList() { va_end(this->vlist); } + + LIBC_INLINE ArgList &operator=(ArgList &rhs) { + va_copy(vlist, rhs.vlist); + return *this; + } + + template <class T> LIBC_INLINE T next_var() { return va_arg(vlist, T); } +}; + +// Used for testing things that use an ArgList when it's impossible to know what +// the arguments should be ahead of time. An example of this would be fuzzing, +// since a function passed a random input could request unpredictable arguments. +class MockArgList { + size_t arg_counter = 0; + +public: + LIBC_INLINE MockArgList() = default; + LIBC_INLINE MockArgList(va_list) { ; } + LIBC_INLINE MockArgList(MockArgList &other) { + arg_counter = other.arg_counter; + } + LIBC_INLINE ~MockArgList() = default; + + LIBC_INLINE MockArgList &operator=(MockArgList &rhs) { + arg_counter = rhs.arg_counter; + return *this; + } + + template <class T> LIBC_INLINE T next_var() { + arg_counter++; + return T(arg_counter); + } + + size_t read_count() const { return arg_counter; } +}; + +// Used by the GPU implementation to parse how many bytes need to be read from +// the variadic argument buffer. +template <bool packed> class DummyArgList { + size_t arg_counter = 0; + +public: + LIBC_INLINE DummyArgList() = default; + LIBC_INLINE DummyArgList(va_list) { ; } + LIBC_INLINE DummyArgList(DummyArgList &other) { + arg_counter = other.arg_counter; + } + LIBC_INLINE ~DummyArgList() = default; + + LIBC_INLINE DummyArgList &operator=(DummyArgList &rhs) { + arg_counter = rhs.arg_counter; + return *this; + } + + template <class T> LIBC_INLINE T next_var() { + arg_counter = packed ? arg_counter + sizeof(T) + : align_up(arg_counter, alignof(T)) + sizeof(T); + return T(arg_counter); + } + + size_t read_count() const { return arg_counter; } +}; + +// Used for the GPU implementation of `printf`. This models a variadic list as a +// simple array of pointers that are built manually by the implementation. +template <bool packed> class StructArgList { + void *ptr; + void *end; + +public: + LIBC_INLINE StructArgList(void *ptr, size_t size) + : ptr(ptr), end(reinterpret_cast<unsigned char *>(ptr) + size) {} + LIBC_INLINE StructArgList(const StructArgList &other) { + ptr = other.ptr; + end = other.end; + } + LIBC_INLINE StructArgList() = default; + LIBC_INLINE ~StructArgList() = default; + + LIBC_INLINE StructArgList &operator=(const StructArgList &rhs) { + ptr = rhs.ptr; + return *this; + } + + LIBC_INLINE void *get_ptr() const { return ptr; } + + template <class T> LIBC_INLINE T next_var() { + if (!packed) + ptr = reinterpret_cast<void *>( + align_up(reinterpret_cast<uintptr_t>(ptr), alignof(T))); + if (ptr >= end) + return T(-1); + + // Memcpy because pointer alignment may be illegal given a packed struct. + T val; + __builtin_memcpy(&val, ptr, sizeof(T)); + + ptr = + reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(ptr) + sizeof(T)); + return val; + } +}; + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_ARG_LIST_H diff --git a/contrib/llvm-project/libc/src/__support/big_int.h b/contrib/llvm-project/libc/src/__support/big_int.h new file mode 100644 index 000000000000..85db31d01399 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/big_int.h @@ -0,0 +1,1391 @@ +//===-- A class to manipulate wide integers. --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_BIG_INT_H +#define LLVM_LIBC_SRC___SUPPORT_BIG_INT_H + +#include "src/__support/CPP/array.h" +#include "src/__support/CPP/bit.h" // countl_zero +#include "src/__support/CPP/limits.h" +#include "src/__support/CPP/optional.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY +#include "src/__support/macros/properties/compiler.h" // LIBC_COMPILER_IS_CLANG +#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128, LIBC_TYPES_HAS_INT64 +#include "src/__support/math_extras.h" // add_with_carry, sub_with_borrow +#include "src/__support/number_pair.h" + +#include <stddef.h> // For size_t +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { + +namespace multiword { + +// A type trait mapping unsigned integers to their half-width unsigned +// counterparts. +template <typename T> struct half_width; +template <> struct half_width<uint16_t> : cpp::type_identity<uint8_t> {}; +template <> struct half_width<uint32_t> : cpp::type_identity<uint16_t> {}; +#ifdef LIBC_TYPES_HAS_INT64 +template <> struct half_width<uint64_t> : cpp::type_identity<uint32_t> {}; +#ifdef LIBC_TYPES_HAS_INT128 +template <> struct half_width<__uint128_t> : cpp::type_identity<uint64_t> {}; +#endif // LIBC_TYPES_HAS_INT128 +#endif // LIBC_TYPES_HAS_INT64 +template <typename T> using half_width_t = typename half_width<T>::type; + +// An array of two elements that can be used in multiword operations. +template <typename T> struct DoubleWide final : cpp::array<T, 2> { + using UP = cpp::array<T, 2>; + using UP::UP; + LIBC_INLINE constexpr DoubleWide(T lo, T hi) : UP({lo, hi}) {} +}; + +// Converts an unsigned value into a DoubleWide<half_width_t<T>>. +template <typename T> LIBC_INLINE constexpr auto split(T value) { + static_assert(cpp::is_unsigned_v<T>); + using half_type = half_width_t<T>; + return DoubleWide<half_type>( + half_type(value), + half_type(value >> cpp::numeric_limits<half_type>::digits)); +} + +// The low part of a DoubleWide value. +template <typename T> LIBC_INLINE constexpr T lo(const DoubleWide<T> &value) { + return value[0]; +} +// The high part of a DoubleWide value. +template <typename T> LIBC_INLINE constexpr T hi(const DoubleWide<T> &value) { + return value[1]; +} +// The low part of an unsigned value. +template <typename T> LIBC_INLINE constexpr half_width_t<T> lo(T value) { + return lo(split(value)); +} +// The high part of an unsigned value. +template <typename T> LIBC_INLINE constexpr half_width_t<T> hi(T value) { + return hi(split(value)); +} + +// Returns 'a' times 'b' in a DoubleWide<word>. Cannot overflow by construction. +template <typename word> +LIBC_INLINE constexpr DoubleWide<word> mul2(word a, word b) { + if constexpr (cpp::is_same_v<word, uint8_t>) { + return split<uint16_t>(uint16_t(a) * uint16_t(b)); + } else if constexpr (cpp::is_same_v<word, uint16_t>) { + return split<uint32_t>(uint32_t(a) * uint32_t(b)); + } +#ifdef LIBC_TYPES_HAS_INT64 + else if constexpr (cpp::is_same_v<word, uint32_t>) { + return split<uint64_t>(uint64_t(a) * uint64_t(b)); + } +#endif +#ifdef LIBC_TYPES_HAS_INT128 + else if constexpr (cpp::is_same_v<word, uint64_t>) { + return split<__uint128_t>(__uint128_t(a) * __uint128_t(b)); + } +#endif + else { + using half_word = half_width_t<word>; + const auto shiftl = [](word value) -> word { + return value << cpp::numeric_limits<half_word>::digits; + }; + const auto shiftr = [](word value) -> word { + return value >> cpp::numeric_limits<half_word>::digits; + }; + // Here we do a one digit multiplication where 'a' and 'b' are of type + // word. We split 'a' and 'b' into half words and perform the classic long + // multiplication with 'a' and 'b' being two-digit numbers. + + // a a_hi a_lo + // x b => x b_hi b_lo + // ---- ----------- + // c result + // We convert 'lo' and 'hi' from 'half_word' to 'word' so multiplication + // doesn't overflow. + const word a_lo = lo(a); + const word b_lo = lo(b); + const word a_hi = hi(a); + const word b_hi = hi(b); + const word step1 = b_lo * a_lo; // no overflow; + const word step2 = b_lo * a_hi; // no overflow; + const word step3 = b_hi * a_lo; // no overflow; + const word step4 = b_hi * a_hi; // no overflow; + word lo_digit = step1; + word hi_digit = step4; + const word no_carry = 0; + word carry; + word _; // unused carry variable. + lo_digit = add_with_carry<word>(lo_digit, shiftl(step2), no_carry, carry); + hi_digit = add_with_carry<word>(hi_digit, shiftr(step2), carry, _); + lo_digit = add_with_carry<word>(lo_digit, shiftl(step3), no_carry, carry); + hi_digit = add_with_carry<word>(hi_digit, shiftr(step3), carry, _); + return DoubleWide<word>(lo_digit, hi_digit); + } +} + +// In-place 'dst op= rhs' with operation with carry propagation. Returns carry. +template <typename Function, typename word, size_t N, size_t M> +LIBC_INLINE constexpr word inplace_binop(Function op_with_carry, + cpp::array<word, N> &dst, + const cpp::array<word, M> &rhs) { + static_assert(N >= M); + word carry_out = 0; + for (size_t i = 0; i < N; ++i) { + const bool has_rhs_value = i < M; + const word rhs_value = has_rhs_value ? rhs[i] : 0; + const word carry_in = carry_out; + dst[i] = op_with_carry(dst[i], rhs_value, carry_in, carry_out); + // stop early when rhs is over and no carry is to be propagated. + if (!has_rhs_value && carry_out == 0) + break; + } + return carry_out; +} + +// In-place addition. Returns carry. +template <typename word, size_t N, size_t M> +LIBC_INLINE constexpr word add_with_carry(cpp::array<word, N> &dst, + const cpp::array<word, M> &rhs) { + return inplace_binop(LIBC_NAMESPACE::add_with_carry<word>, dst, rhs); +} + +// In-place subtraction. Returns borrow. +template <typename word, size_t N, size_t M> +LIBC_INLINE constexpr word sub_with_borrow(cpp::array<word, N> &dst, + const cpp::array<word, M> &rhs) { + return inplace_binop(LIBC_NAMESPACE::sub_with_borrow<word>, dst, rhs); +} + +// In-place multiply-add. Returns carry. +// i.e., 'dst += b * c' +template <typename word, size_t N> +LIBC_INLINE constexpr word mul_add_with_carry(cpp::array<word, N> &dst, word b, + word c) { + return add_with_carry(dst, mul2(b, c)); +} + +// An array of two elements serving as an accumulator during multiword +// computations. +template <typename T> struct Accumulator final : cpp::array<T, 2> { + using UP = cpp::array<T, 2>; + LIBC_INLINE constexpr Accumulator() : UP({0, 0}) {} + LIBC_INLINE constexpr T advance(T carry_in) { + auto result = UP::front(); + UP::front() = UP::back(); + UP::back() = carry_in; + return result; + } + LIBC_INLINE constexpr T sum() const { return UP::front(); } + LIBC_INLINE constexpr T carry() const { return UP::back(); } +}; + +// In-place multiplication by a single word. Returns carry. +template <typename word, size_t N> +LIBC_INLINE constexpr word scalar_multiply_with_carry(cpp::array<word, N> &dst, + word x) { + Accumulator<word> acc; + for (auto &val : dst) { + const word carry = mul_add_with_carry(acc, val, x); + val = acc.advance(carry); + } + return acc.carry(); +} + +// Multiplication of 'lhs' by 'rhs' into 'dst'. Returns carry. +// This function is safe to use for signed numbers. +// https://stackoverflow.com/a/20793834 +// https://pages.cs.wisc.edu/%7Emarkhill/cs354/Fall2008/beyond354/int.mult.html +template <typename word, size_t O, size_t M, size_t N> +LIBC_INLINE constexpr word multiply_with_carry(cpp::array<word, O> &dst, + const cpp::array<word, M> &lhs, + const cpp::array<word, N> &rhs) { + static_assert(O >= M + N); + Accumulator<word> acc; + for (size_t i = 0; i < O; ++i) { + const size_t lower_idx = i < N ? 0 : i - N + 1; + const size_t upper_idx = i < M ? i : M - 1; + word carry = 0; + for (size_t j = lower_idx; j <= upper_idx; ++j) + carry += mul_add_with_carry(acc, lhs[j], rhs[i - j]); + dst[i] = acc.advance(carry); + } + return acc.carry(); +} + +template <typename word, size_t N> +LIBC_INLINE constexpr void quick_mul_hi(cpp::array<word, N> &dst, + const cpp::array<word, N> &lhs, + const cpp::array<word, N> &rhs) { + Accumulator<word> acc; + word carry = 0; + // First round of accumulation for those at N - 1 in the full product. + for (size_t i = 0; i < N; ++i) + carry += mul_add_with_carry(acc, lhs[i], rhs[N - 1 - i]); + for (size_t i = N; i < 2 * N - 1; ++i) { + acc.advance(carry); + carry = 0; + for (size_t j = i - N + 1; j < N; ++j) + carry += mul_add_with_carry(acc, lhs[j], rhs[i - j]); + dst[i - N] = acc.sum(); + } + dst.back() = acc.carry(); +} + +template <typename word, size_t N> +LIBC_INLINE constexpr bool is_negative(const cpp::array<word, N> &array) { + using signed_word = cpp::make_signed_t<word>; + return cpp::bit_cast<signed_word>(array.back()) < 0; +} + +// An enum for the shift function below. +enum Direction { LEFT, RIGHT }; + +// A bitwise shift on an array of elements. +// 'offset' must be less than TOTAL_BITS (i.e., sizeof(word) * CHAR_BIT * N) +// otherwise the behavior is undefined. +template <Direction direction, bool is_signed, typename word, size_t N> +LIBC_INLINE constexpr cpp::array<word, N> shift(cpp::array<word, N> array, + size_t offset) { + static_assert(direction == LEFT || direction == RIGHT); + constexpr size_t WORD_BITS = cpp::numeric_limits<word>::digits; +#ifdef LIBC_TYPES_HAS_INT128 + constexpr size_t TOTAL_BITS = N * WORD_BITS; + if constexpr (TOTAL_BITS == 128) { + using type = cpp::conditional_t<is_signed, __int128_t, __uint128_t>; + auto tmp = cpp::bit_cast<type>(array); + if constexpr (direction == LEFT) + tmp <<= offset; + else + tmp >>= offset; + return cpp::bit_cast<cpp::array<word, N>>(tmp); + } +#endif + if (LIBC_UNLIKELY(offset == 0)) + return array; + const bool is_neg = is_signed && is_negative(array); + constexpr auto at = [](size_t index) -> int { + // reverse iteration when direction == LEFT. + if constexpr (direction == LEFT) + return int(N) - int(index) - 1; + return int(index); + }; + const auto safe_get_at = [&](size_t index) -> word { + // return appropriate value when accessing out of bound elements. + const int i = at(index); + if (i < 0) + return 0; + if (i >= int(N)) + return is_neg ? cpp::numeric_limits<word>::max() : 0; + return array[static_cast<unsigned>(i)]; + }; + const size_t index_offset = offset / WORD_BITS; + const size_t bit_offset = offset % WORD_BITS; +#ifdef LIBC_COMPILER_IS_CLANG + __builtin_assume(index_offset < N); +#endif + cpp::array<word, N> out = {}; + for (size_t index = 0; index < N; ++index) { + const word part1 = safe_get_at(index + index_offset); + const word part2 = safe_get_at(index + index_offset + 1); + word &dst = out[static_cast<unsigned>(at(index))]; + if (bit_offset == 0) + dst = part1; // no crosstalk between parts. + else if constexpr (direction == LEFT) + dst = static_cast<word>((part1 << bit_offset) | + (part2 >> (WORD_BITS - bit_offset))); + else + dst = static_cast<word>((part1 >> bit_offset) | + (part2 << (WORD_BITS - bit_offset))); + } + return out; +} + +#define DECLARE_COUNTBIT(NAME, INDEX_EXPR) \ + template <typename word, size_t N> \ + LIBC_INLINE constexpr int NAME(const cpp::array<word, N> &val) { \ + int bit_count = 0; \ + for (size_t i = 0; i < N; ++i) { \ + const int word_count = cpp::NAME<word>(val[INDEX_EXPR]); \ + bit_count += word_count; \ + if (word_count != cpp::numeric_limits<word>::digits) \ + break; \ + } \ + return bit_count; \ + } + +DECLARE_COUNTBIT(countr_zero, i) // iterating forward +DECLARE_COUNTBIT(countr_one, i) // iterating forward +DECLARE_COUNTBIT(countl_zero, N - i - 1) // iterating backward +DECLARE_COUNTBIT(countl_one, N - i - 1) // iterating backward + +} // namespace multiword + +template <size_t Bits, bool Signed, typename WordType = uint64_t> +struct BigInt { +private: + static_assert(cpp::is_integral_v<WordType> && cpp::is_unsigned_v<WordType>, + "WordType must be unsigned integer."); + + struct Division { + BigInt quotient; + BigInt remainder; + }; + +public: + using word_type = WordType; + using unsigned_type = BigInt<Bits, false, word_type>; + using signed_type = BigInt<Bits, true, word_type>; + + LIBC_INLINE_VAR static constexpr bool SIGNED = Signed; + LIBC_INLINE_VAR static constexpr size_t BITS = Bits; + LIBC_INLINE_VAR + static constexpr size_t WORD_SIZE = sizeof(WordType) * CHAR_BIT; + + static_assert(Bits > 0 && Bits % WORD_SIZE == 0, + "Number of bits in BigInt should be a multiple of WORD_SIZE."); + + LIBC_INLINE_VAR static constexpr size_t WORD_COUNT = Bits / WORD_SIZE; + + cpp::array<WordType, WORD_COUNT> val{}; // zero initialized. + + LIBC_INLINE constexpr BigInt() = default; + + LIBC_INLINE constexpr BigInt(const BigInt &other) = default; + + template <size_t OtherBits, bool OtherSigned, typename OtherWordType> + LIBC_INLINE constexpr BigInt( + const BigInt<OtherBits, OtherSigned, OtherWordType> &other) { + using BigIntOther = BigInt<OtherBits, OtherSigned, OtherWordType>; + const bool should_sign_extend = Signed && other.is_neg(); + + static_assert(!(Bits == OtherBits && WORD_SIZE != BigIntOther::WORD_SIZE) && + "This is currently untested for casting between bigints with " + "the same bit width but different word sizes."); + + if constexpr (BigIntOther::WORD_SIZE < WORD_SIZE) { + // OtherWordType is smaller + constexpr size_t WORD_SIZE_RATIO = WORD_SIZE / BigIntOther::WORD_SIZE; + static_assert( + (WORD_SIZE % BigIntOther::WORD_SIZE) == 0 && + "Word types must be multiples of each other for correct conversion."); + if constexpr (OtherBits >= Bits) { // truncate + // for each big word + for (size_t i = 0; i < WORD_COUNT; ++i) { + WordType cur_word = 0; + // combine WORD_SIZE_RATIO small words into a big word + for (size_t j = 0; j < WORD_SIZE_RATIO; ++j) + cur_word |= static_cast<WordType>(other[(i * WORD_SIZE_RATIO) + j]) + << (BigIntOther::WORD_SIZE * j); + + val[i] = cur_word; + } + } else { // zero or sign extend + size_t i = 0; + WordType cur_word = 0; + // for each small word + for (; i < BigIntOther::WORD_COUNT; ++i) { + // combine WORD_SIZE_RATIO small words into a big word + cur_word |= static_cast<WordType>(other[i]) + << (BigIntOther::WORD_SIZE * (i % WORD_SIZE_RATIO)); + // if we've completed a big word, copy it into place and reset + if ((i % WORD_SIZE_RATIO) == WORD_SIZE_RATIO - 1) { + val[i / WORD_SIZE_RATIO] = cur_word; + cur_word = 0; + } + } + // Pretend there are extra words of the correct sign extension as needed + + const WordType extension_bits = + should_sign_extend ? cpp::numeric_limits<WordType>::max() + : cpp::numeric_limits<WordType>::min(); + if ((i % WORD_SIZE_RATIO) != 0) { + cur_word |= static_cast<WordType>(extension_bits) + << (BigIntOther::WORD_SIZE * (i % WORD_SIZE_RATIO)); + } + // Copy the last word into place. + val[(i / WORD_SIZE_RATIO)] = cur_word; + extend((i / WORD_SIZE_RATIO) + 1, should_sign_extend); + } + } else if constexpr (BigIntOther::WORD_SIZE == WORD_SIZE) { + if constexpr (OtherBits >= Bits) { // truncate + for (size_t i = 0; i < WORD_COUNT; ++i) + val[i] = other[i]; + } else { // zero or sign extend + size_t i = 0; + for (; i < BigIntOther::WORD_COUNT; ++i) + val[i] = other[i]; + extend(i, should_sign_extend); + } + } else { + // OtherWordType is bigger. + constexpr size_t WORD_SIZE_RATIO = BigIntOther::WORD_SIZE / WORD_SIZE; + static_assert( + (BigIntOther::WORD_SIZE % WORD_SIZE) == 0 && + "Word types must be multiples of each other for correct conversion."); + if constexpr (OtherBits >= Bits) { // truncate + // for each small word + for (size_t i = 0; i < WORD_COUNT; ++i) { + // split each big word into WORD_SIZE_RATIO small words + val[i] = static_cast<WordType>(other[i / WORD_SIZE_RATIO] >> + ((i % WORD_SIZE_RATIO) * WORD_SIZE)); + } + } else { // zero or sign extend + size_t i = 0; + // for each big word + for (; i < BigIntOther::WORD_COUNT; ++i) { + // split each big word into WORD_SIZE_RATIO small words + for (size_t j = 0; j < WORD_SIZE_RATIO; ++j) + val[(i * WORD_SIZE_RATIO) + j] = + static_cast<WordType>(other[i] >> (j * WORD_SIZE)); + } + extend(i * WORD_SIZE_RATIO, should_sign_extend); + } + } + } + + // Construct a BigInt from a C array. + template <size_t N> LIBC_INLINE constexpr BigInt(const WordType (&nums)[N]) { + static_assert(N == WORD_COUNT); + for (size_t i = 0; i < WORD_COUNT; ++i) + val[i] = nums[i]; + } + + LIBC_INLINE constexpr explicit BigInt( + const cpp::array<WordType, WORD_COUNT> &words) { + val = words; + } + + // Initialize the first word to |v| and the rest to 0. + template <typename T, typename = cpp::enable_if_t<cpp::is_integral_v<T>>> + LIBC_INLINE constexpr BigInt(T v) { + constexpr size_t T_SIZE = sizeof(T) * CHAR_BIT; + const bool is_neg = v < 0; + for (size_t i = 0; i < WORD_COUNT; ++i) { + if (v == 0) { + extend(i, is_neg); + return; + } + val[i] = static_cast<WordType>(v); + if constexpr (T_SIZE > WORD_SIZE) + v >>= WORD_SIZE; + else + v = 0; + } + } + LIBC_INLINE constexpr BigInt &operator=(const BigInt &other) = default; + + // constants + LIBC_INLINE static constexpr BigInt zero() { return BigInt(); } + LIBC_INLINE static constexpr BigInt one() { return BigInt(1); } + LIBC_INLINE static constexpr BigInt all_ones() { return ~zero(); } + LIBC_INLINE static constexpr BigInt min() { + BigInt out; + if constexpr (SIGNED) + out.set_msb(); + return out; + } + LIBC_INLINE static constexpr BigInt max() { + BigInt out = all_ones(); + if constexpr (SIGNED) + out.clear_msb(); + return out; + } + + // TODO: Reuse the Sign type. + LIBC_INLINE constexpr bool is_neg() const { return SIGNED && get_msb(); } + + template <size_t OtherBits, bool OtherSigned, typename OtherWordType> + LIBC_INLINE constexpr explicit + operator BigInt<OtherBits, OtherSigned, OtherWordType>() const { + return BigInt<OtherBits, OtherSigned, OtherWordType>(this); + } + + template <typename T> LIBC_INLINE constexpr explicit operator T() const { + return to<T>(); + } + + template <typename T> + LIBC_INLINE constexpr cpp::enable_if_t< + cpp::is_integral_v<T> && !cpp::is_same_v<T, bool>, T> + to() const { + constexpr size_t T_SIZE = sizeof(T) * CHAR_BIT; + T lo = static_cast<T>(val[0]); + if constexpr (T_SIZE <= WORD_SIZE) + return lo; + constexpr size_t MAX_COUNT = + T_SIZE > Bits ? WORD_COUNT : T_SIZE / WORD_SIZE; + for (size_t i = 1; i < MAX_COUNT; ++i) + lo += static_cast<T>(static_cast<T>(val[i]) << (WORD_SIZE * i)); + if constexpr (Signed && (T_SIZE > Bits)) { + // Extend sign for negative numbers. + constexpr T MASK = (~T(0) << Bits); + if (is_neg()) + lo |= MASK; + } + return lo; + } + + LIBC_INLINE constexpr explicit operator bool() const { return !is_zero(); } + + LIBC_INLINE constexpr bool is_zero() const { + for (auto part : val) + if (part != 0) + return false; + return true; + } + + // Add 'rhs' to this number and store the result in this number. + // Returns the carry value produced by the addition operation. + LIBC_INLINE constexpr WordType add_overflow(const BigInt &rhs) { + return multiword::add_with_carry(val, rhs.val); + } + + LIBC_INLINE constexpr BigInt operator+(const BigInt &other) const { + BigInt result = *this; + result.add_overflow(other); + return result; + } + + // This will only apply when initializing a variable from constant values, so + // it will always use the constexpr version of add_with_carry. + LIBC_INLINE constexpr BigInt operator+(BigInt &&other) const { + // We use addition commutativity to reuse 'other' and prevent allocation. + other.add_overflow(*this); // Returned carry value is ignored. + return other; + } + + LIBC_INLINE constexpr BigInt &operator+=(const BigInt &other) { + add_overflow(other); // Returned carry value is ignored. + return *this; + } + + // Subtract 'rhs' to this number and store the result in this number. + // Returns the carry value produced by the subtraction operation. + LIBC_INLINE constexpr WordType sub_overflow(const BigInt &rhs) { + return multiword::sub_with_borrow(val, rhs.val); + } + + LIBC_INLINE constexpr BigInt operator-(const BigInt &other) const { + BigInt result = *this; + result.sub_overflow(other); // Returned carry value is ignored. + return result; + } + + LIBC_INLINE constexpr BigInt operator-(BigInt &&other) const { + BigInt result = *this; + result.sub_overflow(other); // Returned carry value is ignored. + return result; + } + + LIBC_INLINE constexpr BigInt &operator-=(const BigInt &other) { + // TODO(lntue): Set overflow flag / errno when carry is true. + sub_overflow(other); // Returned carry value is ignored. + return *this; + } + + // Multiply this number with x and store the result in this number. + LIBC_INLINE constexpr WordType mul(WordType x) { + return multiword::scalar_multiply_with_carry(val, x); + } + + // Return the full product. + template <size_t OtherBits> + LIBC_INLINE constexpr auto + ful_mul(const BigInt<OtherBits, Signed, WordType> &other) const { + BigInt<Bits + OtherBits, Signed, WordType> result; + multiword::multiply_with_carry(result.val, val, other.val); + return result; + } + + LIBC_INLINE constexpr BigInt operator*(const BigInt &other) const { + // Perform full mul and truncate. + return BigInt(ful_mul(other)); + } + + // Fast hi part of the full product. The normal product `operator*` returns + // `Bits` least significant bits of the full product, while this function will + // approximate `Bits` most significant bits of the full product with errors + // bounded by: + // 0 <= (a.full_mul(b) >> Bits) - a.quick_mul_hi(b)) <= WORD_COUNT - 1. + // + // An example usage of this is to quickly (but less accurately) compute the + // product of (normalized) mantissas of floating point numbers: + // (mant_1, mant_2) -> quick_mul_hi -> normalize leading bit + // is much more efficient than: + // (mant_1, mant_2) -> ful_mul -> normalize leading bit + // -> convert back to same Bits width by shifting/rounding, + // especially for higher precisions. + // + // Performance summary: + // Number of 64-bit x 64-bit -> 128-bit multiplications performed. + // Bits WORD_COUNT ful_mul quick_mul_hi Error bound + // 128 2 4 3 1 + // 196 3 9 6 2 + // 256 4 16 10 3 + // 512 8 64 36 7 + LIBC_INLINE constexpr BigInt quick_mul_hi(const BigInt &other) const { + BigInt result; + multiword::quick_mul_hi(result.val, val, other.val); + return result; + } + + // BigInt(x).pow_n(n) computes x ^ n. + // Note 0 ^ 0 == 1. + LIBC_INLINE constexpr void pow_n(uint64_t power) { + static_assert(!Signed); + BigInt result = one(); + BigInt cur_power = *this; + while (power > 0) { + if ((power % 2) > 0) + result *= cur_power; + power >>= 1; + cur_power *= cur_power; + } + *this = result; + } + + // Performs inplace signed / unsigned division. Returns remainder if not + // dividing by zero. + // For signed numbers it behaves like C++ signed integer division. + // That is by truncating the fractionnal part + // https://stackoverflow.com/a/3602857 + LIBC_INLINE constexpr cpp::optional<BigInt> div(const BigInt ÷r) { + if (LIBC_UNLIKELY(divider.is_zero())) + return cpp::nullopt; + if (LIBC_UNLIKELY(divider == BigInt::one())) + return BigInt::zero(); + Division result; + if constexpr (SIGNED) + result = divide_signed(*this, divider); + else + result = divide_unsigned(*this, divider); + *this = result.quotient; + return result.remainder; + } + + // Efficiently perform BigInt / (x * 2^e), where x is a half-word-size + // unsigned integer, and return the remainder. The main idea is as follow: + // Let q = y / (x * 2^e) be the quotient, and + // r = y % (x * 2^e) be the remainder. + // First, notice that: + // r % (2^e) = y % (2^e), + // so we just need to focus on all the bits of y that is >= 2^e. + // To speed up the shift-and-add steps, we only use x as the divisor, and + // performing 32-bit shiftings instead of bit-by-bit shiftings. + // Since the remainder of each division step < x < 2^(WORD_SIZE / 2), the + // computation of each step is now properly contained within WordType. + // And finally we perform some extra alignment steps for the remaining bits. + LIBC_INLINE constexpr cpp::optional<BigInt> + div_uint_half_times_pow_2(multiword::half_width_t<WordType> x, size_t e) { + BigInt remainder; + if (x == 0) + return cpp::nullopt; + if (e >= Bits) { + remainder = *this; + *this = BigInt<Bits, false, WordType>(); + return remainder; + } + BigInt quotient; + WordType x_word = static_cast<WordType>(x); + constexpr size_t LOG2_WORD_SIZE = + static_cast<size_t>(cpp::bit_width(WORD_SIZE) - 1); + constexpr size_t HALF_WORD_SIZE = WORD_SIZE >> 1; + constexpr WordType HALF_MASK = ((WordType(1) << HALF_WORD_SIZE) - 1); + // lower = smallest multiple of WORD_SIZE that is >= e. + size_t lower = ((e >> LOG2_WORD_SIZE) + ((e & (WORD_SIZE - 1)) != 0)) + << LOG2_WORD_SIZE; + // lower_pos is the index of the closest WORD_SIZE-bit chunk >= 2^e. + size_t lower_pos = lower / WORD_SIZE; + // Keep track of current remainder mod x * 2^(32*i) + WordType rem = 0; + // pos is the index of the current 64-bit chunk that we are processing. + size_t pos = WORD_COUNT; + + // TODO: look into if constexpr(Bits > 256) skip leading zeroes. + + for (size_t q_pos = WORD_COUNT - lower_pos; q_pos > 0; --q_pos) { + // q_pos is 1 + the index of the current WORD_SIZE-bit chunk of the + // quotient being processed. Performing the division / modulus with + // divisor: + // x * 2^(WORD_SIZE*q_pos - WORD_SIZE/2), + // i.e. using the upper (WORD_SIZE/2)-bit of the current WORD_SIZE-bit + // chunk. + rem <<= HALF_WORD_SIZE; + rem += val[--pos] >> HALF_WORD_SIZE; + WordType q_tmp = rem / x_word; + rem %= x_word; + + // Performing the division / modulus with divisor: + // x * 2^(WORD_SIZE*(q_pos - 1)), + // i.e. using the lower (WORD_SIZE/2)-bit of the current WORD_SIZE-bit + // chunk. + rem <<= HALF_WORD_SIZE; + rem += val[pos] & HALF_MASK; + quotient.val[q_pos - 1] = (q_tmp << HALF_WORD_SIZE) + rem / x_word; + rem %= x_word; + } + + // So far, what we have is: + // quotient = y / (x * 2^lower), and + // rem = (y % (x * 2^lower)) / 2^lower. + // If (lower > e), we will need to perform an extra adjustment of the + // quotient and remainder, namely: + // y / (x * 2^e) = [ y / (x * 2^lower) ] * 2^(lower - e) + + // + (rem * 2^(lower - e)) / x + // (y % (x * 2^e)) / 2^e = (rem * 2^(lower - e)) % x + size_t last_shift = lower - e; + + if (last_shift > 0) { + // quotient * 2^(lower - e) + quotient <<= last_shift; + WordType q_tmp = 0; + WordType d = val[--pos]; + if (last_shift >= HALF_WORD_SIZE) { + // The shifting (rem * 2^(lower - e)) might overflow WordTyoe, so we + // perform a HALF_WORD_SIZE-bit shift first. + rem <<= HALF_WORD_SIZE; + rem += d >> HALF_WORD_SIZE; + d &= HALF_MASK; + q_tmp = rem / x_word; + rem %= x_word; + last_shift -= HALF_WORD_SIZE; + } else { + // Only use the upper HALF_WORD_SIZE-bit of the current WORD_SIZE-bit + // chunk. + d >>= HALF_WORD_SIZE; + } + + if (last_shift > 0) { + rem <<= HALF_WORD_SIZE; + rem += d; + q_tmp <<= last_shift; + x_word <<= HALF_WORD_SIZE - last_shift; + q_tmp += rem / x_word; + rem %= x_word; + } + + quotient.val[0] += q_tmp; + + if (lower - e <= HALF_WORD_SIZE) { + // The remainder rem * 2^(lower - e) might overflow to the higher + // WORD_SIZE-bit chunk. + if (pos < WORD_COUNT - 1) { + remainder[pos + 1] = rem >> HALF_WORD_SIZE; + } + remainder[pos] = (rem << HALF_WORD_SIZE) + (val[pos] & HALF_MASK); + } else { + remainder[pos] = rem; + } + + } else { + remainder[pos] = rem; + } + + // Set the remaining lower bits of the remainder. + for (; pos > 0; --pos) { + remainder[pos - 1] = val[pos - 1]; + } + + *this = quotient; + return remainder; + } + + LIBC_INLINE constexpr BigInt operator/(const BigInt &other) const { + BigInt result(*this); + result.div(other); + return result; + } + + LIBC_INLINE constexpr BigInt &operator/=(const BigInt &other) { + div(other); + return *this; + } + + LIBC_INLINE constexpr BigInt operator%(const BigInt &other) const { + BigInt result(*this); + return *result.div(other); + } + + LIBC_INLINE constexpr BigInt operator%=(const BigInt &other) { + *this = *this % other; + return *this; + } + + LIBC_INLINE constexpr BigInt &operator*=(const BigInt &other) { + *this = *this * other; + return *this; + } + + LIBC_INLINE constexpr BigInt &operator<<=(size_t s) { + val = multiword::shift<multiword::LEFT, SIGNED>(val, s); + return *this; + } + + LIBC_INLINE constexpr BigInt operator<<(size_t s) const { + return BigInt(multiword::shift<multiword::LEFT, SIGNED>(val, s)); + } + + LIBC_INLINE constexpr BigInt &operator>>=(size_t s) { + val = multiword::shift<multiword::RIGHT, SIGNED>(val, s); + return *this; + } + + LIBC_INLINE constexpr BigInt operator>>(size_t s) const { + return BigInt(multiword::shift<multiword::RIGHT, SIGNED>(val, s)); + } + +#define DEFINE_BINOP(OP) \ + LIBC_INLINE friend constexpr BigInt operator OP(const BigInt &lhs, \ + const BigInt &rhs) { \ + BigInt result; \ + for (size_t i = 0; i < WORD_COUNT; ++i) \ + result[i] = lhs[i] OP rhs[i]; \ + return result; \ + } \ + LIBC_INLINE friend constexpr BigInt operator OP##=(BigInt &lhs, \ + const BigInt &rhs) { \ + for (size_t i = 0; i < WORD_COUNT; ++i) \ + lhs[i] OP## = rhs[i]; \ + return lhs; \ + } + + DEFINE_BINOP(&) // & and &= + DEFINE_BINOP(|) // | and |= + DEFINE_BINOP(^) // ^ and ^= +#undef DEFINE_BINOP + + LIBC_INLINE constexpr BigInt operator~() const { + BigInt result; + for (size_t i = 0; i < WORD_COUNT; ++i) + result[i] = static_cast<WordType>(~val[i]); + return result; + } + + LIBC_INLINE constexpr BigInt operator-() const { + BigInt result(*this); + result.negate(); + return result; + } + + LIBC_INLINE friend constexpr bool operator==(const BigInt &lhs, + const BigInt &rhs) { + for (size_t i = 0; i < WORD_COUNT; ++i) + if (lhs.val[i] != rhs.val[i]) + return false; + return true; + } + + LIBC_INLINE friend constexpr bool operator!=(const BigInt &lhs, + const BigInt &rhs) { + return !(lhs == rhs); + } + + LIBC_INLINE friend constexpr bool operator>(const BigInt &lhs, + const BigInt &rhs) { + return cmp(lhs, rhs) > 0; + } + LIBC_INLINE friend constexpr bool operator>=(const BigInt &lhs, + const BigInt &rhs) { + return cmp(lhs, rhs) >= 0; + } + LIBC_INLINE friend constexpr bool operator<(const BigInt &lhs, + const BigInt &rhs) { + return cmp(lhs, rhs) < 0; + } + LIBC_INLINE friend constexpr bool operator<=(const BigInt &lhs, + const BigInt &rhs) { + return cmp(lhs, rhs) <= 0; + } + + LIBC_INLINE constexpr BigInt &operator++() { + increment(); + return *this; + } + + LIBC_INLINE constexpr BigInt operator++(int) { + BigInt oldval(*this); + increment(); + return oldval; + } + + LIBC_INLINE constexpr BigInt &operator--() { + decrement(); + return *this; + } + + LIBC_INLINE constexpr BigInt operator--(int) { + BigInt oldval(*this); + decrement(); + return oldval; + } + + // Return the i-th word of the number. + LIBC_INLINE constexpr const WordType &operator[](size_t i) const { + return val[i]; + } + + // Return the i-th word of the number. + LIBC_INLINE constexpr WordType &operator[](size_t i) { return val[i]; } + + // Return the i-th bit of the number. + LIBC_INLINE constexpr bool get_bit(size_t i) const { + const size_t word_index = i / WORD_SIZE; + return 1 & (val[word_index] >> (i % WORD_SIZE)); + } + + // Set the i-th bit of the number. + LIBC_INLINE constexpr void set_bit(size_t i) { + const size_t word_index = i / WORD_SIZE; + val[word_index] |= WordType(1) << (i % WORD_SIZE); + } + +private: + LIBC_INLINE friend constexpr int cmp(const BigInt &lhs, const BigInt &rhs) { + constexpr auto compare = [](WordType a, WordType b) { + return a == b ? 0 : a > b ? 1 : -1; + }; + if constexpr (Signed) { + const bool lhs_is_neg = lhs.is_neg(); + const bool rhs_is_neg = rhs.is_neg(); + if (lhs_is_neg != rhs_is_neg) + return rhs_is_neg ? 1 : -1; + } + for (size_t i = WORD_COUNT; i-- > 0;) + if (auto cmp = compare(lhs[i], rhs[i]); cmp != 0) + return cmp; + return 0; + } + + LIBC_INLINE constexpr void bitwise_not() { + for (auto &part : val) + part = static_cast<WordType>(~part); + } + + LIBC_INLINE constexpr void negate() { + bitwise_not(); + increment(); + } + + LIBC_INLINE constexpr void increment() { + multiword::add_with_carry(val, cpp::array<WordType, 1>{1}); + } + + LIBC_INLINE constexpr void decrement() { + multiword::sub_with_borrow(val, cpp::array<WordType, 1>{1}); + } + + LIBC_INLINE constexpr void extend(size_t index, bool is_neg) { + const WordType value = is_neg ? cpp::numeric_limits<WordType>::max() + : cpp::numeric_limits<WordType>::min(); + for (size_t i = index; i < WORD_COUNT; ++i) + val[i] = value; + } + + LIBC_INLINE constexpr bool get_msb() const { + return val.back() >> (WORD_SIZE - 1); + } + + LIBC_INLINE constexpr void set_msb() { + val.back() |= mask_leading_ones<WordType, 1>(); + } + + LIBC_INLINE constexpr void clear_msb() { + val.back() &= mask_trailing_ones<WordType, WORD_SIZE - 1>(); + } + LIBC_INLINE constexpr static Division divide_unsigned(const BigInt ÷nd, + const BigInt ÷r) { + BigInt remainder = dividend; + BigInt quotient; + if (remainder >= divider) { + BigInt subtractor = divider; + int cur_bit = multiword::countl_zero(subtractor.val) - + multiword::countl_zero(remainder.val); + subtractor <<= static_cast<size_t>(cur_bit); + for (; cur_bit >= 0 && remainder > 0; --cur_bit, subtractor >>= 1) { + if (remainder < subtractor) + continue; + remainder -= subtractor; + quotient.set_bit(static_cast<size_t>(cur_bit)); + } + } + return Division{quotient, remainder}; + } + + LIBC_INLINE constexpr static Division divide_signed(const BigInt ÷nd, + const BigInt ÷r) { + // Special case because it is not possible to negate the min value of a + // signed integer. + if (dividend == min() && divider == min()) + return Division{one(), zero()}; + // 1. Convert the dividend and divisor to unsigned representation. + unsigned_type udividend(dividend); + unsigned_type udivider(divider); + // 2. Negate the dividend if it's negative, and similarly for the divisor. + const bool dividend_is_neg = dividend.is_neg(); + const bool divider_is_neg = divider.is_neg(); + if (dividend_is_neg) + udividend.negate(); + if (divider_is_neg) + udivider.negate(); + // 3. Use unsigned multiword division algorithm. + const auto unsigned_result = divide_unsigned(udividend, udivider); + // 4. Convert the quotient and remainder to signed representation. + Division result; + result.quotient = signed_type(unsigned_result.quotient); + result.remainder = signed_type(unsigned_result.remainder); + // 5. Negate the quotient if the dividend and divisor had opposite signs. + if (dividend_is_neg != divider_is_neg) + result.quotient.negate(); + // 6. Negate the remainder if the dividend was negative. + if (dividend_is_neg) + result.remainder.negate(); + return result; + } + + friend signed_type; + friend unsigned_type; +}; + +namespace internal { +// We default BigInt's WordType to 'uint64_t' or 'uint32_t' depending on type +// availability. +template <size_t Bits> +struct WordTypeSelector : cpp::type_identity< +#ifdef LIBC_TYPES_HAS_INT64 + uint64_t +#else + uint32_t +#endif // LIBC_TYPES_HAS_INT64 + > { +}; +// Except if we request 16 or 32 bits explicitly. +template <> struct WordTypeSelector<16> : cpp::type_identity<uint16_t> {}; +template <> struct WordTypeSelector<32> : cpp::type_identity<uint32_t> {}; +template <> struct WordTypeSelector<96> : cpp::type_identity<uint32_t> {}; + +template <size_t Bits> +using WordTypeSelectorT = typename WordTypeSelector<Bits>::type; +} // namespace internal + +template <size_t Bits> +using UInt = BigInt<Bits, false, internal::WordTypeSelectorT<Bits>>; + +template <size_t Bits> +using Int = BigInt<Bits, true, internal::WordTypeSelectorT<Bits>>; + +// Provides limits of BigInt. +template <size_t Bits, bool Signed, typename T> +struct cpp::numeric_limits<BigInt<Bits, Signed, T>> { + LIBC_INLINE static constexpr BigInt<Bits, Signed, T> max() { + return BigInt<Bits, Signed, T>::max(); + } + LIBC_INLINE static constexpr BigInt<Bits, Signed, T> min() { + return BigInt<Bits, Signed, T>::min(); + } + // Meant to match std::numeric_limits interface. + // NOLINTNEXTLINE(readability-identifier-naming) + LIBC_INLINE_VAR static constexpr int digits = Bits - Signed; +}; + +// type traits to determine whether a T is a BigInt. +template <typename T> struct is_big_int : cpp::false_type {}; + +template <size_t Bits, bool Signed, typename T> +struct is_big_int<BigInt<Bits, Signed, T>> : cpp::true_type {}; + +template <class T> +LIBC_INLINE_VAR constexpr bool is_big_int_v = is_big_int<T>::value; + +// extensions of type traits to include BigInt + +// is_integral_or_big_int +template <typename T> +struct is_integral_or_big_int + : cpp::bool_constant<(cpp::is_integral_v<T> || is_big_int_v<T>)> {}; + +template <typename T> +LIBC_INLINE_VAR constexpr bool is_integral_or_big_int_v = + is_integral_or_big_int<T>::value; + +// make_big_int_unsigned +template <typename T> struct make_big_int_unsigned; + +template <size_t Bits, bool Signed, typename T> +struct make_big_int_unsigned<BigInt<Bits, Signed, T>> + : cpp::type_identity<BigInt<Bits, false, T>> {}; + +template <typename T> +using make_big_int_unsigned_t = typename make_big_int_unsigned<T>::type; + +// make_big_int_signed +template <typename T> struct make_big_int_signed; + +template <size_t Bits, bool Signed, typename T> +struct make_big_int_signed<BigInt<Bits, Signed, T>> + : cpp::type_identity<BigInt<Bits, true, T>> {}; + +template <typename T> +using make_big_int_signed_t = typename make_big_int_signed<T>::type; + +// make_integral_or_big_int_unsigned +template <typename T, class = void> struct make_integral_or_big_int_unsigned; + +template <typename T> +struct make_integral_or_big_int_unsigned< + T, cpp::enable_if_t<cpp::is_integral_v<T>>> : cpp::make_unsigned<T> {}; + +template <typename T> +struct make_integral_or_big_int_unsigned<T, cpp::enable_if_t<is_big_int_v<T>>> + : make_big_int_unsigned<T> {}; + +template <typename T> +using make_integral_or_big_int_unsigned_t = + typename make_integral_or_big_int_unsigned<T>::type; + +// make_integral_or_big_int_signed +template <typename T, class = void> struct make_integral_or_big_int_signed; + +template <typename T> +struct make_integral_or_big_int_signed<T, + cpp::enable_if_t<cpp::is_integral_v<T>>> + : cpp::make_signed<T> {}; + +template <typename T> +struct make_integral_or_big_int_signed<T, cpp::enable_if_t<is_big_int_v<T>>> + : make_big_int_signed<T> {}; + +template <typename T> +using make_integral_or_big_int_signed_t = + typename make_integral_or_big_int_signed<T>::type; + +// is_unsigned_integral_or_big_int +template <typename T> +struct is_unsigned_integral_or_big_int + : cpp::bool_constant< + cpp::is_same_v<T, make_integral_or_big_int_unsigned_t<T>>> {}; + +template <typename T> +// Meant to look like <type_traits> helper variable templates. +// NOLINTNEXTLINE(readability-identifier-naming) +LIBC_INLINE_VAR constexpr bool is_unsigned_integral_or_big_int_v = + is_unsigned_integral_or_big_int<T>::value; + +namespace cpp { + +// Specialization of cpp::bit_cast ('bit.h') from T to BigInt. +template <typename To, typename From> +LIBC_INLINE constexpr cpp::enable_if_t< + (sizeof(To) == sizeof(From)) && cpp::is_trivially_copyable<To>::value && + cpp::is_trivially_copyable<From>::value && is_big_int<To>::value, + To> +bit_cast(const From &from) { + To out; + using Storage = decltype(out.val); + out.val = cpp::bit_cast<Storage>(from); + return out; +} + +// Specialization of cpp::bit_cast ('bit.h') from BigInt to T. +template <typename To, size_t Bits> +LIBC_INLINE constexpr cpp::enable_if_t< + sizeof(To) == sizeof(UInt<Bits>) && + cpp::is_trivially_constructible<To>::value && + cpp::is_trivially_copyable<To>::value && + cpp::is_trivially_copyable<UInt<Bits>>::value, + To> +bit_cast(const UInt<Bits> &from) { + return cpp::bit_cast<To>(from.val); +} + +// Specialization of cpp::popcount ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +popcount(T value) { + int bits = 0; + for (auto word : value.val) + if (word) + bits += popcount(word); + return bits; +} + +// Specialization of cpp::has_single_bit ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, bool> +has_single_bit(T value) { + int bits = 0; + for (auto word : value.val) { + if (word == 0) + continue; + bits += popcount(word); + if (bits > 1) + return false; + } + return bits == 1; +} + +// Specialization of cpp::countr_zero ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +countr_zero(const T &value) { + return multiword::countr_zero(value.val); +} + +// Specialization of cpp::countl_zero ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +countl_zero(const T &value) { + return multiword::countl_zero(value.val); +} + +// Specialization of cpp::countl_one ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +countl_one(T value) { + return multiword::countl_one(value.val); +} + +// Specialization of cpp::countr_one ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +countr_one(T value) { + return multiword::countr_one(value.val); +} + +// Specialization of cpp::bit_width ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +bit_width(T value) { + return cpp::numeric_limits<T>::digits - cpp::countl_zero(value); +} + +// Forward-declare rotr so that rotl can use it. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> +rotr(T value, int rotate); + +// Specialization of cpp::rotl ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> +rotl(T value, int rotate) { + constexpr int N = cpp::numeric_limits<T>::digits; + rotate = rotate % N; + if (!rotate) + return value; + if (rotate < 0) + return cpp::rotr<T>(value, -rotate); + return (value << static_cast<size_t>(rotate)) | + (value >> (N - static_cast<size_t>(rotate))); +} + +// Specialization of cpp::rotr ('bit.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> +rotr(T value, int rotate) { + constexpr int N = cpp::numeric_limits<T>::digits; + rotate = rotate % N; + if (!rotate) + return value; + if (rotate < 0) + return cpp::rotl<T>(value, -rotate); + return (value >> static_cast<size_t>(rotate)) | + (value << (N - static_cast<size_t>(rotate))); +} + +} // namespace cpp + +// Specialization of mask_trailing_ones ('math_extras.h') for BigInt. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> +mask_trailing_ones() { + static_assert(!T::SIGNED && count <= T::BITS); + if (count == T::BITS) + return T::all_ones(); + constexpr size_t QUOTIENT = count / T::WORD_SIZE; + constexpr size_t REMAINDER = count % T::WORD_SIZE; + T out; // zero initialized + for (size_t i = 0; i <= QUOTIENT; ++i) + out[i] = i < QUOTIENT + ? cpp::numeric_limits<typename T::word_type>::max() + : mask_trailing_ones<typename T::word_type, REMAINDER>(); + return out; +} + +// Specialization of mask_leading_ones ('math_extras.h') for BigInt. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> mask_leading_ones() { + static_assert(!T::SIGNED && count <= T::BITS); + if (count == T::BITS) + return T::all_ones(); + constexpr size_t QUOTIENT = (T::BITS - count - 1U) / T::WORD_SIZE; + constexpr size_t REMAINDER = count % T::WORD_SIZE; + T out; // zero initialized + for (size_t i = QUOTIENT; i < T::WORD_COUNT; ++i) + out[i] = i > QUOTIENT + ? cpp::numeric_limits<typename T::word_type>::max() + : mask_leading_ones<typename T::word_type, REMAINDER>(); + return out; +} + +// Specialization of mask_trailing_zeros ('math_extras.h') for BigInt. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> +mask_trailing_zeros() { + return mask_leading_ones<T, T::BITS - count>(); +} + +// Specialization of mask_leading_zeros ('math_extras.h') for BigInt. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> +mask_leading_zeros() { + return mask_trailing_ones<T, T::BITS - count>(); +} + +// Specialization of count_zeros ('math_extras.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +count_zeros(T value) { + return cpp::popcount(~value); +} + +// Specialization of first_leading_zero ('math_extras.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +first_leading_zero(T value) { + return value == cpp::numeric_limits<T>::max() ? 0 + : cpp::countl_one(value) + 1; +} + +// Specialization of first_leading_one ('math_extras.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +first_leading_one(T value) { + return first_leading_zero(~value); +} + +// Specialization of first_trailing_zero ('math_extras.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +first_trailing_zero(T value) { + return value == cpp::numeric_limits<T>::max() ? 0 + : cpp::countr_zero(~value) + 1; +} + +// Specialization of first_trailing_one ('math_extras.h') for BigInt. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int> +first_trailing_one(T value) { + return value == 0 ? 0 : cpp::countr_zero(value) + 1; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_BIG_INT_H diff --git a/contrib/llvm-project/libc/src/__support/block.h b/contrib/llvm-project/libc/src/__support/block.h new file mode 100644 index 000000000000..a58c38bbb7ac --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/block.h @@ -0,0 +1,482 @@ +//===-- Implementation header for a block of memory -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_BLOCK_H +#define LLVM_LIBC_SRC___SUPPORT_BLOCK_H + +#include "src/__support/CPP/algorithm.h" +#include "src/__support/CPP/cstddef.h" +#include "src/__support/CPP/limits.h" +#include "src/__support/CPP/new.h" +#include "src/__support/CPP/optional.h" +#include "src/__support/CPP/span.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/libc_assert.h" +#include "src/__support/macros/config.h" +#include "src/__support/math_extras.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { + +/// Returns the value rounded down to the nearest multiple of alignment. +LIBC_INLINE constexpr size_t align_down(size_t value, size_t alignment) { + // Note this shouldn't overflow since the result will always be <= value. + return (value / alignment) * alignment; +} + +/// Returns the value rounded up to the nearest multiple of alignment. May wrap +/// around. +LIBC_INLINE constexpr size_t align_up(size_t value, size_t alignment) { + return align_down(value + alignment - 1, alignment); +} + +using ByteSpan = cpp::span<LIBC_NAMESPACE::cpp::byte>; +using cpp::optional; + +/// Memory region with links to adjacent blocks. +/// +/// The blocks store their offsets to the previous and next blocks. The latter +/// is also the block's size. +/// +/// All blocks have their usable space aligned to some multiple of max_align_t. +/// This also implies that block outer sizes are aligned to max_align_t. +/// +/// As an example, the diagram below represents two contiguous `Block`s. The +/// indices indicate byte offsets: +/// +/// @code{.unparsed} +/// Block 1: +/// +---------------------+--------------+ +/// | Header | Usable space | +/// +----------+----------+--------------+ +/// | prev | next | | +/// | 0......3 | 4......7 | 8........227 | +/// | 00000000 | 00000230 | <app data> | +/// +----------+----------+--------------+ +/// Block 2: +/// +---------------------+--------------+ +/// | Header | Usable space | +/// +----------+----------+--------------+ +/// | prev | next | | +/// | 0......3 | 4......7 | 8........827 | +/// | 00000230 | 00000830 | f7f7....f7f7 | +/// +----------+----------+--------------+ +/// @endcode +/// +/// As a space optimization, when a block is allocated, it consumes the prev +/// field of the following block: +/// +/// Block 1 (used): +/// +---------------------+--------------+ +/// | Header | Usable space | +/// +----------+----------+--------------+ +/// | prev | next | | +/// | 0......3 | 4......7 | 8........230 | +/// | 00000000 | 00000230 | <app data> | +/// +----------+----------+--------------+ +/// Block 2: +/// +---------------------+--------------+ +/// | B1 | Header | Usable space | +/// +----------+----------+--------------+ +/// | | next | | +/// | 0......3 | 4......7 | 8........827 | +/// | xxxxxxxx | 00000830 | f7f7....f7f7 | +/// +----------+----------+--------------+ +/// +/// The next offset of a block matches the previous offset of its next block. +/// The first block in a list is denoted by having a previous offset of `0`. +class Block { + // Masks for the contents of the next_ field. + static constexpr size_t PREV_FREE_MASK = 1 << 0; + static constexpr size_t LAST_MASK = 1 << 1; + static constexpr size_t SIZE_MASK = ~(PREV_FREE_MASK | LAST_MASK); + +public: + // No copy or move. + Block(const Block &other) = delete; + Block &operator=(const Block &other) = delete; + + /// Initializes a given memory region into a first block and a sentinel last + /// block. Returns the first block, which has its usable space aligned to + /// max_align_t. + static optional<Block *> init(ByteSpan region); + + /// @returns A pointer to a `Block`, given a pointer to the start of the + /// usable space inside the block. + /// + /// This is the inverse of `usable_space()`. + /// + /// @warning This method does not do any checking; passing a random + /// pointer will return a non-null pointer. + LIBC_INLINE static Block *from_usable_space(void *usable_space) { + auto *bytes = reinterpret_cast<cpp::byte *>(usable_space); + return reinterpret_cast<Block *>(bytes - sizeof(Block)); + } + LIBC_INLINE static const Block *from_usable_space(const void *usable_space) { + const auto *bytes = reinterpret_cast<const cpp::byte *>(usable_space); + return reinterpret_cast<const Block *>(bytes - sizeof(Block)); + } + + /// @returns The total size of the block in bytes, including the header. + LIBC_INLINE size_t outer_size() const { return next_ & SIZE_MASK; } + + LIBC_INLINE static size_t outer_size(size_t inner_size) { + // The usable region includes the prev_ field of the next block. + return inner_size - sizeof(prev_) + sizeof(Block); + } + + /// @returns The number of usable bytes inside the block were it to be + /// allocated. + LIBC_INLINE size_t inner_size() const { + if (!next()) + return 0; + return inner_size(outer_size()); + } + + /// @returns The number of usable bytes inside a block with the given outer + /// size were it to be allocated. + LIBC_INLINE static size_t inner_size(size_t outer_size) { + // The usable region includes the prev_ field of the next block. + return inner_size_free(outer_size) + sizeof(prev_); + } + + /// @returns The number of usable bytes inside the block if it remains free. + LIBC_INLINE size_t inner_size_free() const { + if (!next()) + return 0; + return inner_size_free(outer_size()); + } + + /// @returns The number of usable bytes inside a block with the given outer + /// size if it remains free. + LIBC_INLINE static size_t inner_size_free(size_t outer_size) { + return outer_size - sizeof(Block); + } + + /// @returns A pointer to the usable space inside this block. + /// + /// Aligned to some multiple of max_align_t. + LIBC_INLINE cpp::byte *usable_space() { + auto *s = reinterpret_cast<cpp::byte *>(this) + sizeof(Block); + LIBC_ASSERT(reinterpret_cast<uintptr_t>(s) % alignof(max_align_t) == 0 && + "usable space must be aligned to a multiple of max_align_t"); + return s; + } + LIBC_INLINE const cpp::byte *usable_space() const { + const auto *s = reinterpret_cast<const cpp::byte *>(this) + sizeof(Block); + LIBC_ASSERT(reinterpret_cast<uintptr_t>(s) % alignof(max_align_t) == 0 && + "usable space must be aligned to a multiple of max_align_t"); + return s; + } + + // @returns The region of memory the block manages, including the header. + LIBC_INLINE ByteSpan region() { + return {reinterpret_cast<cpp::byte *>(this), outer_size()}; + } + + /// Attempts to split this block. + /// + /// If successful, the block will have an inner size of at least + /// `new_inner_size`. The remaining space will be returned as a new block, + /// with usable space aligned to `usable_space_alignment`. Note that the prev_ + /// field of the next block counts as part of the inner size of the block. + /// `usable_space_alignment` must be a multiple of max_align_t. + optional<Block *> split(size_t new_inner_size, + size_t usable_space_alignment = alignof(max_align_t)); + + /// Merges this block with the one that comes after it. + bool merge_next(); + + /// @returns The block immediately after this one, or a null pointer if this + /// is the last block. + LIBC_INLINE Block *next() const { + if (next_ & LAST_MASK) + return nullptr; + return reinterpret_cast<Block *>(reinterpret_cast<uintptr_t>(this) + + outer_size()); + } + + /// @returns The free block immediately before this one, otherwise nullptr. + LIBC_INLINE Block *prev_free() const { + if (!(next_ & PREV_FREE_MASK)) + return nullptr; + return reinterpret_cast<Block *>(reinterpret_cast<uintptr_t>(this) - prev_); + } + + /// @returns Whether the block is unavailable for allocation. + LIBC_INLINE bool used() const { return !next() || !next()->prev_free(); } + + /// Marks this block as in use. + LIBC_INLINE void mark_used() { + LIBC_ASSERT(next() && "last block is always considered used"); + next()->next_ &= ~PREV_FREE_MASK; + } + + /// Marks this block as free. + LIBC_INLINE void mark_free() { + LIBC_ASSERT(next() && "last block is always considered used"); + next()->next_ |= PREV_FREE_MASK; + // The next block's prev_ field becomes alive, as it is no longer part of + // this block's used space. + *new (&next()->prev_) size_t = outer_size(); + } + + LIBC_INLINE Block(size_t outer_size, bool is_last) : next_(outer_size) { + // Last blocks are not usable, so they need not have sizes aligned to + // max_align_t. Their lower bits must still be free, so they must be aligned + // to Block. + LIBC_ASSERT( + outer_size % (is_last ? alignof(Block) : alignof(max_align_t)) == 0 && + "block sizes must be aligned"); + LIBC_ASSERT(is_usable_space_aligned(alignof(max_align_t)) && + "usable space must be aligned to a multiple of max_align_t"); + if (is_last) + next_ |= LAST_MASK; + } + + LIBC_INLINE bool is_usable_space_aligned(size_t alignment) const { + return reinterpret_cast<uintptr_t>(usable_space()) % alignment == 0; + } + + // Returns the minimum inner size necessary for a block of that size to + // always be able to allocate at the given size and alignment. + // + // Returns 0 if there is no such size. + LIBC_INLINE static size_t min_size_for_allocation(size_t alignment, + size_t size) { + LIBC_ASSERT(alignment >= alignof(max_align_t) && + alignment % alignof(max_align_t) == 0 && + "alignment must be multiple of max_align_t"); + + if (alignment == alignof(max_align_t)) + return size; + + // We must create a new block inside this one (splitting). This requires a + // block header in addition to the requested size. + if (add_overflow(size, sizeof(Block), size)) + return 0; + + // Beyond that, padding space may need to remain in this block to ensure + // that the usable space of the next block is aligned. + // + // Consider a position P of some lesser alignment, L, with maximal distance + // to the next position of some greater alignment, G, where G is a multiple + // of L. P must be one L unit past a G-aligned point. If it were one L-unit + // earlier, its distance would be zero. If it were one L-unit later, its + // distance would not be maximal. If it were not some integral number of L + // units away, it would not be L-aligned. + // + // So the maximum distance would be G - L. As a special case, if L is 1 + // (unaligned), the max distance is G - 1. + // + // This block's usable space is aligned to max_align_t >= Block. With zero + // padding, the next block's usable space is sizeof(Block) past it, which is + // a point aligned to Block. Thus the max padding needed is alignment - + // alignof(Block). + if (add_overflow(size, alignment - alignof(Block), size)) + return 0; + return size; + } + + // This is the return type for `allocate` which can split one block into up to + // three blocks. + struct BlockInfo { + // This is the newly aligned block. It will have the alignment requested by + // a call to `allocate` and at most `size`. + Block *block; + + // If the usable_space in the new block was not aligned according to the + // `alignment` parameter, we will need to split into this block and the + // `block` to ensure `block` is properly aligned. In this case, `prev` will + // be a pointer to this new "padding" block. `prev` will be nullptr if no + // new block was created or we were able to merge the block before the + // original block with the "padding" block. + Block *prev; + + // This is the remainder of the next block after splitting the `block` + // according to `size`. This can happen if there's enough space after the + // `block`. + Block *next; + }; + + // Divide a block into up to 3 blocks according to `BlockInfo`. Behavior is + // undefined if allocation is not possible for the given size and alignment. + static BlockInfo allocate(Block *block, size_t alignment, size_t size); + + // These two functions may wrap around. + LIBC_INLINE static uintptr_t next_possible_block_start( + uintptr_t ptr, size_t usable_space_alignment = alignof(max_align_t)) { + return align_up(ptr + sizeof(Block), usable_space_alignment) - + sizeof(Block); + } + LIBC_INLINE static uintptr_t prev_possible_block_start( + uintptr_t ptr, size_t usable_space_alignment = alignof(max_align_t)) { + return align_down(ptr, usable_space_alignment) - sizeof(Block); + } + +private: + /// Construct a block to represent a span of bytes. Overwrites only enough + /// memory for the block header; the rest of the span is left alone. + LIBC_INLINE static Block *as_block(ByteSpan bytes) { + LIBC_ASSERT(reinterpret_cast<uintptr_t>(bytes.data()) % alignof(Block) == + 0 && + "block start must be suitably aligned"); + return ::new (bytes.data()) Block(bytes.size(), /*is_last=*/false); + } + + LIBC_INLINE static void make_last_block(cpp::byte *start) { + LIBC_ASSERT(reinterpret_cast<uintptr_t>(start) % alignof(Block) == 0 && + "block start must be suitably aligned"); + ::new (start) Block(sizeof(Block), /*is_last=*/true); + } + + /// Offset from this block to the previous block. 0 if this is the first + /// block. This field is only alive when the previous block is free; + /// otherwise, its memory is reused as part of the previous block's usable + /// space. + size_t prev_ = 0; + + /// Offset from this block to the next block. Valid even if this is the last + /// block, since it equals the size of the block. + size_t next_ = 0; + + /// Information about the current state of the block is stored in the two low + /// order bits of the next_ value. These are guaranteed free by a minimum + /// alignment (and thus, alignment of the size) of 4. The lowest bit is the + /// `prev_free` flag, and the other bit is the `last` flag. + /// + /// * If the `prev_free` flag is set, the block isn't the first and the + /// previous block is free. + /// * If the `last` flag is set, the block is the sentinel last block. It is + /// summarily considered used and has no next block. + +public: + /// Only for testing. + static constexpr size_t PREV_FIELD_SIZE = sizeof(prev_); +}; + +static_assert(alignof(Block) >= 4, + "at least 2 bits must be available in block sizes for flags"); + +LIBC_INLINE +optional<Block *> Block::init(ByteSpan region) { + if (!region.data()) + return {}; + + uintptr_t start = reinterpret_cast<uintptr_t>(region.data()); + uintptr_t end = start + region.size(); + if (end < start) + return {}; + + uintptr_t block_start = next_possible_block_start(start); + if (block_start < start) + return {}; + + uintptr_t last_start = prev_possible_block_start(end); + if (last_start >= end) + return {}; + + if (block_start + sizeof(Block) > last_start) + return {}; + + auto *last_start_ptr = reinterpret_cast<cpp::byte *>(last_start); + Block *block = + as_block({reinterpret_cast<cpp::byte *>(block_start), last_start_ptr}); + make_last_block(last_start_ptr); + block->mark_free(); + return block; +} + +LIBC_INLINE +Block::BlockInfo Block::allocate(Block *block, size_t alignment, size_t size) { + LIBC_ASSERT(alignment % alignof(max_align_t) == 0 && + "alignment must be a multiple of max_align_t"); + + BlockInfo info{block, /*prev=*/nullptr, /*next=*/nullptr}; + + if (!info.block->is_usable_space_aligned(alignment)) { + Block *original = info.block; + // The padding block has no minimum size requirement. + optional<Block *> maybe_aligned_block = original->split(0, alignment); + LIBC_ASSERT(maybe_aligned_block.has_value() && + "it should always be possible to split for alignment"); + + if (Block *prev = original->prev_free()) { + // If there is a free block before this, we can merge the current one with + // the newly created one. + prev->merge_next(); + } else { + info.prev = original; + } + + Block *aligned_block = *maybe_aligned_block; + LIBC_ASSERT(aligned_block->is_usable_space_aligned(alignment) && + "The aligned block isn't aligned somehow."); + info.block = aligned_block; + } + + // Now get a block for the requested size. + if (optional<Block *> next = info.block->split(size)) + info.next = *next; + + return info; +} + +LIBC_INLINE +optional<Block *> Block::split(size_t new_inner_size, + size_t usable_space_alignment) { + LIBC_ASSERT(usable_space_alignment % alignof(max_align_t) == 0 && + "alignment must be a multiple of max_align_t"); + if (used()) + return {}; + + // Compute the minimum outer size that produces a block of at least + // `new_inner_size`. + size_t min_outer_size = outer_size(cpp::max(new_inner_size, sizeof(prev_))); + + uintptr_t start = reinterpret_cast<uintptr_t>(this); + uintptr_t next_block_start = + next_possible_block_start(start + min_outer_size, usable_space_alignment); + if (next_block_start < start) + return {}; + size_t new_outer_size = next_block_start - start; + LIBC_ASSERT(new_outer_size % alignof(max_align_t) == 0 && + "new size must be aligned to max_align_t"); + + if (outer_size() < new_outer_size || + outer_size() - new_outer_size < sizeof(Block)) + return {}; + + ByteSpan new_region = region().subspan(new_outer_size); + next_ &= ~SIZE_MASK; + next_ |= new_outer_size; + + Block *new_block = as_block(new_region); + mark_free(); // Free status for this block is now stored in new_block. + new_block->next()->prev_ = new_region.size(); + + LIBC_ASSERT(new_block->is_usable_space_aligned(usable_space_alignment) && + "usable space must have requested alignment"); + return new_block; +} + +LIBC_INLINE +bool Block::merge_next() { + if (used() || next()->used()) + return false; + size_t new_size = outer_size() + next()->outer_size(); + next_ &= ~SIZE_MASK; + next_ |= new_size; + next()->prev_ = new_size; + return true; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_BLOCK_H diff --git a/contrib/llvm-project/libc/src/__support/blockstore.h b/contrib/llvm-project/libc/src/__support/blockstore.h new file mode 100644 index 000000000000..efe2234eace5 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/blockstore.h @@ -0,0 +1,262 @@ +//===-- A data structure which stores data in blocks -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_BLOCKSTORE_H +#define LLVM_LIBC_SRC___SUPPORT_BLOCKSTORE_H + +#include "src/__support/CPP/array.h" +#include "src/__support/CPP/new.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/libc_assert.h" +#include "src/__support/macros/config.h" + +#include <stddef.h> +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { + +// The difference between BlockStore a traditional vector types is that, +// when more capacity is desired, a new block is added instead of allocating +// a larger sized array and copying over existing items to the new allocation. +// Also, the initial block does not need heap allocation. Hence, a BlockStore is +// suitable for global objects as it does not require explicit construction. +// Also, the destructor of this class does nothing, which eliminates the need +// for an atexit global object destruction. But, it also means that the global +// object should be explicitly cleaned up at the appropriate time. +// +// If REVERSE_ORDER is true, the iteration of elements will in the reverse +// order. Also, since REVERSE_ORDER is a constexpr, conditionals branching +// on its value will be optimized out in the code below. +template <typename T, size_t BLOCK_SIZE, bool REVERSE_ORDER = false> +class BlockStore { +protected: + struct Block { + alignas(T) uint8_t data[BLOCK_SIZE * sizeof(T)] = {0}; + Block *next = nullptr; + }; + + Block first; + Block *current = &first; + size_t fill_count = 0; + + struct Pair { + Block *first, *second; + }; + LIBC_INLINE Pair get_last_blocks() { + if (REVERSE_ORDER) + return {current, current->next}; + Block *prev = nullptr; + Block *curr = &first; + for (; curr->next; prev = curr, curr = curr->next) + ; + LIBC_ASSERT(curr == current); + return {curr, prev}; + } + + LIBC_INLINE Block *get_last_block() { return get_last_blocks().first; } + +public: + LIBC_INLINE constexpr BlockStore() = default; + LIBC_INLINE ~BlockStore() = default; + + class Iterator { + Block *block; + size_t index; + + public: + LIBC_INLINE constexpr Iterator(Block *b, size_t i) : block(b), index(i) {} + + LIBC_INLINE Iterator &operator++() { + if (REVERSE_ORDER) { + if (index == 0) + return *this; + + --index; + if (index == 0 && block->next != nullptr) { + index = BLOCK_SIZE; + block = block->next; + } + } else { + if (index == BLOCK_SIZE) + return *this; + + ++index; + if (index == BLOCK_SIZE && block->next != nullptr) { + index = 0; + block = block->next; + } + } + + return *this; + } + + LIBC_INLINE T &operator*() { + size_t true_index = REVERSE_ORDER ? index - 1 : index; + return *reinterpret_cast<T *>(block->data + sizeof(T) * true_index); + } + + LIBC_INLINE Iterator operator+(int i) { + LIBC_ASSERT(i >= 0 && + "BlockStore iterators only support incrementation."); + auto other = *this; + for (int j = 0; j < i; ++j) + ++other; + + return other; + } + + LIBC_INLINE bool operator==(const Iterator &rhs) const { + return block == rhs.block && index == rhs.index; + } + + LIBC_INLINE bool operator!=(const Iterator &rhs) const { + return block != rhs.block || index != rhs.index; + } + }; + + LIBC_INLINE static void + destroy(BlockStore<T, BLOCK_SIZE, REVERSE_ORDER> *block_store); + + LIBC_INLINE T *new_obj() { + if (fill_count == BLOCK_SIZE) { + AllocChecker ac; + auto new_block = new (ac) Block(); + if (!ac) + return nullptr; + if (REVERSE_ORDER) { + new_block->next = current; + } else { + new_block->next = nullptr; + current->next = new_block; + } + current = new_block; + fill_count = 0; + } + T *obj = reinterpret_cast<T *>(current->data + fill_count * sizeof(T)); + ++fill_count; + return obj; + } + + [[nodiscard]] LIBC_INLINE bool push_back(const T &value) { + T *ptr = new_obj(); + if (ptr == nullptr) + return false; + *ptr = value; + return true; + } + + LIBC_INLINE T &back() { + return *reinterpret_cast<T *>(get_last_block()->data + + sizeof(T) * (fill_count - 1)); + } + + LIBC_INLINE void pop_back() { + fill_count--; + if (fill_count || current == &first) + return; + auto [last, prev] = get_last_blocks(); + if (REVERSE_ORDER) { + LIBC_ASSERT(last == current); + current = current->next; + } else { + LIBC_ASSERT(prev->next == last); + current = prev; + current->next = nullptr; + } + if (last != &first) + delete last; + fill_count = BLOCK_SIZE; + } + + LIBC_INLINE bool empty() const { return current == &first && !fill_count; } + + LIBC_INLINE Iterator begin() { + if (REVERSE_ORDER) + return Iterator(current, fill_count); + else + return Iterator(&first, 0); + } + + LIBC_INLINE Iterator end() { + if (REVERSE_ORDER) + return Iterator(&first, 0); + else + return Iterator(current, fill_count); + } + + // Removes the element at pos, then moves all the objects after back by one to + // fill the hole. It's assumed that pos is a valid iterator to somewhere in + // this block_store. + LIBC_INLINE void erase(Iterator pos) { + const Iterator last_item = Iterator(current, fill_count); + if (pos == last_item) { + pop_back(); + return; + } + + if constexpr (REVERSE_ORDER) { + // REVERSE: Iterate from begin to pos + const Iterator range_end = pos; + Iterator cur = begin(); + T prev_val = *cur; + ++cur; + T cur_val = *cur; + + for (; cur != range_end; ++cur) { + cur_val = *cur; + *cur = prev_val; + prev_val = cur_val; + } + // As long as this isn't the end we will always need to move at least one + // item (since we know that pos isn't the last item due to the check + // above). + if (range_end != end()) + *cur = prev_val; + } else { + // FORWARD: Iterate from pos to end + const Iterator range_end = end(); + Iterator cur = pos; + Iterator prev = cur; + ++cur; + + for (; cur != range_end; prev = cur, ++cur) + *prev = *cur; + } + pop_back(); + } +}; + +template <typename T, size_t BLOCK_SIZE, bool REVERSE_ORDER> +LIBC_INLINE void BlockStore<T, BLOCK_SIZE, REVERSE_ORDER>::destroy( + BlockStore<T, BLOCK_SIZE, REVERSE_ORDER> *block_store) { + if (REVERSE_ORDER) { + auto current = block_store->current; + while (current->next != nullptr) { + auto temp = current; + current = current->next; + delete temp; + } + } else { + auto current = block_store->first.next; + while (current != nullptr) { + auto temp = current; + current = current->next; + delete temp; + } + } + block_store->current = nullptr; + block_store->fill_count = 0; +} + +// A convenience type for reverse order block stores. +template <typename T, size_t BLOCK_SIZE> +using ReverseOrderBlockStore = BlockStore<T, BLOCK_SIZE, true>; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_BLOCKSTORE_H diff --git a/contrib/llvm-project/libc/src/__support/c_string.h b/contrib/llvm-project/libc/src/__support/c_string.h new file mode 100644 index 000000000000..11f41320681a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/c_string.h @@ -0,0 +1,37 @@ +//===-- Implementation of a struct to hold a string in menory -------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_C_STRING_H +#define LLVM_LIBC_SRC___SUPPORT_C_STRING_H + +#include "src/__support/CPP/string.h" +#include "src/__support/macros/attributes.h" // for LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +// The CString class is a companion to the cpp::string class. Its use case is as +// a return value for a function that in C would return a char* and a flag for +// if that char* needs to be freed. +class CString { + cpp::string str; + +public: + // These constructors can be implemented iff required. + CString() = delete; + CString(const CString &) = delete; + CString(CString &&) = delete; + + LIBC_INLINE CString(cpp::string in_str) : str(in_str) {} + + LIBC_INLINE operator const char *() const { return str.c_str(); } +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_C_STRING_H diff --git a/contrib/llvm-project/libc/src/__support/char_vector.h b/contrib/llvm-project/libc/src/__support/char_vector.h new file mode 100644 index 000000000000..d0837a8af3f4 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/char_vector.h @@ -0,0 +1,81 @@ +//===-- Standalone implementation of a char vector --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CHARVECTOR_H +#define LLVM_LIBC_SRC___SUPPORT_CHARVECTOR_H + +#include "hdr/func/free.h" +#include "hdr/func/malloc.h" +#include "hdr/func/realloc.h" +#include "src/__support/common.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +#include <stddef.h> // size_t + +namespace LIBC_NAMESPACE_DECL { + +// This is very simple alternate of the std::string class. There is no +// bounds check performed in any of the methods. The callers are expected to +// do the checks before invoking the methods. +// +// This class will be extended as needed in future. + +class CharVector { + static constexpr size_t INIT_BUFF_SIZE = 64; + char local_buffer[INIT_BUFF_SIZE]; + char *cur_str = local_buffer; + size_t cur_buff_size = INIT_BUFF_SIZE; + size_t index = 0; + +public: + CharVector() = default; + LIBC_INLINE ~CharVector() { + if (cur_str != local_buffer) + free(cur_str); + } + + // append returns true on success and false on allocation failure. + LIBC_INLINE bool append(char new_char) { + // Subtract 1 for index starting at 0 and another for the null terminator. + if (index >= cur_buff_size - 2) { + // If the new character would cause the string to be longer than the + // buffer's size, attempt to allocate a new buffer. + cur_buff_size = cur_buff_size * 2; + if (cur_str == local_buffer) { + char *new_str; + new_str = reinterpret_cast<char *>(malloc(cur_buff_size)); + if (new_str == nullptr) { + return false; + } + // TODO: replace with inline memcpy + for (size_t i = 0; i < index; ++i) + new_str[i] = cur_str[i]; + cur_str = new_str; + } else { + cur_str = reinterpret_cast<char *>(realloc(cur_str, cur_buff_size)); + if (cur_str == nullptr) { + return false; + } + } + } + cur_str[index] = new_char; + ++index; + return true; + } + + LIBC_INLINE char *c_str() { + cur_str[index] = '\0'; + return cur_str; + } + + LIBC_INLINE size_t length() { return index; } +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CHARVECTOR_H diff --git a/contrib/llvm-project/libc/src/__support/common.h b/contrib/llvm-project/libc/src/__support/common.h new file mode 100644 index 000000000000..15209b76978a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/common.h @@ -0,0 +1,92 @@ +//===-- Common internal contructs -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_COMMON_H +#define LLVM_LIBC_SRC___SUPPORT_COMMON_H + +#ifndef LIBC_NAMESPACE +#error "LIBC_NAMESPACE macro is not defined." +#endif + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/architectures.h" + +#ifndef LLVM_LIBC_FUNCTION_ATTR +#define LLVM_LIBC_FUNCTION_ATTR +#endif + +// clang-format off +// Allow each function `func` to have extra attributes specified by defining: +// `LLVM_LIBC_FUNCTION_ATTR_func` macro, which should always start with +// "LLVM_LIBC_EMPTY, " +// +// For examples: +// #define LLVM_LIBC_FUNCTION_ATTR_memcpy LLVM_LIBC_EMPTY, [[gnu::weak]] +// #define LLVM_LIBC_FUNCTION_ATTR_memchr LLVM_LIBC_EMPTY, [[gnu::weak]] [[gnu::visibility("default")]] +// clang-format on +#define LLVM_LIBC_EMPTY + +#define GET_SECOND(first, second, ...) second +#define EXPAND_THEN_SECOND(name) GET_SECOND(name, LLVM_LIBC_EMPTY) + +#define LLVM_LIBC_ATTR(name) EXPAND_THEN_SECOND(LLVM_LIBC_FUNCTION_ATTR_##name) + +// At the moment, [[gnu::alias()]] is not supported on MacOS, and it is needed +// to cleanly export and alias the C++ symbol `LIBC_NAMESPACE::func` with the C +// symbol `func`. So for public packaging on MacOS, we will only export the C +// symbol. Moreover, a C symbol `func` in macOS is mangled as `_func`. +#if defined(LIBC_COPT_PUBLIC_PACKAGING) +#ifndef __APPLE__ +#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) \ + LLVM_LIBC_ATTR(name) \ + LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) \ + __##name##_impl__ __asm__(#name); \ + decltype(LIBC_NAMESPACE::name) name [[gnu::alias(#name)]]; \ + type __##name##_impl__ arglist +#else // __APPLE__ +#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) \ + LLVM_LIBC_ATTR(name) \ + LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) name asm("_" #name); \ + type name arglist +#endif // __APPLE__ +#else // LIBC_COPT_PUBLIC_PACKAGING +#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) type name arglist +#endif // LIBC_COPT_PUBLIC_PACKAGING + +// This extra layer of macro allows `name` to be a macro to rename a function. +#define LLVM_LIBC_FUNCTION(type, name, arglist) \ + LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) + +namespace LIBC_NAMESPACE_DECL { +namespace internal { +LIBC_INLINE constexpr bool same_string(char const *lhs, char const *rhs) { + for (; *lhs || *rhs; ++lhs, ++rhs) + if (*lhs != *rhs) + return false; + return true; +} +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#define __LIBC_MACRO_TO_STRING(str) #str +#define LIBC_MACRO_TO_STRING(str) __LIBC_MACRO_TO_STRING(str) + +// LLVM_LIBC_IS_DEFINED checks whether a particular macro is defined. +// Usage: constexpr bool kUseAvx = LLVM_LIBC_IS_DEFINED(__AVX__); +// +// This works by comparing the stringified version of the macro with and without +// evaluation. If FOO is not undefined both stringifications yield "FOO". If FOO +// is defined, one stringification yields "FOO" while the other yields its +// stringified value "1". +#define LLVM_LIBC_IS_DEFINED(macro) \ + !LIBC_NAMESPACE::internal::same_string( \ + LLVM_LIBC_IS_DEFINED__EVAL_AND_STRINGIZE(macro), #macro) +#define LLVM_LIBC_IS_DEFINED__EVAL_AND_STRINGIZE(s) #s + +#endif // LLVM_LIBC_SRC___SUPPORT_COMMON_H diff --git a/contrib/llvm-project/libc/src/__support/complex_basic_ops.h b/contrib/llvm-project/libc/src/__support/complex_basic_ops.h new file mode 100644 index 000000000000..5992ebec0786 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/complex_basic_ops.h @@ -0,0 +1,36 @@ +//===-- complex basic operations --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_COMPLEX_BASIC_OPERATIONS_H +#define LLVM_LIBC_SRC___SUPPORT_COMPLEX_BASIC_OPERATIONS_H + +#include "complex_type.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/FPUtil/FPBits.h" + +namespace LIBC_NAMESPACE_DECL { + +template <typename T> LIBC_INLINE constexpr T conjugate(T c) { + Complex<make_real_t<T>> c_c = cpp::bit_cast<Complex<make_real_t<T>>>(c); + c_c.imag = -c_c.imag; + return cpp::bit_cast<T>(c_c); +} + +template <typename T> LIBC_INLINE constexpr T project(T c) { + using real_t = make_real_t<T>; + Complex<real_t> c_c = cpp::bit_cast<Complex<real_t>>(c); + if (fputil::FPBits<real_t>(c_c.real).is_inf() || + fputil::FPBits<real_t>(c_c.imag).is_inf()) + return cpp::bit_cast<T>( + Complex<real_t>{(fputil::FPBits<real_t>::inf(Sign::POS).get_val()), + static_cast<real_t>(c_c.imag > 0 ? 0.0 : -0.0)}); + return c; +} + +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_COMPLEX_BASIC_OPERATIONS_H diff --git a/contrib/llvm-project/libc/src/__support/complex_type.h b/contrib/llvm-project/libc/src/__support/complex_type.h new file mode 100644 index 000000000000..93089de61dba --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/complex_type.h @@ -0,0 +1,73 @@ +//===-- complex type --------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_COMPLEX_TYPE_H +#define LLVM_LIBC_SRC___SUPPORT_COMPLEX_TYPE_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/complex_types.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { +template <typename T> struct Complex { + T real; + T imag; +}; + +template <typename T> struct make_complex; + +template <> struct make_complex<float> { + using type = _Complex float; +}; +template <> struct make_complex<double> { + using type = _Complex double; +}; +template <> struct make_complex<long double> { + using type = _Complex long double; +}; + +#if defined(LIBC_TYPES_HAS_CFLOAT16) +template <> struct make_complex<float16> { + using type = cfloat16; +}; +#endif +#ifdef LIBC_TYPES_CFLOAT128_IS_NOT_COMPLEX_LONG_DOUBLE +template <> struct make_complex<float128> { + using type = cfloat128; +}; +#endif + +template <typename T> using make_complex_t = typename make_complex<T>::type; + +template <typename T> struct make_real; + +template <> struct make_real<_Complex float> { + using type = float; +}; +template <> struct make_real<_Complex double> { + using type = double; +}; +template <> struct make_real<_Complex long double> { + using type = long double; +}; + +#if defined(LIBC_TYPES_HAS_CFLOAT16) +template <> struct make_real<cfloat16> { + using type = float16; +}; +#endif +#ifdef LIBC_TYPES_CFLOAT128_IS_NOT_COMPLEX_LONG_DOUBLE +template <> struct make_real<cfloat128> { + using type = float128; +}; +#endif + +template <typename T> using make_real_t = typename make_real<T>::type; + +} // namespace LIBC_NAMESPACE_DECL +#endif // LLVM_LIBC_SRC___SUPPORT_COMPLEX_TYPE_H diff --git a/contrib/llvm-project/libc/src/__support/ctype_utils.h b/contrib/llvm-project/libc/src/__support/ctype_utils.h new file mode 100644 index 000000000000..be0f25330af9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/ctype_utils.h @@ -0,0 +1,584 @@ +//===-- Collection of utils for implementing ctype functions-------*-C++-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CTYPE_UTILS_H +#define LLVM_LIBC_SRC___SUPPORT_CTYPE_UTILS_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// ----------------------------------------------------------------------------- +// ****************** WARNING ****************** +// ****************** DO NOT TRY TO OPTIMIZE THESE FUNCTIONS! ****************** +// ----------------------------------------------------------------------------- +// This switch/case form is easier for the compiler to understand, and is +// optimized into a form that is almost always the same as or better than +// versions written by hand (see https://godbolt.org/z/qvrebqvvr). Also this +// form makes these functions encoding independent. If you want to rewrite these +// functions, make sure you have benchmarks to show your new solution is faster, +// as well as a way to support non-ASCII character encodings. + +// Similarly, do not change these functions to use case ranges. e.g. +// bool islower(int ch) { +// switch(ch) { +// case 'a'...'z': +// return true; +// } +// } +// This assumes the character ranges are contiguous, which they aren't in +// EBCDIC. Technically we could use some smaller ranges, but that's even harder +// to read. + +LIBC_INLINE static constexpr bool islower(int ch) { + switch (ch) { + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + return true; + default: + return false; + } +} + +LIBC_INLINE static constexpr bool isupper(int ch) { + switch (ch) { + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + return true; + default: + return false; + } +} + +LIBC_INLINE static constexpr bool isdigit(int ch) { + switch (ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return true; + default: + return false; + } +} + +LIBC_INLINE static constexpr int tolower(int ch) { + switch (ch) { + case 'A': + return 'a'; + case 'B': + return 'b'; + case 'C': + return 'c'; + case 'D': + return 'd'; + case 'E': + return 'e'; + case 'F': + return 'f'; + case 'G': + return 'g'; + case 'H': + return 'h'; + case 'I': + return 'i'; + case 'J': + return 'j'; + case 'K': + return 'k'; + case 'L': + return 'l'; + case 'M': + return 'm'; + case 'N': + return 'n'; + case 'O': + return 'o'; + case 'P': + return 'p'; + case 'Q': + return 'q'; + case 'R': + return 'r'; + case 'S': + return 's'; + case 'T': + return 't'; + case 'U': + return 'u'; + case 'V': + return 'v'; + case 'W': + return 'w'; + case 'X': + return 'x'; + case 'Y': + return 'y'; + case 'Z': + return 'z'; + default: + return ch; + } +} + +LIBC_INLINE static constexpr int toupper(int ch) { + switch (ch) { + case 'a': + return 'A'; + case 'b': + return 'B'; + case 'c': + return 'C'; + case 'd': + return 'D'; + case 'e': + return 'E'; + case 'f': + return 'F'; + case 'g': + return 'G'; + case 'h': + return 'H'; + case 'i': + return 'I'; + case 'j': + return 'J'; + case 'k': + return 'K'; + case 'l': + return 'L'; + case 'm': + return 'M'; + case 'n': + return 'N'; + case 'o': + return 'O'; + case 'p': + return 'P'; + case 'q': + return 'Q'; + case 'r': + return 'R'; + case 's': + return 'S'; + case 't': + return 'T'; + case 'u': + return 'U'; + case 'v': + return 'V'; + case 'w': + return 'W'; + case 'x': + return 'X'; + case 'y': + return 'Y'; + case 'z': + return 'Z'; + default: + return ch; + } +} + +LIBC_INLINE static constexpr bool isalpha(int ch) { + switch (ch) { + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + return true; + default: + return false; + } +} + +LIBC_INLINE static constexpr bool isalnum(int ch) { + switch (ch) { + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return true; + default: + return false; + } +} + +LIBC_INLINE static constexpr int b36_char_to_int(int ch) { + switch (ch) { + case '0': + return 0; + case '1': + return 1; + case '2': + return 2; + case '3': + return 3; + case '4': + return 4; + case '5': + return 5; + case '6': + return 6; + case '7': + return 7; + case '8': + return 8; + case '9': + return 9; + case 'a': + case 'A': + return 10; + case 'b': + case 'B': + return 11; + case 'c': + case 'C': + return 12; + case 'd': + case 'D': + return 13; + case 'e': + case 'E': + return 14; + case 'f': + case 'F': + return 15; + case 'g': + case 'G': + return 16; + case 'h': + case 'H': + return 17; + case 'i': + case 'I': + return 18; + case 'j': + case 'J': + return 19; + case 'k': + case 'K': + return 20; + case 'l': + case 'L': + return 21; + case 'm': + case 'M': + return 22; + case 'n': + case 'N': + return 23; + case 'o': + case 'O': + return 24; + case 'p': + case 'P': + return 25; + case 'q': + case 'Q': + return 26; + case 'r': + case 'R': + return 27; + case 's': + case 'S': + return 28; + case 't': + case 'T': + return 29; + case 'u': + case 'U': + return 30; + case 'v': + case 'V': + return 31; + case 'w': + case 'W': + return 32; + case 'x': + case 'X': + return 33; + case 'y': + case 'Y': + return 34; + case 'z': + case 'Z': + return 35; + default: + return 0; + } +} + +LIBC_INLINE static constexpr int int_to_b36_char(int num) { + // Can't actually use LIBC_ASSERT here because it depends on integer_to_string + // which depends on this. + + // LIBC_ASSERT(num < 36); + switch (num) { + case 0: + return '0'; + case 1: + return '1'; + case 2: + return '2'; + case 3: + return '3'; + case 4: + return '4'; + case 5: + return '5'; + case 6: + return '6'; + case 7: + return '7'; + case 8: + return '8'; + case 9: + return '9'; + case 10: + return 'a'; + case 11: + return 'b'; + case 12: + return 'c'; + case 13: + return 'd'; + case 14: + return 'e'; + case 15: + return 'f'; + case 16: + return 'g'; + case 17: + return 'h'; + case 18: + return 'i'; + case 19: + return 'j'; + case 20: + return 'k'; + case 21: + return 'l'; + case 22: + return 'm'; + case 23: + return 'n'; + case 24: + return 'o'; + case 25: + return 'p'; + case 26: + return 'q'; + case 27: + return 'r'; + case 28: + return 's'; + case 29: + return 't'; + case 30: + return 'u'; + case 31: + return 'v'; + case 32: + return 'w'; + case 33: + return 'x'; + case 34: + return 'y'; + case 35: + return 'z'; + default: + return '!'; + } +} + +LIBC_INLINE static constexpr bool isspace(int ch) { + switch (ch) { + case ' ': + case '\t': + case '\n': + case '\v': + case '\f': + case '\r': + return true; + default: + return false; + } +} + +// not yet encoding independent. +LIBC_INLINE static constexpr bool isgraph(int ch) { + return 0x20 < ch && ch < 0x7f; +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_CTYPE_UTILS_H diff --git a/contrib/llvm-project/libc/src/__support/detailed_powers_of_ten.h b/contrib/llvm-project/libc/src/__support/detailed_powers_of_ten.h new file mode 100644 index 000000000000..28741b8a3f56 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/detailed_powers_of_ten.h @@ -0,0 +1,740 @@ +//===-- detailed powers of ten ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_DETAILED_POWERS_OF_TEN_H +#define LLVM_LIBC_SRC___SUPPORT_DETAILED_POWERS_OF_TEN_H + +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// TODO(michaelrj): write a script that will generate this table. + +// This table was generated by +// https://github.com/google/wuffs/blob/788479dd64f35cb6b4e998a851acb06ee962435b/script/print-mpb-powers-of-10.go +// and contains the 128 bit mantissa approximations of the powers of 10 from +// -348 to 347. The exponents are implied by a linear expression with slope +// 217706.0/65536.0 ≈ log(10)/log(2). This is used by the Eisel-Lemire algorithm +// in str_to_float.h. + +constexpr int32_t DETAILED_POWERS_OF_TEN_MIN_EXP_10 = -348; +constexpr int32_t DETAILED_POWERS_OF_TEN_MAX_EXP_10 = 347; + +// This rescales the base 10 exponent by a factor of log(10)/log(2). +LIBC_INLINE int32_t exp10_to_exp2(int32_t exp10) { + // Valid if exp10 < 646 456 636. + return static_cast<int32_t>((217706 * static_cast<int64_t>(exp10)) >> 16); +} + +static constexpr uint64_t DETAILED_POWERS_OF_TEN[696][2] = { + {0x1732C869CD60E453, 0xFA8FD5A0081C0288}, // 1e-348 + {0x0E7FBD42205C8EB4, 0x9C99E58405118195}, // 1e-347 + {0x521FAC92A873B261, 0xC3C05EE50655E1FA}, // 1e-346 + {0xE6A797B752909EF9, 0xF4B0769E47EB5A78}, // 1e-345 + {0x9028BED2939A635C, 0x98EE4A22ECF3188B}, // 1e-344 + {0x7432EE873880FC33, 0xBF29DCABA82FDEAE}, // 1e-343 + {0x113FAA2906A13B3F, 0xEEF453D6923BD65A}, // 1e-342 + {0x4AC7CA59A424C507, 0x9558B4661B6565F8}, // 1e-341 + {0x5D79BCF00D2DF649, 0xBAAEE17FA23EBF76}, // 1e-340 + {0xF4D82C2C107973DC, 0xE95A99DF8ACE6F53}, // 1e-339 + {0x79071B9B8A4BE869, 0x91D8A02BB6C10594}, // 1e-338 + {0x9748E2826CDEE284, 0xB64EC836A47146F9}, // 1e-337 + {0xFD1B1B2308169B25, 0xE3E27A444D8D98B7}, // 1e-336 + {0xFE30F0F5E50E20F7, 0x8E6D8C6AB0787F72}, // 1e-335 + {0xBDBD2D335E51A935, 0xB208EF855C969F4F}, // 1e-334 + {0xAD2C788035E61382, 0xDE8B2B66B3BC4723}, // 1e-333 + {0x4C3BCB5021AFCC31, 0x8B16FB203055AC76}, // 1e-332 + {0xDF4ABE242A1BBF3D, 0xADDCB9E83C6B1793}, // 1e-331 + {0xD71D6DAD34A2AF0D, 0xD953E8624B85DD78}, // 1e-330 + {0x8672648C40E5AD68, 0x87D4713D6F33AA6B}, // 1e-329 + {0x680EFDAF511F18C2, 0xA9C98D8CCB009506}, // 1e-328 + {0x0212BD1B2566DEF2, 0xD43BF0EFFDC0BA48}, // 1e-327 + {0x014BB630F7604B57, 0x84A57695FE98746D}, // 1e-326 + {0x419EA3BD35385E2D, 0xA5CED43B7E3E9188}, // 1e-325 + {0x52064CAC828675B9, 0xCF42894A5DCE35EA}, // 1e-324 + {0x7343EFEBD1940993, 0x818995CE7AA0E1B2}, // 1e-323 + {0x1014EBE6C5F90BF8, 0xA1EBFB4219491A1F}, // 1e-322 + {0xD41A26E077774EF6, 0xCA66FA129F9B60A6}, // 1e-321 + {0x8920B098955522B4, 0xFD00B897478238D0}, // 1e-320 + {0x55B46E5F5D5535B0, 0x9E20735E8CB16382}, // 1e-319 + {0xEB2189F734AA831D, 0xC5A890362FDDBC62}, // 1e-318 + {0xA5E9EC7501D523E4, 0xF712B443BBD52B7B}, // 1e-317 + {0x47B233C92125366E, 0x9A6BB0AA55653B2D}, // 1e-316 + {0x999EC0BB696E840A, 0xC1069CD4EABE89F8}, // 1e-315 + {0xC00670EA43CA250D, 0xF148440A256E2C76}, // 1e-314 + {0x380406926A5E5728, 0x96CD2A865764DBCA}, // 1e-313 + {0xC605083704F5ECF2, 0xBC807527ED3E12BC}, // 1e-312 + {0xF7864A44C633682E, 0xEBA09271E88D976B}, // 1e-311 + {0x7AB3EE6AFBE0211D, 0x93445B8731587EA3}, // 1e-310 + {0x5960EA05BAD82964, 0xB8157268FDAE9E4C}, // 1e-309 + {0x6FB92487298E33BD, 0xE61ACF033D1A45DF}, // 1e-308 + {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 + {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 + {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 + {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 + {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 + {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 + {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 + {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 + {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 + {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 + {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 + {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 + {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 + {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 + {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 + {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 + {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 + {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 + {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 + {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 + {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 + {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 + {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 + {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 + {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 + {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 + {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 + {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 + {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 + {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 + {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 + {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 + {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 + {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 + {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 + {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 + {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 + {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 + {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 + {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 + {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 + {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 + {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 + {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 + {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 + {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 + {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 + {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 + {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 + {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 + {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 + {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 + {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 + {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 + {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 + {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 + {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 + {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 + {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 + {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 + {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 + {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 + {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 + {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 + {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 + {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 + {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 + {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 + {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 + {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 + {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 + {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 + {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 + {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 + {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 + {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 + {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 + {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 + {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 + {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 + {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 + {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 + {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 + {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 + {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 + {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 + {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 + {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 + {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 + {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 + {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 + {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 + {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 + {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 + {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 + {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 + {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 + {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 + {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 + {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 + {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 + {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 + {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 + {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 + {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 + {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 + {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 + {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 + {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 + {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 + {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 + {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 + {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 + {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 + {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 + {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 + {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 + {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 + {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 + {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 + {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 + {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 + {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 + {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 + {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 + {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 + {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 + {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 + {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 + {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 + {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 + {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 + {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 + {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 + {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 + {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 + {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 + {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 + {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 + {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 + {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 + {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 + {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 + {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 + {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 + {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 + {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 + {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 + {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 + {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 + {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 + {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 + {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 + {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 + {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 + {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 + {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 + {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 + {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 + {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 + {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 + {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 + {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 + {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 + {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 + {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 + {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 + {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 + {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 + {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 + {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 + {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 + {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 + {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 + {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 + {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 + {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 + {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 + {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 + {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 + {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 + {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 + {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 + {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 + {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 + {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 + {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 + {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 + {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 + {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 + {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 + {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 + {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 + {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 + {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 + {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 + {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 + {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 + {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 + {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 + {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 + {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 + {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 + {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 + {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 + {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 + {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 + {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 + {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 + {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 + {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 + {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 + {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 + {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 + {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 + {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 + {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 + {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 + {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 + {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 + {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 + {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 + {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 + {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 + {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 + {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 + {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 + {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 + {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 + {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 + {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 + {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 + {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 + {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 + {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 + {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 + {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 + {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 + {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 + {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 + {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 + {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 + {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 + {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 + {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 + {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 + {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 + {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 + {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 + {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 + {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 + {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 + {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 + {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 + {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 + {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 + {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 + {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 + {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 + {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 + {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 + {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 + {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 + {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 + {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 + {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 + {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 + {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 + {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 + {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 + {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 + {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 + {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 + {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 + {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 + {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 + {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 + {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 + {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 + {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 + {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 + {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 + {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 + {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 + {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 + {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 + {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 + {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 + {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 + {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 + {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 + {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 + {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 + {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 + {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 + {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 + {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 + {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 + {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 + {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 + {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 + {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 + {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 + {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 + {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 + {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 + {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 + {0x0000000000000000, 0x8000000000000000}, // 1e0 + {0x0000000000000000, 0xA000000000000000}, // 1e1 + {0x0000000000000000, 0xC800000000000000}, // 1e2 + {0x0000000000000000, 0xFA00000000000000}, // 1e3 + {0x0000000000000000, 0x9C40000000000000}, // 1e4 + {0x0000000000000000, 0xC350000000000000}, // 1e5 + {0x0000000000000000, 0xF424000000000000}, // 1e6 + {0x0000000000000000, 0x9896800000000000}, // 1e7 + {0x0000000000000000, 0xBEBC200000000000}, // 1e8 + {0x0000000000000000, 0xEE6B280000000000}, // 1e9 + {0x0000000000000000, 0x9502F90000000000}, // 1e10 + {0x0000000000000000, 0xBA43B74000000000}, // 1e11 + {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 + {0x0000000000000000, 0x9184E72A00000000}, // 1e13 + {0x0000000000000000, 0xB5E620F480000000}, // 1e14 + {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 + {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 + {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 + {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 + {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 + {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 + {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 + {0x0000000000000000, 0x878678326EAC9000}, // 1e22 + {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 + {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 + {0x0000000000000000, 0x84595161401484A0}, // 1e25 + {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 + {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 + {0x4000000000000000, 0x813F3978F8940984}, // 1e28 + {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 + {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 + {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 + {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 + {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 + {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 + {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 + {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 + {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 + {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 + {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 + {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 + {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 + {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 + {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 + {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 + {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 + {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 + {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 + {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 + {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 + {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 + {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 + {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 + {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 + {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 + {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 + {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 + {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 + {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 + {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 + {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 + {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 + {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 + {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 + {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 + {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 + {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 + {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 + {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 + {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 + {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 + {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 + {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 + {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 + {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 + {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 + {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 + {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 + {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 + {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 + {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 + {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 + {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 + {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 + {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 + {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 + {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 + {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 + {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 + {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 + {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 + {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 + {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 + {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 + {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 + {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 + {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 + {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 + {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 + {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 + {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 + {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 + {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 + {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 + {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 + {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 + {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 + {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 + {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 + {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 + {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 + {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 + {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 + {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 + {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 + {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 + {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 + {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 + {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 + {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 + {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 + {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 + {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 + {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 + {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 + {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 + {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 + {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 + {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 + {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 + {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 + {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 + {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 + {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 + {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 + {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 + {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 + {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 + {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 + {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 + {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 + {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 + {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 + {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 + {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 + {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 + {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 + {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 + {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 + {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 + {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 + {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 + {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 + {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 + {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 + {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 + {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 + {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 + {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 + {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 + {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 + {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 + {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 + {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 + {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 + {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 + {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 + {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 + {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 + {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 + {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 + {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 + {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 + {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 + {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 + {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 + {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 + {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 + {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 + {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 + {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 + {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 + {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 + {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 + {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 + {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 + {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 + {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 + {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 + {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 + {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 + {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 + {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 + {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 + {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 + {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 + {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 + {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 + {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 + {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 + {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 + {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 + {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 + {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 + {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 + {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 + {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 + {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 + {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 + {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 + {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 + {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 + {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 + {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 + {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 + {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 + {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 + {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 + {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 + {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 + {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 + {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 + {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 + {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 + {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 + {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 + {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 + {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 + {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 + {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 + {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 + {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 + {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 + {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 + {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 + {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 + {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 + {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 + {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 + {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 + {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 + {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 + {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 + {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 + {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 + {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 + {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 + {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 + {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 + {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 + {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 + {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 + {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 + {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 + {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 + {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 + {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 + {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 + {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 + {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 + {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 + {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 + {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 + {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 + {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 + {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 + {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 + {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 + {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 + {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 + {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 + {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 + {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 + {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 + {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 + {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 + {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 + {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 + {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 + {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 + {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 + {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 + {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 + {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 + {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 + {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 + {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 + {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 + {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 + {0xC831FD53C5FF7EAB, 0x83585D8FD9C25DB7}, // 1e289 + {0xBA3E7CA8B77F5E55, 0xA42E74F3D032F525}, // 1e290 + {0x28CE1BD2E55F35EB, 0xCD3A1230C43FB26F}, // 1e291 + {0x7980D163CF5B81B3, 0x80444B5E7AA7CF85}, // 1e292 + {0xD7E105BCC332621F, 0xA0555E361951C366}, // 1e293 + {0x8DD9472BF3FEFAA7, 0xC86AB5C39FA63440}, // 1e294 + {0xB14F98F6F0FEB951, 0xFA856334878FC150}, // 1e295 + {0x6ED1BF9A569F33D3, 0x9C935E00D4B9D8D2}, // 1e296 + {0x0A862F80EC4700C8, 0xC3B8358109E84F07}, // 1e297 + {0xCD27BB612758C0FA, 0xF4A642E14C6262C8}, // 1e298 + {0x8038D51CB897789C, 0x98E7E9CCCFBD7DBD}, // 1e299 + {0xE0470A63E6BD56C3, 0xBF21E44003ACDD2C}, // 1e300 + {0x1858CCFCE06CAC74, 0xEEEA5D5004981478}, // 1e301 + {0x0F37801E0C43EBC8, 0x95527A5202DF0CCB}, // 1e302 + {0xD30560258F54E6BA, 0xBAA718E68396CFFD}, // 1e303 + {0x47C6B82EF32A2069, 0xE950DF20247C83FD}, // 1e304 + {0x4CDC331D57FA5441, 0x91D28B7416CDD27E}, // 1e305 + {0xE0133FE4ADF8E952, 0xB6472E511C81471D}, // 1e306 + {0x58180FDDD97723A6, 0xE3D8F9E563A198E5}, // 1e307 + {0x570F09EAA7EA7648, 0x8E679C2F5E44FF8F}, // 1e308 + {0x2CD2CC6551E513DA, 0xB201833B35D63F73}, // 1e309 + {0xF8077F7EA65E58D1, 0xDE81E40A034BCF4F}, // 1e310 + {0xFB04AFAF27FAF782, 0x8B112E86420F6191}, // 1e311 + {0x79C5DB9AF1F9B563, 0xADD57A27D29339F6}, // 1e312 + {0x18375281AE7822BC, 0xD94AD8B1C7380874}, // 1e313 + {0x8F2293910D0B15B5, 0x87CEC76F1C830548}, // 1e314 + {0xB2EB3875504DDB22, 0xA9C2794AE3A3C69A}, // 1e315 + {0x5FA60692A46151EB, 0xD433179D9C8CB841}, // 1e316 + {0xDBC7C41BA6BCD333, 0x849FEEC281D7F328}, // 1e317 + {0x12B9B522906C0800, 0xA5C7EA73224DEFF3}, // 1e318 + {0xD768226B34870A00, 0xCF39E50FEAE16BEF}, // 1e319 + {0xE6A1158300D46640, 0x81842F29F2CCE375}, // 1e320 + {0x60495AE3C1097FD0, 0xA1E53AF46F801C53}, // 1e321 + {0x385BB19CB14BDFC4, 0xCA5E89B18B602368}, // 1e322 + {0x46729E03DD9ED7B5, 0xFCF62C1DEE382C42}, // 1e323 + {0x6C07A2C26A8346D1, 0x9E19DB92B4E31BA9}, // 1e324 + {0xC7098B7305241885, 0xC5A05277621BE293}, // 1e325 + {0xB8CBEE4FC66D1EA7, 0xF70867153AA2DB38}, // 1e326 + {0x737F74F1DC043328, 0x9A65406D44A5C903}, // 1e327 + {0x505F522E53053FF2, 0xC0FE908895CF3B44}, // 1e328 + {0x647726B9E7C68FEF, 0xF13E34AABB430A15}, // 1e329 + {0x5ECA783430DC19F5, 0x96C6E0EAB509E64D}, // 1e330 + {0xB67D16413D132072, 0xBC789925624C5FE0}, // 1e331 + {0xE41C5BD18C57E88F, 0xEB96BF6EBADF77D8}, // 1e332 + {0x8E91B962F7B6F159, 0x933E37A534CBAAE7}, // 1e333 + {0x723627BBB5A4ADB0, 0xB80DC58E81FE95A1}, // 1e334 + {0xCEC3B1AAA30DD91C, 0xE61136F2227E3B09}, // 1e335 + {0x213A4F0AA5E8A7B1, 0x8FCAC257558EE4E6}, // 1e336 + {0xA988E2CD4F62D19D, 0xB3BD72ED2AF29E1F}, // 1e337 + {0x93EB1B80A33B8605, 0xE0ACCFA875AF45A7}, // 1e338 + {0xBC72F130660533C3, 0x8C6C01C9498D8B88}, // 1e339 + {0xEB8FAD7C7F8680B4, 0xAF87023B9BF0EE6A}, // 1e340 + {0xA67398DB9F6820E1, 0xDB68C2CA82ED2A05}, // 1e341 + {0x88083F8943A1148C, 0x892179BE91D43A43}, // 1e342 + {0x6A0A4F6B948959B0, 0xAB69D82E364948D4}, // 1e343 + {0x848CE34679ABB01C, 0xD6444E39C3DB9B09}, // 1e344 + {0xF2D80E0C0C0B4E11, 0x85EAB0E41A6940E5}, // 1e345 + {0x6F8E118F0F0E2195, 0xA7655D1D2103911F}, // 1e346 + {0x4B7195F2D2D1A9FB, 0xD13EB46469447567}, // 1e347 +}; + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_DETAILED_POWERS_OF_TEN_H diff --git a/contrib/llvm-project/libc/src/__support/endian_internal.h b/contrib/llvm-project/libc/src/__support/endian_internal.h new file mode 100644 index 000000000000..77839ad75455 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/endian_internal.h @@ -0,0 +1,146 @@ +//===-- Endianness support --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_ENDIAN_INTERNAL_H +#define LLVM_LIBC_SRC___SUPPORT_ENDIAN_INTERNAL_H + +#include "common.h" +#include "src/__support/macros/config.h" + +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { + +// We rely on compiler preprocessor defines to allow for cross compilation. +#if !defined(__BYTE_ORDER__) || !defined(__ORDER_LITTLE_ENDIAN__) || \ + !defined(__ORDER_BIG_ENDIAN__) +#error "Missing preprocessor definitions for endianness detection." +#endif + +namespace internal { + +// Converts uint8_t, uint16_t, uint32_t, uint64_t to its big or little endian +// counterpart. +// We use explicit template specialization: +// - to prevent accidental integer promotion. +// - to prevent fallback in (unlikely) case of middle-endianness. + +template <unsigned ORDER> struct Endian { + static constexpr const bool IS_LITTLE = ORDER == __ORDER_LITTLE_ENDIAN__; + static constexpr const bool IS_BIG = ORDER == __ORDER_BIG_ENDIAN__; + template <typename T> LIBC_INLINE static T to_big_endian(T value); + template <typename T> LIBC_INLINE static T to_little_endian(T value); +}; + +// Little Endian specializations +template <> +template <> +LIBC_INLINE uint8_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_big_endian<uint8_t>(uint8_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint8_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_little_endian<uint8_t>(uint8_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint16_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_big_endian<uint16_t>(uint16_t v) { + return __builtin_bswap16(v); +} +template <> +template <> +LIBC_INLINE uint16_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_little_endian<uint16_t>(uint16_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint32_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_big_endian<uint32_t>(uint32_t v) { + return __builtin_bswap32(v); +} +template <> +template <> +LIBC_INLINE uint32_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_little_endian<uint32_t>(uint32_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint64_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_big_endian<uint64_t>(uint64_t v) { + return __builtin_bswap64(v); +} +template <> +template <> +LIBC_INLINE uint64_t +Endian<__ORDER_LITTLE_ENDIAN__>::to_little_endian<uint64_t>(uint64_t v) { + return v; +} + +// Big Endian specializations +template <> +template <> +LIBC_INLINE uint8_t +Endian<__ORDER_BIG_ENDIAN__>::to_big_endian<uint8_t>(uint8_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint8_t +Endian<__ORDER_BIG_ENDIAN__>::to_little_endian<uint8_t>(uint8_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint16_t +Endian<__ORDER_BIG_ENDIAN__>::to_big_endian<uint16_t>(uint16_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint16_t +Endian<__ORDER_BIG_ENDIAN__>::to_little_endian<uint16_t>(uint16_t v) { + return __builtin_bswap16(v); +} +template <> +template <> +LIBC_INLINE uint32_t +Endian<__ORDER_BIG_ENDIAN__>::to_big_endian<uint32_t>(uint32_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint32_t +Endian<__ORDER_BIG_ENDIAN__>::to_little_endian<uint32_t>(uint32_t v) { + return __builtin_bswap32(v); +} +template <> +template <> +LIBC_INLINE uint64_t +Endian<__ORDER_BIG_ENDIAN__>::to_big_endian<uint64_t>(uint64_t v) { + return v; +} +template <> +template <> +LIBC_INLINE uint64_t +Endian<__ORDER_BIG_ENDIAN__>::to_little_endian<uint64_t>(uint64_t v) { + return __builtin_bswap64(v); +} + +} // namespace internal + +using Endian = internal::Endian<__BYTE_ORDER__>; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_ENDIAN_INTERNAL_H diff --git a/contrib/llvm-project/libc/src/__support/error_or.h b/contrib/llvm-project/libc/src/__support/error_or.h new file mode 100644 index 000000000000..3faaddde6cd3 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/error_or.h @@ -0,0 +1,40 @@ +//===-- A data structure for returning an error or a value ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_ERROR_OR_H +#define LLVM_LIBC_SRC___SUPPORT_ERROR_OR_H + +#include "src/__support/CPP/expected.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +template <class T> using ErrorOr = cpp::expected<T, int>; + +using Error = cpp::unexpected<int>; + +// template <typename T> struct ErrorOr { +// union { +// T value; +// int error; +// }; +// bool is_error; + +// constexpr ErrorOr(T value) : value(value), is_error(false) {} +// constexpr ErrorOr(int error, bool is_error) +// : error(error), is_error(is_error) {} + +// constexpr bool has_error() { return is_error; } + +// constexpr operator bool() { return is_error; } +// constexpr operator T() { return value; } +// }; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_ERROR_OR_H diff --git a/contrib/llvm-project/libc/src/__support/fixed_point/fx_bits.h b/contrib/llvm-project/libc/src/__support/fixed_point/fx_bits.h new file mode 100644 index 000000000000..00c6119b4f35 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/fixed_point/fx_bits.h @@ -0,0 +1,232 @@ +//===-- Utility class to manipulate fixed point numbers. --*- C++ -*-=========// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FIXED_POINT_FX_BITS_H +#define LLVM_LIBC_SRC___SUPPORT_FIXED_POINT_FX_BITS_H + +#include "include/llvm-libc-macros/stdfix-macros.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/limits.h" // numeric_limits +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" // LIBC_NAMESPACE_DECL +#include "src/__support/macros/null_check.h" // LIBC_CRASH_ON_VALUE +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY +#include "src/__support/math_extras.h" + +#include "fx_rep.h" + +#ifdef LIBC_COMPILER_HAS_FIXED_POINT + +namespace LIBC_NAMESPACE_DECL { +namespace fixed_point { + +template <typename T> struct FXBits { +private: + using fx_rep = FXRep<T>; + using StorageType = typename fx_rep::StorageType; + + StorageType value; + + static_assert(fx_rep::FRACTION_LEN > 0); + + static constexpr size_t FRACTION_OFFSET = 0; // Just for completeness + static constexpr size_t INTEGRAL_OFFSET = + fx_rep::INTEGRAL_LEN == 0 ? 0 : fx_rep::FRACTION_LEN; + static constexpr size_t SIGN_OFFSET = + fx_rep::SIGN_LEN == 0 + ? 0 + : ((sizeof(StorageType) * CHAR_BIT) - fx_rep::SIGN_LEN); + + static constexpr StorageType FRACTION_MASK = + mask_trailing_ones<StorageType, fx_rep::FRACTION_LEN>() + << FRACTION_OFFSET; + static constexpr StorageType INTEGRAL_MASK = + mask_trailing_ones<StorageType, fx_rep::INTEGRAL_LEN>() + << INTEGRAL_OFFSET; + static constexpr StorageType SIGN_MASK = + (fx_rep::SIGN_LEN == 0 ? 0 : StorageType(1) << SIGN_OFFSET); + + // mask for <integral | fraction> + static constexpr StorageType VALUE_MASK = INTEGRAL_MASK | FRACTION_MASK; + + // mask for <sign | integral | fraction> + static constexpr StorageType TOTAL_MASK = SIGN_MASK | VALUE_MASK; + +public: + LIBC_INLINE constexpr FXBits() = default; + + template <typename XType> LIBC_INLINE constexpr explicit FXBits(XType x) { + using Unqual = typename cpp::remove_cv_t<XType>; + if constexpr (cpp::is_same_v<Unqual, T>) { + value = cpp::bit_cast<StorageType>(x); + } else if constexpr (cpp::is_same_v<Unqual, StorageType>) { + value = x; + } else { + // We don't want accidental type promotions/conversions, so we require + // exact type match. + static_assert(cpp::always_false<XType>); + } + } + + LIBC_INLINE constexpr StorageType get_fraction() { + return (value & FRACTION_MASK) >> FRACTION_OFFSET; + } + + LIBC_INLINE constexpr StorageType get_integral() { + return (value & INTEGRAL_MASK) >> INTEGRAL_OFFSET; + } + + // returns complete bitstring representation the fixed point number + // the bitstring is of the form: padding | sign | integral | fraction + LIBC_INLINE constexpr StorageType get_bits() { + return (value & TOTAL_MASK) >> FRACTION_OFFSET; + } + + // TODO: replace bool with Sign + LIBC_INLINE constexpr bool get_sign() { + return static_cast<bool>((value & SIGN_MASK) >> SIGN_OFFSET); + } + + // This represents the effective negative exponent applied to this number + LIBC_INLINE constexpr int get_exponent() { return fx_rep::FRACTION_LEN; } + + LIBC_INLINE constexpr void set_fraction(StorageType fraction) { + value = (value & (~FRACTION_MASK)) | + ((fraction << FRACTION_OFFSET) & FRACTION_MASK); + } + + LIBC_INLINE constexpr void set_integral(StorageType integral) { + value = (value & (~INTEGRAL_MASK)) | + ((integral << INTEGRAL_OFFSET) & INTEGRAL_MASK); + } + + // TODO: replace bool with Sign + LIBC_INLINE constexpr void set_sign(bool sign) { + value = (value & (~SIGN_MASK)) | + ((static_cast<StorageType>(sign) << SIGN_OFFSET) & SIGN_MASK); + } + + LIBC_INLINE constexpr T get_val() const { return cpp::bit_cast<T>(value); } +}; + +// Bit-wise operations are not available for fixed point types yet. +template <typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_fixed_point_v<T>, T> +bit_and(T x, T y) { + using BitType = typename FXRep<T>::StorageType; + BitType x_bit = cpp::bit_cast<BitType>(x); + BitType y_bit = cpp::bit_cast<BitType>(y); + // For some reason, bit_cast cannot deduce BitType from the input. + return cpp::bit_cast<T, BitType>(x_bit & y_bit); +} + +template <typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_fixed_point_v<T>, T> +bit_or(T x, T y) { + using BitType = typename FXRep<T>::StorageType; + BitType x_bit = cpp::bit_cast<BitType>(x); + BitType y_bit = cpp::bit_cast<BitType>(y); + // For some reason, bit_cast cannot deduce BitType from the input. + return cpp::bit_cast<T, BitType>(x_bit | y_bit); +} + +template <typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_fixed_point_v<T>, T> +bit_not(T x) { + using BitType = typename FXRep<T>::StorageType; + BitType x_bit = cpp::bit_cast<BitType>(x); + // For some reason, bit_cast cannot deduce BitType from the input. + return cpp::bit_cast<T, BitType>(static_cast<BitType>(~x_bit)); +} + +template <typename T> LIBC_INLINE constexpr T abs(T x) { + using FXRep = FXRep<T>; + if constexpr (FXRep::SIGN_LEN == 0) + return x; + else { + if (LIBC_UNLIKELY(x == FXRep::MIN())) + return FXRep::MAX(); + return (x < FXRep::ZERO() ? -x : x); + } +} + +// Round-to-nearest, tie-to-(+Inf) +template <typename T> LIBC_INLINE constexpr T round(T x, int n) { + using FXRep = FXRep<T>; + if (LIBC_UNLIKELY(n < 0)) + n = 0; + if (LIBC_UNLIKELY(n >= FXRep::FRACTION_LEN)) + return x; + + T round_bit = FXRep::EPS() << (FXRep::FRACTION_LEN - n - 1); + // Check for overflow. + if (LIBC_UNLIKELY(FXRep::MAX() - round_bit < x)) + return FXRep::MAX(); + + T all_ones = bit_not(FXRep::ZERO()); + + int shift = FXRep::FRACTION_LEN - n; + T rounding_mask = + (shift == FXRep::TOTAL_LEN) ? FXRep::ZERO() : (all_ones << shift); + return bit_and((x + round_bit), rounding_mask); +} + +// count leading sign bits +// TODO: support fixed_point_padding +template <typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_fixed_point_v<T>, int> +countls(T f) { + using FXRep = FXRep<T>; + using BitType = typename FXRep::StorageType; + using FXBits = FXBits<T>; + + if constexpr (FXRep::SIGN_LEN > 0) { + if (f < 0) + f = bit_not(f); + } + + BitType value_bits = FXBits(f).get_bits(); + return cpp::countl_zero(value_bits) - FXRep::SIGN_LEN; +} + +// fixed-point to integer conversion +template <typename T, typename XType> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_fixed_point_v<T>, XType> +bitsfx(T f) { + return cpp::bit_cast<XType, T>(f); +} + +// divide the two fixed-point types and return an integer result +template <typename T, typename XType> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_fixed_point_v<T>, XType> +idiv(T x, T y) { + using FXBits = FXBits<T>; + using FXRep = FXRep<T>; + using CompType = typename FXRep::CompType; + + // If the value of the second operand of the / operator is zero, the + // behavior is undefined. Ref: ISO/IEC TR 18037:2008(E) p.g. 16 + LIBC_CRASH_ON_VALUE(y, FXRep::ZERO()); + + CompType x_comp = static_cast<CompType>(FXBits(x).get_bits()); + CompType y_comp = static_cast<CompType>(FXBits(y).get_bits()); + + // If an integer result of one of these functions overflows, the behavior is + // undefined. Ref: ISO/IEC TR 18037:2008(E) p.g. 16 + CompType result = x_comp / y_comp; + + return static_cast<XType>(result); +} + +} // namespace fixed_point +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_COMPILER_HAS_FIXED_POINT + +#endif // LLVM_LIBC_SRC___SUPPORT_FIXED_POINT_FX_BITS_H diff --git a/contrib/llvm-project/libc/src/__support/fixed_point/fx_rep.h b/contrib/llvm-project/libc/src/__support/fixed_point/fx_rep.h new file mode 100644 index 000000000000..7227fffa683a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/fixed_point/fx_rep.h @@ -0,0 +1,303 @@ +//===-- Utility class to manipulate fixed point numbers. --*- C++ -*-=========// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FIXED_POINT_FX_REP_H +#define LLVM_LIBC_SRC___SUPPORT_FIXED_POINT_FX_REP_H + +#include "include/llvm-libc-macros/stdfix-macros.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE, LIBC_INLINE_VAR +#include "src/__support/macros/config.h" + +#include <stdint.h> + +#ifdef LIBC_COMPILER_HAS_FIXED_POINT + +namespace LIBC_NAMESPACE_DECL { +namespace fixed_point { + +namespace internal { + +template <int Bits> struct Storage { + static_assert(Bits > 0 && Bits <= 64, "Bits has to be between 1 and 64."); + using Type = typename cpp::conditional_t< + (Bits <= 8), uint8_t, + typename cpp::conditional_t< + (Bits <= 16 && Bits > 8), uint16_t, + typename cpp::conditional_t<(Bits <= 32 && Bits > 16), uint32_t, + uint64_t>>>; +}; + +} // namespace internal + +template <typename T> struct FXRep; + +template <> struct FXRep<short fract> { + using Type = short _Fract; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = 0; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SFRACT_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return SFRACT_MIN; } + LIBC_INLINE static constexpr Type MAX() { return SFRACT_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0HR; } + LIBC_INLINE static constexpr Type EPS() { return SFRACT_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5HR; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25HR; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_signed_t<StorageType>; +}; + +template <> struct FXRep<unsigned short fract> { + using Type = unsigned short fract; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 0; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = 0; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = USFRACT_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return USFRACT_MIN; } + LIBC_INLINE static constexpr Type MAX() { return USFRACT_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0UHR; } + LIBC_INLINE static constexpr Type EPS() { return USFRACT_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5UHR; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25UHR; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_unsigned_t<StorageType>; +}; + +template <> struct FXRep<fract> { + using Type = fract; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = 0; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = FRACT_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return FRACT_MIN; } + LIBC_INLINE static constexpr Type MAX() { return FRACT_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0R; } + LIBC_INLINE static constexpr Type EPS() { return FRACT_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5R; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25R; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_signed_t<StorageType>; +}; + +template <> struct FXRep<unsigned fract> { + using Type = unsigned fract; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 0; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = 0; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = UFRACT_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return UFRACT_MIN; } + LIBC_INLINE static constexpr Type MAX() { return UFRACT_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0UR; } + LIBC_INLINE static constexpr Type EPS() { return UFRACT_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5UR; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25UR; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_unsigned_t<StorageType>; +}; + +template <> struct FXRep<long fract> { + using Type = long fract; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = 0; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = LFRACT_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return LFRACT_MIN; } + LIBC_INLINE static constexpr Type MAX() { return LFRACT_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0LR; } + LIBC_INLINE static constexpr Type EPS() { return LFRACT_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5LR; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25LR; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_signed_t<StorageType>; +}; + +template <> struct FXRep<unsigned long fract> { + using Type = unsigned long fract; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 0; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = 0; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = ULFRACT_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return ULFRACT_MIN; } + LIBC_INLINE static constexpr Type MAX() { return ULFRACT_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0ULR; } + LIBC_INLINE static constexpr Type EPS() { return ULFRACT_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5ULR; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25ULR; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_unsigned_t<StorageType>; +}; + +template <> struct FXRep<short accum> { + using Type = short accum; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = SACCUM_IBIT; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = SACCUM_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return SACCUM_MIN; } + LIBC_INLINE static constexpr Type MAX() { return SACCUM_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0HK; } + LIBC_INLINE static constexpr Type EPS() { return SACCUM_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5HK; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25HK; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_signed_t<StorageType>; +}; + +template <> struct FXRep<unsigned short accum> { + using Type = unsigned short accum; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 0; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = USACCUM_IBIT; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = USACCUM_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return USACCUM_MIN; } + LIBC_INLINE static constexpr Type MAX() { return USACCUM_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0UHK; } + LIBC_INLINE static constexpr Type EPS() { return USACCUM_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5UHK; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25UHK; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_unsigned_t<StorageType>; +}; + +template <> struct FXRep<accum> { + using Type = accum; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = ACCUM_IBIT; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = ACCUM_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return ACCUM_MIN; } + LIBC_INLINE static constexpr Type MAX() { return ACCUM_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0K; } + LIBC_INLINE static constexpr Type EPS() { return ACCUM_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5K; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25K; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_signed_t<StorageType>; +}; + +template <> struct FXRep<unsigned accum> { + using Type = unsigned accum; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 0; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = UACCUM_IBIT; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = UACCUM_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return UACCUM_MIN; } + LIBC_INLINE static constexpr Type MAX() { return UACCUM_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0UK; } + LIBC_INLINE static constexpr Type EPS() { return UACCUM_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5UK; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25UK; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_unsigned_t<StorageType>; +}; + +template <> struct FXRep<long accum> { + using Type = long accum; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 1; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = LACCUM_IBIT; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = LACCUM_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return LACCUM_MIN; } + LIBC_INLINE static constexpr Type MAX() { return LACCUM_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0LK; } + LIBC_INLINE static constexpr Type EPS() { return LACCUM_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5LK; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25LK; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_signed_t<StorageType>; +}; + +template <> struct FXRep<unsigned long accum> { + using Type = unsigned long accum; + + LIBC_INLINE_VAR static constexpr int SIGN_LEN = 0; + LIBC_INLINE_VAR static constexpr int INTEGRAL_LEN = ULACCUM_IBIT; + LIBC_INLINE_VAR static constexpr int FRACTION_LEN = ULACCUM_FBIT; + LIBC_INLINE_VAR static constexpr int VALUE_LEN = INTEGRAL_LEN + FRACTION_LEN; + LIBC_INLINE_VAR static constexpr int TOTAL_LEN = SIGN_LEN + VALUE_LEN; + + LIBC_INLINE static constexpr Type MIN() { return ULACCUM_MIN; } + LIBC_INLINE static constexpr Type MAX() { return ULACCUM_MAX; } + LIBC_INLINE static constexpr Type ZERO() { return 0.0ULK; } + LIBC_INLINE static constexpr Type EPS() { return ULACCUM_EPSILON; } + LIBC_INLINE static constexpr Type ONE_HALF() { return 0.5ULK; } + LIBC_INLINE static constexpr Type ONE_FOURTH() { return 0.25ULK; } + + using StorageType = typename internal::Storage<TOTAL_LEN>::Type; + using CompType = cpp::make_unsigned_t<StorageType>; +}; + +template <> struct FXRep<short sat fract> : FXRep<short fract> {}; +template <> struct FXRep<sat fract> : FXRep<fract> {}; +template <> struct FXRep<long sat fract> : FXRep<long fract> {}; +template <> +struct FXRep<unsigned short sat fract> : FXRep<unsigned short fract> {}; +template <> struct FXRep<unsigned sat fract> : FXRep<unsigned fract> {}; +template <> +struct FXRep<unsigned long sat fract> : FXRep<unsigned long fract> {}; + +template <> struct FXRep<short sat accum> : FXRep<short accum> {}; +template <> struct FXRep<sat accum> : FXRep<accum> {}; +template <> struct FXRep<long sat accum> : FXRep<long accum> {}; +template <> +struct FXRep<unsigned short sat accum> : FXRep<unsigned short accum> {}; +template <> struct FXRep<unsigned sat accum> : FXRep<unsigned accum> {}; +template <> +struct FXRep<unsigned long sat accum> : FXRep<unsigned long accum> {}; + +} // namespace fixed_point +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_COMPILER_HAS_FIXED_POINT + +#endif // LLVM_LIBC_SRC___SUPPORT_FIXED_POINT_FX_REP_H diff --git a/contrib/llvm-project/libc/src/__support/fixed_point/sqrt.h b/contrib/llvm-project/libc/src/__support/fixed_point/sqrt.h new file mode 100644 index 000000000000..b77319debeea --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/fixed_point/sqrt.h @@ -0,0 +1,269 @@ +//===-- Calculate square root of fixed point numbers. -----*- C++ -*-=========// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FIXEDPOINT_SQRT_H +#define LLVM_LIBC_SRC___SUPPORT_FIXEDPOINT_SQRT_H + +#include "include/llvm-libc-macros/stdfix-macros.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/limits.h" // CHAR_BIT +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY + +#include "fx_rep.h" + +#ifdef LIBC_COMPILER_HAS_FIXED_POINT + +namespace LIBC_NAMESPACE_DECL { +namespace fixed_point { + +namespace internal { + +template <typename T> struct SqrtConfig; + +template <> struct SqrtConfig<unsigned short fract> { + using Type = unsigned short fract; + static constexpr int EXTRA_STEPS = 0; + + // Linear approximation for the initial values, with errors bounded by: + // max(1.5 * 2^-11, eps) + // Generated with Sollya: + // > for i from 4 to 15 do { + // P = fpminimax(sqrt(x), 1, [|8, 8|], [i * 2^-4, (i + 1)*2^-4], + // fixed, absolute); + // print("{", coeff(P, 1), "uhr,", coeff(P, 0), "uhr},"); + // }; + static constexpr Type FIRST_APPROX[12][2] = { + {0x1.e8p-1uhr, 0x1.0cp-2uhr}, {0x1.bap-1uhr, 0x1.28p-2uhr}, + {0x1.94p-1uhr, 0x1.44p-2uhr}, {0x1.74p-1uhr, 0x1.6p-2uhr}, + {0x1.6p-1uhr, 0x1.74p-2uhr}, {0x1.4ep-1uhr, 0x1.88p-2uhr}, + {0x1.3ep-1uhr, 0x1.9cp-2uhr}, {0x1.32p-1uhr, 0x1.acp-2uhr}, + {0x1.22p-1uhr, 0x1.c4p-2uhr}, {0x1.18p-1uhr, 0x1.d4p-2uhr}, + {0x1.08p-1uhr, 0x1.fp-2uhr}, {0x1.04p-1uhr, 0x1.f8p-2uhr}, + }; +}; + +template <> struct SqrtConfig<unsigned fract> { + using Type = unsigned fract; + static constexpr int EXTRA_STEPS = 1; + + // Linear approximation for the initial values, with errors bounded by: + // max(1.5 * 2^-11, eps) + // Generated with Sollya: + // > for i from 4 to 14 do { + // P = fpminimax(sqrt(x), 1, [|16, 16|], [i * 2^-4, (i + 1)*2^-4], + // fixed, absolute); + // print("{", coeff(P, 1), "ur,", coeff(P, 0), "ur},"); + // }; + // For the last interval [15/16, 1), we choose the linear function Q such that + // Q(1) = 1 and Q(15/16) = P(15/16), + // where P is the polynomial generated by Sollya above for [14/16, 15/16]. + // This is to prevent overflow in the last interval [15/16, 1). + static constexpr Type FIRST_APPROX[12][2] = { + {0x1.e378p-1ur, 0x1.0ebp-2ur}, {0x1.b512p-1ur, 0x1.2b94p-2ur}, + {0x1.91fp-1ur, 0x1.45dcp-2ur}, {0x1.7622p-1ur, 0x1.5e24p-2ur}, + {0x1.5f5ap-1ur, 0x1.74e4p-2ur}, {0x1.4c58p-1ur, 0x1.8a4p-2ur}, + {0x1.3c1ep-1ur, 0x1.9e84p-2ur}, {0x1.2e0cp-1ur, 0x1.b1d8p-2ur}, + {0x1.21aap-1ur, 0x1.c468p-2ur}, {0x1.16bap-1ur, 0x1.d62cp-2ur}, + {0x1.0cfp-1ur, 0x1.e74cp-2ur}, {0x1.039p-1ur, 0x1.f8ep-2ur}, + }; +}; + +template <> struct SqrtConfig<unsigned long fract> { + using Type = unsigned long fract; + static constexpr int EXTRA_STEPS = 2; + + // Linear approximation for the initial values, with errors bounded by: + // max(1.5 * 2^-11, eps) + // Generated with Sollya: + // > for i from 4 to 14 do { + // P = fpminimax(sqrt(x), 1, [|32, 32|], [i * 2^-4, (i + 1)*2^-4], + // fixed, absolute); + // print("{", coeff(P, 1), "ulr,", coeff(P, 0), "ulr},"); + // }; + // For the last interval [15/16, 1), we choose the linear function Q such that + // Q(1) = 1 and Q(15/16) = P(15/16), + // where P is the polynomial generated by Sollya above for [14/16, 15/16]. + // This is to prevent overflow in the last interval [15/16, 1). + static constexpr Type FIRST_APPROX[12][2] = { + {0x1.e3779b98p-1ulr, 0x1.0eaff788p-2ulr}, + {0x1.b5167872p-1ulr, 0x1.2b908ad4p-2ulr}, + {0x1.91f195cap-1ulr, 0x1.45da800cp-2ulr}, + {0x1.761ebcb4p-1ulr, 0x1.5e27004cp-2ulr}, + {0x1.5f619986p-1ulr, 0x1.74db933cp-2ulr}, + {0x1.4c583adep-1ulr, 0x1.8a3fbfccp-2ulr}, + {0x1.3c1a591cp-1ulr, 0x1.9e88373cp-2ulr}, + {0x1.2e08545ap-1ulr, 0x1.b1dd2534p-2ulr}, + {0x1.21b05c0ap-1ulr, 0x1.c45e023p-2ulr}, + {0x1.16becd02p-1ulr, 0x1.d624031p-2ulr}, + {0x1.0cf49fep-1ulr, 0x1.e743b844p-2ulr}, + {0x1.038cdfcp-1ulr, 0x1.f8e6408p-2ulr}, + }; +}; + +template <> +struct SqrtConfig<unsigned short accum> : SqrtConfig<unsigned fract> {}; + +template <> +struct SqrtConfig<unsigned accum> : SqrtConfig<unsigned long fract> {}; + +// Integer square root +template <> struct SqrtConfig<unsigned short> { + using OutType = unsigned short accum; + using FracType = unsigned fract; + // For fast-but-less-accurate version + using FastFracType = unsigned short fract; + using HalfType = unsigned char; +}; + +template <> struct SqrtConfig<unsigned int> { + using OutType = unsigned accum; + using FracType = unsigned long fract; + // For fast-but-less-accurate version + using FastFracType = unsigned fract; + using HalfType = unsigned short; +}; + +// TODO: unsigned long accum type is 64-bit, and will need 64-bit fract type. +// Probably we will use DyadicFloat<64> for intermediate computations instead. + +} // namespace internal + +// Core computation for sqrt with normalized inputs (0.25 <= x < 1). +template <typename Config> +LIBC_INLINE constexpr typename Config::Type +sqrt_core(typename Config::Type x_frac) { + using FracType = typename Config::Type; + using FXRep = FXRep<FracType>; + using StorageType = typename FXRep::StorageType; + // Exact case: + if (x_frac == FXRep::ONE_FOURTH()) + return FXRep::ONE_HALF(); + + // Use use Newton method to approximate sqrt(a): + // x_{n + 1} = 1/2 (x_n + a / x_n) + // For the initial values, we choose x_0 + + // Use the leading 4 bits to do look up for sqrt(x). + // After normalization, 0.25 <= x_frac < 1, so the leading 4 bits of x_frac + // are between 0b0100 and 0b1111. Hence the lookup table only needs 12 + // entries, and we can get the index by subtracting the leading 4 bits of + // x_frac by 4 = 0b0100. + StorageType x_bit = cpp::bit_cast<StorageType>(x_frac); + int index = (static_cast<int>(x_bit >> (FXRep::TOTAL_LEN - 4))) - 4; + FracType a = Config::FIRST_APPROX[index][0]; + FracType b = Config::FIRST_APPROX[index][1]; + + // Initial approximation step. + // Estimated error bounds: | r - sqrt(x_frac) | < max(1.5 * 2^-11, eps). + FracType r = a * x_frac + b; + + // Further Newton-method iterations for square-root: + // x_{n + 1} = 0.5 * (x_n + a / x_n) + // We distribute and do the multiplication by 0.5 first to avoid overflow. + // TODO: Investigate the performance and accuracy of using division-free + // iterations from: + // Blanchard, J. D. and Chamberland, M., "Newton's Method Without Division", + // The American Mathematical Monthly (2023). + // https://chamberland.math.grinnell.edu/papers/newton.pdf + for (int i = 0; i < Config::EXTRA_STEPS; ++i) + r = (r >> 1) + (x_frac >> 1) / r; + + return r; +} + +template <typename T> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_fixed_point_v<T>, T> sqrt(T x) { + using BitType = typename FXRep<T>::StorageType; + BitType x_bit = cpp::bit_cast<BitType>(x); + + if (LIBC_UNLIKELY(x_bit == 0)) + return FXRep<T>::ZERO(); + + int leading_zeros = cpp::countl_zero(x_bit); + constexpr int STORAGE_LENGTH = sizeof(BitType) * CHAR_BIT; + constexpr int EXP_ADJUSTMENT = STORAGE_LENGTH - FXRep<T>::FRACTION_LEN - 1; + // x_exp is the real exponent of the leading bit of x. + int x_exp = EXP_ADJUSTMENT - leading_zeros; + int shift = EXP_ADJUSTMENT - 1 - (x_exp & (~1)); + // Normalize. + x_bit <<= shift; + using FracType = typename internal::SqrtConfig<T>::Type; + FracType x_frac = cpp::bit_cast<FracType>(x_bit); + + // Compute sqrt(x_frac) using Newton-method. + FracType r = sqrt_core<internal::SqrtConfig<T>>(x_frac); + + // Re-scaling + r >>= EXP_ADJUSTMENT - (x_exp >> 1); + + // Return result. + return cpp::bit_cast<T>(r); +} + +// Integer square root - Accurate version: +// Absolute errors < 2^(-fraction length). +template <typename T> +LIBC_INLINE constexpr typename internal::SqrtConfig<T>::OutType isqrt(T x) { + using OutType = typename internal::SqrtConfig<T>::OutType; + using FracType = typename internal::SqrtConfig<T>::FracType; + + if (x == 0) + return FXRep<OutType>::ZERO(); + + // Normalize the leading bits to the first two bits. + // Shift and then Bit cast x to x_frac gives us: + // x = 2^(FRACTION_LEN + 1 - shift) * x_frac; + int leading_zeros = cpp::countl_zero(x); + int shift = ((leading_zeros >> 1) << 1); + x <<= shift; + // Convert to frac type and compute square root. + FracType x_frac = cpp::bit_cast<FracType>(x); + FracType r = sqrt_core<internal::SqrtConfig<FracType>>(x_frac); + // To rescale back to the OutType (Accum) + r >>= (shift >> 1); + + return cpp::bit_cast<OutType>(r); +} + +// Integer square root - Fast but less accurate version: +// Relative errors < 2^(-fraction length). +template <typename T> +LIBC_INLINE constexpr typename internal::SqrtConfig<T>::OutType +isqrt_fast(T x) { + using OutType = typename internal::SqrtConfig<T>::OutType; + using FracType = typename internal::SqrtConfig<T>::FastFracType; + using StorageType = typename FXRep<FracType>::StorageType; + + if (x == 0) + return FXRep<OutType>::ZERO(); + + // Normalize the leading bits to the first two bits. + // Shift and then Bit cast x to x_frac gives us: + // x = 2^(FRACTION_LEN + 1 - shift) * x_frac; + int leading_zeros = cpp::countl_zero(x); + int shift = (leading_zeros & (~1)); + x <<= shift; + // Convert to frac type and compute square root. + FracType x_frac = cpp::bit_cast<FracType>( + static_cast<StorageType>(x >> FXRep<FracType>::FRACTION_LEN)); + OutType r = + static_cast<OutType>(sqrt_core<internal::SqrtConfig<FracType>>(x_frac)); + // To rescale back to the OutType (Accum) + r <<= (FXRep<OutType>::INTEGRAL_LEN - (shift >> 1)); + return cpp::bit_cast<OutType>(r); +} + +} // namespace fixed_point +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_COMPILER_HAS_FIXED_POINT + +#endif // LLVM_LIBC_SRC___SUPPORT_FIXEDPOINT_SQRT_H diff --git a/contrib/llvm-project/libc/src/__support/fixedvector.h b/contrib/llvm-project/libc/src/__support/fixedvector.h new file mode 100644 index 000000000000..34601f86dc01 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/fixedvector.h @@ -0,0 +1,127 @@ +//===-- A data structure for a fixed capacity data store --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FIXEDVECTOR_H +#define LLVM_LIBC_SRC___SUPPORT_FIXEDVECTOR_H + +#include "src/__support/CPP/array.h" +#include "src/__support/CPP/iterator.h" +#include "src/__support/libc_assert.h" +#include "src/__support/macros/config.h" +#include "src/string/memory_utils/inline_memset.h" + +namespace LIBC_NAMESPACE_DECL { + +// A fixed size data store backed by an underlying cpp::array data structure. It +// supports vector like API but is not resizable like a vector. +template <typename T, size_t CAPACITY> class FixedVector { + cpp::array<T, CAPACITY> store; + size_t item_count = 0; + +public: + LIBC_INLINE constexpr FixedVector() = default; + + using iterator = typename cpp::array<T, CAPACITY>::iterator; + LIBC_INLINE constexpr FixedVector(iterator begin, iterator end) + : store{}, item_count{} { + LIBC_ASSERT(begin + CAPACITY >= end); + for (; begin != end; ++begin) + push_back(*begin); + } + + using const_iterator = typename cpp::array<T, CAPACITY>::const_iterator; + LIBC_INLINE constexpr FixedVector(const_iterator begin, const_iterator end) + : store{}, item_count{} { + LIBC_ASSERT(begin + CAPACITY >= end); + for (; begin != end; ++begin) + push_back(*begin); + } + + LIBC_INLINE constexpr FixedVector(size_t count, const T &value) + : store{}, item_count{} { + LIBC_ASSERT(count <= CAPACITY); + for (size_t i = 0; i < count; ++i) + push_back(value); + } + + LIBC_INLINE constexpr bool push_back(const T &obj) { + if (item_count == CAPACITY) + return false; + store[item_count] = obj; + ++item_count; + return true; + } + + LIBC_INLINE constexpr const T &back() const { + LIBC_ASSERT(!empty()); + return store[item_count - 1]; + } + + LIBC_INLINE constexpr T &back() { + LIBC_ASSERT(!empty()); + return store[item_count - 1]; + } + + LIBC_INLINE constexpr bool pop_back() { + if (item_count == 0) + return false; + inline_memset(&store[item_count - 1], 0, sizeof(T)); + --item_count; + return true; + } + + LIBC_INLINE constexpr T &operator[](size_t idx) { + LIBC_ASSERT(idx < item_count); + return store[idx]; + } + + LIBC_INLINE constexpr const T &operator[](size_t idx) const { + LIBC_ASSERT(idx < item_count); + return store[idx]; + } + + LIBC_INLINE constexpr bool empty() const { return item_count == 0; } + + LIBC_INLINE constexpr size_t size() const { return item_count; } + + // Empties the store for all practical purposes. + LIBC_INLINE constexpr void reset() { + inline_memset(store.data(), 0, sizeof(T) * item_count); + item_count = 0; + } + + // This static method does not free up the resources held by |store|, + // say by calling `free` or something similar. It just does the equivalent + // of the `reset` method. Considering that FixedVector is of fixed storage, + // a `destroy` method like this should not be required. However, FixedVector + // is used in a few places as an alternate for data structures which use + // dynamically allocated storate. So, the `destroy` method like this + // matches the `destroy` API of those other data structures so that users + // can easily swap one data structure for the other. + LIBC_INLINE static void destroy(FixedVector<T, CAPACITY> *store) { + store->reset(); + } + + using reverse_iterator = typename cpp::array<T, CAPACITY>::reverse_iterator; + LIBC_INLINE constexpr reverse_iterator rbegin() { + return reverse_iterator{&store[item_count]}; + } + LIBC_INLINE constexpr reverse_iterator rend() { return store.rend(); } + + LIBC_INLINE constexpr iterator begin() { return store.begin(); } + LIBC_INLINE constexpr iterator end() { return iterator{&store[item_count]}; } + + LIBC_INLINE constexpr const_iterator begin() const { return store.begin(); } + LIBC_INLINE constexpr const_iterator end() const { + return const_iterator{&store[item_count]}; + } +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FIXEDVECTOR_H diff --git a/contrib/llvm-project/libc/src/__support/float_to_string.h b/contrib/llvm-project/libc/src/__support/float_to_string.h new file mode 100644 index 000000000000..d88bf844b15a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/float_to_string.h @@ -0,0 +1,837 @@ +//===-- Utilities to convert floating point values to string ----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FLOAT_TO_STRING_H +#define LLVM_LIBC_SRC___SUPPORT_FLOAT_TO_STRING_H + +#include <stdint.h> + +#include "src/__support/CPP/limits.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/dyadic_float.h" +#include "src/__support/big_int.h" +#include "src/__support/common.h" +#include "src/__support/libc_assert.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/sign.h" + +// This file has 5 compile-time flags to allow the user to configure the float +// to string behavior. These were used to explore tradeoffs during the design +// phase, and can still be used to gain specific properties. Unless you +// specifically know what you're doing, you should leave all these flags off. + +// LIBC_COPT_FLOAT_TO_STR_NO_SPECIALIZE_LD +// This flag disables the separate long double conversion implementation. It is +// not based on the Ryu algorithm, instead generating the digits by +// multiplying/dividing the written-out number by 10^9 to get blocks. It's +// significantly faster than INT_CALC, only about 10x slower than MEGA_TABLE, +// and is small in binary size. Its downside is that it always calculates all +// of the digits above the decimal point, making it inefficient for %e calls +// with large exponents. This specialization overrides other flags, so this +// flag must be set for other flags to effect the long double behavior. + +// LIBC_COPT_FLOAT_TO_STR_USE_MEGA_LONG_DOUBLE_TABLE +// The Mega Table is ~5 megabytes when compiled. It lists the constants needed +// to perform the Ryu Printf algorithm (described below) for all long double +// values. This makes it extremely fast for both doubles and long doubles, in +// exchange for large binary size. + +// LIBC_COPT_FLOAT_TO_STR_USE_DYADIC_FLOAT +// Dyadic floats are software floating point numbers, and their accuracy can be +// as high as necessary. This option uses 256 bit dyadic floats to calculate +// the table values that Ryu Printf needs. This is reasonably fast and very +// small compared to the Mega Table, but the 256 bit floats only give accurate +// results for the first ~50 digits of the output. In practice this shouldn't +// be a problem since long doubles are only accurate for ~35 digits, but the +// trailing values all being 0s may cause brittle tests to fail. + +// LIBC_COPT_FLOAT_TO_STR_USE_INT_CALC +// Integer Calculation uses wide integers to do the calculations for the Ryu +// Printf table, which is just as accurate as the Mega Table without requiring +// as much code size. These integers can be very large (~32KB at max, though +// always on the stack) to handle the edges of the long double range. They are +// also very slow, taking multiple seconds on a powerful CPU to calculate the +// values at the end of the range. If no flag is set, this is used for long +// doubles, the flag only changes the double behavior. + +// LIBC_COPT_FLOAT_TO_STR_NO_TABLE +// This flag doesn't change the actual calculation method, instead it is used +// to disable the normal Ryu Printf table for configurations that don't use any +// table at all. + +// Default Config: +// If no flags are set, doubles use the normal (and much more reasonably sized) +// Ryu Printf table and long doubles use their specialized implementation. This +// provides good performance and binary size. + +#ifdef LIBC_COPT_FLOAT_TO_STR_USE_MEGA_LONG_DOUBLE_TABLE +#include "src/__support/ryu_long_double_constants.h" +#elif !defined(LIBC_COPT_FLOAT_TO_STR_NO_TABLE) +#include "src/__support/ryu_constants.h" +#else +constexpr size_t IDX_SIZE = 1; +constexpr size_t MID_INT_SIZE = 192; +#endif + +// This implementation is based on the Ryu Printf algorithm by Ulf Adams: +// Ulf Adams. 2019. Ryū revisited: printf floating point conversion. +// Proc. ACM Program. Lang. 3, OOPSLA, Article 169 (October 2019), 23 pages. +// https://doi.org/10.1145/3360595 + +// This version is modified to require significantly less memory (it doesn't use +// a large buffer to store the result). + +// The general concept of this algorithm is as follows: +// We want to calculate a 9 digit segment of a floating point number using this +// formula: floor((mantissa * 2^exponent)/10^i) % 10^9. +// To do so normally would involve large integers (~1000 bits for doubles), so +// we use a shortcut. We can avoid calculating 2^exponent / 10^i by using a +// lookup table. The resulting intermediate value needs to be about 192 bits to +// store the result with enough precision. Since this is all being done with +// integers for appropriate precision, we would run into a problem if +// i > exponent since then 2^exponent / 10^i would be less than 1. To correct +// for this, the actual calculation done is 2^(exponent + c) / 10^i, and then +// when multiplying by the mantissa we reverse this by dividing by 2^c, like so: +// floor((mantissa * table[exponent][i])/(2^c)) % 10^9. +// This gives a 9 digit value, which is small enough to fit in a 32 bit integer, +// and that integer is converted into a string as normal, and called a block. In +// this implementation, the most recent block is buffered, so that if rounding +// is necessary the block can be adjusted before being written to the output. +// Any block that is all 9s adds one to the max block counter and doesn't clear +// the buffer because they can cause the block above them to be rounded up. + +namespace LIBC_NAMESPACE_DECL { + +using BlockInt = uint32_t; +constexpr uint32_t BLOCK_SIZE = 9; +constexpr uint64_t EXP5_9 = 1953125; +constexpr uint64_t EXP10_9 = 1000000000; + +using FPBits = fputil::FPBits<long double>; + +// Larger numbers prefer a slightly larger constant than is used for the smaller +// numbers. +constexpr size_t CALC_SHIFT_CONST = 128; + +namespace internal { + +// Returns floor(log_10(2^e)); requires 0 <= e <= 42039. +LIBC_INLINE constexpr uint32_t log10_pow2(uint64_t e) { + LIBC_ASSERT(e <= 42039 && + "Incorrect exponent to perform log10_pow2 approximation."); + // This approximation is based on the float value for log_10(2). It first + // gives an incorrect result for our purposes at 42039 (well beyond the 16383 + // maximum for long doubles). + + // To get these constants I first evaluated log_10(2) to get an approximation + // of 0.301029996. Next I passed that value through a string to double + // conversion to get an explicit mantissa of 0x13441350fbd738 and an exponent + // of -2 (which becomes -54 when we shift the mantissa to be a non-fractional + // number). Next I shifted the mantissa right 12 bits to create more space for + // the multiplication result, adding 12 to the exponent to compensate. To + // check that this approximation works for our purposes I used the following + // python code: + // for i in range(16384): + // if(len(str(2**i)) != (((i*0x13441350fbd)>>42)+1)): + // print(i) + // The reason we add 1 is because this evaluation truncates the result, giving + // us the floor, whereas counting the digits of the power of 2 gives us the + // ceiling. With a similar loop I checked the maximum valid value and found + // 42039. + return static_cast<uint32_t>((e * 0x13441350fbdll) >> 42); +} + +// Same as above, but with different constants. +LIBC_INLINE constexpr uint32_t log2_pow5(uint64_t e) { + return static_cast<uint32_t>((e * 0x12934f0979bll) >> 39); +} + +// Returns 1 + floor(log_10(2^e). This could technically be off by 1 if any +// power of 2 was also a power of 10, but since that doesn't exist this is +// always accurate. This is used to calculate the maximum number of base-10 +// digits a given e-bit number could have. +LIBC_INLINE constexpr uint32_t ceil_log10_pow2(uint32_t e) { + return log10_pow2(e) + 1; +} + +LIBC_INLINE constexpr uint32_t div_ceil(uint32_t num, uint32_t denom) { + return (num + (denom - 1)) / denom; +} + +// Returns the maximum number of 9 digit blocks a number described by the given +// index (which is ceil(exponent/16)) and mantissa width could need. +LIBC_INLINE constexpr uint32_t length_for_num(uint32_t idx, + uint32_t mantissa_width) { + return div_ceil(ceil_log10_pow2(idx) + ceil_log10_pow2(mantissa_width + 1), + BLOCK_SIZE); +} + +// The formula for the table when i is positive (or zero) is as follows: +// floor(10^(-9i) * 2^(e + c_1) + 1) % (10^9 * 2^c_1) +// Rewritten slightly we get: +// floor(5^(-9i) * 2^(e + c_1 - 9i) + 1) % (10^9 * 2^c_1) + +// TODO: Fix long doubles (needs bigger table or alternate algorithm.) +// Currently the table values are generated, which is very slow. +template <size_t INT_SIZE> +LIBC_INLINE constexpr UInt<MID_INT_SIZE> get_table_positive(int exponent, + size_t i) { + // INT_SIZE is the size of int that is used for the internal calculations of + // this function. It should be large enough to hold 2^(exponent+constant), so + // ~1000 for double and ~16000 for long double. Be warned that the time + // complexity of exponentiation is O(n^2 * log_2(m)) where n is the number of + // bits in the number being exponentiated and m is the exponent. + const int shift_amount = + static_cast<int>(exponent + CALC_SHIFT_CONST - (BLOCK_SIZE * i)); + if (shift_amount < 0) { + return 1; + } + UInt<INT_SIZE> num(0); + // MOD_SIZE is one of the limiting factors for how big the constant argument + // can get, since it needs to be small enough to fit in the result UInt, + // otherwise we'll get truncation on return. + constexpr UInt<INT_SIZE> MOD_SIZE = + (UInt<INT_SIZE>(EXP10_9) + << (CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0))); + + num = UInt<INT_SIZE>(1) << (shift_amount); + if (i > 0) { + UInt<INT_SIZE> fives(EXP5_9); + fives.pow_n(i); + num = num / fives; + } + + num = num + 1; + if (num > MOD_SIZE) { + auto rem = num.div_uint_half_times_pow_2( + EXP10_9, CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0)) + .value(); + num = rem; + } + return num; +} + +template <size_t INT_SIZE> +LIBC_INLINE UInt<MID_INT_SIZE> get_table_positive_df(int exponent, size_t i) { + static_assert(INT_SIZE == 256, + "Only 256 is supported as an int size right now."); + // This version uses dyadic floats with 256 bit mantissas to perform the same + // calculation as above. Due to floating point imprecision it is only accurate + // for the first 50 digits, but it's much faster. Since even 128 bit long + // doubles are only accurate to ~35 digits, the 50 digits of accuracy are + // enough for these floats to be converted back and forth safely. This is + // ideal for avoiding the size of the long double table. + const int shift_amount = + static_cast<int>(exponent + CALC_SHIFT_CONST - (9 * i)); + if (shift_amount < 0) { + return 1; + } + fputil::DyadicFloat<INT_SIZE> num(Sign::POS, 0, 1); + constexpr UInt<INT_SIZE> MOD_SIZE = + (UInt<INT_SIZE>(EXP10_9) + << (CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0))); + + constexpr UInt<INT_SIZE> FIVE_EXP_MINUS_NINE_MANT{ + {0xf387295d242602a7, 0xfdd7645e011abac9, 0x31680a88f8953030, + 0x89705f4136b4a597}}; + + static const fputil::DyadicFloat<INT_SIZE> FIVE_EXP_MINUS_NINE( + Sign::POS, -276, FIVE_EXP_MINUS_NINE_MANT); + + if (i > 0) { + fputil::DyadicFloat<INT_SIZE> fives = + fputil::pow_n(FIVE_EXP_MINUS_NINE, static_cast<uint32_t>(i)); + num = fives; + } + num = mul_pow_2(num, shift_amount); + + // Adding one is part of the formula. + UInt<INT_SIZE> int_num = num.as_mantissa_type() + 1; + if (int_num > MOD_SIZE) { + auto rem = + int_num + .div_uint_half_times_pow_2( + EXP10_9, CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0)) + .value(); + int_num = rem; + } + + UInt<MID_INT_SIZE> result = int_num; + + return result; +} + +// The formula for the table when i is negative (or zero) is as follows: +// floor(10^(-9i) * 2^(c_0 - e)) % (10^9 * 2^c_0) +// Since we know i is always negative, we just take it as unsigned and treat it +// as negative. We do the same with exponent, while they're both always negative +// in theory, in practice they're converted to positive for simpler +// calculations. +// The formula being used looks more like this: +// floor(10^(9*(-i)) * 2^(c_0 + (-e))) % (10^9 * 2^c_0) +template <size_t INT_SIZE> +LIBC_INLINE UInt<MID_INT_SIZE> get_table_negative(int exponent, size_t i) { + int shift_amount = CALC_SHIFT_CONST - exponent; + UInt<INT_SIZE> num(1); + constexpr UInt<INT_SIZE> MOD_SIZE = + (UInt<INT_SIZE>(EXP10_9) + << (CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0))); + + size_t ten_blocks = i; + size_t five_blocks = 0; + if (shift_amount < 0) { + int block_shifts = (-shift_amount) / static_cast<int>(BLOCK_SIZE); + if (block_shifts < static_cast<int>(ten_blocks)) { + ten_blocks = ten_blocks - block_shifts; + five_blocks = block_shifts; + shift_amount = shift_amount + (block_shifts * BLOCK_SIZE); + } else { + ten_blocks = 0; + five_blocks = i; + shift_amount = shift_amount + (static_cast<int>(i) * BLOCK_SIZE); + } + } + + if (five_blocks > 0) { + UInt<INT_SIZE> fives(EXP5_9); + fives.pow_n(five_blocks); + num = fives; + } + if (ten_blocks > 0) { + UInt<INT_SIZE> tens(EXP10_9); + tens.pow_n(ten_blocks); + if (five_blocks <= 0) { + num = tens; + } else { + num *= tens; + } + } + + if (shift_amount > 0) { + num = num << shift_amount; + } else { + num = num >> (-shift_amount); + } + if (num > MOD_SIZE) { + auto rem = num.div_uint_half_times_pow_2( + EXP10_9, CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0)) + .value(); + num = rem; + } + return num; +} + +template <size_t INT_SIZE> +LIBC_INLINE UInt<MID_INT_SIZE> get_table_negative_df(int exponent, size_t i) { + static_assert(INT_SIZE == 256, + "Only 256 is supported as an int size right now."); + // This version uses dyadic floats with 256 bit mantissas to perform the same + // calculation as above. Due to floating point imprecision it is only accurate + // for the first 50 digits, but it's much faster. Since even 128 bit long + // doubles are only accurate to ~35 digits, the 50 digits of accuracy are + // enough for these floats to be converted back and forth safely. This is + // ideal for avoiding the size of the long double table. + + int shift_amount = CALC_SHIFT_CONST - exponent; + + fputil::DyadicFloat<INT_SIZE> num(Sign::POS, 0, 1); + constexpr UInt<INT_SIZE> MOD_SIZE = + (UInt<INT_SIZE>(EXP10_9) + << (CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0))); + + constexpr UInt<INT_SIZE> TEN_EXP_NINE_MANT(EXP10_9); + + static const fputil::DyadicFloat<INT_SIZE> TEN_EXP_NINE(Sign::POS, 0, + TEN_EXP_NINE_MANT); + + if (i > 0) { + fputil::DyadicFloat<INT_SIZE> tens = + fputil::pow_n(TEN_EXP_NINE, static_cast<uint32_t>(i)); + num = tens; + } + num = mul_pow_2(num, shift_amount); + + UInt<INT_SIZE> int_num = num.as_mantissa_type(); + if (int_num > MOD_SIZE) { + auto rem = + int_num + .div_uint_half_times_pow_2( + EXP10_9, CALC_SHIFT_CONST + (IDX_SIZE > 1 ? IDX_SIZE : 0)) + .value(); + int_num = rem; + } + + UInt<MID_INT_SIZE> result = int_num; + + return result; +} + +LIBC_INLINE uint32_t mul_shift_mod_1e9(const FPBits::StorageType mantissa, + const UInt<MID_INT_SIZE> &large, + const int32_t shift_amount) { + // make sure the number of bits is always divisible by 64 + UInt<internal::div_ceil(MID_INT_SIZE + FPBits::STORAGE_LEN, 64) * 64> val( + large); + val = (val * mantissa) >> shift_amount; + return static_cast<uint32_t>( + val.div_uint_half_times_pow_2(static_cast<uint32_t>(EXP10_9), 0).value()); +} + +} // namespace internal + +// Convert floating point values to their string representation. +// Because the result may not fit in a reasonably sized array, the caller must +// request blocks of digits and convert them from integers to strings themself. +// Blocks contain the most digits that can be stored in an BlockInt. This is 9 +// digits for a 32 bit int and 18 digits for a 64 bit int. +// The intended use pattern is to create a FloatToString object of the +// appropriate type, then call get_positive_blocks to get an approximate number +// of blocks there are before the decimal point. Now the client code can start +// calling get_positive_block in a loop from the number of positive blocks to +// zero. This will give all digits before the decimal point. Then the user can +// start calling get_negative_block in a loop from 0 until the number of digits +// they need is reached. As an optimization, the client can use +// zero_blocks_after_point to find the number of blocks that are guaranteed to +// be zero after the decimal point and before the non-zero digits. Additionally, +// is_lowest_block will return if the current block is the lowest non-zero +// block. +template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0> +class FloatToString { + fputil::FPBits<T> float_bits; + int exponent; + FPBits::StorageType mantissa; + + static constexpr int FRACTION_LEN = fputil::FPBits<T>::FRACTION_LEN; + static constexpr int EXP_BIAS = fputil::FPBits<T>::EXP_BIAS; + +public: + LIBC_INLINE constexpr FloatToString(T init_float) : float_bits(init_float) { + exponent = float_bits.get_explicit_exponent(); + mantissa = float_bits.get_explicit_mantissa(); + + // Adjust for the width of the mantissa. + exponent -= FRACTION_LEN; + } + + LIBC_INLINE constexpr bool is_nan() { return float_bits.is_nan(); } + LIBC_INLINE constexpr bool is_inf() { return float_bits.is_inf(); } + LIBC_INLINE constexpr bool is_inf_or_nan() { + return float_bits.is_inf_or_nan(); + } + + // get_block returns an integer that represents the digits in the requested + // block. + LIBC_INLINE constexpr BlockInt get_positive_block(int block_index) { + if (exponent >= -FRACTION_LEN) { + // idx is ceil(exponent/16) or 0 if exponent is negative. This is used to + // find the coarse section of the POW10_SPLIT table that will be used to + // calculate the 9 digit window, as well as some other related values. + const uint32_t idx = + exponent < 0 + ? 0 + : static_cast<uint32_t>(exponent + (IDX_SIZE - 1)) / IDX_SIZE; + + // shift_amount = -(c0 - exponent) = c_0 + 16 * ceil(exponent/16) - + // exponent + + const uint32_t pos_exp = idx * IDX_SIZE; + + UInt<MID_INT_SIZE> val; + +#if defined(LIBC_COPT_FLOAT_TO_STR_USE_DYADIC_FLOAT) + // ----------------------- DYADIC FLOAT CALC MODE ------------------------ + const int32_t SHIFT_CONST = CALC_SHIFT_CONST; + val = internal::get_table_positive_df<256>(IDX_SIZE * idx, block_index); +#elif defined(LIBC_COPT_FLOAT_TO_STR_USE_INT_CALC) + + // ---------------------------- INT CALC MODE ---------------------------- + const int32_t SHIFT_CONST = CALC_SHIFT_CONST; + const uint64_t MAX_POW_2_SIZE = + pos_exp + CALC_SHIFT_CONST - (BLOCK_SIZE * block_index); + const uint64_t MAX_POW_5_SIZE = + internal::log2_pow5(BLOCK_SIZE * block_index); + const uint64_t MAX_INT_SIZE = + (MAX_POW_2_SIZE > MAX_POW_5_SIZE) ? MAX_POW_2_SIZE : MAX_POW_5_SIZE; + + if (MAX_INT_SIZE < 1024) { + val = internal::get_table_positive<1024>(pos_exp, block_index); + } else if (MAX_INT_SIZE < 2048) { + val = internal::get_table_positive<2048>(pos_exp, block_index); + } else if (MAX_INT_SIZE < 4096) { + val = internal::get_table_positive<4096>(pos_exp, block_index); + } else if (MAX_INT_SIZE < 8192) { + val = internal::get_table_positive<8192>(pos_exp, block_index); + } else if (MAX_INT_SIZE < 16384) { + val = internal::get_table_positive<16384>(pos_exp, block_index); + } else { + val = internal::get_table_positive<16384 + 128>(pos_exp, block_index); + } +#else + // ----------------------------- TABLE MODE ------------------------------ + const int32_t SHIFT_CONST = TABLE_SHIFT_CONST; + + val = POW10_SPLIT[POW10_OFFSET[idx] + block_index]; +#endif + const uint32_t shift_amount = SHIFT_CONST + pos_exp - exponent; + + const BlockInt digits = + internal::mul_shift_mod_1e9(mantissa, val, (int32_t)(shift_amount)); + return digits; + } else { + return 0; + } + } + + LIBC_INLINE constexpr BlockInt get_negative_block(int block_index) { + if (exponent < 0) { + const int32_t idx = -exponent / static_cast<int32_t>(IDX_SIZE); + + UInt<MID_INT_SIZE> val; + + const uint32_t pos_exp = static_cast<uint32_t>(idx * IDX_SIZE); + +#if defined(LIBC_COPT_FLOAT_TO_STR_USE_DYADIC_FLOAT) + // ----------------------- DYADIC FLOAT CALC MODE ------------------------ + const int32_t SHIFT_CONST = CALC_SHIFT_CONST; + val = internal::get_table_negative_df<256>(pos_exp, block_index + 1); +#elif defined(LIBC_COPT_FLOAT_TO_STR_USE_INT_CALC) + // ---------------------------- INT CALC MODE ---------------------------- + const int32_t SHIFT_CONST = CALC_SHIFT_CONST; + + const uint64_t NUM_FIVES = (block_index + 1) * BLOCK_SIZE; + // Round MAX_INT_SIZE up to the nearest 64 (adding 1 because log2_pow5 + // implicitly rounds down). + const uint64_t MAX_INT_SIZE = + ((internal::log2_pow5(NUM_FIVES) / 64) + 1) * 64; + + if (MAX_INT_SIZE < 1024) { + val = internal::get_table_negative<1024>(pos_exp, block_index + 1); + } else if (MAX_INT_SIZE < 2048) { + val = internal::get_table_negative<2048>(pos_exp, block_index + 1); + } else if (MAX_INT_SIZE < 4096) { + val = internal::get_table_negative<4096>(pos_exp, block_index + 1); + } else if (MAX_INT_SIZE < 8192) { + val = internal::get_table_negative<8192>(pos_exp, block_index + 1); + } else if (MAX_INT_SIZE < 16384) { + val = internal::get_table_negative<16384>(pos_exp, block_index + 1); + } else { + val = internal::get_table_negative<16384 + 8192>(pos_exp, + block_index + 1); + } +#else + // ----------------------------- TABLE MODE ------------------------------ + // if the requested block is zero + const int32_t SHIFT_CONST = TABLE_SHIFT_CONST; + if (block_index < MIN_BLOCK_2[idx]) { + return 0; + } + const uint32_t p = POW10_OFFSET_2[idx] + block_index - MIN_BLOCK_2[idx]; + // If every digit after the requested block is zero. + if (p >= POW10_OFFSET_2[idx + 1]) { + return 0; + } + + val = POW10_SPLIT_2[p]; +#endif + const int32_t shift_amount = + SHIFT_CONST + (-exponent - static_cast<int32_t>(pos_exp)); + BlockInt digits = + internal::mul_shift_mod_1e9(mantissa, val, shift_amount); + return digits; + } else { + return 0; + } + } + + LIBC_INLINE constexpr BlockInt get_block(int block_index) { + if (block_index >= 0) { + return get_positive_block(block_index); + } else { + return get_negative_block(-1 - block_index); + } + } + + LIBC_INLINE constexpr size_t get_positive_blocks() { + if (exponent < -FRACTION_LEN) + return 0; + const uint32_t idx = + exponent < 0 + ? 0 + : static_cast<uint32_t>(exponent + (IDX_SIZE - 1)) / IDX_SIZE; + return internal::length_for_num(idx * IDX_SIZE, FRACTION_LEN); + } + + // This takes the index of a block after the decimal point (a negative block) + // and return if it's sure that all of the digits after it are zero. + LIBC_INLINE constexpr bool is_lowest_block(size_t negative_block_index) { +#ifdef LIBC_COPT_FLOAT_TO_STR_NO_TABLE + // The decimal representation of 2**(-i) will have exactly i digits after + // the decimal point. + int num_requested_digits = + static_cast<int>((negative_block_index + 1) * BLOCK_SIZE); + + return num_requested_digits > -exponent; +#else + const int32_t idx = -exponent / static_cast<int32_t>(IDX_SIZE); + const size_t p = + POW10_OFFSET_2[idx] + negative_block_index - MIN_BLOCK_2[idx]; + // If the remaining digits are all 0, then this is the lowest block. + return p >= POW10_OFFSET_2[idx + 1]; +#endif + } + + LIBC_INLINE constexpr size_t zero_blocks_after_point() { +#ifdef LIBC_COPT_FLOAT_TO_STR_NO_TABLE + if (exponent < -FRACTION_LEN) { + const int pos_exp = -exponent - 1; + const uint32_t pos_idx = + static_cast<uint32_t>(pos_exp + (IDX_SIZE - 1)) / IDX_SIZE; + const int32_t pos_len = ((internal::ceil_log10_pow2(pos_idx * IDX_SIZE) - + internal::ceil_log10_pow2(FRACTION_LEN + 1)) / + BLOCK_SIZE) - + 1; + return static_cast<uint32_t>(pos_len > 0 ? pos_len : 0); + } + return 0; +#else + return MIN_BLOCK_2[-exponent / static_cast<int32_t>(IDX_SIZE)]; +#endif + } +}; + +#if !defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) && \ + !defined(LIBC_COPT_FLOAT_TO_STR_NO_SPECIALIZE_LD) +// --------------------------- LONG DOUBLE FUNCTIONS --------------------------- + +// this algorithm will work exactly the same for 80 bit and 128 bit long +// doubles. They have the same max exponent, but even if they didn't the +// constants should be calculated to be correct for any provided floating point +// type. + +template <> class FloatToString<long double> { + fputil::FPBits<long double> float_bits; + bool is_negative = 0; + int exponent = 0; + FPBits::StorageType mantissa = 0; + + static constexpr int FRACTION_LEN = fputil::FPBits<long double>::FRACTION_LEN; + static constexpr int EXP_BIAS = fputil::FPBits<long double>::EXP_BIAS; + static constexpr size_t UINT_WORD_SIZE = 64; + + static constexpr size_t FLOAT_AS_INT_WIDTH = + internal::div_ceil(fputil::FPBits<long double>::MAX_BIASED_EXPONENT - + FPBits::EXP_BIAS, + UINT_WORD_SIZE) * + UINT_WORD_SIZE; + static constexpr size_t EXTRA_INT_WIDTH = + internal::div_ceil(sizeof(long double) * CHAR_BIT, UINT_WORD_SIZE) * + UINT_WORD_SIZE; + + using wide_int = UInt<FLOAT_AS_INT_WIDTH + EXTRA_INT_WIDTH>; + + // float_as_fixed represents the floating point number as a fixed point number + // with the point EXTRA_INT_WIDTH bits from the left of the number. This can + // store any number with a negative exponent. + wide_int float_as_fixed = 0; + int int_block_index = 0; + + static constexpr size_t BLOCK_BUFFER_LEN = + internal::div_ceil(internal::log10_pow2(FLOAT_AS_INT_WIDTH), BLOCK_SIZE) + + 1; + BlockInt block_buffer[BLOCK_BUFFER_LEN] = {0}; + size_t block_buffer_valid = 0; + + template <size_t Bits> + LIBC_INLINE static constexpr BlockInt grab_digits(UInt<Bits> &int_num) { + auto wide_result = int_num.div_uint_half_times_pow_2(EXP5_9, 9); + // the optional only comes into effect when dividing by 0, which will + // never happen here. Thus, we just assert that it has value. + LIBC_ASSERT(wide_result.has_value()); + return static_cast<BlockInt>(wide_result.value()); + } + + LIBC_INLINE static constexpr void zero_leading_digits(wide_int &int_num) { + // WORD_SIZE is the width of the numbers used to internally represent the + // UInt + for (size_t i = 0; i < EXTRA_INT_WIDTH / wide_int::WORD_SIZE; ++i) + int_num[i + (FLOAT_AS_INT_WIDTH / wide_int::WORD_SIZE)] = 0; + } + + // init_convert initializes float_as_int, cur_block, and block_buffer based on + // the mantissa and exponent of the initial number. Calling it will always + // return the class to the starting state. + LIBC_INLINE constexpr void init_convert() { + // No calculation necessary for the 0 case. + if (mantissa == 0 && exponent == 0) + return; + + if (exponent > 0) { + // if the exponent is positive, then the number is fully above the decimal + // point. In this case we represent the float as an integer, then divide + // by 10^BLOCK_SIZE and take the remainder as our next block. This + // generates the digits from right to left, but the digits will be written + // from left to right, so it caches the results so they can be read in + // reverse order. + + wide_int float_as_int = mantissa; + + float_as_int <<= exponent; + int_block_index = 0; + + while (float_as_int > 0) { + LIBC_ASSERT(int_block_index < static_cast<int>(BLOCK_BUFFER_LEN)); + block_buffer[int_block_index] = + grab_digits<FLOAT_AS_INT_WIDTH + EXTRA_INT_WIDTH>(float_as_int); + ++int_block_index; + } + block_buffer_valid = int_block_index; + + } else { + // if the exponent is not positive, then the number is at least partially + // below the decimal point. In this case we represent the float as a fixed + // point number with the decimal point after the top EXTRA_INT_WIDTH bits. + float_as_fixed = mantissa; + + const int SHIFT_AMOUNT = FLOAT_AS_INT_WIDTH + exponent; + static_assert(EXTRA_INT_WIDTH >= sizeof(long double) * 8); + float_as_fixed <<= SHIFT_AMOUNT; + + // If there are still digits above the decimal point, handle those. + if (cpp::countl_zero(float_as_fixed) < + static_cast<int>(EXTRA_INT_WIDTH)) { + UInt<EXTRA_INT_WIDTH> above_decimal_point = + float_as_fixed >> FLOAT_AS_INT_WIDTH; + + size_t positive_int_block_index = 0; + while (above_decimal_point > 0) { + block_buffer[positive_int_block_index] = + grab_digits<EXTRA_INT_WIDTH>(above_decimal_point); + ++positive_int_block_index; + } + block_buffer_valid = positive_int_block_index; + + // Zero all digits above the decimal point. + zero_leading_digits(float_as_fixed); + int_block_index = 0; + } + } + } + +public: + LIBC_INLINE constexpr FloatToString(long double init_float) + : float_bits(init_float) { + is_negative = float_bits.is_neg(); + exponent = float_bits.get_explicit_exponent(); + mantissa = float_bits.get_explicit_mantissa(); + + // Adjust for the width of the mantissa. + exponent -= FRACTION_LEN; + + this->init_convert(); + } + + LIBC_INLINE constexpr size_t get_positive_blocks() { + if (exponent < -FRACTION_LEN) + return 0; + + const uint32_t idx = + exponent < 0 + ? 0 + : static_cast<uint32_t>(exponent + (IDX_SIZE - 1)) / IDX_SIZE; + return internal::length_for_num(idx * IDX_SIZE, FRACTION_LEN); + } + + LIBC_INLINE constexpr size_t zero_blocks_after_point() { +#ifdef LIBC_COPT_FLOAT_TO_STR_USE_MEGA_LONG_DOUBLE_TABLE + return MIN_BLOCK_2[-exponent / IDX_SIZE]; +#else + if (exponent >= -FRACTION_LEN) + return 0; + + const int pos_exp = -exponent - 1; + const uint32_t pos_idx = + static_cast<uint32_t>(pos_exp + (IDX_SIZE - 1)) / IDX_SIZE; + const int32_t pos_len = ((internal::ceil_log10_pow2(pos_idx * IDX_SIZE) - + internal::ceil_log10_pow2(FRACTION_LEN + 1)) / + BLOCK_SIZE) - + 1; + return static_cast<uint32_t>(pos_len > 0 ? pos_len : 0); +#endif + } + + LIBC_INLINE constexpr bool is_lowest_block(size_t negative_block_index) { + // The decimal representation of 2**(-i) will have exactly i digits after + // the decimal point. + const int num_requested_digits = + static_cast<int>((negative_block_index + 1) * BLOCK_SIZE); + + return num_requested_digits > -exponent; + } + + LIBC_INLINE constexpr BlockInt get_positive_block(int block_index) { + if (exponent < -FRACTION_LEN) + return 0; + if (block_index > static_cast<int>(block_buffer_valid) || block_index < 0) + return 0; + + LIBC_ASSERT(block_index < static_cast<int>(BLOCK_BUFFER_LEN)); + + return block_buffer[block_index]; + } + + LIBC_INLINE constexpr BlockInt get_negative_block(int negative_block_index) { + if (exponent >= 0) + return 0; + + // negative_block_index starts at 0 with the first block after the decimal + // point, and 1 with the second and so on. This converts to the same + // block_index used everywhere else. + + const int block_index = -1 - negative_block_index; + + // If we're currently after the requested block (remember these are + // negative indices) we reset the number to the start. This is only + // likely to happen in %g calls. This will also reset int_block_index. + // if (block_index > int_block_index) { + // init_convert(); + // } + + // Printf is the only existing user of this code and it will only ever move + // downwards, except for %g but that currently creates a second + // float_to_string object so this assertion still holds. If a new user needs + // the ability to step backwards, uncomment the code above. + LIBC_ASSERT(block_index <= int_block_index); + + // If we are currently before the requested block. Step until we reach the + // requested block. This is likely to only be one step. + while (block_index < int_block_index) { + zero_leading_digits(float_as_fixed); + float_as_fixed.mul(EXP10_9); + --int_block_index; + } + + // We're now on the requested block, return the current block. + return static_cast<BlockInt>(float_as_fixed >> FLOAT_AS_INT_WIDTH); + } + + LIBC_INLINE constexpr BlockInt get_block(int block_index) { + if (block_index >= 0) + return get_positive_block(block_index); + + return get_negative_block(-1 - block_index); + } +}; + +#endif // !LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 && + // !LIBC_COPT_FLOAT_TO_STR_NO_SPECIALIZE_LD + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FLOAT_TO_STRING_H diff --git a/contrib/llvm-project/libc/src/__support/freelist.cpp b/contrib/llvm-project/libc/src/__support/freelist.cpp new file mode 100644 index 000000000000..bfb90ae1c4db --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/freelist.cpp @@ -0,0 +1,42 @@ +//===-- Implementation for freelist ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "freelist.h" + +namespace LIBC_NAMESPACE_DECL { + +void FreeList::push(Node *node) { + if (begin_) { + LIBC_ASSERT(Block::from_usable_space(node)->outer_size() == + begin_->block()->outer_size() && + "freelist entries must have the same size"); + // Since the list is circular, insert the node immediately before begin_. + node->prev = begin_->prev; + node->next = begin_; + begin_->prev->next = node; + begin_->prev = node; + } else { + begin_ = node->prev = node->next = node; + } +} + +void FreeList::remove(Node *node) { + LIBC_ASSERT(begin_ && "cannot remove from empty list"); + if (node == node->next) { + LIBC_ASSERT(node == begin_ && + "a self-referential node must be the only element"); + begin_ = nullptr; + } else { + node->prev->next = node->next; + node->next->prev = node->prev; + if (begin_ == node) + begin_ = node->next; + } +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/freelist.h b/contrib/llvm-project/libc/src/__support/freelist.h new file mode 100644 index 000000000000..c51f14fe57ae --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/freelist.h @@ -0,0 +1,89 @@ +//===-- Interface for freelist --------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FREELIST_H +#define LLVM_LIBC_SRC___SUPPORT_FREELIST_H + +#include "block.h" + +namespace LIBC_NAMESPACE_DECL { + +/// A circularly-linked FIFO list storing free Blocks. All Blocks on a list +/// are the same size. The blocks are referenced by Nodes in the list; the list +/// refers to these, but it does not own them. +/// +/// Allocating free blocks in FIFO order maximizes the amount of time before a +/// free block is reused. This in turn maximizes the number of opportunities for +/// it to be coalesced with an adjacent block, which tends to reduce heap +/// fragmentation. +class FreeList { +public: + class Node { + public: + /// @returns The block containing this node. + LIBC_INLINE const Block *block() const { + return Block::from_usable_space(this); + } + + /// @returns The block containing this node. + LIBC_INLINE Block *block() { return Block::from_usable_space(this); } + + /// @returns The inner size of blocks in the list containing this node. + LIBC_INLINE size_t size() const { return block()->inner_size(); } + + private: + // Circularly linked pointers to adjacent nodes. + Node *prev; + Node *next; + friend class FreeList; + }; + + LIBC_INLINE constexpr FreeList() : FreeList(nullptr) {} + LIBC_INLINE constexpr FreeList(Node *begin) : begin_(begin) {} + + LIBC_INLINE bool empty() const { return !begin_; } + + /// @returns The inner size of blocks in the list. + LIBC_INLINE size_t size() const { + LIBC_ASSERT(begin_ && "empty lists have no size"); + return begin_->size(); + } + + /// @returns The first node in the list. + LIBC_INLINE Node *begin() { return begin_; } + + /// @returns The first block in the list. + LIBC_INLINE Block *front() { return begin_->block(); } + + /// Push a block to the back of the list. + /// The block must be large enough to contain a node. + LIBC_INLINE void push(Block *block) { + LIBC_ASSERT(!block->used() && + "only free blocks can be placed on free lists"); + LIBC_ASSERT(block->inner_size_free() >= sizeof(FreeList) && + "block too small to accomodate free list node"); + push(new (block->usable_space()) Node); + } + + /// Push an already-constructed node to the back of the list. + /// This allows pushing derived node types with additional data. + void push(Node *node); + + /// Pop the first node from the list. + LIBC_INLINE void pop() { remove(begin_); } + + /// Remove an arbitrary node from the list. + void remove(Node *node); + +private: + Node *begin_; +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FREELIST_H diff --git a/contrib/llvm-project/libc/src/__support/freelist_heap.cpp b/contrib/llvm-project/libc/src/__support/freelist_heap.cpp new file mode 100644 index 000000000000..4deb0e0f09e2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/freelist_heap.cpp @@ -0,0 +1,19 @@ +//===-- Implementation for freelist_heap ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/freelist_heap.h" +#include "src/__support/macros/config.h" + +#include <stddef.h> + +namespace LIBC_NAMESPACE_DECL { + +static LIBC_CONSTINIT FreeListHeap freelist_heap_symbols; +FreeListHeap *freelist_heap = &freelist_heap_symbols; + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/freelist_heap.h b/contrib/llvm-project/libc/src/__support/freelist_heap.h new file mode 100644 index 000000000000..d58685194aeb --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/freelist_heap.h @@ -0,0 +1,209 @@ +//===-- Interface for freelist_heap ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FREELIST_HEAP_H +#define LLVM_LIBC_SRC___SUPPORT_FREELIST_HEAP_H + +#include <stddef.h> + +#include "block.h" +#include "freestore.h" +#include "src/__support/CPP/optional.h" +#include "src/__support/CPP/span.h" +#include "src/__support/libc_assert.h" +#include "src/__support/macros/config.h" +#include "src/__support/math_extras.h" +#include "src/string/memory_utils/inline_memcpy.h" +#include "src/string/memory_utils/inline_memset.h" + +namespace LIBC_NAMESPACE_DECL { + +extern "C" cpp::byte _end; +extern "C" cpp::byte __llvm_libc_heap_limit; + +using cpp::optional; +using cpp::span; + +LIBC_INLINE constexpr bool IsPow2(size_t x) { return x && (x & (x - 1)) == 0; } + +class FreeListHeap { +public: + constexpr FreeListHeap() : begin(&_end), end(&__llvm_libc_heap_limit) {} + + constexpr FreeListHeap(span<cpp::byte> region) + : begin(region.begin()), end(region.end()) {} + + void *allocate(size_t size); + void *aligned_allocate(size_t alignment, size_t size); + // NOTE: All pointers passed to free must come from one of the other + // allocation functions: `allocate`, `aligned_allocate`, `realloc`, `calloc`. + void free(void *ptr); + void *realloc(void *ptr, size_t size); + void *calloc(size_t num, size_t size); + + cpp::span<cpp::byte> region() const { return {begin, end}; } + +private: + void init(); + + void *allocate_impl(size_t alignment, size_t size); + + span<cpp::byte> block_to_span(Block *block) { + return span<cpp::byte>(block->usable_space(), block->inner_size()); + } + + bool is_valid_ptr(void *ptr) { return ptr >= begin && ptr < end; } + + cpp::byte *begin; + cpp::byte *end; + bool is_initialized = false; + FreeStore free_store; +}; + +template <size_t BUFF_SIZE> class FreeListHeapBuffer : public FreeListHeap { +public: + constexpr FreeListHeapBuffer() : FreeListHeap{buffer}, buffer{} {} + +private: + cpp::byte buffer[BUFF_SIZE]; +}; + +LIBC_INLINE void FreeListHeap::init() { + LIBC_ASSERT(!is_initialized && "duplicate initialization"); + auto result = Block::init(region()); + Block *block = *result; + free_store.set_range({0, cpp::bit_ceil(block->inner_size())}); + free_store.insert(block); + is_initialized = true; +} + +LIBC_INLINE void *FreeListHeap::allocate_impl(size_t alignment, size_t size) { + if (size == 0) + return nullptr; + + if (!is_initialized) + init(); + + size_t request_size = Block::min_size_for_allocation(alignment, size); + if (!request_size) + return nullptr; + + Block *block = free_store.remove_best_fit(request_size); + if (!block) + return nullptr; + + auto block_info = Block::allocate(block, alignment, size); + if (block_info.next) + free_store.insert(block_info.next); + if (block_info.prev) + free_store.insert(block_info.prev); + + block_info.block->mark_used(); + return block_info.block->usable_space(); +} + +LIBC_INLINE void *FreeListHeap::allocate(size_t size) { + return allocate_impl(alignof(max_align_t), size); +} + +LIBC_INLINE void *FreeListHeap::aligned_allocate(size_t alignment, + size_t size) { + // The alignment must be an integral power of two. + if (!IsPow2(alignment)) + return nullptr; + + // The size parameter must be an integral multiple of alignment. + if (size % alignment != 0) + return nullptr; + + // The minimum alignment supported by Block is max_align_t. + alignment = cpp::max(alignment, alignof(max_align_t)); + + return allocate_impl(alignment, size); +} + +LIBC_INLINE void FreeListHeap::free(void *ptr) { + cpp::byte *bytes = static_cast<cpp::byte *>(ptr); + + LIBC_ASSERT(is_valid_ptr(bytes) && "Invalid pointer"); + + Block *block = Block::from_usable_space(bytes); + LIBC_ASSERT(block->next() && "sentinel last block cannot be freed"); + LIBC_ASSERT(block->used() && "double free"); + block->mark_free(); + + // Can we combine with the left or right blocks? + Block *prev_free = block->prev_free(); + Block *next = block->next(); + + if (prev_free != nullptr) { + // Remove from free store and merge. + free_store.remove(prev_free); + block = prev_free; + block->merge_next(); + } + if (!next->used()) { + free_store.remove(next); + block->merge_next(); + } + // Add back to the freelist + free_store.insert(block); +} + +// Follows constract of the C standard realloc() function +// If ptr is free'd, will return nullptr. +LIBC_INLINE void *FreeListHeap::realloc(void *ptr, size_t size) { + if (size == 0) { + free(ptr); + return nullptr; + } + + // If the pointer is nullptr, allocate a new memory. + if (ptr == nullptr) + return allocate(size); + + cpp::byte *bytes = static_cast<cpp::byte *>(ptr); + + if (!is_valid_ptr(bytes)) + return nullptr; + + Block *block = Block::from_usable_space(bytes); + if (!block->used()) + return nullptr; + size_t old_size = block->inner_size(); + + // Do nothing and return ptr if the required memory size is smaller than + // the current size. + if (old_size >= size) + return ptr; + + void *new_ptr = allocate(size); + // Don't invalidate ptr if allocate(size) fails to initilize the memory. + if (new_ptr == nullptr) + return nullptr; + LIBC_NAMESPACE::inline_memcpy(new_ptr, ptr, old_size); + + free(ptr); + return new_ptr; +} + +LIBC_INLINE void *FreeListHeap::calloc(size_t num, size_t size) { + size_t bytes; + if (__builtin_mul_overflow(num, size, &bytes)) + return nullptr; + void *ptr = allocate(bytes); + if (ptr != nullptr) + LIBC_NAMESPACE::inline_memset(ptr, 0, bytes); + return ptr; +} + +extern FreeListHeap *freelist_heap; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FREELIST_HEAP_H diff --git a/contrib/llvm-project/libc/src/__support/freestore.h b/contrib/llvm-project/libc/src/__support/freestore.h new file mode 100644 index 000000000000..09f2479debb3 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/freestore.h @@ -0,0 +1,114 @@ +//===-- Interface for freestore ------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FREESTORE_H +#define LLVM_LIBC_SRC___SUPPORT_FREESTORE_H + +#include "freetrie.h" + +namespace LIBC_NAMESPACE_DECL { + +/// A best-fit store of variously-sized free blocks. Blocks can be inserted and +/// removed in logarithmic time. +class FreeStore { +public: + FreeStore() = default; + FreeStore(const FreeStore &other) = delete; + FreeStore &operator=(const FreeStore &other) = delete; + + /// Sets the range of possible block sizes. This can only be called when the + /// trie is empty. + LIBC_INLINE void set_range(FreeTrie::SizeRange range) { + large_trie.set_range(range); + } + + /// Insert a free block. If the block is too small to be tracked, nothing + /// happens. + void insert(Block *block); + + /// Remove a free block. If the block is too small to be tracked, nothing + /// happens. + void remove(Block *block); + + /// Remove a best-fit free block that can contain the given size when + /// allocated. Returns nullptr if there is no such block. + Block *remove_best_fit(size_t size); + +private: + static constexpr size_t MIN_OUTER_SIZE = + align_up(sizeof(Block) + sizeof(FreeList::Node), alignof(max_align_t)); + static constexpr size_t MIN_LARGE_OUTER_SIZE = + align_up(sizeof(Block) + sizeof(FreeTrie::Node), alignof(max_align_t)); + static constexpr size_t NUM_SMALL_SIZES = + (MIN_LARGE_OUTER_SIZE - MIN_OUTER_SIZE) / alignof(max_align_t); + + LIBC_INLINE static bool too_small(Block *block) { + return block->outer_size() < MIN_OUTER_SIZE; + } + LIBC_INLINE static bool is_small(Block *block) { + return block->outer_size() < MIN_LARGE_OUTER_SIZE; + } + + FreeList &small_list(Block *block); + FreeList *find_best_small_fit(size_t size); + + cpp::array<FreeList, NUM_SMALL_SIZES> small_lists; + FreeTrie large_trie; +}; + +LIBC_INLINE void FreeStore::insert(Block *block) { + if (too_small(block)) + return; + if (is_small(block)) + small_list(block).push(block); + else + large_trie.push(block); +} + +LIBC_INLINE void FreeStore::remove(Block *block) { + if (too_small(block)) + return; + if (is_small(block)) { + small_list(block).remove( + reinterpret_cast<FreeList::Node *>(block->usable_space())); + } else { + large_trie.remove( + reinterpret_cast<FreeTrie::Node *>(block->usable_space())); + } +} + +LIBC_INLINE Block *FreeStore::remove_best_fit(size_t size) { + if (FreeList *list = find_best_small_fit(size)) { + Block *block = list->front(); + list->pop(); + return block; + } + if (FreeTrie::Node *best_fit = large_trie.find_best_fit(size)) { + Block *block = best_fit->block(); + large_trie.remove(best_fit); + return block; + } + return nullptr; +} + +LIBC_INLINE FreeList &FreeStore::small_list(Block *block) { + LIBC_ASSERT(is_small(block) && "only legal for small blocks"); + return small_lists[(block->outer_size() - MIN_OUTER_SIZE) / + alignof(max_align_t)]; +} + +LIBC_INLINE FreeList *FreeStore::find_best_small_fit(size_t size) { + for (FreeList &list : small_lists) + if (!list.empty() && list.size() >= size) + return &list; + return nullptr; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FREESTORE_H diff --git a/contrib/llvm-project/libc/src/__support/freetrie.cpp b/contrib/llvm-project/libc/src/__support/freetrie.cpp new file mode 100644 index 000000000000..e76efe717f21 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/freetrie.cpp @@ -0,0 +1,64 @@ +//===-- Implementation for freetrie ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "freetrie.h" + +namespace LIBC_NAMESPACE_DECL { + +void FreeTrie::remove(Node *node) { + LIBC_ASSERT(!empty() && "cannot remove from empty trie"); + FreeList list = node; + list.pop(); + Node *new_node = static_cast<Node *>(list.begin()); + if (!new_node) { + // The freelist is empty. Replace the subtrie root with an arbitrary leaf. + // This is legal because there is no relationship between the size of the + // root and its children. + Node *leaf = node; + while (leaf->lower || leaf->upper) + leaf = leaf->lower ? leaf->lower : leaf->upper; + if (leaf == node) { + // If the root is a leaf, then removing it empties the subtrie. + replace_node(node, nullptr); + return; + } + + replace_node(leaf, nullptr); + new_node = leaf; + } + + if (!is_head(node)) + return; + + // Copy the trie links to the new head. + new_node->lower = node->lower; + new_node->upper = node->upper; + new_node->parent = node->parent; + replace_node(node, new_node); +} + +void FreeTrie::replace_node(Node *node, Node *new_node) { + LIBC_ASSERT(is_head(node) && "only head nodes contain trie links"); + + if (node->parent) { + Node *&parent_child = + node->parent->lower == node ? node->parent->lower : node->parent->upper; + LIBC_ASSERT(parent_child == node && + "no reference to child node found in parent"); + parent_child = new_node; + } else { + LIBC_ASSERT(root == node && "non-root node had no parent"); + root = new_node; + } + if (node->lower) + node->lower->parent = new_node; + if (node->upper) + node->upper->parent = new_node; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/contrib/llvm-project/libc/src/__support/freetrie.h b/contrib/llvm-project/libc/src/__support/freetrie.h new file mode 100644 index 000000000000..42363c2c9e2f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/freetrie.h @@ -0,0 +1,237 @@ +//===-- Interface for freetrie --------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_FREETRIE_H +#define LLVM_LIBC_SRC___SUPPORT_FREETRIE_H + +#include "freelist.h" + +namespace LIBC_NAMESPACE_DECL { + +/// A trie of free lists. +/// +/// This is an unusual little data structure originally from Doug Lea's malloc. +/// Finding the best fit from a set of differently-sized free list typically +/// required some kind of ordered map, and these are typically implemented using +/// a self-balancing binary search tree. Those are notorious for having a +/// relatively large number of special cases, while this trie has relatively +/// few, which helps with code size. +/// +/// Operations on the trie are logarithmic not on the number of nodes within it, +/// but rather the fixed range of possible sizes that the trie can contain. This +/// means that the data structure would likely actually perform worse than an +/// e.g. red-black tree, but its implementation is still much simpler. +/// +/// Each trie node's children subdivide the range of possible sizes into two +/// halves: a lower and an upper. The node itself holds a free list of some size +/// within its range. This makes it possible to summarily replace any node with +/// any leaf within its subtrie, which makes it very straightforward to remove a +/// node. Insertion is also simple; the only real complexity lies with finding +/// the best fit. This can still be done in logarithmic time with only a few +/// cases to consider. +/// +/// The trie refers to, but does not own, the Nodes that comprise it. +class FreeTrie { +public: + /// A trie node that is also a free list. Only the head node of each list is + /// actually part of the trie. The subtrie contains a continous SizeRange of + /// free lists. The lower and upper subtrie's contain the lower and upper half + /// of the subtries range. There is no direct relationship between the size of + /// this node's free list and the contents of the lower and upper subtries. + class Node : public FreeList::Node { + /// The child subtrie covering the lower half of this subtrie's size range. + /// Undefined if this is not the head of the list. + Node *lower; + /// The child subtrie covering the upper half of this subtrie's size range. + /// Undefined if this is not the head of the list. + Node *upper; + /// The parent subtrie. nullptr if this is the root or not the head of the + /// list. + Node *parent; + + friend class FreeTrie; + }; + + /// Power-of-two range of sizes covered by a subtrie. + struct SizeRange { + size_t min; + size_t width; + + LIBC_INLINE constexpr SizeRange(size_t min, size_t width) + : min(min), width(width) { + LIBC_ASSERT(!(width & (width - 1)) && "width must be a power of two"); + } + + /// @returns The lower half of the size range. + LIBC_INLINE SizeRange lower() const { return {min, width / 2}; } + + /// @returns The upper half of the size range. + LIBC_INLINE SizeRange upper() const { return {min + width / 2, width / 2}; } + + /// @returns The largest size in this range. + LIBC_INLINE size_t max() const { return min + (width - 1); } + + /// @returns Whether the range contains the given size. + LIBC_INLINE bool contains(size_t size) const { + return min <= size && size < min + width; + } + }; + + LIBC_INLINE constexpr FreeTrie() : FreeTrie(SizeRange{0, 0}) {} + LIBC_INLINE constexpr FreeTrie(SizeRange range) : range(range) {} + + /// Sets the range of possible block sizes. This can only be called when the + /// trie is empty. + LIBC_INLINE void set_range(FreeTrie::SizeRange range) { + LIBC_ASSERT(empty() && "cannot change the range of a preexisting trie"); + this->range = range; + } + + /// @returns Whether the trie contains any blocks. + LIBC_INLINE bool empty() const { return !root; } + + /// Push a block to the trie. + void push(Block *block); + + /// Remove a node from this trie node's free list. + void remove(Node *node); + + /// @returns A smallest node that can allocate the given size; otherwise + /// nullptr. + Node *find_best_fit(size_t size); + +private: + /// @returns Whether a node is the head of its containing freelist. + bool is_head(Node *node) const { return node->parent || node == root; } + + /// Replaces references to one node with another (or nullptr) in all adjacent + /// parent and child nodes. + void replace_node(Node *node, Node *new_node); + + Node *root = nullptr; + SizeRange range; +}; + +LIBC_INLINE void FreeTrie::push(Block *block) { + LIBC_ASSERT(block->inner_size_free() >= sizeof(Node) && + "block too small to accomodate free trie node"); + size_t size = block->inner_size(); + LIBC_ASSERT(range.contains(size) && "requested size out of trie range"); + + // Find the position in the tree to push to. + Node **cur = &root; + Node *parent = nullptr; + SizeRange cur_range = range; + while (*cur && (*cur)->size() != size) { + LIBC_ASSERT(cur_range.contains(size) && "requested size out of trie range"); + parent = *cur; + if (size <= cur_range.lower().max()) { + cur = &(*cur)->lower; + cur_range = cur_range.lower(); + } else { + cur = &(*cur)->upper; + cur_range = cur_range.upper(); + } + } + + Node *node = new (block->usable_space()) Node; + FreeList list = *cur; + if (list.empty()) { + node->parent = parent; + node->lower = node->upper = nullptr; + } else { + node->parent = nullptr; + } + list.push(node); + *cur = static_cast<Node *>(list.begin()); +} + +LIBC_INLINE FreeTrie::Node *FreeTrie::find_best_fit(size_t size) { + if (empty() || range.max() < size) + return nullptr; + + Node *cur = root; + SizeRange cur_range = range; + Node *best_fit = nullptr; + Node *deferred_upper_trie = nullptr; + FreeTrie::SizeRange deferred_upper_range{0, 0}; + + while (true) { + LIBC_ASSERT(cur_range.contains(cur->size()) && + "trie node size out of range"); + LIBC_ASSERT(cur_range.max() >= size && + "range could not fit requested size"); + LIBC_ASSERT((!best_fit || cur_range.min < best_fit->size()) && + "range could not contain a best fit"); + + // If the current node is an exact fit, it is a best fit. + if (cur->size() == size) + return cur; + + if (cur->size() > size && (!best_fit || cur->size() < best_fit->size())) { + // The current node is a better fit. + best_fit = cur; + + // If there is a deferred upper subtrie, then the current node is + // somewhere in its lower sibling subtrie. That means that the new best + // fit is better than the best fit in the deferred subtrie. + LIBC_ASSERT( + (!deferred_upper_trie || + deferred_upper_range.min > best_fit->size()) && + "deferred upper subtrie should be outclassed by new best fit"); + deferred_upper_trie = nullptr; + } + + // Determine which subtries might contain the best fit. + bool lower_impossible = !cur->lower || cur_range.lower().max() < size; + bool upper_impossible = + !cur->upper || + // If every node in the lower trie fits + (!lower_impossible && cur_range.min >= size) || + // If every node in the upper trie is worse than the current best + (best_fit && cur_range.upper().min >= best_fit->size()); + + if (lower_impossible && upper_impossible) { + if (!deferred_upper_trie) + return best_fit; + // Scan the deferred upper subtrie and consider whether any element within + // provides a better fit. + // + // This can only ever be reached once. In a deferred upper subtrie, every + // node fits, so the higher of two subtries can never contain a best fit. + cur = deferred_upper_trie; + cur_range = deferred_upper_range; + deferred_upper_trie = nullptr; + continue; + } + + if (lower_impossible) { + cur = cur->upper; + cur_range = cur_range.upper(); + } else if (upper_impossible) { + cur = cur->lower; + cur_range = cur_range.lower(); + } else { + // Both subtries might contain a better fit. Any fit in the lower subtrie + // is better than the any fit in the upper subtrie, so scan the lower + // and return to the upper only if no better fits were found. (Any better + // fit found clears the deferred upper subtrie.) + LIBC_ASSERT((!deferred_upper_trie || + cur_range.upper().max() < deferred_upper_range.min) && + "old deferred upper subtrie should be outclassed by new"); + deferred_upper_trie = cur->upper; + deferred_upper_range = cur_range.upper(); + cur = cur->lower; + cur_range = cur_range.lower(); + } + } +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_FREETRIE_H diff --git a/contrib/llvm-project/libc/src/__support/hash.h b/contrib/llvm-project/libc/src/__support/hash.h new file mode 100644 index 000000000000..49138b1f43b9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/hash.h @@ -0,0 +1,164 @@ +//===-- Portable string hash function ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_HASH_H +#define LLVM_LIBC_SRC___SUPPORT_HASH_H + +#include "src/__support/CPP/bit.h" // rotl +#include "src/__support/CPP/limits.h" // numeric_limits +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/uint128.h" // UInt128 +#include <stdint.h> // For uint64_t + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +// Folded multiplication. +// This function multiplies two 64-bit integers and xor the high and +// low 64-bit parts of the result. +LIBC_INLINE uint64_t folded_multiply(uint64_t x, uint64_t y) { + UInt128 p = static_cast<UInt128>(x) * static_cast<UInt128>(y); + uint64_t low = static_cast<uint64_t>(p); + uint64_t high = static_cast<uint64_t>(p >> 64); + return low ^ high; +} + +// Read as little endian. +// Shift-and-or implementation does not give a satisfactory code on aarch64. +// Therefore, we use a union to read the value. +template <typename T> LIBC_INLINE T read_little_endian(const void *ptr) { + const uint8_t *bytes = static_cast<const uint8_t *>(ptr); + uint8_t buffer[sizeof(T)]; +#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ + // Compiler should able to optimize this as a load followed by a byte + // swap. On aarch64 (-mbig-endian), this compiles to the following for + // int: + // ldr w0, [x0] + // rev w0, w0 + // ret + for (size_t i = 0; i < sizeof(T); ++i) { + buffer[i] = bytes[sizeof(T) - i - 1]; + } +#else + for (size_t i = 0; i < sizeof(T); ++i) { + buffer[i] = bytes[i]; + } +#endif + return cpp::bit_cast<T>(buffer); +} + +// Specialized read functions for small values. size must be <= 8. +LIBC_INLINE void read_small_values(const void *ptr, size_t size, uint64_t &low, + uint64_t &high) { + const uint8_t *bytes = static_cast<const uint8_t *>(ptr); + if (size >= 2) { + if (size >= 4) { + low = static_cast<uint64_t>(read_little_endian<uint32_t>(&bytes[0])); + high = + static_cast<uint64_t>(read_little_endian<uint32_t>(&bytes[size - 4])); + } else { + low = static_cast<uint64_t>(read_little_endian<uint16_t>(&bytes[0])); + high = static_cast<uint64_t>(bytes[size - 1]); + } + } else { + if (size > 0) { + low = static_cast<uint64_t>(bytes[0]); + high = static_cast<uint64_t>(bytes[0]); + } else { + low = 0; + high = 0; + } + } +} + +// This constant comes from Kunth's prng (it empirically works well). +LIBC_INLINE_VAR constexpr uint64_t MULTIPLE = 6364136223846793005; +// Rotation amount for mixing. +LIBC_INLINE_VAR constexpr uint64_t ROTATE = 23; + +// Randomly generated values. For now, we use the same values as in aHash as +// they are widely tested. +// https://github.com/tkaitchuck/aHash/blob/9f6a2ad8b721fd28da8dc1d0b7996677b374357c/src/random_state.rs#L38 +LIBC_INLINE_VAR constexpr uint64_t RANDOMNESS[2][4] = { + {0x243f6a8885a308d3, 0x13198a2e03707344, 0xa4093822299f31d0, + 0x082efa98ec4e6c89}, + {0x452821e638d01377, 0xbe5466cf34e90c6c, 0xc0ac29b7c97c50dd, + 0x3f84d5b5b5470917}, +}; + +// This is a portable string hasher. It is not cryptographically secure. +// The quality of the hash is good enough to pass all tests in SMHasher. +// The implementation is derived from the generic routine of aHash. +class HashState { + uint64_t buffer; + uint64_t pad; + uint64_t extra_keys[2]; + LIBC_INLINE void update(uint64_t low, uint64_t high) { + uint64_t combined = + folded_multiply(low ^ extra_keys[0], high ^ extra_keys[1]); + buffer = (buffer + pad) ^ combined; + buffer = cpp::rotl(buffer, ROTATE); + } + LIBC_INLINE static uint64_t mix(uint64_t seed) { + HashState mixer{RANDOMNESS[0][0], RANDOMNESS[0][1], RANDOMNESS[0][2], + RANDOMNESS[0][3]}; + mixer.update(seed, 0); + return mixer.finish(); + } + +public: + LIBC_INLINE constexpr HashState(uint64_t a, uint64_t b, uint64_t c, + uint64_t d) + : buffer(a), pad(b), extra_keys{c, d} {} + LIBC_INLINE HashState(uint64_t seed) { + // Mix one more round of the seed to make it stronger. + uint64_t mixed = mix(seed); + buffer = RANDOMNESS[1][0] ^ mixed; + pad = RANDOMNESS[1][1] ^ mixed; + extra_keys[0] = RANDOMNESS[1][2] ^ mixed; + extra_keys[1] = RANDOMNESS[1][3] ^ mixed; + } + LIBC_INLINE void update(const void *ptr, size_t size) { + uint8_t const *bytes = static_cast<const uint8_t *>(ptr); + buffer = (buffer + size) * MULTIPLE; + uint64_t low, high; + if (size > 8) { + if (size > 16) { + // update tail + low = read_little_endian<uint64_t>(&bytes[size - 16]); + high = read_little_endian<uint64_t>(&bytes[size - 8]); + update(low, high); + while (size > 16) { + low = read_little_endian<uint64_t>(&bytes[0]); + high = read_little_endian<uint64_t>(&bytes[8]); + update(low, high); + bytes += 16; + size -= 16; + } + } else { + low = read_little_endian<uint64_t>(&bytes[0]); + high = read_little_endian<uint64_t>(&bytes[size - 8]); + update(low, high); + } + } else { + read_small_values(ptr, size, low, high); + update(low, high); + } + } + LIBC_INLINE uint64_t finish() { + int rot = buffer & 63; + uint64_t folded = folded_multiply(buffer, pad); + return cpp::rotl(folded, rot); + } +}; + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_HASH_H diff --git a/contrib/llvm-project/libc/src/__support/high_precision_decimal.h b/contrib/llvm-project/libc/src/__support/high_precision_decimal.h new file mode 100644 index 000000000000..cb4b50c31544 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/high_precision_decimal.h @@ -0,0 +1,442 @@ +//===-- High Precision Decimal ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See httpss//llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// ----------------------------------------------------------------------------- +// **** WARNING **** +// This file is shared with libc++. You should also be careful when adding +// dependencies to this file, since it needs to build for all libc++ targets. +// ----------------------------------------------------------------------------- + +#ifndef LLVM_LIBC_SRC___SUPPORT_HIGH_PRECISION_DECIMAL_H +#define LLVM_LIBC_SRC___SUPPORT_HIGH_PRECISION_DECIMAL_H + +#include "src/__support/CPP/limits.h" +#include "src/__support/ctype_utils.h" +#include "src/__support/macros/config.h" +#include "src/__support/str_to_integer.h" +#include <stdint.h> + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +struct LShiftTableEntry { + uint32_t new_digits; + char const *power_of_five; +}; + +// ----------------------------------------------------------------------------- +// **** WARNING **** +// This interface is shared with libc++, if you change this interface you need +// to update it in both libc and libc++. +// ----------------------------------------------------------------------------- +// This is used in both this file and in the main str_to_float.h. +// TODO: Figure out where to put this. +enum class RoundDirection { Up, Down, Nearest }; + +// This is based on the HPD data structure described as part of the Simple +// Decimal Conversion algorithm by Nigel Tao, described at this link: +// https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html +class HighPrecisionDecimal { + + // This precomputed table speeds up left shifts by having the number of new + // digits that will be added by multiplying 5^i by 2^i. If the number is less + // than 5^i then it will add one fewer digit. There are only 60 entries since + // that's the max shift amount. + // This table was generated by the script at + // libc/utils/mathtools/GenerateHPDConstants.py + static constexpr LShiftTableEntry LEFT_SHIFT_DIGIT_TABLE[] = { + {0, ""}, + {1, "5"}, + {1, "25"}, + {1, "125"}, + {2, "625"}, + {2, "3125"}, + {2, "15625"}, + {3, "78125"}, + {3, "390625"}, + {3, "1953125"}, + {4, "9765625"}, + {4, "48828125"}, + {4, "244140625"}, + {4, "1220703125"}, + {5, "6103515625"}, + {5, "30517578125"}, + {5, "152587890625"}, + {6, "762939453125"}, + {6, "3814697265625"}, + {6, "19073486328125"}, + {7, "95367431640625"}, + {7, "476837158203125"}, + {7, "2384185791015625"}, + {7, "11920928955078125"}, + {8, "59604644775390625"}, + {8, "298023223876953125"}, + {8, "1490116119384765625"}, + {9, "7450580596923828125"}, + {9, "37252902984619140625"}, + {9, "186264514923095703125"}, + {10, "931322574615478515625"}, + {10, "4656612873077392578125"}, + {10, "23283064365386962890625"}, + {10, "116415321826934814453125"}, + {11, "582076609134674072265625"}, + {11, "2910383045673370361328125"}, + {11, "14551915228366851806640625"}, + {12, "72759576141834259033203125"}, + {12, "363797880709171295166015625"}, + {12, "1818989403545856475830078125"}, + {13, "9094947017729282379150390625"}, + {13, "45474735088646411895751953125"}, + {13, "227373675443232059478759765625"}, + {13, "1136868377216160297393798828125"}, + {14, "5684341886080801486968994140625"}, + {14, "28421709430404007434844970703125"}, + {14, "142108547152020037174224853515625"}, + {15, "710542735760100185871124267578125"}, + {15, "3552713678800500929355621337890625"}, + {15, "17763568394002504646778106689453125"}, + {16, "88817841970012523233890533447265625"}, + {16, "444089209850062616169452667236328125"}, + {16, "2220446049250313080847263336181640625"}, + {16, "11102230246251565404236316680908203125"}, + {17, "55511151231257827021181583404541015625"}, + {17, "277555756156289135105907917022705078125"}, + {17, "1387778780781445675529539585113525390625"}, + {18, "6938893903907228377647697925567626953125"}, + {18, "34694469519536141888238489627838134765625"}, + {18, "173472347597680709441192448139190673828125"}, + {19, "867361737988403547205962240695953369140625"}, + }; + + // The maximum amount we can shift is the number of bits used in the + // accumulator, minus the number of bits needed to represent the base (in this + // case 4). + static constexpr uint32_t MAX_SHIFT_AMOUNT = sizeof(uint64_t) - 4; + + // 800 is an arbitrary number of digits, but should be + // large enough for any practical number. + static constexpr uint32_t MAX_NUM_DIGITS = 800; + + uint32_t num_digits = 0; + int32_t decimal_point = 0; + bool truncated = false; + uint8_t digits[MAX_NUM_DIGITS]; + +private: + LIBC_INLINE bool should_round_up(int32_t round_to_digit, + RoundDirection round) { + if (round_to_digit < 0 || + static_cast<uint32_t>(round_to_digit) >= this->num_digits) { + return false; + } + + // The above condition handles all cases where all of the trailing digits + // are zero. In that case, if the rounding mode is up, then this number + // should be rounded up. Similarly, if the rounding mode is down, then it + // should always round down. + if (round == RoundDirection::Up) { + return true; + } else if (round == RoundDirection::Down) { + return false; + } + // Else round to nearest. + + // If we're right in the middle and there are no extra digits + if (this->digits[round_to_digit] == 5 && + static_cast<uint32_t>(round_to_digit + 1) == this->num_digits) { + + // Round up if we've truncated (since that means the result is slightly + // higher than what's represented.) + if (this->truncated) { + return true; + } + + // If this exactly halfway, round to even. + if (round_to_digit == 0) + // When the input is ".5". + return false; + return this->digits[round_to_digit - 1] % 2 != 0; + } + // If there are digits after round_to_digit, they must be non-zero since we + // trim trailing zeroes after all operations that change digits. + return this->digits[round_to_digit] >= 5; + } + + // Takes an amount to left shift and returns the number of new digits needed + // to store the result based on LEFT_SHIFT_DIGIT_TABLE. + LIBC_INLINE uint32_t get_num_new_digits(uint32_t lshift_amount) { + const char *power_of_five = + LEFT_SHIFT_DIGIT_TABLE[lshift_amount].power_of_five; + uint32_t new_digits = LEFT_SHIFT_DIGIT_TABLE[lshift_amount].new_digits; + uint32_t digit_index = 0; + while (power_of_five[digit_index] != 0) { + if (digit_index >= this->num_digits) { + return new_digits - 1; + } + if (this->digits[digit_index] != + internal::b36_char_to_int(power_of_five[digit_index])) { + return new_digits - + ((this->digits[digit_index] < + internal::b36_char_to_int(power_of_five[digit_index])) + ? 1 + : 0); + } + ++digit_index; + } + return new_digits; + } + + // Trim all trailing 0s + LIBC_INLINE void trim_trailing_zeroes() { + while (this->num_digits > 0 && this->digits[this->num_digits - 1] == 0) { + --this->num_digits; + } + if (this->num_digits == 0) { + this->decimal_point = 0; + } + } + + // Perform a digitwise binary non-rounding right shift on this value by + // shift_amount. The shift_amount can't be more than MAX_SHIFT_AMOUNT to + // prevent overflow. + LIBC_INLINE void right_shift(uint32_t shift_amount) { + uint32_t read_index = 0; + uint32_t write_index = 0; + + uint64_t accumulator = 0; + + const uint64_t shift_mask = (uint64_t(1) << shift_amount) - 1; + + // Warm Up phase: we don't have enough digits to start writing, so just + // read them into the accumulator. + while (accumulator >> shift_amount == 0) { + uint64_t read_digit = 0; + // If there are still digits to read, read the next one, else the digit is + // assumed to be 0. + if (read_index < this->num_digits) { + read_digit = this->digits[read_index]; + } + accumulator = accumulator * 10 + read_digit; + ++read_index; + } + + // Shift the decimal point by the number of digits it took to fill the + // accumulator. + this->decimal_point -= read_index - 1; + + // Middle phase: we have enough digits to write, as well as more digits to + // read. Keep reading until we run out of digits. + while (read_index < this->num_digits) { + uint64_t read_digit = this->digits[read_index]; + uint64_t write_digit = accumulator >> shift_amount; + accumulator &= shift_mask; + this->digits[write_index] = static_cast<uint8_t>(write_digit); + accumulator = accumulator * 10 + read_digit; + ++read_index; + ++write_index; + } + + // Cool Down phase: All of the readable digits have been read, so just write + // the remainder, while treating any more digits as 0. + while (accumulator > 0) { + uint64_t write_digit = accumulator >> shift_amount; + accumulator &= shift_mask; + if (write_index < MAX_NUM_DIGITS) { + this->digits[write_index] = static_cast<uint8_t>(write_digit); + ++write_index; + } else if (write_digit > 0) { + this->truncated = true; + } + accumulator = accumulator * 10; + } + this->num_digits = write_index; + this->trim_trailing_zeroes(); + } + + // Perform a digitwise binary non-rounding left shift on this value by + // shift_amount. The shift_amount can't be more than MAX_SHIFT_AMOUNT to + // prevent overflow. + LIBC_INLINE void left_shift(uint32_t shift_amount) { + uint32_t new_digits = this->get_num_new_digits(shift_amount); + + int32_t read_index = static_cast<int32_t>(this->num_digits - 1); + uint32_t write_index = this->num_digits + new_digits; + + uint64_t accumulator = 0; + + // No Warm Up phase. Since we're putting digits in at the top and taking + // digits from the bottom we don't have to wait for the accumulator to fill. + + // Middle phase: while we have more digits to read, keep reading as well as + // writing. + while (read_index >= 0) { + accumulator += static_cast<uint64_t>(this->digits[read_index]) + << shift_amount; + uint64_t next_accumulator = accumulator / 10; + uint64_t write_digit = accumulator - (10 * next_accumulator); + --write_index; + if (write_index < MAX_NUM_DIGITS) { + this->digits[write_index] = static_cast<uint8_t>(write_digit); + } else if (write_digit != 0) { + this->truncated = true; + } + accumulator = next_accumulator; + --read_index; + } + + // Cool Down phase: there are no more digits to read, so just write the + // remaining digits in the accumulator. + while (accumulator > 0) { + uint64_t next_accumulator = accumulator / 10; + uint64_t write_digit = accumulator - (10 * next_accumulator); + --write_index; + if (write_index < MAX_NUM_DIGITS) { + this->digits[write_index] = static_cast<uint8_t>(write_digit); + } else if (write_digit != 0) { + this->truncated = true; + } + accumulator = next_accumulator; + } + + this->num_digits += new_digits; + if (this->num_digits > MAX_NUM_DIGITS) { + this->num_digits = MAX_NUM_DIGITS; + } + this->decimal_point += new_digits; + this->trim_trailing_zeroes(); + } + +public: + // num_string is assumed to be a string of numeric characters. It doesn't + // handle leading spaces. + LIBC_INLINE + HighPrecisionDecimal( + const char *__restrict num_string, + const size_t num_len = cpp::numeric_limits<size_t>::max()) { + bool saw_dot = false; + size_t num_cur = 0; + // This counts the digits in the number, even if there isn't space to store + // them all. + uint32_t total_digits = 0; + while (num_cur < num_len && + (isdigit(num_string[num_cur]) || num_string[num_cur] == '.')) { + if (num_string[num_cur] == '.') { + if (saw_dot) { + break; + } + this->decimal_point = static_cast<int32_t>(total_digits); + saw_dot = true; + } else { + if (num_string[num_cur] == '0' && this->num_digits == 0) { + --this->decimal_point; + ++num_cur; + continue; + } + ++total_digits; + if (this->num_digits < MAX_NUM_DIGITS) { + this->digits[this->num_digits] = static_cast<uint8_t>( + internal::b36_char_to_int(num_string[num_cur])); + ++this->num_digits; + } else if (num_string[num_cur] != '0') { + this->truncated = true; + } + } + ++num_cur; + } + + if (!saw_dot) + this->decimal_point = static_cast<int32_t>(total_digits); + + if (num_cur < num_len && + (num_string[num_cur] == 'e' || num_string[num_cur] == 'E')) { + ++num_cur; + if (isdigit(num_string[num_cur]) || num_string[num_cur] == '+' || + num_string[num_cur] == '-') { + auto result = + strtointeger<int32_t>(num_string + num_cur, 10, num_len - num_cur); + if (result.has_error()) { + // TODO: handle error + } + int32_t add_to_exponent = result.value; + + // Here we do this operation as int64 to avoid overflow. + int64_t temp_exponent = static_cast<int64_t>(this->decimal_point) + + static_cast<int64_t>(add_to_exponent); + + // Theoretically these numbers should be MAX_BIASED_EXPONENT for long + // double, but that should be ~16,000 which is much less than 1 << 30. + if (temp_exponent > (1 << 30)) { + temp_exponent = (1 << 30); + } else if (temp_exponent < -(1 << 30)) { + temp_exponent = -(1 << 30); + } + this->decimal_point = static_cast<int32_t>(temp_exponent); + } + } + + this->trim_trailing_zeroes(); + } + + // Binary shift left (shift_amount > 0) or right (shift_amount < 0) + LIBC_INLINE void shift(int shift_amount) { + if (shift_amount == 0) { + return; + } + // Left + else if (shift_amount > 0) { + while (static_cast<uint32_t>(shift_amount) > MAX_SHIFT_AMOUNT) { + this->left_shift(MAX_SHIFT_AMOUNT); + shift_amount -= MAX_SHIFT_AMOUNT; + } + this->left_shift(static_cast<uint32_t>(shift_amount)); + } + // Right + else { + while (static_cast<uint32_t>(shift_amount) < -MAX_SHIFT_AMOUNT) { + this->right_shift(MAX_SHIFT_AMOUNT); + shift_amount += MAX_SHIFT_AMOUNT; + } + this->right_shift(static_cast<uint32_t>(-shift_amount)); + } + } + + // Round the number represented to the closest value of unsigned int type T. + // This is done ignoring overflow. + template <class T> + LIBC_INLINE T + round_to_integer_type(RoundDirection round = RoundDirection::Nearest) { + T result = 0; + uint32_t cur_digit = 0; + + while (static_cast<int32_t>(cur_digit) < this->decimal_point && + cur_digit < this->num_digits) { + result = result * 10 + (this->digits[cur_digit]); + ++cur_digit; + } + + // If there are implicit 0s at the end of the number, include those. + while (static_cast<int32_t>(cur_digit) < this->decimal_point) { + result *= 10; + ++cur_digit; + } + return result + + static_cast<T>(this->should_round_up(this->decimal_point, round)); + } + + // Extra functions for testing. + + LIBC_INLINE uint8_t *get_digits() { return this->digits; } + LIBC_INLINE uint32_t get_num_digits() { return this->num_digits; } + LIBC_INLINE int32_t get_decimal_point() { return this->decimal_point; } + LIBC_INLINE void set_truncated(bool trunc) { this->truncated = trunc; } +}; + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_HIGH_PRECISION_DECIMAL_H diff --git a/contrib/llvm-project/libc/src/__support/integer_literals.h b/contrib/llvm-project/libc/src/__support/integer_literals.h new file mode 100644 index 000000000000..f68b7ef12c87 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/integer_literals.h @@ -0,0 +1,180 @@ +//===-- User literal for unsigned integers ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This set of user defined literals allows uniform constructions of constants +// up to 256 bits and also help with unit tests (EXPECT_EQ requires the same +// type for LHS and RHS). +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_INTEGER_LITERALS_H +#define LLVM_LIBC_SRC___SUPPORT_INTEGER_LITERALS_H + +#include "src/__support/CPP/limits.h" // CHAR_BIT +#include "src/__support/ctype_utils.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/uint128.h" // UInt128 +#include <stddef.h> // size_t +#include <stdint.h> // uintxx_t + +namespace LIBC_NAMESPACE_DECL { + +LIBC_INLINE constexpr uint8_t operator""_u8(unsigned long long value) { + return static_cast<uint8_t>(value); +} + +LIBC_INLINE constexpr uint16_t operator""_u16(unsigned long long value) { + return static_cast<uint16_t>(value); +} + +LIBC_INLINE constexpr uint32_t operator""_u32(unsigned long long value) { + return static_cast<uint32_t>(value); +} + +LIBC_INLINE constexpr uint64_t operator""_u64(unsigned long long value) { + return static_cast<uint64_t>(value); +} + +namespace internal { + +// Creates a T by reading digits from an array. +template <typename T> +LIBC_INLINE constexpr T accumulate(int base, const uint8_t *digits, + size_t size) { + T value{}; + for (; size; ++digits, --size) { + value *= static_cast<unsigned int>(base); + value += *digits; + } + return value; +} + +// A static buffer to hold the digits for a T. +template <typename T, int base> struct DigitBuffer { + static_assert(base == 2 || base == 10 || base == 16); + // One character provides log2(base) bits. + // Base 2 and 16 provide exactly one and four bits per character respectively. + // For base 10, a character provides log2(10) ≈ 3.32... which we round to 3 + // for the purpose of buffer allocation. + LIBC_INLINE_VAR static constexpr size_t BITS_PER_DIGIT = base == 2 ? 1 + : base == 10 ? 3 + : base == 16 ? 4 + : 0; + LIBC_INLINE_VAR static constexpr size_t MAX_DIGITS = + sizeof(T) * CHAR_BIT / BITS_PER_DIGIT; + LIBC_INLINE_VAR static constexpr uint8_t INVALID_DIGIT = 255; + + uint8_t digits[MAX_DIGITS] = {}; + size_t size = 0; + + constexpr DigitBuffer(const char *str) { + for (; *str != '\0'; ++str) + push(*str); + } + + // Adds a single character to this buffer. + LIBC_INLINE constexpr void push(char c) { + if (c == '\'') + return; // ' is valid but not taken into account. + const int b36_val = internal::b36_char_to_int(c); + const uint8_t value = static_cast<uint8_t>( + b36_val < base && (b36_val != 0 || c == '0') ? b36_val : INVALID_DIGIT); + if (value == INVALID_DIGIT || size >= MAX_DIGITS) { + // During constant evaluation `__builtin_unreachable` will halt the + // compiler as it is not executable. This is preferable over `assert` that + // will only trigger in debug mode. Also we can't use `static_assert` + // because `value` and `size` are not constant. + __builtin_unreachable(); // invalid or too many characters. + } + digits[size] = value; + ++size; + } +}; + +// Generic implementation for native types (including __uint128_t or ExtInt +// where available). +template <typename T> struct Parser { + template <int base> LIBC_INLINE static constexpr T parse(const char *str) { + const DigitBuffer<T, base> buffer(str); + return accumulate<T>(base, buffer.digits, buffer.size); + } +}; + +// Specialization for UInt<N>. +// Because this code runs at compile time we try to make it efficient. For +// binary and hexadecimal formats we read digits by chunks of 64 bits and +// produce the BigInt internal representation direcly. For decimal numbers we +// go the slow path and use slower BigInt arithmetic. +template <size_t N> struct Parser<LIBC_NAMESPACE::UInt<N>> { + using UIntT = UInt<N>; + template <int base> static constexpr UIntT parse(const char *str) { + const DigitBuffer<UIntT, base> buffer(str); + if constexpr (base == 10) { + // Slow path, we sum and multiply BigInt for each digit. + return accumulate<UIntT>(base, buffer.digits, buffer.size); + } else { + // Fast path, we consume blocks of WordType and creates the BigInt's + // internal representation directly. + using WordArrayT = decltype(UIntT::val); + using WordType = typename WordArrayT::value_type; + WordArrayT array = {}; + size_t size = buffer.size; + const uint8_t *digit_ptr = buffer.digits + size; + for (size_t i = 0; i < array.size(); ++i) { + constexpr size_t DIGITS = DigitBuffer<WordType, base>::MAX_DIGITS; + const size_t chunk = size > DIGITS ? DIGITS : size; + digit_ptr -= chunk; + size -= chunk; + array[i] = accumulate<WordType>(base, digit_ptr, chunk); + } + return UIntT(array); + } + } +}; + +// Detects the base of the number and dispatches to the right implementation. +template <typename T> +LIBC_INLINE constexpr T parse_with_prefix(const char *ptr) { + using P = Parser<T>; + if (ptr == nullptr) + return T(); + if (ptr[0] == '0') { + if (ptr[1] == 'b') + return P::template parse<2>(ptr + 2); + if (ptr[1] == 'x') + return P::template parse<16>(ptr + 2); + } + return P::template parse<10>(ptr); +} + +} // namespace internal + +LIBC_INLINE constexpr UInt<96> operator""_u96(const char *x) { + return internal::parse_with_prefix<UInt<96>>(x); +} + +LIBC_INLINE constexpr UInt128 operator""_u128(const char *x) { + return internal::parse_with_prefix<UInt128>(x); +} + +LIBC_INLINE constexpr auto operator""_u256(const char *x) { + return internal::parse_with_prefix<UInt<256>>(x); +} + +template <typename T> LIBC_INLINE constexpr T parse_bigint(const char *ptr) { + if (ptr == nullptr) + return T(); + if (ptr[0] == '-' || ptr[0] == '+') { + auto positive = internal::parse_with_prefix<T>(ptr + 1); + return ptr[0] == '-' ? -positive : positive; + } + return internal::parse_with_prefix<T>(ptr); +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_INTEGER_LITERALS_H diff --git a/contrib/llvm-project/libc/src/__support/integer_operations.h b/contrib/llvm-project/libc/src/__support/integer_operations.h new file mode 100644 index 000000000000..4ecff70a6175 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/integer_operations.h @@ -0,0 +1,33 @@ +//===-- Utils for abs and friends -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_INTEGER_OPERATIONS_H +#define LLVM_LIBC_SRC___SUPPORT_INTEGER_OPERATIONS_H + +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +template <typename T> +LIBC_INLINE static constexpr cpp::enable_if_t<cpp::is_integral_v<T>, T> +integer_abs(T n) { + return (n < 0) ? -n : n; +} + +template <typename T> +LIBC_INLINE static constexpr cpp::enable_if_t<cpp::is_integral_v<T>, void> +integer_rem_quo(T x, T y, T ", T &rem) { + quot = x / y; + rem = x % y; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_INTEGER_OPERATIONS_H diff --git a/contrib/llvm-project/libc/src/__support/integer_to_string.h b/contrib/llvm-project/libc/src/__support/integer_to_string.h new file mode 100644 index 000000000000..65bdcf16b386 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/integer_to_string.h @@ -0,0 +1,498 @@ +//===-- Utilities to convert integral values to string ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Converts an integer to a string. +// +// By default, the string is written as decimal to an internal buffer and +// accessed via the 'view' method. +// +// IntegerToString<int> buffer(42); +// cpp::string_view view = buffer.view(); +// +// The buffer is allocated on the stack and its size is so that the conversion +// always succeeds. +// +// It is also possible to write the data to a preallocated buffer, but this may +// fail. +// +// char buffer[8]; +// if (auto maybe_view = IntegerToString<int>::write_to_span(buffer, 42)) { +// cpp::string_view view = *maybe_view; +// } +// +// The first template parameter is the type of the integer. +// The second template parameter defines how the integer is formatted. +// Available default are 'radix::Bin', 'radix::Oct', 'radix::Dec' and +// 'radix::Hex'. +// +// For 'radix::Bin', 'radix::Oct' and 'radix::Hex' the value is always +// interpreted as a positive type but 'radix::Dec' will honor negative values. +// e.g., +// +// IntegerToString<int8_t>(-1) // "-1" +// IntegerToString<int8_t, radix::Dec>(-1) // "-1" +// IntegerToString<int8_t, radix::Bin>(-1) // "11111111" +// IntegerToString<int8_t, radix::Oct>(-1) // "377" +// IntegerToString<int8_t, radix::Hex>(-1) // "ff" +// +// Additionnally, the format can be changed by navigating the subtypes: +// - WithPrefix : Adds "0b", "0", "0x" for binary, octal and hexadecimal +// - WithWidth<XX> : Pad string to XX characters filling leading digits with 0 +// - Uppercase : Use uppercase letters (only for HexString) +// - WithSign : Prepend '+' for positive values (only for DecString) +// +// Examples +// -------- +// IntegerToString<int8_t, radix::Dec::WithWidth<2>::WithSign>(0) : "+00" +// IntegerToString<int8_t, radix::Dec::WithWidth<2>::WithSign>(-1) : "-01" +// IntegerToString<uint8_t, radix::Hex::WithPrefix::Uppercase>(255) : "0xFF" +// IntegerToString<uint8_t, radix::Hex::WithWidth<4>::Uppercase>(255) : "00FF" +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_INTEGER_TO_STRING_H +#define LLVM_LIBC_SRC___SUPPORT_INTEGER_TO_STRING_H + +#include <stdint.h> + +#include "src/__support/CPP/algorithm.h" // max +#include "src/__support/CPP/array.h" +#include "src/__support/CPP/bit.h" +#include "src/__support/CPP/limits.h" +#include "src/__support/CPP/optional.h" +#include "src/__support/CPP/span.h" +#include "src/__support/CPP/string_view.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/big_int.h" // make_integral_or_big_int_unsigned_t +#include "src/__support/common.h" +#include "src/__support/ctype_utils.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace details { + +template <uint8_t base, bool prefix = false, bool force_sign = false, + bool is_uppercase = false, size_t min_digits = 1> +struct Fmt { + static constexpr uint8_t BASE = base; + static constexpr size_t MIN_DIGITS = min_digits; + static constexpr bool IS_UPPERCASE = is_uppercase; + static constexpr bool PREFIX = prefix; + static constexpr char FORCE_SIGN = force_sign; + + using WithPrefix = Fmt<BASE, true, FORCE_SIGN, IS_UPPERCASE, MIN_DIGITS>; + using WithSign = Fmt<BASE, PREFIX, true, IS_UPPERCASE, MIN_DIGITS>; + using Uppercase = Fmt<BASE, PREFIX, FORCE_SIGN, true, MIN_DIGITS>; + template <size_t value> + using WithWidth = Fmt<BASE, PREFIX, FORCE_SIGN, IS_UPPERCASE, value>; + + // Invariants + static constexpr uint8_t NUMERICAL_DIGITS = 10; + static constexpr uint8_t ALPHA_DIGITS = 26; + static constexpr uint8_t MAX_DIGIT = NUMERICAL_DIGITS + ALPHA_DIGITS; + static_assert(BASE > 1 && BASE <= MAX_DIGIT); + static_assert(!IS_UPPERCASE || BASE > 10, "Uppercase is only for radix > 10"); + static_assert(!FORCE_SIGN || BASE == 10, "WithSign is only for radix == 10"); + static_assert(!PREFIX || (BASE == 2 || BASE == 8 || BASE == 16), + "WithPrefix is only for radix == 2, 8 or 16"); +}; + +// Move this to a separate header since it might be useful elsewhere. +template <bool forward> class StringBufferWriterImpl { + cpp::span<char> buffer; + size_t index = 0; + bool out_of_range = false; + + LIBC_INLINE size_t location() const { + return forward ? index : buffer.size() - 1 - index; + } + +public: + StringBufferWriterImpl(const StringBufferWriterImpl &) = delete; + StringBufferWriterImpl(cpp::span<char> buffer) : buffer(buffer) {} + + LIBC_INLINE size_t size() const { return index; } + LIBC_INLINE size_t remainder_size() const { return buffer.size() - size(); } + LIBC_INLINE bool empty() const { return size() == 0; } + LIBC_INLINE bool full() const { return size() == buffer.size(); } + LIBC_INLINE bool ok() const { return !out_of_range; } + + LIBC_INLINE StringBufferWriterImpl &push(char c) { + if (ok()) { + if (!full()) { + buffer[location()] = c; + ++index; + } else { + out_of_range = true; + } + } + return *this; + } + + LIBC_INLINE cpp::span<char> remainder_span() const { + return forward ? buffer.last(remainder_size()) + : buffer.first(remainder_size()); + } + + LIBC_INLINE cpp::span<char> buffer_span() const { + return forward ? buffer.first(size()) : buffer.last(size()); + } + + LIBC_INLINE cpp::string_view buffer_view() const { + const auto s = buffer_span(); + return {s.data(), s.size()}; + } +}; + +using StringBufferWriter = StringBufferWriterImpl<true>; +using BackwardStringBufferWriter = StringBufferWriterImpl<false>; + +} // namespace details + +namespace radix { + +using Bin = details::Fmt<2>; +using Oct = details::Fmt<8>; +using Dec = details::Fmt<10>; +using Hex = details::Fmt<16>; +template <size_t radix> using Custom = details::Fmt<radix>; + +} // namespace radix + +// Extract the low-order decimal digit from a value of integer type T. The +// returned value is the digit itself, from 0 to 9. The input value is passed +// by reference, and modified by dividing by 10, so that iterating this +// function extracts all the digits of the original number one at a time from +// low to high. +template <typename T> +LIBC_INLINE cpp::enable_if_t<cpp::is_integral_v<T>, uint8_t> +extract_decimal_digit(T &value) { + const uint8_t digit(static_cast<uint8_t>(value % 10)); + // For built-in integer types, we assume that an adequately fast division is + // available. If hardware division isn't implemented, then with a divisor + // known at compile time the compiler might be able to generate an optimized + // sequence instead. + value /= 10; + return digit; +} + +// A specialization of extract_decimal_digit for the BigInt type in big_int.h, +// avoiding the use of general-purpose BigInt division which is very slow. +template <typename T> +LIBC_INLINE cpp::enable_if_t<is_big_int_v<T>, uint8_t> +extract_decimal_digit(T &value) { + // There are two essential ways you can turn n into (n/10,n%10). One is + // ordinary integer division. The other is a modular-arithmetic approach in + // which you first compute n%10 by bit twiddling, then subtract it off to get + // a value that is definitely a multiple of 10. Then you divide that by 10 in + // two steps: shift right to divide off a factor of 2, and then divide off a + // factor of 5 by multiplying by the modular inverse of 5 mod 2^BITS. (That + // last step only works if you know there's no remainder, which is why you + // had to subtract off the output digit first.) + // + // Either approach can be made to work in linear time. This code uses the + // modular-arithmetic technique, because the other approach either does a lot + // of integer divisions (requiring a fast hardware divider), or else uses a + // "multiply by an approximation to the reciprocal" technique which depends + // on careful error analysis which might go wrong in an untested edge case. + + using Word = typename T::word_type; + + // Find the remainder (value % 10). We do this by breaking up the input + // integer into chunks of size WORD_SIZE/2, so that the sum of them doesn't + // overflow a Word. Then we sum all the half-words times 6, except the bottom + // one, which is added to that sum without scaling. + // + // Why 6? Because you can imagine that the original number had the form + // + // halfwords[0] + K*halfwords[1] + K^2*halfwords[2] + ... + // + // where K = 2^(WORD_SIZE/2). Since WORD_SIZE is expected to be a multiple of + // 8, that makes WORD_SIZE/2 a multiple of 4, so that K is a power of 16. And + // all powers of 16 (larger than 1) are congruent to 6 mod 10, by induction: + // 16 itself is, and 6^2=36 is also congruent to 6. + Word acc_remainder = 0; + constexpr Word HALFWORD_BITS = T::WORD_SIZE / 2; + constexpr Word HALFWORD_MASK = ((Word(1) << HALFWORD_BITS) - 1); + // Sum both halves of all words except the low one. + for (size_t i = 1; i < T::WORD_COUNT; i++) { + acc_remainder += value.val[i] >> HALFWORD_BITS; + acc_remainder += value.val[i] & HALFWORD_MASK; + } + // Add the high half of the low word. Then we have everything that needs to + // be multiplied by 6, so do that. + acc_remainder += value.val[0] >> HALFWORD_BITS; + acc_remainder *= 6; + // Having multiplied it by 6, add the lowest half-word, and then reduce mod + // 10 by normal integer division to finish. + acc_remainder += value.val[0] & HALFWORD_MASK; + uint8_t digit = static_cast<uint8_t>(acc_remainder % 10); + + // Now we have the output digit. Subtract it from the input value, and shift + // right to divide by 2. + value -= digit; + value >>= 1; + + // Now all that's left is to multiply by the inverse of 5 mod 2^BITS. No + // matter what the value of BITS, the inverse of 5 has the very convenient + // form 0xCCCC...CCCD, with as many C hex digits in the middle as necessary. + // + // We could construct a second BigInt with all words 0xCCCCCCCCCCCCCCCC, + // increment the bottom word, and call a general-purpose multiply function. + // But we can do better, by taking advantage of the regularity: we can do + // this particular operation in linear time, whereas a general multiplier + // would take superlinear time (quadratic in small cases). + // + // To begin with, instead of computing n*0xCCCC...CCCD, we'll compute + // n*0xCCCC...CCCC and then add it to the original n. Then all the words of + // the multiplier have the same value 0xCCCCCCCCCCCCCCCC, which I'll just + // denote as C. If we also write t = 2^WORD_SIZE, and imagine (as an example) + // that the input number has three words x,y,z with x being the low word, + // then we're computing + // + // (x + y t + z t^2) * (C + C t + C t^2) + // + // = x C + y C t + z C t^2 + // + x C t + y C t^2 + z C t^3 + // + x C t^2 + y C t^3 + z C t^4 + // + // but we're working mod t^3, so the high-order terms vanish and this becomes + // + // x C + y C t + z C t^2 + // + x C t + y C t^2 + // + x C t^2 + // + // = x C + (x+y) C t + (x+y+z) C t^2 + // + // So all you have to do is to work from the low word of the integer upwards, + // accumulating C times the sum of all the words you've seen so far to get + // x*C, (x+y)*C, (x+y+z)*C and so on. In each step you add another product to + // the accumulator, and add the accumulator to the corresponding word of the + // original number (so that we end up with value*CCCD, not just value*CCCC). + // + // If you do that literally, then your accumulator has to be three words + // wide, because the sum of words can overflow into a second word, and + // multiplying by C adds another word. But we can do slightly better by + // breaking each product word*C up into a bottom half and a top half. If we + // write x*C = xl + xh*t, and similarly for y and z, then our sum becomes + // + // (xl + xh t) + (yl + yh t) t + (zl + zh t) t^2 + // + (xl + xh t) t + (yl + yh t) t^2 + // + (xl + xh t) t^2 + // + // and if you expand out again, collect terms, and discard t^3 terms, you get + // + // (xl) + // + (xl + xh + yl) t + // + (xl + xh + yl + yh + zl) t^2 + // + // in which each coefficient is the sum of all the low words of the products + // up to _and including_ the current word, plus all the high words up to but + // _not_ including the current word. So now you only have to retain two words + // of sum instead of three. + // + // We do this entire procedure in a single in-place pass over the input + // number, reading each word to make its product with C and then adding the + // low word of the accumulator to it. + constexpr Word C = Word(-1) / 5 * 4; // calculate 0xCCCC as 4/5 of 0xFFFF + Word acc_lo = 0, acc_hi = 0; // accumulator of all the half-products so far + Word carry_bit, carry_word = 0; + + for (size_t i = 0; i < T::WORD_COUNT; i++) { + // Make the two-word product of C with the current input word. + multiword::DoubleWide<Word> product = multiword::mul2(C, value.val[i]); + + // Add the low half of the product to our accumulator, but not yet the high + // half. + acc_lo = add_with_carry<Word>(acc_lo, product[0], 0, carry_bit); + acc_hi += carry_bit; + + // Now the accumulator contains exactly the value we need to add to the + // current input word. Add it, plus any carries from lower words, and make + // a new word of carry data to propagate into the next iteration. + value.val[i] = add_with_carry<Word>(value.val[i], carry_word, 0, carry_bit); + carry_word = acc_hi + carry_bit; + value.val[i] = add_with_carry<Word>(value.val[i], acc_lo, 0, carry_bit); + carry_word += carry_bit; + + // Now add the high half of the current product to our accumulator. + acc_lo = add_with_carry<Word>(acc_lo, product[1], 0, carry_bit); + acc_hi += carry_bit; + } + + return digit; +} + +// See file header for documentation. +template <typename T, typename Fmt = radix::Dec> class IntegerToString { + static_assert(cpp::is_integral_v<T> || is_big_int_v<T>); + + LIBC_INLINE static constexpr size_t compute_buffer_size() { + constexpr auto MAX_DIGITS = []() -> size_t { + // We size the string buffer for base 10 using an approximation algorithm: + // + // size = ceil(sizeof(T) * 5 / 2) + // + // If sizeof(T) is 1, then size is 3 (actually need 3) + // If sizeof(T) is 2, then size is 5 (actually need 5) + // If sizeof(T) is 4, then size is 10 (actually need 10) + // If sizeof(T) is 8, then size is 20 (actually need 20) + // If sizeof(T) is 16, then size is 40 (actually need 39) + // + // NOTE: The ceil operation is actually implemented as + // floor(((sizeof(T) * 5) + 1) / 2) + // where floor operation is just integer division. + // + // This estimation grows slightly faster than the actual value, but the + // overhead is small enough to tolerate. + if constexpr (Fmt::BASE == 10) + return ((sizeof(T) * 5) + 1) / 2; + // For other bases, we approximate by rounding down to the nearest power + // of two base, since the space needed is easy to calculate and it won't + // overestimate by too much. + constexpr auto FLOOR_LOG_2 = [](size_t num) -> size_t { + size_t i = 0; + for (; num > 1; num /= 2) + ++i; + return i; + }; + constexpr size_t BITS_PER_DIGIT = FLOOR_LOG_2(Fmt::BASE); + return ((sizeof(T) * 8 + (BITS_PER_DIGIT - 1)) / BITS_PER_DIGIT); + }; + constexpr size_t DIGIT_SIZE = cpp::max(MAX_DIGITS(), Fmt::MIN_DIGITS); + constexpr size_t SIGN_SIZE = Fmt::BASE == 10 ? 1 : 0; + constexpr size_t PREFIX_SIZE = Fmt::PREFIX ? 2 : 0; + return DIGIT_SIZE + SIGN_SIZE + PREFIX_SIZE; + } + + static constexpr size_t BUFFER_SIZE = compute_buffer_size(); + static_assert(BUFFER_SIZE > 0); + + // An internal stateless structure that handles the number formatting logic. + struct IntegerWriter { + static_assert(cpp::is_integral_v<T> || is_big_int_v<T>); + using UNSIGNED_T = make_integral_or_big_int_unsigned_t<T>; + + LIBC_INLINE static char digit_char(uint8_t digit) { + const int result = internal::int_to_b36_char(digit); + return static_cast<char>(Fmt::IS_UPPERCASE ? internal::toupper(result) + : result); + } + + LIBC_INLINE static void + write_unsigned_number(UNSIGNED_T value, + details::BackwardStringBufferWriter &sink) { + for (; sink.ok() && value != 0; value /= Fmt::BASE) { + const uint8_t digit(static_cast<uint8_t>(value % Fmt::BASE)); + sink.push(digit_char(digit)); + } + } + + LIBC_INLINE static void + write_unsigned_number_dec(UNSIGNED_T value, + details::BackwardStringBufferWriter &sink) { + while (sink.ok() && value != 0) { + const uint8_t digit = extract_decimal_digit(value); + sink.push(digit_char(digit)); + } + } + + // Returns the absolute value of 'value' as 'UNSIGNED_T'. + LIBC_INLINE static UNSIGNED_T abs(T value) { + if (cpp::is_unsigned_v<T> || value >= 0) + return static_cast<UNSIGNED_T>(value); // already of the right sign. + + // Signed integers are asymmetric (e.g., int8_t ∈ [-128, 127]). + // Thus negating the type's minimum value would overflow. + // From C++20 on, signed types are guaranteed to be represented as 2's + // complement. We take advantage of this representation and negate the + // value by using the exact same bit representation, e.g., + // binary : 0b1000'0000 + // int8_t : -128 + // uint8_t: 128 + + // Note: the compiler can completely optimize out the two branches and + // replace them by a simple negate instruction. + // https://godbolt.org/z/hE7zahT9W + if (value == cpp::numeric_limits<T>::min()) { + return cpp::bit_cast<UNSIGNED_T>(value); + } else { + return static_cast<UNSIGNED_T>( + -value); // legal and representable both as T and UNSIGNED_T.` + } + } + + LIBC_INLINE static void write(T value, + details::BackwardStringBufferWriter &sink) { + if constexpr (Fmt::BASE == 10) { + write_unsigned_number_dec(abs(value), sink); + } else { + write_unsigned_number(static_cast<UNSIGNED_T>(value), sink); + } + // width + while (sink.ok() && sink.size() < Fmt::MIN_DIGITS) + sink.push('0'); + // sign + if constexpr (Fmt::BASE == 10) { + if (value < 0) + sink.push('-'); + else if (Fmt::FORCE_SIGN) + sink.push('+'); + } + // prefix + if constexpr (Fmt::PREFIX) { + if constexpr (Fmt::BASE == 2) { + sink.push('b'); + sink.push('0'); + } + if constexpr (Fmt::BASE == 16) { + sink.push('x'); + sink.push('0'); + } + if constexpr (Fmt::BASE == 8) { + const cpp::string_view written = sink.buffer_view(); + if (written.empty() || written.front() != '0') + sink.push('0'); + } + } + } + }; + + cpp::array<char, BUFFER_SIZE> array; + size_t written = 0; + +public: + IntegerToString(const IntegerToString &) = delete; + IntegerToString(T value) { + details::BackwardStringBufferWriter writer(array); + IntegerWriter::write(value, writer); + written = writer.size(); + } + + [[nodiscard]] LIBC_INLINE static cpp::optional<cpp::string_view> + format_to(cpp::span<char> buffer, T value) { + details::BackwardStringBufferWriter writer(buffer); + IntegerWriter::write(value, writer); + if (writer.ok()) + return cpp::string_view(buffer.data() + buffer.size() - writer.size(), + writer.size()); + return cpp::nullopt; + } + + LIBC_INLINE static constexpr size_t buffer_size() { return BUFFER_SIZE; } + + LIBC_INLINE size_t size() const { return written; } + LIBC_INLINE cpp::string_view view() && = delete; + LIBC_INLINE cpp::string_view view() const & { + return cpp::string_view(array.data() + array.size() - size(), size()); + } +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_INTEGER_TO_STRING_H diff --git a/contrib/llvm-project/libc/src/__support/intrusive_list.h b/contrib/llvm-project/libc/src/__support/intrusive_list.h new file mode 100644 index 000000000000..4bbd8a41abd6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/intrusive_list.h @@ -0,0 +1,66 @@ +//===-- Intrusive queue implementation. -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// An intrusive list that implements the insque and remque semantics. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_INTRUSIVE_LIST_H +#define LLVM_LIBC_SRC___SUPPORT_INTRUSIVE_LIST_H + +#include "common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +class IntrusiveList { + struct IntrusiveNodeHeader { + IntrusiveNodeHeader *next; + IntrusiveNodeHeader *prev; + }; + +public: + LIBC_INLINE static void insert(void *elem, void *prev) { + auto elem_header = static_cast<IntrusiveNodeHeader *>(elem); + auto prev_header = static_cast<IntrusiveNodeHeader *>(prev); + + if (!prev_header) { + // The list is linear and elem will be the only element. + elem_header->next = nullptr; + elem_header->prev = nullptr; + return; + } + + auto next = prev_header->next; + + elem_header->next = next; + elem_header->prev = prev_header; + + prev_header->next = elem_header; + if (next) + next->prev = elem_header; + } + + LIBC_INLINE static void remove(void *elem) { + auto elem_header = static_cast<IntrusiveNodeHeader *>(elem); + + auto prev = elem_header->prev; + auto next = elem_header->next; + + if (prev) + prev->next = next; + if (next) + next->prev = prev; + } +}; + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_INTRUSIVE_LIST_H diff --git a/contrib/llvm-project/libc/src/__support/libc_assert.h b/contrib/llvm-project/libc/src/__support/libc_assert.h new file mode 100644 index 000000000000..ada1795ccb80 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/libc_assert.h @@ -0,0 +1,88 @@ +//===-- Definition of a libc internal assert macro --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_LIBC_ASSERT_H +#define LLVM_LIBC_SRC___SUPPORT_LIBC_ASSERT_H + +#if defined(LIBC_COPT_USE_C_ASSERT) || !defined(LIBC_FULL_BUILD) + +// The build is configured to just use the public <assert.h> API +// for libc's internal assertions. + +#include <assert.h> + +#define LIBC_ASSERT(COND) assert(COND) + +#else // Not LIBC_COPT_USE_C_ASSERT + +#include "src/__support/OSUtil/exit.h" +#include "src/__support/OSUtil/io.h" +#include "src/__support/integer_to_string.h" +#include "src/__support/macros/attributes.h" // For LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // For LIBC_UNLIKELY + +namespace LIBC_NAMESPACE_DECL { + +// This is intended to be removed in a future patch to use a similar design to +// below, but it's necessary for the external assert. +LIBC_INLINE void report_assertion_failure(const char *assertion, + const char *filename, unsigned line, + const char *funcname) { + const IntegerToString<unsigned> line_buffer(line); + write_to_stderr(filename); + write_to_stderr(":"); + write_to_stderr(line_buffer.view()); + write_to_stderr(": Assertion failed: '"); + write_to_stderr(assertion); + write_to_stderr("' in function: '"); + write_to_stderr(funcname); + write_to_stderr("'\n"); +} + +} // namespace LIBC_NAMESPACE_DECL + +#ifdef LIBC_ASSERT +#error "Unexpected: LIBC_ASSERT macro already defined" +#endif + +// The public "assert" macro calls abort on failure. Should it be same here? +// The libc internal assert can fire from anywhere inside the libc. So, to +// avoid potential chicken-and-egg problems, it is simple to do an exit +// on assertion failure instead of calling abort. We also don't want to use +// __builtin_trap as it could potentially be implemented using illegal +// instructions which can be very misleading when debugging. +#ifdef NDEBUG +#define LIBC_ASSERT(COND) \ + do { \ + } while (false) +#else + +// Convert __LINE__ to a string using macros. The indirection is necessary +// because otherwise it will turn "__LINE__" into a string, not its value. The +// value is evaluated in the indirection step. +#define __LIBC_MACRO_TO_STR(x) #x +#define __LIBC_MACRO_TO_STR_INDIR(y) __LIBC_MACRO_TO_STR(y) +#define __LIBC_LINE_STR__ __LIBC_MACRO_TO_STR_INDIR(__LINE__) + +#define LIBC_ASSERT(COND) \ + do { \ + if (LIBC_UNLIKELY(!(COND))) { \ + LIBC_NAMESPACE::write_to_stderr(__FILE__ ":" __LIBC_LINE_STR__ \ + ": Assertion failed: '" #COND \ + "' in function: '"); \ + LIBC_NAMESPACE::write_to_stderr(__PRETTY_FUNCTION__); \ + LIBC_NAMESPACE::write_to_stderr("'\n"); \ + LIBC_NAMESPACE::internal::exit(0xFF); \ + } \ + } while (false) +#endif // NDEBUG + +#endif // LIBC_COPT_USE_C_ASSERT + +#endif // LLVM_LIBC_SRC___SUPPORT_LIBC_ASSERT_H diff --git a/contrib/llvm-project/libc/src/__support/libc_errno.h b/contrib/llvm-project/libc/src/__support/libc_errno.h new file mode 100644 index 000000000000..ab5f6a9c4b9d --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/libc_errno.h @@ -0,0 +1,108 @@ +//===-- Implementation header for libc_errno --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_LIBC_ERRNO_H +#define LLVM_LIBC_SRC___SUPPORT_LIBC_ERRNO_H + +// This header is to be consumed by internal implementations, in which all of +// them should refer to `libc_errno` instead of using `errno` directly from +// <errno.h> header. + +// Unit and hermetic tests should: +// - #include "src/__support/libc_errno.h" +// - NOT #include <errno.h> +// - Only use `libc_errno` in the code +// - Depend on libc.src.errno.errno + +// Integration tests should: +// - NOT #include "src/__support/libc_errno.h" +// - #include <errno.h> +// - Use regular `errno` in the code +// - Still depend on libc.src.errno.errno + +// libc uses a fallback default value, either system or thread local. +#define LIBC_ERRNO_MODE_DEFAULT 0 +// libc never stores a value; `errno` macro uses get link-time failure. +#define LIBC_ERRNO_MODE_UNDEFINED 1 +// libc maintains per-thread state (requires C++ `thread_local` support). +#define LIBC_ERRNO_MODE_THREAD_LOCAL 2 +// libc maintains shared state used by all threads, contrary to standard C +// semantics unless always single-threaded; nothing prevents data races. +#define LIBC_ERRNO_MODE_SHARED 3 +// libc doesn't maintain any internal state, instead the embedder must define +// `int *__llvm_libc_errno(void);` C function. +#define LIBC_ERRNO_MODE_EXTERNAL 4 +// libc uses system `<errno.h>` `errno` macro directly in the overlay mode; in +// fullbuild mode, effectively the same as `LIBC_ERRNO_MODE_EXTERNAL`. +// In this mode, the public C++ symbol `LIBC_NAMESPACE::libc_errno ` is still +// exported and get redirected to the system `errno` inside its implementation. + +// TODO: Investigate deprecating LIBC_ERRNO_MODE_SYSTEM in favor of +// LIBC_ERRNO_MODE_SYSTEM_INLINE. +// https://github.com/llvm/llvm-project/issues/143454 +#define LIBC_ERRNO_MODE_SYSTEM 5 +// In this mode, the libc_errno is simply a macro resolved to `errno` from the +// system header <errno.h>. There is no need to link against the +// `libc.src.errno.errno` object. +#define LIBC_ERRNO_MODE_SYSTEM_INLINE 6 + +#if !defined(LIBC_ERRNO_MODE) || LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_DEFAULT +#undef LIBC_ERRNO_MODE +#if defined(LIBC_FULL_BUILD) || !defined(LIBC_COPT_PUBLIC_PACKAGING) +#define LIBC_ERRNO_MODE LIBC_ERRNO_MODE_THREAD_LOCAL +#else +#define LIBC_ERRNO_MODE LIBC_ERRNO_MODE_SYSTEM +#endif +#endif // LIBC_ERRNO_MODE + +#if LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_DEFAULT && \ + LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_UNDEFINED && \ + LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_THREAD_LOCAL && \ + LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_SHARED && \ + LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_EXTERNAL && \ + LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_SYSTEM && \ + LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_SYSTEM_INLINE +#error LIBC_ERRNO_MODE must be one of the following values: \ +LIBC_ERRNO_MODE_DEFAULT, \ +LIBC_ERRNO_MODE_UNDEFINED, \ +LIBC_ERRNO_MODE_THREAD_LOCAL, \ +LIBC_ERRNO_MODE_SHARED, \ +LIBC_ERRNO_MODE_EXTERNAL, \ +LIBC_ERRNO_MODE_SYSTEM, \ +LIBC_ERRNO_MODE_SYSTEM_INLINE. +#endif + +#if LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_SYSTEM_INLINE + +#include <errno.h> + +#define libc_errno errno + +#else // !LIBC_ERRNO_MODE_SYSTEM_INLINE + +#include "hdr/errno_macros.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +extern "C" int *__llvm_libc_errno() noexcept; + +struct Errno { + void operator=(int); + operator int(); +}; + +extern Errno libc_errno; + +} // namespace LIBC_NAMESPACE_DECL + +using LIBC_NAMESPACE::libc_errno; + +#endif // LIBC_ERRNO_MODE_SYSTEM_INLINE + +#endif // LLVM_LIBC_SRC___SUPPORT_LIBC_ERRNO_H diff --git a/contrib/llvm-project/libc/src/__support/macros/README.md b/contrib/llvm-project/libc/src/__support/macros/README.md new file mode 100644 index 000000000000..ec6911ceacc7 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/README.md @@ -0,0 +1 @@ +This folder and its subfolders contain freestanding header only files. diff --git a/contrib/llvm-project/libc/src/__support/macros/attributes.h b/contrib/llvm-project/libc/src/__support/macros/attributes.h new file mode 100644 index 000000000000..c6474673de85 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/attributes.h @@ -0,0 +1,51 @@ +//===-- Portable attributes -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This header file defines macros for declaring attributes for functions, +// types, and variables. +// +// These macros are used within llvm-libc and allow the compiler to optimize, +// where applicable, certain function calls. +// +// Most macros here are exposing GCC or Clang features, and are stubbed out for +// other compilers. + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_ATTRIBUTES_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_ATTRIBUTES_H + +#include "properties/architectures.h" + +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + +#define LIBC_INLINE inline +#define LIBC_INLINE_VAR inline +#define LIBC_INLINE_ASM __asm__ __volatile__ +#define LIBC_UNUSED __attribute__((unused)) + +#ifdef LIBC_TARGET_ARCH_IS_GPU +#define LIBC_THREAD_LOCAL +#else +#define LIBC_THREAD_LOCAL thread_local +#endif + +#if __cplusplus >= 202002L +#define LIBC_CONSTINIT constinit +#elif __has_attribute(__require_constant_initialization__) +#define LIBC_CONSTINIT __attribute__((__require_constant_initialization__)) +#else +#define LIBC_CONSTINIT +#endif + +#if defined(__clang__) && __has_attribute(preferred_type) +#define LIBC_PREFERED_TYPE(TYPE) [[clang::preferred_type(TYPE)]] +#else +#define LIBC_PREFERED_TYPE(TYPE) +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_ATTRIBUTES_H diff --git a/contrib/llvm-project/libc/src/__support/macros/config.h b/contrib/llvm-project/libc/src/__support/macros/config.h new file mode 100644 index 000000000000..2ab0fba095e6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/config.h @@ -0,0 +1,46 @@ +//===-- Portable attributes -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This header file defines a set of macros for checking the presence of +// important compiler and platform features. Such macros can be used to +// produce portable code by parameterizing compilation based on the presence or +// lack of a given feature. + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_CONFIG_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_CONFIG_H + +// Workaround for compilers that do not support builtin detection. +// FIXME: This is only required for the GPU portion which should be moved. +#ifndef __has_builtin +#define __has_builtin(b) 0 +#endif + +// Compiler feature-detection. +// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension +#ifdef __has_feature +#define LIBC_HAS_FEATURE(f) __has_feature(f) +#else +#define LIBC_HAS_FEATURE(f) 0 +#endif + +#ifdef __clang__ +// Declare a LIBC_NAMESPACE with hidden visibility. `namespace +// LIBC_NAMESPACE_DECL {` should be used around all declarations and definitions +// for libc internals as opposed to just `namespace LIBC_NAMESPACE {`. This +// ensures that all declarations within this namespace have hidden +// visibility, which optimizes codegen for uses of symbols defined in other +// translation units in ways that can be necessary for correctness by avoiding +// dynamic relocations. This does not affect the public C symbols which are +// controlled independently via `LLVM_LIBC_FUNCTION_ATTR`. +#define LIBC_NAMESPACE_DECL [[gnu::visibility("hidden")]] LIBC_NAMESPACE +#else +// TODO(#98548): GCC emits a warning when using the visibility attribute which +// needs to be diagnosed and addressed. +#define LIBC_NAMESPACE_DECL LIBC_NAMESPACE +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_CONFIG_H diff --git a/contrib/llvm-project/libc/src/__support/macros/null_check.h b/contrib/llvm-project/libc/src/__support/macros/null_check.h new file mode 100644 index 000000000000..abf65c56c404 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/null_check.h @@ -0,0 +1,37 @@ +//===-- Safe nullptr check --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_NULL_CHECK_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_NULL_CHECK_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" +#include "src/__support/macros/sanitizer.h" + +#if defined(LIBC_ADD_NULL_CHECKS) && !defined(LIBC_HAS_SANITIZER) +#define LIBC_CRASH_ON_NULLPTR(ptr) \ + do { \ + if (LIBC_UNLIKELY((ptr) == nullptr)) \ + __builtin_trap(); \ + } while (0) +#define LIBC_CRASH_ON_VALUE(var, value) \ + do { \ + if (LIBC_UNLIKELY((var) == (value))) \ + __builtin_trap(); \ + } while (0) + +#else +#define LIBC_CRASH_ON_NULLPTR(ptr) \ + do { \ + } while (0) +#define LIBC_CRASH_ON_VALUE(var, value) \ + do { \ + } while (0) +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_NULL_CHECK_H diff --git a/contrib/llvm-project/libc/src/__support/macros/optimization.h b/contrib/llvm-project/libc/src/__support/macros/optimization.h new file mode 100644 index 000000000000..250a9e060728 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/optimization.h @@ -0,0 +1,76 @@ +//===-- Portable optimization macros ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This header file defines portable macros for performance optimization. + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_OPTIMIZATION_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_OPTIMIZATION_H + +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/compiler.h" // LIBC_COMPILER_IS_CLANG + +// We use a template to implement likely/unlikely to make sure that we don't +// accidentally pass an integer. +namespace LIBC_NAMESPACE_DECL { +namespace details { +template <typename T> +LIBC_INLINE constexpr bool expects_bool_condition(T value, T expected) { + return __builtin_expect(value, expected); +} +} // namespace details +} // namespace LIBC_NAMESPACE_DECL +#define LIBC_LIKELY(x) LIBC_NAMESPACE::details::expects_bool_condition(x, true) +#define LIBC_UNLIKELY(x) \ + LIBC_NAMESPACE::details::expects_bool_condition(x, false) + +#if defined(LIBC_COMPILER_IS_CLANG) +#define LIBC_LOOP_NOUNROLL _Pragma("nounroll") +#define LIBC_LOOP_UNROLL _Pragma("unroll") +#elif defined(LIBC_COMPILER_IS_GCC) +#define LIBC_LOOP_NOUNROLL _Pragma("GCC unroll 0") +#define LIBC_LOOP_UNROLL _Pragma("GCC unroll 2048") +#else +#error "Unhandled compiler" +#endif + +// Defining optimization options for math functions. +// TODO: Exporting this to public generated headers? +#define LIBC_MATH_SKIP_ACCURATE_PASS 0x01 +#define LIBC_MATH_SMALL_TABLES 0x02 +#define LIBC_MATH_NO_ERRNO 0x04 +#define LIBC_MATH_NO_EXCEPT 0x08 +#define LIBC_MATH_FAST \ + (LIBC_MATH_SKIP_ACCURATE_PASS | LIBC_MATH_SMALL_TABLES | \ + LIBC_MATH_NO_ERRNO | LIBC_MATH_NO_EXCEPT) +#define LIBC_MATH_INTERMEDIATE_COMP_IN_FLOAT 0x10 + +#ifndef LIBC_MATH +#define LIBC_MATH 0 +#endif // LIBC_MATH + +#if (LIBC_MATH & LIBC_MATH_SKIP_ACCURATE_PASS) +#define LIBC_MATH_HAS_SKIP_ACCURATE_PASS +#endif + +#if (LIBC_MATH & LIBC_MATH_SMALL_TABLES) +#define LIBC_MATH_HAS_SMALL_TABLES +#endif + +#if (LIBC_MATH & LIBC_MATH_INTERMEDIATE_COMP_IN_FLOAT) +#define LIBC_MATH_HAS_INTERMEDIATE_COMP_IN_FLOAT +#endif + +#if (LIBC_MATH & LIBC_MATH_NO_ERRNO) +#define LIBC_MATH_HAS_NO_ERRNO +#endif + +#if (LIBC_MATH & LIBC_MATH_NO_EXCEPT) +#define LIBC_MATH_HAS_NO_EXCEPT +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_OPTIMIZATION_H diff --git a/contrib/llvm-project/libc/src/__support/macros/properties/README.md b/contrib/llvm-project/libc/src/__support/macros/properties/README.md new file mode 100644 index 000000000000..05dc0ce3b929 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/properties/README.md @@ -0,0 +1,2 @@ +This folder contain freestanding header only files that describe constant +target properties like architecture, supported cpu features, or used compiler. diff --git a/contrib/llvm-project/libc/src/__support/macros/properties/architectures.h b/contrib/llvm-project/libc/src/__support/macros/properties/architectures.h new file mode 100644 index 000000000000..c88956ff4114 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/properties/architectures.h @@ -0,0 +1,64 @@ +//===-- Compile time architecture detection ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_ARCHITECTURES_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_ARCHITECTURES_H + +#if defined(__AMDGPU__) +#define LIBC_TARGET_ARCH_IS_AMDGPU +#endif + +#if defined(__NVPTX__) +#define LIBC_TARGET_ARCH_IS_NVPTX +#endif + +#if defined(LIBC_TARGET_ARCH_IS_NVPTX) || defined(LIBC_TARGET_ARCH_IS_AMDGPU) +#define LIBC_TARGET_ARCH_IS_GPU +#endif + +#if defined(__pnacl__) || defined(__CLR_VER) || defined(LIBC_TARGET_ARCH_IS_GPU) +#define LIBC_TARGET_ARCH_IS_VM +#endif + +#if (defined(_M_IX86) || defined(__i386__)) && !defined(LIBC_TARGET_ARCH_IS_VM) +#define LIBC_TARGET_ARCH_IS_X86_32 +#endif + +#if (defined(_M_X64) || defined(__x86_64__)) && !defined(LIBC_TARGET_ARCH_IS_VM) +#define LIBC_TARGET_ARCH_IS_X86_64 +#endif + +#if defined(LIBC_TARGET_ARCH_IS_X86_32) || defined(LIBC_TARGET_ARCH_IS_X86_64) +#define LIBC_TARGET_ARCH_IS_X86 +#endif + +#if (defined(__arm__) || defined(_M_ARM)) +#define LIBC_TARGET_ARCH_IS_ARM +#endif + +#if defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) +#define LIBC_TARGET_ARCH_IS_AARCH64 +#endif + +#if defined(LIBC_TARGET_ARCH_IS_AARCH64) || defined(LIBC_TARGET_ARCH_IS_ARM) +#define LIBC_TARGET_ARCH_IS_ANY_ARM +#endif + +#if defined(__riscv) && (__riscv_xlen == 64) +#define LIBC_TARGET_ARCH_IS_RISCV64 +#endif + +#if defined(__riscv) && (__riscv_xlen == 32) +#define LIBC_TARGET_ARCH_IS_RISCV32 +#endif + +#if defined(LIBC_TARGET_ARCH_IS_RISCV64) || defined(LIBC_TARGET_ARCH_IS_RISCV32) +#define LIBC_TARGET_ARCH_IS_ANY_RISCV +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_ARCHITECTURES_H diff --git a/contrib/llvm-project/libc/src/__support/macros/properties/compiler.h b/contrib/llvm-project/libc/src/__support/macros/properties/compiler.h new file mode 100644 index 000000000000..b9ec0dd1defb --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/properties/compiler.h @@ -0,0 +1,43 @@ +//===-- Compile time compiler detection -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_COMPILER_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_COMPILER_H + +// Example usage of compiler version checks +// #if defined(LIBC_COMPILER_CLANG_VER) +// # if LIBC_COMPILER_CLANG_VER < 1500 +// # warning "Libc only supports Clang 15 and later" +// # endif +// #elif defined(LIBC_COMPILER_GCC_VER) +// # if LIBC_COMPILER_GCC_VER < 1500 +// # warning "Libc only supports GCC 15 and later" +// # endif +// #elif defined(LIBC_COMPILER_MSC_VER) +// # if LIBC_COMPILER_MSC_VER < 1930 +// # warning "Libc only supports Visual Studio 2022 RTW (17.0) and later" +// # endif +// #endif + +#if defined(__clang__) +#define LIBC_COMPILER_IS_CLANG +#define LIBC_COMPILER_CLANG_VER (__clang_major__ * 100 + __clang_minor__) +#endif + +#if defined(__GNUC__) && !defined(__clang__) +#define LIBC_COMPILER_IS_GCC +#define LIBC_COMPILER_GCC_VER (__GNUC__ * 100 + __GNUC_MINOR__) +#endif + +#if defined(_MSC_VER) +#define LIBC_COMPILER_IS_MSC +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +#define LIBC_COMPILER_MSC_VER (_MSC_VER) +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_COMPILER_H diff --git a/contrib/llvm-project/libc/src/__support/macros/properties/complex_types.h b/contrib/llvm-project/libc/src/__support/macros/properties/complex_types.h new file mode 100644 index 000000000000..ede4d6b7c7d9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/properties/complex_types.h @@ -0,0 +1,30 @@ +//===-- Complex Types support -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// Complex Types detection and support. + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CTYPES_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CTYPES_H + +#include "include/llvm-libc-types/cfloat128.h" +#include "include/llvm-libc-types/cfloat16.h" +#include "types.h" + +// -- cfloat16 support -------------------------------------------------------- +// LIBC_TYPES_HAS_CFLOAT16 and 'cfloat16' type is provided by +// "include/llvm-libc-types/cfloat16.h" + +// -- cfloat128 support ------------------------------------------------------- +// LIBC_TYPES_HAS_CFLOAT128 and 'cfloat128' type are provided by +// "include/llvm-libc-types/cfloat128.h" + +#if defined(LIBC_TYPES_HAS_CFLOAT128) && \ + !defined(LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE) +#define LIBC_TYPES_CFLOAT128_IS_NOT_COMPLEX_LONG_DOUBLE +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CTYPES_H diff --git a/contrib/llvm-project/libc/src/__support/macros/properties/cpu_features.h b/contrib/llvm-project/libc/src/__support/macros/properties/cpu_features.h new file mode 100644 index 000000000000..cdb2df97b2b9 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/properties/cpu_features.h @@ -0,0 +1,108 @@ +//===-- Compile time cpu feature detection ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This file lists target cpu features by introspecting compiler enabled +// preprocessor definitions. +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CPU_FEATURES_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CPU_FEATURES_H + +#include "architectures.h" + +#if defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC) +#define LIBC_TARGET_CPU_HAS_FULLFP16 +#endif + +#if defined(__SSE2__) +#define LIBC_TARGET_CPU_HAS_SSE2 +#define LIBC_TARGET_CPU_HAS_FPU_FLOAT +#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE +#endif + +#if defined(__SSE4_2__) +#define LIBC_TARGET_CPU_HAS_SSE4_2 +#endif + +#if defined(__AVX__) +#define LIBC_TARGET_CPU_HAS_AVX +#endif + +#if defined(__AVX2__) +#define LIBC_TARGET_CPU_HAS_AVX2 +#endif + +#if defined(__AVX512F__) +#define LIBC_TARGET_CPU_HAS_AVX512F +#endif + +#if defined(__AVX512BW__) +#define LIBC_TARGET_CPU_HAS_AVX512BW +#endif + +#if defined(__ARM_FP) +#if (__ARM_FP & 0x2) +#define LIBC_TARGET_CPU_HAS_ARM_FPU_HALF +#define LIBC_TARGET_CPU_HAS_FPU_HALF +#endif // LIBC_TARGET_CPU_HAS_ARM_FPU_HALF +#if (__ARM_FP & 0x4) +#define LIBC_TARGET_CPU_HAS_ARM_FPU_FLOAT +#define LIBC_TARGET_CPU_HAS_FPU_FLOAT +#endif // LIBC_TARGET_CPU_HAS_ARM_FPU_FLOAT +#if (__ARM_FP & 0x8) +#define LIBC_TARGET_CPU_HAS_ARM_FPU_DOUBLE +#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE +#endif // LIBC_TARGET_CPU_HAS_ARM_FPU_DOUBLE +#endif // __ARM_FP + +#if defined(__riscv_flen) +// https://github.com/riscv-non-isa/riscv-c-api-doc/blob/main/src/c-api.adoc +#if defined(__riscv_zfhmin) +#define LIBC_TARGET_CPU_HAS_RISCV_FPU_HALF +#define LIBC_TARGET_CPU_HAS_FPU_HALF +#endif // LIBC_TARGET_CPU_HAS_RISCV_FPU_HALF +#if (__riscv_flen >= 32) +#define LIBC_TARGET_CPU_HAS_RISCV_FPU_FLOAT +#define LIBC_TARGET_CPU_HAS_FPU_FLOAT +#endif // LIBC_TARGET_CPU_HAS_RISCV_FPU_FLOAT +#if (__riscv_flen >= 64) +#define LIBC_TARGET_CPU_HAS_RISCV_FPU_DOUBLE +#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE +#endif // LIBC_TARGET_CPU_HAS_RISCV_FPU_DOUBLE +#endif // __riscv_flen + +#if defined(__NVPTX__) || defined(__AMDGPU__) +#define LIBC_TARGET_CPU_HAS_FPU_FLOAT +#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE +#endif + +#if defined(__ARM_FEATURE_FMA) || (defined(__AVX2__) && defined(__FMA__)) || \ + defined(__NVPTX__) || defined(__AMDGPU__) || defined(__LIBC_RISCV_USE_FMA) +#define LIBC_TARGET_CPU_HAS_FMA +// Provide a more fine-grained control of FMA instruction for ARM targets. +#if defined(LIBC_TARGET_CPU_HAS_FPU_HALF) +#define LIBC_TARGET_CPU_HAS_FMA_HALF +#endif // LIBC_TARGET_CPU_HAS_FMA_HALF +#if defined(LIBC_TARGET_CPU_HAS_FPU_FLOAT) +#define LIBC_TARGET_CPU_HAS_FMA_FLOAT +#endif // LIBC_TARGET_CPU_HAS_FMA_FLOAT +#if defined(LIBC_TARGET_CPU_HAS_FPU_DOUBLE) +#define LIBC_TARGET_CPU_HAS_FMA_DOUBLE +#endif // LIBC_TARGET_CPU_HAS_FMA_DOUBLE +#endif + +#if defined(LIBC_TARGET_ARCH_IS_AARCH64) || \ + (defined(LIBC_TARGET_ARCH_IS_X86_64) && \ + defined(LIBC_TARGET_CPU_HAS_SSE4_2)) +#define LIBC_TARGET_CPU_HAS_NEAREST_INT +#endif + +#if defined(LIBC_TARGET_ARCH_IS_AARCH64) || defined(LIBC_TARGET_ARCH_IS_GPU) +#define LIBC_TARGET_CPU_HAS_FAST_FLOAT16_OPS +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CPU_FEATURES_H diff --git a/contrib/llvm-project/libc/src/__support/macros/properties/os.h b/contrib/llvm-project/libc/src/__support/macros/properties/os.h new file mode 100644 index 000000000000..807ce1812735 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/properties/os.h @@ -0,0 +1,32 @@ +//===-- Target OS detection -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_OS_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_OS_H + +#if (defined(__freebsd__) || defined(__FreeBSD__)) +#define LIBC_TARGET_OS_IS_FREEBSD +#endif + +#if defined(__ANDROID__) +#define LIBC_TARGET_OS_IS_ANDROID +#endif + +#if defined(__linux__) && !defined(LIBC_TARGET_OS_IS_FREEBSD) && \ + !defined(LIBC_TARGET_OS_IS_ANDROID) +#define LIBC_TARGET_OS_IS_LINUX +#endif + +#if (defined(_WIN64) || defined(_WIN32)) +#define LIBC_TARGET_OS_IS_WINDOWS +#endif + +#if defined(__Fuchsia__) +#define LIBC_TARGET_OS_IS_FUCHSIA +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_OS_H diff --git a/contrib/llvm-project/libc/src/__support/macros/properties/types.h b/contrib/llvm-project/libc/src/__support/macros/properties/types.h new file mode 100644 index 000000000000..aec4a488c3cb --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/properties/types.h @@ -0,0 +1,72 @@ +//===-- Types support -------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// Types detection and support. + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_TYPES_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_TYPES_H + +#include "hdr/float_macros.h" // LDBL_MANT_DIG +#include "include/llvm-libc-macros/float16-macros.h" // LIBC_TYPES_HAS_FLOAT16 +#include "include/llvm-libc-types/float128.h" // float128 +#include "src/__support/macros/config.h" // LIBC_NAMESPACE_DECL +#include "src/__support/macros/properties/architectures.h" +#include "src/__support/macros/properties/compiler.h" +#include "src/__support/macros/properties/cpu_features.h" +#include "src/__support/macros/properties/os.h" + +#include <stdint.h> // UINT64_MAX, __SIZEOF_INT128__ + +// 'long double' properties. +#if (LDBL_MANT_DIG == 53) +#define LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 +#elif (LDBL_MANT_DIG == 64) +#define LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 +#elif (LDBL_MANT_DIG == 113) +#define LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128 +#elif (LDBL_MANT_DIG == 106) +#define LIBC_TYPES_LONG_DOUBLE_IS_DOUBLE_DOUBLE +#endif + +#if defined(LIBC_TYPES_HAS_FLOAT128) && \ + !defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) +#define LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE +#endif + +// int64 / uint64 support +#if defined(UINT64_MAX) +#define LIBC_TYPES_HAS_INT64 +#endif // UINT64_MAX + +// int128 / uint128 support +#if defined(__SIZEOF_INT128__) && !defined(LIBC_TARGET_OS_IS_WINDOWS) +#define LIBC_TYPES_HAS_INT128 +#endif // defined(__SIZEOF_INT128__) + +// -- float16 support --------------------------------------------------------- +// LIBC_TYPES_HAS_FLOAT16 is provided by +// "include/llvm-libc-macros/float16-macros.h" +#ifdef LIBC_TYPES_HAS_FLOAT16 +// Type alias for internal use. +using float16 = _Float16; +#endif // LIBC_TYPES_HAS_FLOAT16 + +// -- float128 support -------------------------------------------------------- +// LIBC_TYPES_HAS_FLOAT128 and 'float128' type are provided by +// "include/llvm-libc-types/float128.h" + +// -- bfloat16 support --------------------------------------------------------- + +namespace LIBC_NAMESPACE_DECL { +namespace fputil { +struct BFloat16; +} +} // namespace LIBC_NAMESPACE_DECL + +using bfloat16 = LIBC_NAMESPACE::fputil::BFloat16; + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_TYPES_H diff --git a/contrib/llvm-project/libc/src/__support/macros/sanitizer.h b/contrib/llvm-project/libc/src/__support/macros/sanitizer.h new file mode 100644 index 000000000000..c20412e0f8b6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/macros/sanitizer.h @@ -0,0 +1,59 @@ +//===-- Convenient sanitizer macros -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H +#define LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H + +#include "src/__support/macros/config.h" //LIBC_HAS_FEATURE + +//----------------------------------------------------------------------------- +// Functions to unpoison memory +//----------------------------------------------------------------------------- + +#if LIBC_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__) +#define LIBC_HAS_ADDRESS_SANITIZER +#endif + +#if LIBC_HAS_FEATURE(memory_sanitizer) +#define LIBC_HAS_MEMORY_SANITIZER +#endif + +#if LIBC_HAS_FEATURE(undefined_behavior_sanitizer) +#define LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER +#endif + +#if defined(LIBC_HAS_ADDRESS_SANITIZER) || \ + defined(LIBC_HAS_MEMORY_SANITIZER) || \ + defined(LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER) +#define LIBC_HAS_SANITIZER +#endif + +#ifdef LIBC_HAS_MEMORY_SANITIZER +// Only perform MSAN unpoison in non-constexpr context. +#include <sanitizer/msan_interface.h> +#define MSAN_UNPOISON(addr, size) \ + do { \ + if (!__builtin_is_constant_evaluated()) \ + __msan_unpoison(addr, size); \ + } while (0) +#else +#define MSAN_UNPOISON(ptr, size) +#endif + +#ifdef LIBC_HAS_ADDRESS_SANITIZER +#include <sanitizer/asan_interface.h> +#define ASAN_POISON_MEMORY_REGION(addr, size) \ + __asan_poison_memory_region((addr), (size)) +#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ + __asan_unpoison_memory_region((addr), (size)) +#else +#define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) +#define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) +#endif + +#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H diff --git a/contrib/llvm-project/libc/src/__support/math/exp_float_constants.h b/contrib/llvm-project/libc/src/__support/math/exp_float_constants.h new file mode 100644 index 000000000000..cabb227a034b --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/exp_float_constants.h @@ -0,0 +1,145 @@ +//===-- Look-up tables for exp*f functions ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT_CONSTANTS_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT_CONSTANTS_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { +// Lookup table for exp(m) with m = -104, ..., 89. +// -104 = floor(log(single precision's min denormal)) +// 89 = ceil(log(single precision's max normal)) +// Table is generated with Sollya as follow: +// > display = hexadecimal; +// > for i from -104 to 89 do { D(exp(i)); }; +static constexpr double EXP_M1[195] = { + 0x1.f1e6b68529e33p-151, 0x1.525be4e4e601dp-149, 0x1.cbe0a45f75eb1p-148, + 0x1.3884e838aea68p-146, 0x1.a8c1f14e2af5dp-145, 0x1.20a717e64a9bdp-143, + 0x1.8851d84118908p-142, 0x1.0a9bdfb02d240p-140, 0x1.6a5bea046b42ep-139, + 0x1.ec7f3b269efa8p-138, 0x1.4eafb87eab0f2p-136, 0x1.c6e2d05bbc000p-135, + 0x1.35208867c2683p-133, 0x1.a425b317eeacdp-132, 0x1.1d8508fa8246ap-130, + 0x1.840fbc08fdc8ap-129, 0x1.07b7112bc1ffep-127, 0x1.666d0dad2961dp-126, + 0x1.e726c3f64d0fep-125, 0x1.4b0dc07cabf98p-123, 0x1.c1f2daf3b6a46p-122, + 0x1.31c5957a47de2p-120, 0x1.9f96445648b9fp-119, 0x1.1a6baeadb4fd1p-117, + 0x1.7fd974d372e45p-116, 0x1.04da4d1452919p-114, 0x1.62891f06b3450p-113, + 0x1.e1dd273aa8a4ap-112, 0x1.4775e0840bfddp-110, 0x1.bd109d9d94bdap-109, + 0x1.2e73f53fba844p-107, 0x1.9b138170d6bfep-106, 0x1.175af0cf60ec5p-104, + 0x1.7baee1bffa80bp-103, 0x1.02057d1245cebp-101, 0x1.5eafffb34ba31p-100, + 0x1.dca23bae16424p-99, 0x1.43e7fc88b8056p-97, 0x1.b83bf23a9a9ebp-96, + 0x1.2b2b8dd05b318p-94, 0x1.969d47321e4ccp-93, 0x1.1452b7723aed2p-91, + 0x1.778fe2497184cp-90, 0x1.fe7116182e9ccp-89, 0x1.5ae191a99585ap-87, + 0x1.d775d87da854dp-86, 0x1.4063f8cc8bb98p-84, 0x1.b374b315f87c1p-83, + 0x1.27ec458c65e3cp-81, 0x1.923372c67a074p-80, 0x1.1152eaeb73c08p-78, + 0x1.737c5645114b5p-77, 0x1.f8e6c24b5592ep-76, 0x1.571db733a9d61p-74, + 0x1.d257d547e083fp-73, 0x1.3ce9b9de78f85p-71, 0x1.aebabae3a41b5p-70, + 0x1.24b6031b49bdap-68, 0x1.8dd5e1bb09d7ep-67, 0x1.0e5b73d1ff53dp-65, + 0x1.6f741de1748ecp-64, 0x1.f36bd37f42f3ep-63, 0x1.536452ee2f75cp-61, + 0x1.cd480a1b74820p-60, 0x1.39792499b1a24p-58, 0x1.aa0de4bf35b38p-57, + 0x1.2188ad6ae3303p-55, 0x1.898471fca6055p-54, 0x1.0b6c3afdde064p-52, + 0x1.6b7719a59f0e0p-51, 0x1.ee001eed62aa0p-50, 0x1.4fb547c775da8p-48, + 0x1.c8464f7616468p-47, 0x1.36121e24d3bbap-45, 0x1.a56e0c2ac7f75p-44, + 0x1.1e642baeb84a0p-42, 0x1.853f01d6d53bap-41, 0x1.0885298767e9ap-39, + 0x1.67852a7007e42p-38, 0x1.e8a37a45fc32ep-37, 0x1.4c1078fe9228ap-35, + 0x1.c3527e433fab1p-34, 0x1.32b48bf117da2p-32, 0x1.a0db0d0ddb3ecp-31, + 0x1.1b48655f37267p-29, 0x1.81056ff2c5772p-28, 0x1.05a628c699fa1p-26, + 0x1.639e3175a689dp-25, 0x1.e355bbaee85cbp-24, 0x1.4875ca227ec38p-22, + 0x1.be6c6fdb01612p-21, 0x1.2f6053b981d98p-19, 0x1.9c54c3b43bc8bp-18, + 0x1.18354238f6764p-16, 0x1.7cd79b5647c9bp-15, 0x1.02cf22526545ap-13, + 0x1.5fc21041027adp-12, 0x1.de16b9c24a98fp-11, 0x1.44e51f113d4d6p-9, + 0x1.b993fe00d5376p-8, 0x1.2c155b8213cf4p-6, 0x1.97db0ccceb0afp-5, + 0x1.152aaa3bf81ccp-3, 0x1.78b56362cef38p-2, 0x1.0000000000000p+0, + 0x1.5bf0a8b145769p+1, 0x1.d8e64b8d4ddaep+2, 0x1.415e5bf6fb106p+4, + 0x1.b4c902e273a58p+5, 0x1.28d389970338fp+7, 0x1.936dc5690c08fp+8, + 0x1.122885aaeddaap+10, 0x1.749ea7d470c6ep+11, 0x1.fa7157c470f82p+12, + 0x1.5829dcf950560p+14, 0x1.d3c4488ee4f7fp+15, 0x1.3de1654d37c9ap+17, + 0x1.b00b5916ac955p+18, 0x1.259ac48bf05d7p+20, 0x1.8f0ccafad2a87p+21, + 0x1.0f2ebd0a80020p+23, 0x1.709348c0ea4f9p+24, 0x1.f4f22091940bdp+25, + 0x1.546d8f9ed26e1p+27, 0x1.ceb088b68e804p+28, 0x1.3a6e1fd9eecfdp+30, + 0x1.ab5adb9c43600p+31, 0x1.226af33b1fdc1p+33, 0x1.8ab7fb5475fb7p+34, + 0x1.0c3d3920962c9p+36, 0x1.6c932696a6b5dp+37, 0x1.ef822f7f6731dp+38, + 0x1.50bba3796379ap+40, 0x1.c9aae4631c056p+41, 0x1.370470aec28edp+43, + 0x1.a6b765d8cdf6dp+44, 0x1.1f43fcc4b662cp+46, 0x1.866f34a725782p+47, + 0x1.0953e2f3a1ef7p+49, 0x1.689e221bc8d5bp+50, 0x1.ea215a1d20d76p+51, + 0x1.4d13fbb1a001ap+53, 0x1.c4b334617cc67p+54, 0x1.33a43d282a519p+56, + 0x1.a220d397972ebp+57, 0x1.1c25c88df6862p+59, 0x1.8232558201159p+60, + 0x1.0672a3c9eb871p+62, 0x1.64b41c6d37832p+63, 0x1.e4cf766fe49bep+64, + 0x1.49767bc0483e3p+66, 0x1.bfc951eb8bb76p+67, 0x1.304d6aeca254bp+69, + 0x1.9d97010884251p+70, 0x1.19103e4080b45p+72, 0x1.7e013cd114461p+73, + 0x1.03996528e074cp+75, 0x1.60d4f6fdac731p+76, 0x1.df8c5af17ba3bp+77, + 0x1.45e3076d61699p+79, 0x1.baed16a6e0da7p+80, 0x1.2cffdfebde1a1p+82, + 0x1.9919cabefcb69p+83, 0x1.160345c9953e3p+85, 0x1.79dbc9dc53c66p+86, + 0x1.00c810d464097p+88, 0x1.5d009394c5c27p+89, 0x1.da57de8f107a8p+90, + 0x1.425982cf597cdp+92, 0x1.b61e5ca3a5e31p+93, 0x1.29bb825dfcf87p+95, + 0x1.94a90db0d6fe2p+96, 0x1.12fec759586fdp+98, 0x1.75c1dc469e3afp+99, + 0x1.fbfd219c43b04p+100, 0x1.5936d44e1a146p+102, 0x1.d531d8a7ee79cp+103, + 0x1.3ed9d24a2d51bp+105, 0x1.b15cfe5b6e17bp+106, 0x1.268038c2c0e00p+108, + 0x1.9044a73545d48p+109, 0x1.1002ab6218b38p+111, 0x1.71b3540cbf921p+112, + 0x1.f6799ea9c414ap+113, 0x1.55779b984f3ebp+115, 0x1.d01a210c44aa4p+116, + 0x1.3b63da8e91210p+118, 0x1.aca8d6b0116b8p+119, 0x1.234de9e0c74e9p+121, + 0x1.8bec7503ca477p+122, 0x1.0d0eda9796b90p+124, 0x1.6db0118477245p+125, + 0x1.f1056dc7bf22dp+126, 0x1.51c2cc3433801p+128, 0x1.cb108ffbec164p+129, +}; + +// Lookup table for exp(m * 2^(-7)) with m = 0, ..., 127. +// Table is generated with Sollya as follow: +// > display = hexadecimal; +// > for i from 0 to 127 do { D(exp(i / 128)); }; +static constexpr double EXP_M2[128] = { + 0x1.0000000000000p0, 0x1.0202015600446p0, 0x1.04080ab55de39p0, + 0x1.06122436410ddp0, 0x1.08205601127edp0, 0x1.0a32a84e9c1f6p0, + 0x1.0c49236829e8cp0, 0x1.0e63cfa7ab09dp0, 0x1.1082b577d34edp0, + 0x1.12a5dd543ccc5p0, 0x1.14cd4fc989cd6p0, 0x1.16f9157587069p0, + 0x1.192937074e0cdp0, 0x1.1b5dbd3f68122p0, 0x1.1d96b0eff0e79p0, + 0x1.1fd41afcba45ep0, 0x1.2216045b6f5cdp0, 0x1.245c7613b8a9bp0, + 0x1.26a7793f60164p0, 0x1.28f7170a755fdp0, 0x1.2b4b58b372c79p0, + 0x1.2da4478b620c7p0, 0x1.3001ecf601af7p0, 0x1.32645269ea829p0, + 0x1.34cb8170b5835p0, 0x1.373783a722012p0, 0x1.39a862bd3c106p0, + 0x1.3c1e2876834aap0, 0x1.3e98deaa11dccp0, 0x1.41188f42c3e32p0, + 0x1.439d443f5f159p0, 0x1.462707b2bac21p0, 0x1.48b5e3c3e8186p0, + 0x1.4b49e2ae5ac67p0, 0x1.4de30ec211e60p0, 0x1.50817263c13cdp0, + 0x1.5325180cfacf7p0, 0x1.55ce0a4c58c7cp0, 0x1.587c53c5a7af0p0, + 0x1.5b2fff3210fd9p0, 0x1.5de9176045ff5p0, 0x1.60a7a734ab0e8p0, + 0x1.636bb9a983258p0, 0x1.663559cf1bc7cp0, 0x1.690492cbf9433p0, + 0x1.6bd96fdd034a2p0, 0x1.6eb3fc55b1e76p0, 0x1.719443a03acb9p0, + 0x1.747a513dbef6ap0, 0x1.776630c678bc1p0, 0x1.7a57ede9ea23ep0, + 0x1.7d4f946f0ba8dp0, 0x1.804d30347b546p0, 0x1.8350cd30ac390p0, + 0x1.865a7772164c5p0, 0x1.896a3b1f66a0ep0, 0x1.8c802477b0010p0, + 0x1.8f9c3fd29beafp0, 0x1.92be99a09bf00p0, 0x1.95e73e6b1b75ep0, + 0x1.99163ad4b1dccp0, 0x1.9c4b9b995509bp0, 0x1.9f876d8e8c566p0, + 0x1.a2c9bda3a3e78p0, 0x1.a61298e1e069cp0, 0x1.a9620c6cb3374p0, + 0x1.acb82581eee54p0, 0x1.b014f179fc3b8p0, 0x1.b3787dc80f95fp0, + 0x1.b6e2d7fa5eb18p0, 0x1.ba540dba56e56p0, 0x1.bdcc2cccd3c85p0, + 0x1.c14b431256446p0, 0x1.c4d15e873c193p0, 0x1.c85e8d43f7cd0p0, + 0x1.cbf2dd7d490f2p0, 0x1.cf8e5d84758a9p0, 0x1.d3311bc7822b4p0, + 0x1.d6db26d16cd67p0, 0x1.da8c8d4a66969p0, 0x1.de455df80e3c0p0, + 0x1.e205a7bdab73ep0, 0x1.e5cd799c6a54ep0, 0x1.e99ce2b397649p0, + 0x1.ed73f240dc142p0, 0x1.f152b7a07bb76p0, 0x1.f539424d90f5ep0, + 0x1.f927a1e24bb76p0, 0x1.fd1de6182f8c9p0, 0x1.008e0f64294abp1, + 0x1.02912df5ce72ap1, 0x1.049856cd84339p1, 0x1.06a39207f0a09p1, + 0x1.08b2e7d2035cfp1, 0x1.0ac6606916501p1, 0x1.0cde041b0e9aep1, + 0x1.0ef9db467dcf8p1, 0x1.1119ee5ac36b6p1, 0x1.133e45d82e952p1, + 0x1.1566ea50201d7p1, 0x1.1793e4652cc50p1, 0x1.19c53ccb3fc6bp1, + 0x1.1bfafc47bda73p1, 0x1.1e352bb1a74adp1, 0x1.2073d3f1bd518p1, + 0x1.22b6fe02a3b9cp1, 0x1.24feb2f105cb8p1, 0x1.274afbdbba4a6p1, + 0x1.299be1f3e7f1cp1, 0x1.2bf16e7d2a38cp1, 0x1.2e4baacdb6614p1, + 0x1.30aaa04e80d05p1, 0x1.330e587b62b28p1, 0x1.3576dce33feadp1, + 0x1.37e437282d4eep1, 0x1.3a5670ff972edp1, 0x1.3ccd9432682b4p1, + 0x1.3f49aa9d30590p1, 0x1.41cabe304cb34p1, 0x1.4450d8f00edd4p1, + 0x1.46dc04f4e5338p1, 0x1.496c4c6b832dap1, 0x1.4c01b9950a111p1, + 0x1.4e9c56c731f5dp1, 0x1.513c2e6c731d7p1, 0x1.53e14b042f9cap1, + 0x1.568bb722dd593p1, 0x1.593b7d72305bbp1, +}; + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT_CONSTANTS_H diff --git a/contrib/llvm-project/libc/src/__support/math/expf.h b/contrib/llvm-project/libc/src/__support/math/expf.h new file mode 100644 index 000000000000..88c151492a04 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/expf.h @@ -0,0 +1,116 @@ +//===-- Implementation header for expf --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXPF_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXPF_H + +#include "exp_float_constants.h" // Lookup tables EXP_M1 and EXP_M2. +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/PolyEval.h" +#include "src/__support/FPUtil/multiply_add.h" +#include "src/__support/FPUtil/nearest_integer.h" +#include "src/__support/FPUtil/rounding_mode.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float expf(float x) { + using FPBits = typename fputil::FPBits<float>; + FPBits xbits(x); + + uint32_t x_u = xbits.uintval(); + uint32_t x_abs = x_u & 0x7fff'ffffU; + +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS + // Exceptional values + if (LIBC_UNLIKELY(x_u == 0xc236'bd8cU)) { // x = -0x1.6d7b18p+5f + return 0x1.108a58p-66f - x * 0x1.0p-95f; + } +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + + // When |x| >= 89, |x| < 2^-25, or x is nan + if (LIBC_UNLIKELY(x_abs >= 0x42b2'0000U || x_abs <= 0x3280'0000U)) { + // |x| < 2^-25 + if (xbits.get_biased_exponent() <= 101) { + return 1.0f + x; + } + + // When x < log(2^-150) or nan + if (xbits.uintval() >= 0xc2cf'f1b5U) { + // exp(-Inf) = 0 + if (xbits.is_inf()) + return 0.0f; + // exp(nan) = nan + if (xbits.is_nan()) + return x; + if (fputil::fenv_is_round_up()) + return FPBits::min_subnormal().get_val(); + fputil::set_errno_if_required(ERANGE); + fputil::raise_except_if_required(FE_UNDERFLOW); + return 0.0f; + } + // x >= 89 or nan + if (xbits.is_pos() && (xbits.uintval() >= 0x42b2'0000)) { + // x is finite + if (xbits.uintval() < 0x7f80'0000U) { + int rounding = fputil::quick_get_round(); + if (rounding == FE_DOWNWARD || rounding == FE_TOWARDZERO) + return FPBits::max_normal().get_val(); + + fputil::set_errno_if_required(ERANGE); + fputil::raise_except_if_required(FE_OVERFLOW); + } + // x is +inf or nan + return x + FPBits::inf().get_val(); + } + } + // For -104 < x < 89, to compute exp(x), we perform the following range + // reduction: find hi, mid, lo such that: + // x = hi + mid + lo, in which + // hi is an integer, + // mid * 2^7 is an integer + // -2^(-8) <= lo < 2^-8. + // In particular, + // hi + mid = round(x * 2^7) * 2^(-7). + // Then, + // exp(x) = exp(hi + mid + lo) = exp(hi) * exp(mid) * exp(lo). + // We store exp(hi) and exp(mid) in the lookup tables EXP_M1 and EXP_M2 + // respectively. exp(lo) is computed using a degree-4 minimax polynomial + // generated by Sollya. + + // x_hi = (hi + mid) * 2^7 = round(x * 2^7). + float kf = fputil::nearest_integer(x * 0x1.0p7f); + // Subtract (hi + mid) from x to get lo. + double xd = static_cast<double>(fputil::multiply_add(kf, -0x1.0p-7f, x)); + int x_hi = static_cast<int>(kf); + x_hi += 104 << 7; + // hi = x_hi >> 7 + double exp_hi = EXP_M1[x_hi >> 7]; + // mid * 2^7 = x_hi & 0x0000'007fU; + double exp_mid = EXP_M2[x_hi & 0x7f]; + // Degree-4 minimax polynomial generated by Sollya with the following + // commands: + // > display = hexadecimal; + // > Q = fpminimax(expm1(x)/x, 3, [|D...|], [-2^-8, 2^-8]); + // > Q; + double exp_lo = + fputil::polyeval(xd, 0x1p0, 0x1.ffffffffff777p-1, 0x1.000000000071cp-1, + 0x1.555566668e5e7p-3, 0x1.55555555ef243p-5); + return static_cast<float>(exp_hi * exp_mid * exp_lo); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXPF_H diff --git a/contrib/llvm-project/libc/src/__support/math/expf16.h b/contrib/llvm-project/libc/src/__support/math/expf16.h new file mode 100644 index 000000000000..ded28c7dba50 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/expf16.h @@ -0,0 +1,141 @@ +//===-- Implementation header for expf16 ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H + +#include "include/llvm-libc-macros/float16-macros.h" + +#ifdef LIBC_TYPES_HAS_FLOAT16 + +#include "hdr/errno_macros.h" +#include "hdr/fenv_macros.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/PolyEval.h" +#include "src/__support/FPUtil/cast.h" +#include "src/__support/FPUtil/except_value_utils.h" +#include "src/__support/FPUtil/rounding_mode.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" + +#include "expf16_utils.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float16 expf16(float16 x) { +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS + constexpr fputil::ExceptValues<float16, 2> EXPF16_EXCEPTS_LO = {{ + // (input, RZ output, RU offset, RD offset, RN offset) + // x = 0x1.de4p-8, expf16(x) = 0x1.01cp+0 (RZ) + {0x1f79U, 0x3c07U, 1U, 0U, 0U}, + // x = 0x1.73cp-6, expf16(x) = 0x1.05cp+0 (RZ) + {0x25cfU, 0x3c17U, 1U, 0U, 0U}, + }}; + + constexpr fputil::ExceptValues<float16, 3> EXPF16_EXCEPTS_HI = {{ + // (input, RZ output, RU offset, RD offset, RN offset) + // x = 0x1.c34p+0, expf16(x) = 0x1.74cp+2 (RZ) + {0x3f0dU, 0x45d3U, 1U, 0U, 1U}, + // x = -0x1.488p-5, expf16(x) = 0x1.ebcp-1 (RZ) + {0xa922U, 0x3bafU, 1U, 0U, 0U}, + // x = -0x1.55p-5, expf16(x) = 0x1.ebp-1 (RZ) + {0xa954U, 0x3bacU, 1U, 0U, 0U}, + }}; +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + + using FPBits = fputil::FPBits<float16>; + FPBits x_bits(x); + + uint16_t x_u = x_bits.uintval(); + uint16_t x_abs = x_u & 0x7fffU; + + // When 0 < |x| <= 2^(-5), or |x| >= 12, or x is NaN. + if (LIBC_UNLIKELY(x_abs <= 0x2800U || x_abs >= 0x4a00U)) { + // exp(NaN) = NaN + if (x_bits.is_nan()) { + if (x_bits.is_signaling_nan()) { + fputil::raise_except_if_required(FE_INVALID); + return FPBits::quiet_nan().get_val(); + } + + return x; + } + + // When x >= 12. + if (x_bits.is_pos() && x_abs >= 0x4a00U) { + // exp(+inf) = +inf + if (x_bits.is_inf()) + return FPBits::inf().get_val(); + + switch (fputil::quick_get_round()) { + case FE_TONEAREST: + case FE_UPWARD: + fputil::set_errno_if_required(ERANGE); + fputil::raise_except_if_required(FE_OVERFLOW); + return FPBits::inf().get_val(); + default: + return FPBits::max_normal().get_val(); + } + } + + // When x <= -18. + if (x_u >= 0xcc80U) { + // exp(-inf) = +0 + if (x_bits.is_inf()) + return FPBits::zero().get_val(); + + fputil::set_errno_if_required(ERANGE); + fputil::raise_except_if_required(FE_UNDERFLOW | FE_INEXACT); + + switch (fputil::quick_get_round()) { + case FE_UPWARD: + return FPBits::min_subnormal().get_val(); + default: + return FPBits::zero().get_val(); + } + } + + // When 0 < |x| <= 2^(-5). + if (x_abs <= 0x2800U && !x_bits.is_zero()) { +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS + if (auto r = EXPF16_EXCEPTS_LO.lookup(x_u); LIBC_UNLIKELY(r.has_value())) + return r.value(); +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + + float xf = x; + // Degree-3 minimax polynomial generated by Sollya with the following + // commands: + // > display = hexadecimal; + // > P = fpminimax(expm1(x)/x, 2, [|SG...|], [-2^-5, 2^-5]); + // > 1 + x * P; + return fputil::cast<float16>( + fputil::polyeval(xf, 0x1p+0f, 0x1p+0f, 0x1.0004p-1f, 0x1.555778p-3f)); + } + } + +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS + if (auto r = EXPF16_EXCEPTS_HI.lookup(x_u); LIBC_UNLIKELY(r.has_value())) + return r.value(); +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + + // exp(x) = exp(hi + mid) * exp(lo) + auto [exp_hi_mid, exp_lo] = exp_range_reduction(x); + return fputil::cast<float16>(exp_hi_mid * exp_lo); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT16 + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H diff --git a/contrib/llvm-project/libc/src/__support/math/expf16_utils.h b/contrib/llvm-project/libc/src/__support/math/expf16_utils.h new file mode 100644 index 000000000000..bebb72b09b88 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/expf16_utils.h @@ -0,0 +1,89 @@ +//===-- Common utils for expf16 functions -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_UTILS_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_UTILS_H + +#include "include/llvm-libc-macros/float16-macros.h" + +#ifdef LIBC_TYPES_HAS_FLOAT16 + +#include "src/__support/CPP/array.h" +#include "src/__support/FPUtil/PolyEval.h" +#include "src/__support/FPUtil/nearest_integer.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +// Generated by Sollya with the following commands: +// > display = hexadecimal; +// > for i from -18 to 12 do print(round(exp(i), SG, RN)); +static constexpr cpp::array<float, 31> EXP_HI = { + 0x1.05a628p-26f, 0x1.639e32p-25f, 0x1.e355bcp-24f, 0x1.4875cap-22f, + 0x1.be6c7p-21f, 0x1.2f6054p-19f, 0x1.9c54c4p-18f, 0x1.183542p-16f, + 0x1.7cd79cp-15f, 0x1.02cf22p-13f, 0x1.5fc21p-12f, 0x1.de16bap-11f, + 0x1.44e52p-9f, 0x1.b993fep-8f, 0x1.2c155cp-6f, 0x1.97db0cp-5f, + 0x1.152aaap-3f, 0x1.78b564p-2f, 0x1p+0f, 0x1.5bf0a8p+1f, + 0x1.d8e64cp+2f, 0x1.415e5cp+4f, 0x1.b4c902p+5f, 0x1.28d38ap+7f, + 0x1.936dc6p+8f, 0x1.122886p+10f, 0x1.749ea8p+11f, 0x1.fa7158p+12f, + 0x1.5829dcp+14f, 0x1.d3c448p+15f, 0x1.3de166p+17f, +}; + +// Generated by Sollya with the following commands: +// > display = hexadecimal; +// > for i from 0 to 7 do print(round(exp(i * 2^-3), SG, RN)); +static constexpr cpp::array<float, 8> EXP_MID = { + 0x1p+0f, 0x1.221604p+0f, 0x1.48b5e4p+0f, 0x1.747a52p+0f, + 0x1.a61298p+0f, 0x1.de455ep+0f, 0x1.0ef9dcp+1f, 0x1.330e58p+1f, +}; + +struct ExpRangeReduction { + float exp_hi_mid; + float exp_lo; +}; + +static constexpr ExpRangeReduction exp_range_reduction(float16 x) { + // For -18 < x < 12, to compute exp(x), we perform the following range + // reduction: find hi, mid, lo, such that: + // x = hi + mid + lo, in which + // hi is an integer, + // mid * 2^3 is an integer, + // -2^(-4) <= lo < 2^(-4). + // In particular, + // hi + mid = round(x * 2^3) * 2^(-3). + // Then, + // exp(x) = exp(hi + mid + lo) = exp(hi) * exp(mid) * exp(lo). + // We store exp(hi) and exp(mid) in the lookup tables EXP_HI and EXP_MID + // respectively. exp(lo) is computed using a degree-3 minimax polynomial + // generated by Sollya. + + float xf = x; + float kf = fputil::nearest_integer(xf * 0x1.0p+3f); + int x_hi_mid = static_cast<int>(kf); + int x_hi = x_hi_mid >> 3; + int x_mid = x_hi_mid & 0x7; + // lo = x - (hi + mid) = round(x * 2^3) * (-2^(-3)) + x + float lo = fputil::multiply_add(kf, -0x1.0p-3f, xf); + + float exp_hi = EXP_HI[x_hi + 18]; + float exp_mid = EXP_MID[x_mid]; + // Degree-3 minimax polynomial generated by Sollya with the following + // commands: + // > display = hexadecimal; + // > P = fpminimax(expm1(x)/x, 2, [|SG...|], [-2^-4, 2^-4]); + // > 1 + x * P; + float exp_lo = + fputil::polyeval(lo, 0x1p+0f, 0x1p+0f, 0x1.001p-1f, 0x1.555ddep-3f); + return {exp_hi * exp_mid, exp_lo}; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT16 + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_UTILS_H diff --git a/contrib/llvm-project/libc/src/__support/math/frexpf.h b/contrib/llvm-project/libc/src/__support/math/frexpf.h new file mode 100644 index 000000000000..4d2f4948f2af --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/frexpf.h @@ -0,0 +1,28 @@ +//===-- Implementation header for frexpf ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF_H + +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float frexpf(float x, int *exp) { + return fputil::frexp(x, *exp); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF_H diff --git a/contrib/llvm-project/libc/src/__support/math/frexpf128.h b/contrib/llvm-project/libc/src/__support/math/frexpf128.h new file mode 100644 index 000000000000..2fd5bc4318e2 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/frexpf128.h @@ -0,0 +1,34 @@ +//===-- Implementation header for expf --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF128_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF128_H + +#include "include/llvm-libc-types/float128.h" + +#ifdef LIBC_TYPES_HAS_FLOAT128 + +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float128 frexpf128(float128 x, int *exp) { + return fputil::frexp(x, *exp); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT128 + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF128_H diff --git a/contrib/llvm-project/libc/src/__support/math/frexpf16.h b/contrib/llvm-project/libc/src/__support/math/frexpf16.h new file mode 100644 index 000000000000..8deeba0f43e3 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/frexpf16.h @@ -0,0 +1,34 @@ +//===-- Implementation header for frexpf16 ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF16_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF16_H + +#include "include/llvm-libc-macros/float16-macros.h" + +#ifdef LIBC_TYPES_HAS_FLOAT16 + +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float16 frexpf16(float16 x, int *exp) { + return fputil::frexp(x, *exp); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT16 + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF16_H diff --git a/contrib/llvm-project/libc/src/__support/math/ldexpf.h b/contrib/llvm-project/libc/src/__support/math/ldexpf.h new file mode 100644 index 000000000000..3a5ec1d47133 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/ldexpf.h @@ -0,0 +1,28 @@ +//===-- Implementation header for ldexpf ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF_H + +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float ldexpf(float x, int exp) { + return fputil::ldexp(x, exp); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF_H diff --git a/contrib/llvm-project/libc/src/__support/math/ldexpf128.h b/contrib/llvm-project/libc/src/__support/math/ldexpf128.h new file mode 100644 index 000000000000..362583093b2f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/ldexpf128.h @@ -0,0 +1,34 @@ +//===-- Implementation header for ldexpf ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF128_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF128_H + +#include "include/llvm-libc-types/float128.h" + +#ifdef LIBC_TYPES_HAS_FLOAT128 + +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float128 ldexpf128(float128 x, int exp) { + return fputil::ldexp(x, exp); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT128 + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF128_H diff --git a/contrib/llvm-project/libc/src/__support/math/ldexpf16.h b/contrib/llvm-project/libc/src/__support/math/ldexpf16.h new file mode 100644 index 000000000000..fbead87d909a --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math/ldexpf16.h @@ -0,0 +1,34 @@ +//===-- Implementation header for ldexpf16 ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF16_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF16_H + +#include "include/llvm-libc-macros/float16-macros.h" + +#ifdef LIBC_TYPES_HAS_FLOAT16 + +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float16 ldexpf16(float16 x, int exp) { + return fputil::ldexp(x, exp); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT16 + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF16_H diff --git a/contrib/llvm-project/libc/src/__support/math_extras.h b/contrib/llvm-project/libc/src/__support/math_extras.h new file mode 100644 index 000000000000..47df2a43250c --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/math_extras.h @@ -0,0 +1,160 @@ +//===-- Mimics llvm/Support/MathExtras.h ------------------------*- C++ -*-===// +// Provides useful math functions. +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXTRAS_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXTRAS_H + +#include "src/__support/CPP/bit.h" // countl_one, countr_zero +#include "src/__support/CPP/limits.h" // CHAR_BIT, numeric_limits +#include "src/__support/CPP/type_traits.h" // is_unsigned_v, is_constant_evaluated +#include "src/__support/macros/attributes.h" // LIBC_INLINE +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +// Create a bitmask with the count right-most bits set to 1, and all other bits +// set to 0. Only unsigned types are allowed. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +mask_trailing_ones() { + constexpr unsigned T_BITS = CHAR_BIT * sizeof(T); + static_assert(count <= T_BITS && "Invalid bit index"); + return count == 0 ? 0 : (T(-1) >> (T_BITS - count)); +} + +// Create a bitmask with the count left-most bits set to 1, and all other bits +// set to 0. Only unsigned types are allowed. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +mask_leading_ones() { + return T(~mask_trailing_ones<T, CHAR_BIT * sizeof(T) - count>()); +} + +// Create a bitmask with the count right-most bits set to 0, and all other bits +// set to 1. Only unsigned types are allowed. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +mask_trailing_zeros() { + return mask_leading_ones<T, CHAR_BIT * sizeof(T) - count>(); +} + +// Create a bitmask with the count left-most bits set to 0, and all other bits +// set to 1. Only unsigned types are allowed. +template <typename T, size_t count> +LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +mask_leading_zeros() { + return mask_trailing_ones<T, CHAR_BIT * sizeof(T) - count>(); +} + +// Returns whether 'a + b' overflows, the result is stored in 'res'. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr bool add_overflow(T a, T b, T &res) { + return __builtin_add_overflow(a, b, &res); +} + +// Returns whether 'a - b' overflows, the result is stored in 'res'. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr bool sub_overflow(T a, T b, T &res) { + return __builtin_sub_overflow(a, b, &res); +} + +#define RETURN_IF(TYPE, BUILTIN) \ + if constexpr (cpp::is_same_v<T, TYPE>) \ + return BUILTIN(a, b, carry_in, carry_out); + +// Returns the result of 'a + b' taking into account 'carry_in'. +// The carry out is stored in 'carry_out' it not 'nullptr', dropped otherwise. +// We keep the pass by pointer interface for consistency with the intrinsic. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +add_with_carry(T a, T b, T carry_in, T &carry_out) { + if constexpr (!cpp::is_constant_evaluated()) { +#if __has_builtin(__builtin_addcb) + RETURN_IF(unsigned char, __builtin_addcb) +#elif __has_builtin(__builtin_addcs) + RETURN_IF(unsigned short, __builtin_addcs) +#elif __has_builtin(__builtin_addc) + RETURN_IF(unsigned int, __builtin_addc) +#elif __has_builtin(__builtin_addcl) + RETURN_IF(unsigned long, __builtin_addcl) +#elif __has_builtin(__builtin_addcll) + RETURN_IF(unsigned long long, __builtin_addcll) +#endif + } + T sum = {}; + T carry1 = add_overflow(a, b, sum); + T carry2 = add_overflow(sum, carry_in, sum); + carry_out = carry1 | carry2; + return sum; +} + +// Returns the result of 'a - b' taking into account 'carry_in'. +// The carry out is stored in 'carry_out' it not 'nullptr', dropped otherwise. +// We keep the pass by pointer interface for consistency with the intrinsic. +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T> +sub_with_borrow(T a, T b, T carry_in, T &carry_out) { + if constexpr (!cpp::is_constant_evaluated()) { +#if __has_builtin(__builtin_subcb) + RETURN_IF(unsigned char, __builtin_subcb) +#elif __has_builtin(__builtin_subcs) + RETURN_IF(unsigned short, __builtin_subcs) +#elif __has_builtin(__builtin_subc) + RETURN_IF(unsigned int, __builtin_subc) +#elif __has_builtin(__builtin_subcl) + RETURN_IF(unsigned long, __builtin_subcl) +#elif __has_builtin(__builtin_subcll) + RETURN_IF(unsigned long long, __builtin_subcll) +#endif + } + T sub = {}; + T carry1 = sub_overflow(a, b, sub); + T carry2 = sub_overflow(sub, carry_in, sub); + carry_out = carry1 | carry2; + return sub; +} + +#undef RETURN_IF + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +first_leading_zero(T value) { + return value == cpp::numeric_limits<T>::max() ? 0 + : cpp::countl_one(value) + 1; +} + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +first_leading_one(T value) { + return first_leading_zero(static_cast<T>(~value)); +} + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +first_trailing_zero(T value) { + return value == cpp::numeric_limits<T>::max() + ? 0 + : cpp::countr_zero(static_cast<T>(~value)) + 1; +} + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +first_trailing_one(T value) { + return value == 0 ? 0 : cpp::countr_zero(value) + 1; +} + +template <typename T> +[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int> +count_zeros(T value) { + return cpp::popcount<T>(static_cast<T>(~value)); +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXTRAS_H diff --git a/contrib/llvm-project/libc/src/__support/memory_size.h b/contrib/llvm-project/libc/src/__support/memory_size.h new file mode 100644 index 000000000000..3d40b113bcb6 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/memory_size.h @@ -0,0 +1,92 @@ +//===-- Memory Size ---------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_MEMORY_SIZE_H +#define LLVM_LIBC_SRC___SUPPORT_MEMORY_SIZE_H + +#include "src/__support/CPP/bit.h" // has_single_bit +#include "src/__support/CPP/limits.h" +#include "src/__support/CPP/type_traits.h" +#include "src/__support/macros/attributes.h" +#include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" +#include "src/string/memory_utils/utils.h" + +namespace LIBC_NAMESPACE_DECL { +namespace internal { +template <class T> LIBC_INLINE bool mul_overflow(T a, T b, T *res) { +#if __has_builtin(__builtin_mul_overflow) + return __builtin_mul_overflow(a, b, res); +#else + T max = cpp::numeric_limits<T>::max(); + T min = cpp::numeric_limits<T>::min(); + bool overflow = (b > 0 && (a > max / b || a < min / b)) || + (b < 0 && (a < max / b || a > min / b)); + if (!overflow) + *res = a * b; + return overflow; +#endif +} +// Limit memory size to the max of ssize_t +class SafeMemSize { +private: + using type = cpp::make_signed_t<size_t>; + type value; + LIBC_INLINE explicit SafeMemSize(type value) : value(value) {} + +public: + LIBC_INLINE_VAR static constexpr size_t MAX_MEM_SIZE = + static_cast<size_t>(cpp::numeric_limits<type>::max()); + + LIBC_INLINE explicit SafeMemSize(size_t value) + : value(value <= MAX_MEM_SIZE ? static_cast<type>(value) : -1) {} + + LIBC_INLINE static constexpr size_t offset_to(size_t val, size_t align) { + return (-val) & (align - 1); + } + + LIBC_INLINE operator size_t() { return static_cast<size_t>(value); } + + LIBC_INLINE bool valid() { return value >= 0; } + + LIBC_INLINE SafeMemSize operator+(const SafeMemSize &other) { + type result; + if (LIBC_UNLIKELY((value | other.value) < 0)) { + result = -1; + } else { + result = value + other.value; + } + return SafeMemSize{result}; + } + + LIBC_INLINE SafeMemSize operator*(const SafeMemSize &other) { + type result; + if (LIBC_UNLIKELY((value | other.value) < 0)) + result = -1; + if (LIBC_UNLIKELY(mul_overflow(value, other.value, &result))) + result = -1; + return SafeMemSize{result}; + } + + LIBC_INLINE SafeMemSize align_up(size_t alignment) { + if (!cpp::has_single_bit(alignment) || alignment > MAX_MEM_SIZE || !valid()) + return SafeMemSize{type{-1}}; + + type offset = + static_cast<type>(offset_to(static_cast<size_t>(value), alignment)); + + if (LIBC_UNLIKELY(offset > static_cast<type>(MAX_MEM_SIZE) - value)) + return SafeMemSize{type{-1}}; + + return SafeMemSize{value + offset}; + } +}; +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MEMORY_SIZE_H diff --git a/contrib/llvm-project/libc/src/__support/number_pair.h b/contrib/llvm-project/libc/src/__support/number_pair.h new file mode 100644 index 000000000000..f5e877406d8f --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/number_pair.h @@ -0,0 +1,26 @@ +//===-- Utilities for pairs of numbers. -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_NUMBER_PAIR_H +#define LLVM_LIBC_SRC___SUPPORT_NUMBER_PAIR_H + +#include "CPP/type_traits.h" +#include "src/__support/macros/config.h" + +#include <stddef.h> + +namespace LIBC_NAMESPACE_DECL { + +template <typename T> struct NumberPair { + T lo = T(0); + T hi = T(0); +}; + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_NUMBER_PAIR_H diff --git a/contrib/llvm-project/libc/src/__support/ryu_constants.h b/contrib/llvm-project/libc/src/__support/ryu_constants.h new file mode 100644 index 000000000000..1ecb34e661ba --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/ryu_constants.h @@ -0,0 +1,4404 @@ +//===-- Ryu Constants for float conversion ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_RYU_CONSTANTS_H +#define LLVM_LIBC_SRC___SUPPORT_RYU_CONSTANTS_H + +#include <stddef.h> +#include <stdint.h> + +constexpr size_t TABLE_SHIFT_CONST = 120; +constexpr size_t IDX_SIZE = 16; + +constexpr size_t MID_INT_SIZE = 192; + +constexpr uint16_t POW10_OFFSET[64] = { + 0, 2, 5, 8, 12, 16, 21, 26, 32, 39, 46, 54, 62, + 71, 80, 90, 100, 111, 122, 134, 146, 159, 173, 187, 202, 217, + 233, 249, 266, 283, 301, 319, 338, 357, 377, 397, 418, 440, 462, + 485, 508, 532, 556, 581, 606, 632, 658, 685, 712, 740, 769, 798, + 828, 858, 889, 920, 952, 984, 1017, 1050, 1084, 1118, 1153, 1188}; + +constexpr uint64_t POW10_SPLIT[1224][3] = { + {1u, 72057594037927936u, 0u}, + {699646928636035157u, 72057594u, 0u}, + {1u, 0u, 256u}, + {11902091922964236229u, 4722366482869u, 0u}, + {6760415703743915872u, 4722u, 0u}, + {1u, 0u, 16777216u}, + {13369850649504950658u, 309485009821345068u, 0u}, + {15151142278969419334u, 309485009u, 0u}, + {1u, 0u, 75511627776u}, + {4635408826454083567u, 9437866644873197963u, 1099u}, + {12367138975830625353u, 20282409603651u, 0u}, + {7555853734021184432u, 20282u, 0u}, + {1u, 0u, 250037927936u}, + {5171444645924616995u, 699646928636035156u, 72057594u}, + {16672297533003297786u, 1329227995784915872u, 0u}, + {14479142226848862515u, 1329227995u, 0u}, + {1u, 0u, 181645213696u}, + {12214193123817091081u, 11902091922964236228u, 114366482869u}, + {16592893013671929435u, 6760415703743915871u, 4722u}, + {4549827147718617003u, 87112285931760u, 0u}, + {5274510003815168971u, 87112u, 0u}, + {1u, 0u, 44724781056u}, + {9794971998307800535u, 13369850649504950657u, 209821345068u}, + {14720142899209240169u, 15151142278969419333u, 309485009u}, + {4300745446091561535u, 5708990770823839524u, 0u}, + {15197156861335443364u, 5708990770u, 0u}, + {1u, 0u, 139251286016u}, + {13484604155038683037u, 4635408826454083566u, 67670423947u}, + {8356963862052375699u, 12367138975830625352u, 58409603651u}, + {5850852848337610021u, 7555853734021184431u, 20282u}, + {2712780827214982050u, 374144419156711u, 0u}, + {7732076577307618052u, 374144u, 0u}, + {1u, 0u, 84280344576u}, + {17296309485351745867u, 5171444645924616994u, 160903807060u}, + {16598859101615853088u, 16672297533003297785u, 219784915872u}, + {7469952526870444257u, 14479142226848862514u, 1329227995u}, + {13531654022114669524u, 6073184580144670117u, 1u}, + {15757609704383306943u, 24519928653u, 0u}, + {9590990814237149590u, 24u, 0u}, + {1u, 0u, 196662132736u}, + {15408590707489433890u, 12214193123817091080u, 95899502532u}, + {18332056844289122710u, 16592893013671929434u, 240246646623u}, + {11114572877353986193u, 4549827147718617002u, 72285931760u}, + {1703393793997526525u, 5274510003815168970u, 87112u}, + {5082852056285196265u, 1606938044258990u, 0u}, + {816434266573722365u, 1606938u, 0u}, + {1u, 0u, 129530986496u}, + {5736523019264798742u, 9794971998307800534u, 69797980545u}, + {10129314776268243339u, 14720142899209240168u, 36233143877u}, + {16511595775483995364u, 4300745446091561534u, 50823839524u}, + {12367293405401453325u, 15197156861335443363u, 5708990770u}, + {16934621733248854291u, 13078571300009428617u, 5u}, + {10278280417769171336u, 105312291668u, 0u}, + {5760764486226151240u, 105u, 0u}, + {1u, 0u, 238731001856u}, + {4128368337188369761u, 13484604155038683036u, 72453031918u}, + {10240941003671005056u, 8356963862052375698u, 175317175368u}, + {17933378316822368251u, 5850852848337610020u, 231147060143u}, + {8346249813075698616u, 2712780827214982049u, 128419156711u}, + {15906203609160902695u, 7732076577307618051u, 374144u}, + {14525607416135386328u, 6901746346790563u, 0u}, + {6397156777364256320u, 6901746u, 0u}, + {1u, 0u, 34937634816u}, + {16798760952716600048u, 17296309485351745866u, 249899825954u}, + {2419982808370854967u, 16598859101615853087u, 50404946937u}, + {2922947087773078956u, 7469952526870444256u, 165733552434u}, + {15419220167069510190u, 13531654022114669523u, 77854221733u}, + {3452124642157173416u, 15757609704383306942u, 24519928653u}, + {5979700067267186899u, 9590990814237149589u, 24u}, + {4913998146922579597u, 452312848583u, 0u}, + {5771037749337678924u, 452u, 0u}, + {1u, 0u, 8835301376u}, + {3464734175350698519u, 15408590707489433889u, 90993782792u}, + {9334527711335850125u, 18332056844289122709u, 170602522202u}, + {7269882896518450106u, 11114572877353986192u, 202092341162u}, + {1372511258182263196u, 1703393793997526524u, 174275541962u}, + {7571228438575951046u, 5082852056285196264u, 26044258990u}, + {2992506536646070406u, 816434266573722364u, 1606938u}, + {524517896824344606u, 29642774844752946u, 0u}, + {15582941400898702773u, 29642774u, 0u}, + {1u, 0u, 214310977536u}, + {3846112492507251066u, 5736523019264798741u, 104549111254u}, + {16681117750123089487u, 10129314776268243338u, 62895095400u}, + {14986314536556547267u, 16511595775483995363u, 163670432318u}, + {2573712825027107389u, 12367293405401453324u, 137918027683u}, + {7504855874008324928u, 16934621733248854290u, 84557186697u}, + {9572138030626879787u, 10278280417769171335u, 105312291668u}, + {8520676959353394843u, 5760764486226151239u, 105u}, + {13448984662897903496u, 1942668892225u, 0u}, + {12338883700918130648u, 1942u, 0u}, + {1u, 0u, 156223799296u}, + {2517285787892561600u, 4128368337188369760u, 146555162524u}, + {4338831817635138103u, 10240941003671005055u, 36972170386u}, + {1561495325934523196u, 17933378316822368250u, 161452451108u}, + {12262635050079398786u, 8346249813075698615u, 3862277025u}, + {11144065765517284188u, 15906203609160902694u, 163787434755u}, + {1212260522471875711u, 14525607416135386327u, 242346790563u}, + {9695352922247418869u, 6397156777364256319u, 6901746u}, + {7227025834627242948u, 127314748520905380u, 0u}, + {9609008238705447829u, 127314748u, 0u}, + {1u, 0u, 74910662656u}, + {3609144142396852269u, 16798760952716600047u, 31131187530u}, + {11568848377382068865u, 2419982808370854966u, 224158453279u}, + {10068303578029323957u, 2922947087773078955u, 211835877600u}, + {11645070846862630231u, 15419220167069510189u, 190187140051u}, + {12449386705878485055u, 3452124642157173415u, 149324160190u}, + {15025619323517318418u, 5979700067267186898u, 199266388373u}, + {14996237555047131272u, 4913998146922579596u, 196312848583u}, + {10211005638256058413u, 5771037749337678923u, 452u}, + {1014743503555840530u, 8343699359066u, 0u}, + {12900897707145290678u, 8343u, 0u}, + {1u, 0u, 33187823616u}, + {4718003016239473662u, 3464734175350698518u, 149506025761u}, + {14865830648693666725u, 9334527711335850124u, 144394101141u}, + {14754517212823091778u, 7269882896518450105u, 252074403984u}, + {11113946551474911901u, 1372511258182263195u, 232410437116u}, + {1963520352638130630u, 7571228438575951045u, 252162224104u}, + {13342587341404964200u, 2992506536646070405u, 50028434172u}, + {6240392545013573291u, 524517896824344605u, 22844752946u}, + {14377490861349714758u, 15582941400898702772u, 29642774u}, + {1717863312631397839u, 546812681195752981u, 0u}, + {3611005143890591770u, 546812681u, 0u}, + {1u, 0u, 21208498176u}, + {13168252824351245504u, 3846112492507251065u, 138904285205u}, + {735883891883379688u, 16681117750123089486u, 227812409738u}, + {10609203866866106404u, 14986314536556547266u, 12139521251u}, + {12358191111890306470u, 2573712825027107388u, 18406839052u}, + {15229916368406413528u, 7504855874008324927u, 135518906642u}, + {7241424335568075942u, 9572138030626879786u, 71461906823u}, + {6049715868779871913u, 8520676959353394842u, 65729070919u}, + {2000548404719336762u, 13448984662897903495u, 150668892225u}, + {1410974761895205301u, 12338883700918130647u, 1942u}, + {16000132467694084868u, 35835915874844u, 0u}, + {16894908866816792556u, 35835u, 0u}, + {1u, 0u, 96136462336u}, + {589096329272056762u, 2517285787892561599u, 127235208544u}, + {7097729792403256904u, 4338831817635138102u, 250084648831u}, + {8553736750439287020u, 1561495325934523195u, 183664758778u}, + {2114152625261065696u, 12262635050079398785u, 38604121015u}, + {9817523680007641224u, 11144065765517284187u, 215065716774u}, + {13047215537500048015u, 1212260522471875710u, 63525586135u}, + {16755544192002345880u, 9695352922247418868u, 164391777855u}, + {6930119832670648356u, 7227025834627242947u, 60520905380u}, + {14560698131901886167u, 9609008238705447828u, 127314748u}, + {16408020927503338035u, 2348542582773833227u, 0u}, + {14274703510609809116u, 2348542582u, 0u}, + {1u, 0u, 239195652096u}, + {16428432973129962470u, 3609144142396852268u, 54627148527u}, + {3721112279790863774u, 11568848377382068864u, 171545803830u}, + {18032764903259620753u, 10068303578029323956u, 45631280555u}, + {18058455550468776079u, 11645070846862630230u, 167674882605u}, + {15692090139033993190u, 12449386705878485054u, 210814540455u}, + {389416944300619393u, 15025619323517318417u, 140812947666u}, + {12009691357260487293u, 14996237555047131271u, 75553539724u}, + {13494259174449809900u, 10211005638256058412u, 90055009355u}, + {18288583400616279877u, 1014743503555840529u, 151699359066u}, + {7216107869057472u, 12900897707145290677u, 8343u}, + {17237061291959073878u, 153914086704665u, 0u}, + {1599418782488783273u, 153914u, 0u}, + {1u, 0u, 22255763456u}, + {9565464987240335777u, 4718003016239473661u, 140805878294u}, + {857713933775880687u, 14865830648693666724u, 185799843980u}, + {4621617820081363356u, 14754517212823091777u, 155602488249u}, + {9630162611715632528u, 11113946551474911900u, 197106442651u}, + {9283986497984645815u, 1963520352638130629u, 133723303109u}, + {8981807745082630996u, 13342587341404964199u, 29338292357u}, + {18350140531565934622u, 6240392545013573290u, 180779405341u}, + {4411619033127524143u, 14377490861349714757u, 21093125556u}, + {1852297584111266889u, 1717863312631397838u, 9195752981u}, + {11746243463811666096u, 3611005143890591769u, 546812681u}, + {6335244004343789147u, 10086913586276986678u, 0u}, + {5109502367228239844u, 10086913586u, 0u}, + {1603272682579847821u, 10u, 0u}, + {1u, 0u, 121713852416u}, + {6609546910952910052u, 13168252824351245503u, 78039892345u}, + {3911171343112928288u, 735883891883379687u, 194575126094u}, + {5254510615100863555u, 10609203866866106403u, 60669938882u}, + {3881927570803887650u, 12358191111890306469u, 63825615420u}, + {6379348759607163190u, 15229916368406413527u, 42392558399u}, + {14595733737222406466u, 7241424335568075941u, 154327955754u}, + {14670223432002373542u, 6049715868779871912u, 135108449946u}, + {4045087795619708513u, 2000548404719336761u, 215076489095u}, + {12598467307137142718u, 1410974761895205300u, 28867368919u}, + {734704388050777108u, 16000132467694084867u, 251915874844u}, + {5682201693687285822u, 16894908866816792555u, 35835u}, + {11048712694145438788u, 661055968790248u, 0u}, + {17871025777010319485u, 661055u, 0u}, + {1u, 0u, 191031934976u}, + {15268761435931663695u, 589096329272056761u, 54384768703u}, + {5016238054648555438u, 7097729792403256903u, 59463698998u}, + {14236047313993899750u, 8553736750439287019u, 129114608443u}, + {6957759675154690848u, 2114152625261065695u, 91532209025u}, + {18439367135478514473u, 9817523680007641223u, 126707290971u}, + {8539004472540641041u, 13047215537500048014u, 244908319870u}, + {1908462039431738399u, 16755544192002345879u, 195375682548u}, + {714690453250792146u, 6930119832670648355u, 148789337027u}, + {13782189447673929633u, 14560698131901886166u, 11889480596u}, + {3584742913798803164u, 16408020927503338034u, 118773833227u}, + {4347581515245125291u, 14274703510609809115u, 2348542582u}, + {16836742268156371392u, 6429475823218628948u, 2u}, + {11764082328865615308u, 43322963970u, 0u}, + {5957633711383291746u, 43u, 0u}, + {1u, 0u, 44890587136u}, + {9917186842884466953u, 16428432973129962469u, 128201721900u}, + {4751011869809829335u, 3721112279790863773u, 180977558144u}, + {11068497969931435029u, 18032764903259620752u, 86978950836u}, + {17118056985122509954u, 18058455550468776078u, 62850669910u}, + {14607066080907684459u, 15692090139033993189u, 17021110334u}, + {11768892370493391107u, 389416944300619392u, 135651046673u}, + {4043396447647747170u, 12009691357260487292u, 44731525255u}, + {1670341095362518057u, 13494259174449809899u, 17991426092u}, + {3190817644167043165u, 18288583400616279876u, 181000391185u}, + {10425820027224322486u, 7216107869057471u, 25934422965u}, + {13139964660506311565u, 17237061291959073877u, 58086704665u}, + {2297772885416059937u, 1599418782488783272u, 153914u}, + {7677687919964523763u, 2839213766779714u, 0u}, + {14144589152747892828u, 2839213u, 0u}, + {1u, 0u, 253518544896u}, + {17069730341503660290u, 9565464987240335776u, 164046496765u}, + {18167423787163077107u, 857713933775880686u, 65250538404u}, + {3765746945827805904u, 4621617820081363355u, 156522052161u}, + {10241734342430761691u, 9630162611715632527u, 197503285916u}, + {13345717282537140784u, 9283986497984645814u, 103486904773u}, + {9313926784816939953u, 8981807745082630995u, 170994763111u}, + {550974205049535019u, 18350140531565934621u, 69239154346u}, + {4494692285504086222u, 4411619033127524142u, 206100413253u}, + {1134308559863725587u, 1852297584111266888u, 25636765134u}, + {17587558045116130233u, 11746243463811666095u, 54343434265u}, + {9817142032346161594u, 6335244004343789146u, 50276986678u}, + {6071944935834172568u, 5109502367228239843u, 10086913586u}, + {11564168293299416955u, 1603272682579847820u, 10u}, + {12458266507226064437u, 186070713419u, 0u}, + {1304432355328256915u, 186u, 0u}, + {1u, 0u, 191358304256u}, + {15946798815542087355u, 6609546910952910051u, 231212025023u}, + {12082566083831286138u, 3911171343112928287u, 35284847591u}, + {11449623684706196411u, 5254510615100863554u, 165210439715u}, + {17518743620362604446u, 3881927570803887649u, 215345825189u}, + {9451061563087633805u, 6379348759607163189u, 165791236311u}, + {13191114787623314926u, 14595733737222406465u, 168795274405u}, + {8367349876734474799u, 14670223432002373541u, 57219284648u}, + {6544253801674393507u, 4045087795619708512u, 180682964281u}, + {16113906253336597498u, 12598467307137142717u, 3039828404u}, + {10294087136797312392u, 734704388050777107u, 235308032771u}, + {9127173070014462803u, 5682201693687285821u, 232598951915u}, + {16266900839595484952u, 11048712694145438787u, 63968790248u}, + {3299745387370952632u, 17871025777010319484u, 661055u}, + {12061115182604399189u, 12194330274671844u, 0u}, + {5066801222582989646u, 12194330u, 0u}, + {1u, 0u, 185827721216u}, + {7568423425299591513u, 15268761435931663694u, 71271930809u}, + {16561505984665207377u, 5016238054648555437u, 235771737671u}, + {4329114621856906245u, 14236047313993899749u, 223377180907u}, + {1477500474861899139u, 6957759675154690847u, 135999600095u}, + {16891579639263969684u, 18439367135478514472u, 142462900359u}, + {4684451357140027420u, 8539004472540641040u, 151103457934u}, + {14727186580409080709u, 1908462039431738398u, 35038743447u}, + {15864176859687308834u, 714690453250792145u, 214747133987u}, + {1755486942842684438u, 13782189447673929632u, 50194329302u}, + {17417077516652710041u, 3584742913798803163u, 219235682866u}, + {4290982361913532783u, 4347581515245125290u, 84912721627u}, + {11826659981004351409u, 16836742268156371391u, 2637732180u}, + {932930645678090820u, 11764082328865615307u, 43322963970u}, + {12707792781328052617u, 5957633711383291745u, 43u}, + {16491596426880311906u, 799167628880u, 0u}, + {3092207065214166010u, 799u, 0u}, + {1u, 0u, 229537611776u}, + {8142946531605512550u, 9917186842884466952u, 157257552869u}, + {5328402096432654515u, 4751011869809829334u, 144600024477u}, + {1932004361303814512u, 11068497969931435028u, 142927971728u}, + {2511477647985517771u, 17118056985122509953u, 229791850638u}, + {17451375493324716694u, 14607066080907684458u, 128637992933u}, + {9489266854478998489u, 11768892370493391106u, 124219192960u}, + {8803053132063235169u, 4043396447647747169u, 235090549372u}, + {16198682197142616773u, 1670341095362518056u, 68172974571u}, + {13696242485403414202u, 3190817644167043164u, 191565184836u}, + {16409082426079859931u, 10425820027224322485u, 85712318911u}, + {11653410736879597610u, 13139964660506311564u, 168124562517u}, + {13589514120653213261u, 2297772885416059936u, 66416208296u}, + {8032934885905905774u, 7677687919964523762u, 173766779714u}, + {2753021350129449273u, 14144589152747892827u, 2839213u}, + {16974897459201404133u, 52374249726338269u, 0u}, + {13398576176159101589u, 52374249u, 0u}, + {1u, 0u, 160925351936u}, + {10284586955251725351u, 17069730341503660289u, 238984858016u}, + {5294476488634150891u, 18167423787163077106u, 155204141550u}, + {15833244538135063323u, 3765746945827805903u, 143555205531u}, + {10348512742273116664u, 10241734342430761690u, 182723472783u}, + {13658504610142595663u, 13345717282537140783u, 83504908982u}, + {11956362239240850266u, 9313926784816939952u, 29029868371u}, + {13415901703662731781u, 550974205049535018u, 46243657757u}, + {5161774027546852762u, 4494692285504086221u, 72061490990u}, + {15274384838790587711u, 1134308559863725586u, 175953423432u}, + {14233354597679374929u, 17587558045116130232u, 90532188335u}, + {4274656492162486921u, 9817142032346161593u, 227329160794u}, + {12040276505541795046u, 6071944935834172567u, 140626894819u}, + {13238307206256765457u, 11564168293299416954u, 75675363980u}, + {12850161204172713271u, 12458266507226064436u, 186070713419u}, + {17531777095001445154u, 1304432355328256914u, 186u}, + {5623628114515245990u, 3432398830065u, 0u}, + {7357116143579573377u, 3432u, 0u}, + {1u, 0u, 227864477696u}, + {3555734177475596582u, 15946798815542087354u, 31654997219u}, + {14001876724756424382u, 12082566083831286137u, 66620685343u}, + {18159905057231476140u, 11449623684706196410u, 33949692994u}, + {5585207679308509467u, 17518743620362604445u, 53512343073u}, + {13948697622866724672u, 9451061563087633804u, 65715091765u}, + {9807691927739036432u, 13191114787623314925u, 165453594945u}, + {15818010096140820918u, 8367349876734474798u, 96354764709u}, + {5629845624785010943u, 6544253801674393506u, 189873536608u}, + {9517635131137734707u, 16113906253336597497u, 19558043581u}, + {619338244618780585u, 10294087136797312391u, 61494785043u}, + {11632367007491958899u, 9127173070014462802u, 67881830461u}, + {12083314261009739916u, 16266900839595484951u, 124178879555u}, + {16880538609458881650u, 3299745387370952631u, 228653834364u}, + {17404223674486504228u, 12061115182604399188u, 26274671844u}, + {7089067015287185433u, 5066801222582989645u, 12194330u}, + {2592264228029443648u, 224945689727159819u, 0u}, + {13413731084370224440u, 224945689u, 0u}, + {1u, 0u, 78410285056u}, + {9323915941641553425u, 7568423425299591512u, 173897801038u}, + {12155831029092699564u, 16561505984665207376u, 229234681773u}, + {17397171276588232676u, 4329114621856906244u, 31080095461u}, + {11874560617553253769u, 1477500474861899138u, 40915694367u}, + {13444839516837727954u, 16891579639263969683u, 16253944616u}, + {16994416043584590671u, 4684451357140027419u, 30798362384u}, + {15879694502877015730u, 14727186580409080708u, 209859998750u}, + {4234647645735263359u, 15864176859687308833u, 160095165137u}, + {7978589901512919496u, 1755486942842684437u, 219944181664u}, + {6114237175390859894u, 17417077516652710040u, 170232614619u}, + {8658612872088282708u, 4290982361913532782u, 191641124522u}, + {10253813330683324853u, 11826659981004351408u, 203050574271u}, + {13289465061747830991u, 932930645678090819u, 97688890827u}, + {4123165538545565412u, 12707792781328052616u, 80894011233u}, + {7846417485927038481u, 16491596426880311905u, 31167628880u}, + {10562273346358018864u, 3092207065214166009u, 799u}, + {2691512658346619120u, 14742040721959u, 0u}, + {751187558544605998u, 14742u, 0u}, + {1u, 0u, 8441430016u}, + {3757709791947931308u, 8142946531605512549u, 214288853256u}, + {3452755398462519465u, 5328402096432654514u, 20104734166u}, + {3105818720159874523u, 1932004361303814511u, 129136147476u}, + {16859138458894499364u, 2511477647985517770u, 106946040961u}, + {12271894740606233755u, 17451375493324716693u, 2514414186u}, + {5429638071845793701u, 9489266854478998488u, 97477214466u}, + {145278150038876889u, 8803053132063235168u, 40878132321u}, + {9050266019724932450u, 16198682197142616772u, 92742474792u}, + {11907016253451490866u, 13696242485403414201u, 181889538140u}, + {2472757296513770735u, 16409082426079859930u, 140631732661u}, + {10558733798178239360u, 11653410736879597609u, 32736689036u}, + {15917322570831255850u, 13589514120653213260u, 242435466272u}, + {12254334656791355238u, 8032934885905905773u, 91149241586u}, + {7869542424662730262u, 2753021350129449272u, 221920211035u}, + {1378558986933000253u, 16974897459201404132u, 233726338269u}, + {13521405041909411105u, 13398576176159101588u, 52374249u}, + {3206744593298092012u, 966134380754314586u, 0u}, + {13914648122214918505u, 966134380u, 0u}, + {1u, 0u, 1557528576u}, + {1235541077112082496u, 10284586955251725350u, 242287014145u}, + {12014985518315533846u, 5294476488634150890u, 207858321906u}, + {1561535086344155741u, 15833244538135063322u, 218560993999u}, + {12761747276316224577u, 10348512742273116663u, 47740429018u}, + {9745594781103966137u, 13658504610142595662u, 176648155695u}, + {17514238702394846785u, 11956362239240850265u, 42727277488u}, + {2428898913707151713u, 13415901703662731780u, 205279820330u}, + {71666709959904945u, 5161774027546852761u, 18828026061u}, + {4049380135452919193u, 15274384838790587710u, 184771591698u}, + {18422240861777453733u, 14233354597679374928u, 185231729592u}, + {2914504416394425696u, 4274656492162486920u, 151652704697u}, + {12721377795748989418u, 12040276505541795045u, 122717650071u}, + {2626074459217717422u, 13238307206256765456u, 52696608634u}, + {4261529925046307655u, 12850161204172713270u, 146950399540u}, + {11536038685430305586u, 17531777095001445153u, 241304857490u}, + {12555757789435162768u, 5623628114515245989u, 104398830065u}, + {11905178684546080059u, 7357116143579573376u, 3432u}, + {14032797718924543051u, 63316582777114u, 0u}, + {10750340288005853484u, 63316u, 0u}, + {1u, 0u, 186192756736u}, + {9660290106216358253u, 3555734177475596581u, 121759043258u}, + {14820142034615351103u, 14001876724756424381u, 186984450425u}, + {12674041783707777619u, 18159905057231476139u, 157302774714u}, + {15386686816442679994u, 5585207679308509466u, 140756160413u}, + {5679510383719146248u, 13948697622866724671u, 237531676044u}, + {1391101719248678506u, 9807691927739036431u, 46857496045u}, + {3364596672173710517u, 15818010096140820917u, 162305194542u}, + {11276509210104319732u, 5629845624785010942u, 249515952034u}, + {5316312656902630164u, 9517635131137734706u, 135033574393u}, + {17470981304473644647u, 619338244618780584u, 82630591879u}, + {7373293636384920591u, 11632367007491958898u, 23655037778u}, + {7616810902585191937u, 12083314261009739915u, 183915095831u}, + {12740295655921903924u, 16880538609458881649u, 84943484855u}, + {18366635945916526940u, 17404223674486504227u, 77384299092u}, + {4472171448243407067u, 7089067015287185432u, 11140526925u}, + {229592460858185629u, 2592264228029443647u, 25727159819u}, + {12749672866417114996u, 13413731084370224439u, 224945689u}, + {9452256722867098693u, 4149515568880992958u, 0u}, + {16251451636418604634u, 4149515568u, 0u}, + {1u, 0u, 88505450496u}, + {4515791283442995454u, 9323915941641553424u, 80658968920u}, + {13306155670047701346u, 12155831029092699563u, 4943102544u}, + {4456930152933417601u, 17397171276588232675u, 130643721220u}, + {9089157128546489637u, 11874560617553253768u, 147728846210u}, + {12437332180345515840u, 13444839516837727953u, 27921269139u}, + {3433060408790452524u, 16994416043584590670u, 132860839963u}, + {8275594526021936172u, 15879694502877015729u, 33229560708u}, + {3846512444641107689u, 4234647645735263358u, 21432520225u}, + {6210962618469046250u, 7978589901512919495u, 152331453461u}, + {7272858906616296575u, 6114237175390859893u, 110469384344u}, + {3710743300451225347u, 8658612872088282707u, 176555860334u}, + {6424677242672030600u, 10253813330683324852u, 67720423344u}, + {11485842256170301862u, 13289465061747830990u, 136223517251u}, + {7355797963557024308u, 4123165538545565411u, 97425355144u}, + {6358188982569427273u, 7846417485927038480u, 249572581985u}, + {12475094728768767402u, 10562273346358018863u, 39145907193u}, + {17288154837907896183u, 2691512658346619119u, 150040721959u}, + {2983850577727105262u, 751187558544605997u, 14742u}, + {13918604635001185935u, 271942652322184u, 0u}, + {12033220395769876327u, 271942u, 0u}, + {1u, 0u, 101203705856u}, + {5782377197813462997u, 3757709791947931307u, 178187174245u}, + {17732139848231399226u, 3452755398462519464u, 111168366770u}, + {3628839527415562921u, 3105818720159874522u, 202913935727u}, + {3188692267613601004u, 16859138458894499363u, 149665260746u}, + {5168130193478377352u, 12271894740606233754u, 216294341269u}, + {12556227529405091290u, 5429638071845793700u, 96007875544u}, + {15087090312791441192u, 145278150038876888u, 196490615904u}, + {10281804758610642494u, 9050266019724932449u, 185645480644u}, + {14238177586158586580u, 11907016253451490865u, 218134048441u}, + {7107927498217678128u, 2472757296513770734u, 41572390106u}, + {3845814658485364450u, 10558733798178239359u, 76862879785u}, + {714293333681725946u, 15917322570831255849u, 109664308812u}, + {16766172658649116982u, 12254334656791355237u, 56426608749u}, + {812461421432632215u, 7869542424662730261u, 228074731832u}, + {15218024718633799196u, 1378558986933000252u, 148732996836u}, + {8110797782612805146u, 13521405041909411104u, 90173837972u}, + {15941193964933529227u, 3206744593298092011u, 108754314586u}, + {14144280602323277933u, 13914648122214918504u, 966134380u}, + {15072402647813125245u, 17822033662586700072u, 0u}, + {10822706091283369889u, 17822033662u, 0u}, + {15163844593710966731u, 17u, 0u}, + {1u, 0u, 38066978816u}, + {2408529687792073670u, 1235541077112082495u, 234651333670u}, + {3980682212356510808u, 12014985518315533845u, 26084650986u}, + {4202670442792148519u, 1561535086344155740u, 247691815706u}, + {9419583343154651922u, 12761747276316224576u, 78528309751u}, + {16359166491570434575u, 9745594781103966136u, 89949448782u}, + {12567727056384237385u, 17514238702394846784u, 4131670873u}, + {2068388267923286639u, 2428898913707151712u, 153003885060u}, + {5689135844565021196u, 71666709959904944u, 62219517337u}, + {3104061965171139313u, 4049380135452919192u, 80998671678u}, + {7955173880156328016u, 18422240861777453732u, 136157995600u}, + {1445179403240833754u, 2914504416394425695u, 229689627272u}, + {12538201164459126715u, 12721377795748989417u, 16142359781u}, + {7580606719088482667u, 2626074459217717421u, 54231018000u}, + {8168318283218819755u, 4261529925046307654u, 33625369910u}, + {5249615277755961676u, 11536038685430305585u, 165680648993u}, + {6312997372068219831u, 12555757789435162767u, 128645381029u}, + {9183815417025176703u, 11905178684546080058u, 26760719488u}, + {10683849953373876937u, 14032797718924543050u, 84582777114u}, + {17175012155615667568u, 10750340288005853483u, 63316u}, + {18003508288378896912u, 1167984798111281u, 0u}, + {14722554560950996951u, 1167984u, 0u}, + {1u, 0u, 37523685376u}, + {15059324482416394930u, 9660290106216358252u, 189803401509u}, + {4134778595813308312u, 14820142034615351102u, 171687061181u}, + {16321118342639660948u, 12674041783707777618u, 26834113963u}, + {1523550293123468805u, 15386686816442679993u, 63307886874u}, + {8016371634569878509u, 5679510383719146247u, 15075411775u}, + {9884220139611134110u, 1391101719248678505u, 181182395151u}, + {7218073002727840414u, 3364596672173710516u, 254611300789u}, + {16062235669481359233u, 11276509210104319731u, 50288197886u}, + {15558048660560338002u, 5316312656902630163u, 168947103794u}, + {8394398745765058609u, 17470981304473644646u, 114399707048u}, + {5693296366442904274u, 7373293636384920590u, 139412908146u}, + {11783494675061161358u, 7616810902585191936u, 113690652811u}, + {13377293110865447894u, 12740295655921903923u, 35995657329u}, + {12840734051093062130u, 18366635945916526939u, 24242436899u}, + {7009868331566697505u, 4472171448243407066u, 63012446232u}, + {5019690705031194477u, 229592460858185628u, 55691161151u}, + {8608277240439804984u, 12749672866417114995u, 190512407863u}, + {12172482590657749222u, 9452256722867098692u, 48880992958u}, + {16613484892678771990u, 16251451636418604633u, 4149515568u}, + {5721488662757049244u, 2758075434182769113u, 4u}, + {386931106438877039u, 76545051729u, 0u}, + {10054429752182825659u, 76u, 0u}, + {1u, 0u, 16244801536u}, + {8634592106137071313u, 4515791283442995453u, 171721328144u}, + {12626356501369830731u, 13306155670047701345u, 227241610667u}, + {4803333258178976933u, 4456930152933417600u, 136492724195u}, + {13613083223558209297u, 9089157128546489636u, 209674229128u}, + {16106967997237446989u, 12437332180345515839u, 78186106577u}, + {14832921244380020170u, 3433060408790452523u, 177448620878u}, + {13774024637717231397u, 8275594526021936171u, 126208519857u}, + {9673012968505228885u, 3846512444641107688u, 199336696958u}, + {5391832334264815667u, 6210962618469046249u, 117394262471u}, + {16514436292632703088u, 7272858906616296574u, 83201159797u}, + {12025036352783454153u, 3710743300451225346u, 180348282451u}, + {7059867105311401050u, 6424677242672030599u, 206622648756u}, + {12769210631552594670u, 11485842256170301861u, 227398758606u}, + {8328873878884556145u, 7355797963557024307u, 16344678115u}, + {1016565892414238685u, 6358188982569427272u, 47676276240u}, + {9662978461927250281u, 12475094728768767401u, 239937192751u}, + {13729967277551868112u, 17288154837907896182u, 45161754863u}, + {6371593776693359475u, 2983850577727105261u, 136754529069u}, + {17617208110845643245u, 13918604635001185934u, 70652322184u}, + {14960960225633086797u, 12033220395769876326u, 271942u}, + {12090634301321662558u, 5016456510113118u, 0u}, + {9409926148478635503u, 5016456u, 0u}, + {1u, 0u, 171313463296u}, + {4307062684900157136u, 5782377197813462996u, 168961261227u}, + {15300759383869911853u, 17732139848231399225u, 218196719784u}, + {16007534237643445447u, 3628839527415562920u, 35172859354u}, + {7138502295759677634u, 3188692267613601003u, 154280164899u}, + {8218537071653683708u, 5168130193478377351u, 164680674458u}, + {2254219416760329296u, 12556227529405091289u, 216817872804u}, + {3057410459568460683u, 15087090312791441191u, 97557377752u}, + {8217810929938874370u, 10281804758610642493u, 49771853153u}, + {11741126472498340929u, 14238177586158586579u, 238385321521u}, + {1175325363726654805u, 7107927498217678127u, 127208482030u}, + {9428843070696730900u, 3845814658485364449u, 41038721919u}, + {12662500978715131896u, 714293333681725945u, 101908896041u}, + {6443045597035184564u, 16766172658649116981u, 21044043621u}, + {1921385512639171183u, 812461421432632214u, 60824970773u}, + {10469475094355551399u, 15218024718633799195u, 32439687228u}, + {14679174489076953574u, 8110797782612805145u, 235864173856u}, + {11853074234719825644u, 15941193964933529226u, 104766762987u}, + {8270896886596139124u, 14144280602323277932u, 40817076584u}, + {16532667046659118126u, 15072402647813125244u, 254586700072u}, + {148341279888833483u, 10822706091283369888u, 17822033662u}, + {10364629296397276041u, 15163844593710966730u, 17u}, + {14265682585545771671u, 328758493846u, 0u}, + {13991741872911347878u, 328u, 0u}, + {1u, 0u, 63130566656u}, + {14029045786848724433u, 2408529687792073669u, 21215793215u}, + {4005878521026842341u, 3980682212356510807u, 92227827221u}, + {3428326338640386488u, 4202670442792148518u, 64510636636u}, + {1010001558294829380u, 9419583343154651921u, 184886832192u}, + {2012063724327403418u, 16359166491570434574u, 64681297848u}, + {10997154538851372612u, 12567727056384237384u, 96112127552u}, + {1917749645489607898u, 2068388267923286638u, 176308408672u}, + {9763872523711218805u, 5689135844565021195u, 152168271536u}, + {15875699078454059311u, 3104061965171139312u, 164431250840u}, + {10966529452671276106u, 7955173880156328015u, 95078343332u}, + {18073244132105736913u, 1445179403240833753u, 233679697247u}, + {4435241176994913173u, 12538201164459126714u, 173410945513u}, + {5464400086219074323u, 7580606719088482666u, 70442805421u}, + {2445909179323258812u, 8168318283218819754u, 49284582214u}, + {873962058644121211u, 5249615277755961675u, 143342228273u}, + {16675872194112650857u, 6312997372068219830u, 58497855631u}, + {10680102689274800355u, 9183815417025176702u, 74579172666u}, + {2370498083108897524u, 10683849953373876936u, 43931059274u}, + {15354400521451334666u, 17175012155615667567u, 49975972139u}, + {259991949657381021u, 18003508288378896911u, 112798111281u}, + {10335286558772966917u, 14722554560950996950u, 1167984u}, + {16337526653906757263u, 21545516652742137u, 0u}, + {12040967163702784894u, 21545516u, 0u}, + {1u, 0u, 108816367616u}, + {3373309160242342187u, 15059324482416394929u, 62224146796u}, + {13639841054510584221u, 4134778595813308311u, 82884769598u}, + {15898855427739708031u, 16321118342639660947u, 185082591826u}, + {4544387940067005419u, 1523550293123468804u, 7434568377u}, + {5281598644835398575u, 8016371634569878508u, 105535824647u}, + {13675642405083408835u, 9884220139611134109u, 180391292521u}, + {3973392623768015721u, 7218073002727840413u, 243870735540u}, + {4491285101509114191u, 16062235669481359232u, 19843403507u}, + {15002304272810270500u, 15558048660560338001u, 102455061267u}, + {17325098540619893468u, 8394398745765058608u, 14308634214u}, + {1137212864974584822u, 5693296366442904273u, 638784526u}, + {2619406097224859078u, 11783494675061161357u, 51725184512u}, + {8281347529729293732u, 13377293110865447893u, 91696097587u}, + {11344719666795450104u, 12840734051093062129u, 218380005723u}, + {17283870506679425783u, 7009868331566697504u, 156272117978u}, + {11054210518010603775u, 5019690705031194476u, 115466655644u}, + {6399455551799092885u, 8608277240439804983u, 68659871603u}, + {12930529916573967170u, 12172482590657749221u, 89900618820u}, + {14550097052337552404u, 16613484892678771989u, 217310162521u}, + {12487632712206414748u, 5721488662757049243u, 81020975577u}, + {5791017277843595715u, 386931106438877038u, 76545051729u}, + {10227264183449036113u, 10054429752182825658u, 76u}, + {2006055278511721441u, 1412006979354u, 0u}, + {128746359043876333u, 1412u, 0u}, + {1u, 0u, 253468082176u}, + {7408146306870995754u, 8634592106137071312u, 97684476157u}, + {8299024588195267962u, 12626356501369830730u, 128260389217u}, + {1497052939192040881u, 4803333258178976932u, 36737966720u}, + {16771714264265803747u, 13613083223558209296u, 63873160484u}, + {142988846654429432u, 16106967997237446988u, 43804094271u}, + {11839838367716104145u, 14832921244380020169u, 43746691371u}, + {6019646776647679765u, 13774024637717231396u, 232524375083u}, + {4611972391702034948u, 9673012968505228884u, 233292291816u}, + {16447182322205429545u, 5391832334264815666u, 126895249385u}, + {2113477168726764245u, 16514436292632703087u, 2651878526u}, + {3536261187802311516u, 12025036352783454152u, 135382716162u}, + {18444381860986709854u, 7059867105311401049u, 165692220295u}, + {4734315730275909838u, 12769210631552594669u, 51451509157u}, + {9974936316849658174u, 8328873878884556144u, 72055108147u}, + {11864423681540657642u, 1016565892414238684u, 169523831112u}, + {8207245621417902667u, 9662978461927250280u, 118744303017u}, + {7992526918695295028u, 13729967277551868111u, 237345404790u}, + {8679354522130259987u, 6371593776693359474u, 142955030765u}, + {6065763799692166461u, 17617208110845643244u, 102811035278u}, + {18143341109049024976u, 14960960225633086796u, 94655434598u}, + {15242492331283350570u, 12090634301321662557u, 136510113118u}, + {9986352353182266963u, 9409926148478635502u, 5016456u}, + {17340463289911536077u, 92537289398950870u, 0u}, + {7359344614214233035u, 92537289u, 0u}, + {1u, 0u, 212233486336u}, + {419091135888749535u, 4307062684900157135u, 57829455828u}, + {1073142712661309790u, 15300759383869911852u, 168867770169u}, + {11076438902195672286u, 16007534237643445446u, 235386978984u}, + {1820390940081322073u, 7138502295759677633u, 135445527787u}, + {18417808973944523597u, 8218537071653683707u, 217122201479u}, + {10251294197731582957u, 2254219416760329295u, 39165742553u}, + {1502394029870156428u, 3057410459568460682u, 61445488423u}, + {321014853559106075u, 8217810929938874369u, 211636487741u}, + {2390953058510591778u, 11741126472498340928u, 47063714515u}, + {10685224265907994087u, 1175325363726654804u, 225511138607u}, + {5967405799190505023u, 9428843070696730899u, 249686435553u}, + {11210723659228214761u, 12662500978715131895u, 53349278201u}, + {12327123641078462773u, 6443045597035184563u, 150104158517u}, + {1709976940107894237u, 1921385512639171182u, 27567551382u}, + {16607686590938553511u, 10469475094355551398u, 25795759643u}, + {18332088094272679457u, 14679174489076953573u, 138642556441u}, + {2946170632136780882u, 11853074234719825643u, 108448366218u}, + {4824449494694383419u, 8270896886596139123u, 124896237676u}, + {17008332258693407134u, 16532667046659118125u, 160008041596u}, + {1773419466622750661u, 148341279888833482u, 202561867680u}, + {3892343466023784379u, 10364629296397276040u, 150773344202u}, + {12001571085575422796u, 14265682585545771670u, 72758493846u}, + {12933506765500977582u, 13991741872911347877u, 328u}, + {11884830007749143734u, 6064523798049u, 0u}, + {9662368568096205337u, 6064u, 0u}, + {1u, 0u, 197760516096u}, + {16801499925276664442u, 14029045786848724432u, 87217159109u}, + {10492407990787637084u, 4005878521026842340u, 38185849943u}, + {7673849751013230269u, 3428326338640386487u, 17054752294u}, + {6046724489853072367u, 1010001558294829379u, 14109074193u}, + {3723941391207507903u, 2012063724327403417u, 72596156942u}, + {16844122108860347659u, 10997154538851372611u, 110103961416u}, + {10622020182694668027u, 1917749645489607897u, 11529300590u}, + {8741198820686854862u, 9763872523711218804u, 240860623371u}, + {6855480461211306807u, 15875699078454059310u, 79594496752u}, + {10005708458011566304u, 10966529452671276105u, 217979752527u}, + {8932093106442919061u, 18073244132105736912u, 186240434905u}, + {9062763476260756743u, 4435241176994913172u, 106296225722u}, + {13664977682032775521u, 5464400086219074322u, 170132593002u}, + {1078499125430623453u, 2445909179323258811u, 75047377578u}, + {6554586738078431161u, 873962058644121210u, 182904000843u}, + {12177313698643242883u, 16675872194112650856u, 126578969526u}, + {16615072271904633953u, 10680102689274800354u, 200128504958u}, + {16375404983106569285u, 2370498083108897523u, 111832363720u}, + {13552251831473522729u, 15354400521451334665u, 15014094191u}, + {8330500218412111874u, 259991949657381020u, 214560277007u}, + {7044338079053294004u, 10335286558772966916u, 249885659094u}, + {2688849443046530184u, 16337526653906757262u, 44652742137u}, + {855940991879596845u, 12040967163702784893u, 21545516u}, + {7344363609485825662u, 397444631628981487u, 0u}, + {11602660525134634992u, 397444631u, 0u}, + {1u, 0u, 177182867456u}, + {16945343208344873835u, 3373309160242342186u, 151739417265u}, + {9617992661337889145u, 13639841054510584220u, 147861878679u}, + {18280344933262742088u, 15898855427739708030u, 4246351763u}, + {5179975582362777795u, 4544387940067005418u, 236286316036u}, + {1798918997870037130u, 5281598644835398574u, 157741358060u}, + {6327667344756325883u, 13675642405083408834u, 157215398045u}, + {18380327574124007701u, 3973392623768015720u, 128243473053u}, + {18015447557304295289u, 4491285101509114190u, 81813276544u}, + {10315590748073249878u, 15002304272810270499u, 48939195473u}, + {7697916092577993382u, 17325098540619893467u, 209061648432u}, + {3124132817942110723u, 1137212864974584821u, 141141998289u}, + {7448238998520507049u, 2619406097224859077u, 213448932749u}, + {13892823322374205297u, 8281347529729293731u, 241614998485u}, + {11042137840046332564u, 11344719666795450103u, 32936960497u}, + {10513966307445593804u, 17283870506679425782u, 108599249952u}, + {9388437460943526958u, 11054210518010603774u, 55346915180u}, + {10967228614677896228u, 6399455551799092884u, 229700965431u}, + {2310996671540235542u, 12930529916573967169u, 21788762341u}, + {4989110555003898587u, 14550097052337552403u, 155676955925u}, + {16271452421983657679u, 12487632712206414747u, 110313931675u}, + {9523160181437090473u, 5791017277843595714u, 186554421102u}, + {13137707423765072250u, 10227264183449036112u, 26108748474u}, + {16846859744221860705u, 2006055278511721440u, 132006979354u}, + {7767140033449795569u, 128746359043876332u, 1412u}, + {17169456915721160017u, 26046931378436u, 0u}, + {17180899661833327819u, 26046u, 0u}, + {1u, 0u, 208401596416u}, + {17572520700934791416u, 7408146306870995753u, 74449891024u}, + {17968798858233825417u, 8299024588195267961u, 164081155402u}, + {15338423313945305609u, 1497052939192040880u, 16909196452u}, + {17895321323836726301u, 16771714264265803746u, 76007751440u}, + {814069333008965773u, 142988846654429431u, 201641838924u}, + {7200328959852723947u, 11839838367716104144u, 36326325705u}, + {759884557248133773u, 6019646776647679764u, 84250015524u}, + {13410165861863974851u, 4611972391702034947u, 50891603540u}, + {6278452420856351570u, 16447182322205429544u, 111114571826u}, + {9072115382556676442u, 2113477168726764244u, 200191701103u}, + {2755882551854926563u, 3536261187802311515u, 89999871944u}, + {8496072611504649269u, 18444381860986709853u, 237256647769u}, + {4122009033579215815u, 4734315730275909837u, 112540742381u}, + {10222217724450527221u, 9974936316849658173u, 220643171696u}, + {2064539481554006325u, 11864423681540657641u, 104444915676u}, + {7935605886598063693u, 8207245621417902666u, 207433275752u}, + {7805147585347548429u, 7992526918695295027u, 114470508751u}, + {5709020905457661273u, 8679354522130259986u, 236328825714u}, + {16257370307404906674u, 6065763799692166460u, 76983552492u}, + {14971258192939373646u, 18143341109049024975u, 93826297164u}, + {1133404845901376390u, 15242492331283350569u, 238541361245u}, + {9460827548162822047u, 9986352353182266962u, 214940028398u}, + {1273897659779791346u, 17340463289911536076u, 201398950870u}, + {7833262224435092783u, 7359344614214233034u, 92537289u}, + {3033420566713364587u, 1707011694817242694u, 0u}, + {15075466825360349103u, 1707011694u, 0u}, + {1u, 0u, 207022718976u}, + {2484134775182816690u, 419091135888749534u, 44058175183u}, + {18400539815335991277u, 1073142712661309789u, 198600454956u}, + {485494064952118286u, 11076438902195672285u, 193098683590u}, + {17577048805241314891u, 1820390940081322072u, 251998431425u}, + {2863946907557583807u, 18417808973944523596u, 79555723771u}, + {13045307417786230800u, 10251294197731582956u, 138081444943u}, + {12032088871615097766u, 1502394029870156427u, 1017402250u}, + {8848763446997690580u, 321014853559106074u, 64129613825u}, + {10031289150307672684u, 2390953058510591777u, 84579247168u}, + {11592215575498656563u, 10685224265907994086u, 19323493716u}, + {15894436747956898388u, 5967405799190505022u, 247607734547u}, + {2091546719588500923u, 11210723659228214760u, 179668254711u}, + {5863809244813756109u, 12327123641078462772u, 110092698035u}, + {11303008753675411245u, 1709976940107894236u, 166900304494u}, + {13238426537506910532u, 16607686590938553510u, 229993784486u}, + {17258458071023005565u, 18332088094272679456u, 235159712229u}, + {8385733444777075179u, 2946170632136780881u, 115261533931u}, + {9530757096163247300u, 4824449494694383418u, 45922023539u}, + {14423000845391072217u, 17008332258693407133u, 202096137261u}, + {10953140011159884311u, 1773419466622750660u, 136211004362u}, + {12228340237948264127u, 3892343466023784378u, 150650606472u}, + {11279134946966259189u, 12001571085575422795u, 165701126806u}, + {14640097792684582651u, 12933506765500977581u, 33644277925u}, + {6232313315128656728u, 11884830007749143733u, 176523798049u}, + {16136121832933322088u, 9662368568096205336u, 6064u}, + {15074767079673358271u, 111870718431542u, 0u}, + {13252722804829281908u, 111870u, 0u}, + {1u, 0u, 208910811136u}, + {7740175894281560509u, 16801499925276664441u, 228568794576u}, + {15670495392425593226u, 10492407990787637083u, 183416000228u}, + {15152257626756992778u, 7673849751013230268u, 67327793591u}, + {4090073428152440422u, 6046724489853072366u, 153201875267u}, + {14450327772834205584u, 3723941391207507902u, 67913121689u}, + {4466091895542494216u, 16844122108860347658u, 217575820867u}, + {10454115378553795377u, 10622020182694668026u, 116473861337u}, + {2267817233475657788u, 8741198820686854861u, 46371636340u}, + {5500455702636497521u, 6855480461211306806u, 73542410542u}, + {15178768299492252549u, 10005708458011566303u, 208484209737u}, + {7062359872332045590u, 8932093106442919060u, 148491293392u}, + {12297347290027942576u, 9062763476260756742u, 18740779924u}, + {8030124596941085588u, 13664977682032775520u, 187058465554u}, + {6526656990996654843u, 1078499125430623452u, 122355324859u}, + {6254287345256979850u, 6554586738078431160u, 104660133498u}, + {6642007136244870032u, 12177313698643242882u, 226900704872u}, + {2027592955437164718u, 16615072271904633952u, 243887712482u}, + {942718349157325567u, 16375404983106569284u, 9734669043u}, + {14617066671884002278u, 13552251831473522728u, 156451597321u}, + {6831631114396133348u, 8330500218412111873u, 4381874332u}, + {14603040013386939258u, 7044338079053294003u, 142145762820u}, + {9906106765319401103u, 2688849443046530183u, 125046400654u}, + {1396179595609933063u, 855940991879596844u, 239398138749u}, + {11524884268464976417u, 7344363609485825661u, 23628981487u}, + {382929570730827274u, 11602660525134634991u, 397444631u}, + {6109721884461301381u, 7331559403129590068u, 0u}, + {2390514825000339691u, 7331559403u, 0u}, + {6116191454763441755u, 7u, 0u}, + {1u, 0u, 42918608896u}, + {11598868771099176310u, 16945343208344873834u, 156521392426u}, + {14449966445520085105u, 9617992661337889144u, 126990979484u}, + {11675595287405614726u, 18280344933262742087u, 234280807038u}, + {15860796398550489897u, 5179975582362777794u, 174097519594u}, + {16180408435245829662u, 1798918997870037129u, 194343023534u}, + {13756992797154950706u, 6327667344756325882u, 104996399554u}, + {8830551328786758466u, 18380327574124007700u, 78976619368u}, + {16699955256560951264u, 18015447557304295288u, 35559209294u}, + {10038983627153402074u, 10315590748073249877u, 219417304867u}, + {15085100736692127346u, 7697916092577993381u, 245169359579u}, + {10007783780289711125u, 3124132817942110722u, 197403769845u}, + {17596907048353602192u, 7448238998520507048u, 163753131461u}, + {13530650344896573509u, 13892823322374205296u, 247598595491u}, + {6337724853398437005u, 11042137840046332563u, 246569963255u}, + {12768885008904063297u, 10513966307445593803u, 254508948214u}, + {2759773619512884114u, 9388437460943526957u, 148594534654u}, + {8434364600126655292u, 10967228614677896227u, 65125279380u}, + {3843827521199949338u, 2310996671540235541u, 19270460225u}, + {4661660852957808994u, 4989110555003898586u, 155882077203u}, + {15298044134177324417u, 16271452421983657678u, 194516251547u}, + {7747773274913338217u, 9523160181437090472u, 80712196546u}, + {10348785912020632966u, 13137707423765072249u, 224913270096u}, + {4175372293197190170u, 16846859744221860704u, 236421057504u}, + {11326064156813083145u, 7767140033449795568u, 4930758124u}, + {8100407170505981763u, 17169456915721160016u, 190931378436u}, + {1706556116319916846u, 17180899661833327818u, 26046u}, + {15028897280749641942u, 480481077043500u, 0u}, + {1421201742071739121u, 480481u, 0u}, + {1u, 0u, 41952608256u}, + {8480737406125178272u, 17572520700934791415u, 121974090537u}, + {10947205650755620361u, 17968798858233825416u, 176831497593u}, + {868577942165647781u, 15338423313945305608u, 226970107312u}, + {16017710019091388479u, 17895321323836726300u, 247044130786u}, + {6610879150827623375u, 814069333008965772u, 208390330615u}, + {12110095866223762092u, 7200328959852723946u, 20041193424u}, + {7756802952949470775u, 759884557248133772u, 3726966548u}, + {2941800790804618759u, 13410165861863974850u, 40340355587u}, + {11703600274199927522u, 6278452420856351569u, 212491800360u}, + {806737539257940346u, 9072115382556676441u, 91149396692u}, + {14579028397110132023u, 2755882551854926562u, 93460573019u}, + {14247808875344366934u, 8496072611504649268u, 205223454557u}, + {9713379923695279513u, 4122009033579215814u, 61554147533u}, + {2246428675703313877u, 10222217724450527220u, 233111918909u}, + {3549783776592680620u, 2064539481554006324u, 74430190057u}, + {12645029747929213033u, 7935605886598063692u, 51423117898u}, + {16279009267476580506u, 7805147585347548428u, 18309486643u}, + {343358782242907186u, 5709020905457661272u, 60881313810u}, + {10077054739085890321u, 16257370307404906673u, 207811593532u}, + {10526715404712173586u, 14971258192939373645u, 41061441999u}, + {11438715865125144243u, 1133404845901376389u, 82512872489u}, + {5040916178827294801u, 9460827548162822046u, 204069058130u}, + {16643761637275849508u, 1273897659779791345u, 202424641996u}, + {4852542977279030386u, 7833262224435092782u, 70164442058u}, + {7883373066544387129u, 3033420566713364586u, 110817242694u}, + {16699064314768500978u, 15075466825360349102u, 1707011694u}, + {6805863634444817214u, 13042063791413317777u, 1u}, + {2266540253968903500u, 31488807865u, 0u}, + {9016913589137908810u, 31u, 0u}, + {1u, 0u, 222134665216u}, + {11654451024602552034u, 2484134775182816689u, 93997495262u}, + {5299013208454526793u, 18400539815335991276u, 221026318685u}, + {14918550373926182540u, 485494064952118285u, 88952853725u}, + {6225552657491071054u, 17577048805241314890u, 76155254872u}, + {10344713496596235785u, 2863946907557583806u, 236707187532u}, + {12972405634433280209u, 13045307417786230799u, 139652260844u}, + {12911885282402784945u, 12032088871615097765u, 26479692427u}, + {6934311832970995868u, 8848763446997690579u, 33543797274u}, + {9975729197003430461u, 10031289150307672683u, 230628415265u}, + {1982857556803548935u, 11592215575498656562u, 62861639142u}, + {2095735223386298223u, 15894436747956898387u, 232113382974u}, + {7110931538347639365u, 2091546719588500922u, 52317877736u}, + {15822183724630969535u, 5863809244813756108u, 220612737332u}, + {16931982690156327501u, 11303008753675411244u, 166717656540u}, + {6740069226761666110u, 13238426537506910531u, 32935582886u}, + {3138792961008474902u, 17258458071023005564u, 81454591520u}, + {12154594426971851390u, 8385733444777075178u, 58516663377u}, + {15780127219221910902u, 9530757096163247299u, 157781872442u}, + {16421541930960194381u, 14423000845391072216u, 196593770909u}, + {7485894627196740576u, 10953140011159884310u, 186662899652u}, + {8897269432694476707u, 12228340237948264126u, 75611443130u}, + {17189823634941678805u, 11279134946966259188u, 173793641291u}, + {9585582064286255216u, 14640097792684582650u, 181337854381u}, + {12835472279575022097u, 6232313315128656727u, 24874740917u}, + {6776016669542754608u, 16136121832933322087u, 54817204760u}, + {18340015775620871027u, 15074767079673358270u, 254718431542u}, + {5254188752292365830u, 13252722804829281907u, 111870u}, + {6798802596750151183u, 2063650512248692u, 0u}, + {9449320530215272000u, 2063650u, 0u}, + {1u, 0u, 121419595776u}, + {17110720482574968811u, 7740175894281560508u, 91849499257u}, + {16172441693558688213u, 15670495392425593225u, 188821405531u}, + {6234654946353717320u, 15152257626756992777u, 238221723324u}, + {11180283100679445438u, 4090073428152440421u, 190783353838u}, + {14852260031176961272u, 14450327772834205583u, 10242107326u}, + {4481533167346438750u, 4466091895542494215u, 250566718730u}, + {4269718344362365664u, 10454115378553795376u, 205122938618u}, + {11520029752381101466u, 2267817233475657787u, 54298180301u}, + {16778682550309368417u, 5500455702636497520u, 223822842678u}, + {9687587467301363608u, 15178768299492252548u, 148382851295u}, + {10093971076828497318u, 7062359872332045589u, 6666640532u}, + {1913763026490934696u, 12297347290027942575u, 96435313926u}, + {12701450127613557000u, 8030124596941085587u, 220353810784u}, + {8974572160711134644u, 6526656990996654842u, 184339045596u}, + {9890000077336694124u, 6254287345256979849u, 130360063928u}, + {4292326716201059148u, 6642007136244870031u, 96109916034u}, + {14644519175104337420u, 2027592955437164717u, 68051104864u}, + {5051178622270136798u, 942718349157325566u, 40792392772u}, + {675983118348065839u, 14617066671884002277u, 1370343464u}, + {4431647660065117244u, 6831631114396133347u, 179791632385u}, + {8316115180008411962u, 14603040013386939257u, 135537011123u}, + {9621158095544965602u, 9906106765319401102u, 44075687047u}, + {15283478958951102072u, 1396179595609933062u, 125624765228u}, + {13981553073094447813u, 11524884268464976416u, 239020758653u}, + {4558368743929911607u, 382929570730827273u, 52331208687u}, + {15217004469858477791u, 6109721884461301380u, 235129590068u}, + {11589190369996515737u, 2390514825000339690u, 7331559403u}, + {3670624237398152929u, 6116191454763441754u, 7u}, + {13471713758418039777u, 135243399970u, 0u}, + {4489936967610296411u, 135u, 0u}, + {1u, 0u, 106628775936u}, + {9052049303222747950u, 11598868771099176309u, 120783334250u}, + {1011330006193020538u, 14449966445520085104u, 71632935288u}, + {17412075644359478612u, 11675595287405614725u, 194859815495u}, + {6358678384745980468u, 15860796398550489896u, 137877141698u}, + {15262353928842850919u, 16180408435245829661u, 250745768073u}, + {11145257686438581736u, 13756992797154950705u, 20478705146u}, + {1600562031807691890u, 8830551328786758465u, 120905306388u}, + {6775147337046626724u, 16699955256560951263u, 85544214392u}, + {15772127322106297822u, 10038983627153402073u, 165817764949u}, + {4141472200527441474u, 15085100736692127345u, 2542523045u}, + {18246007807879281267u, 10007783780289711124u, 168953930242u}, + {960746958654787123u, 17596907048353602191u, 112733498024u}, + {11355981212264408477u, 13530650344896573508u, 147343568752u}, + {1573078209576251481u, 6337724853398437004u, 203692202643u}, + {6245294478780491367u, 12768885008904063296u, 45149607627u}, + {7523292955659721510u, 2759773619512884113u, 35457227821u}, + {14454736751015226505u, 8434364600126655291u, 21208374307u}, + {7219786377781411316u, 3843827521199949337u, 218252709141u}, + {10597123082209392431u, 4661660852957808993u, 206829308634u}, + {6922353544343010714u, 15298044134177324416u, 168420007630u}, + {14317523356293377430u, 7747773274913338216u, 121561008808u}, + {4057766168681892717u, 10348785912020632965u, 96226347385u}, + {15214083611901244045u, 4175372293197190169u, 240613987168u}, + {8390569016883950721u, 11326064156813083144u, 80439123952u}, + {10680472538208175055u, 8100407170505981762u, 202092512592u}, + {12173567833130544927u, 1706556116319916845u, 44814718154u}, + {1386341248286610026u, 15028897280749641941u, 225077043500u}, + {12487300952797237352u, 1421201742071739120u, 480481u}, + {2614759871804869720u, 8863311460481781u, 0u}, + {8494389567327729477u, 8863311u, 0u}, + {1u, 0u, 247459741696u}, + {6260469580539185878u, 8480737406125178271u, 136593449207u}, + {17818573101084525841u, 10947205650755620360u, 8047085704u}, + {2201029069927307150u, 868577942165647780u, 28868321800u}, + {10397997613804897039u, 16017710019091388478u, 140358376476u}, + {14269915965770103741u, 6610879150827623374u, 234656489612u}, + {16776139909196366727u, 12110095866223762091u, 140420497130u}, + {6246513436385199720u, 7756802952949470774u, 194159475340u}, + {2926026498821554288u, 2941800790804618758u, 81634453442u}, + {15725499391028340982u, 11703600274199927521u, 89043733329u}, + {8576577277771450827u, 806737539257940345u, 226790330713u}, + {15523351176022259335u, 14579028397110132022u, 52772375266u}, + {4775158829429176134u, 14247808875344366933u, 198526563380u}, + {10141817222123532462u, 9713379923695279512u, 244121779142u}, + {12847658900242624586u, 2246428675703313876u, 52192434164u}, + {13708197964460514655u, 3549783776592680619u, 76685488436u}, + {1951540006613246932u, 12645029747929213032u, 12882486860u}, + {9979297327280092199u, 16279009267476580505u, 88018613516u}, + {15381307706282553684u, 343358782242907185u, 177546278232u}, + {10037428657543061177u, 10077054739085890320u, 77570654385u}, + {2584877324547208668u, 10526715404712173585u, 133620094029u}, + {1126624732730703576u, 11438715865125144242u, 158273268613u}, + {1501064139624981020u, 5040916178827294800u, 241902260126u}, + {5219661484955306109u, 16643761637275849507u, 46263056881u}, + {5336997298570282212u, 4852542977279030385u, 106427358510u}, + {12191131175733833362u, 7883373066544387128u, 174905258090u}, + {3707068178994436536u, 16699064314768500977u, 145368946606u}, + {5045484691732942022u, 6805863634444817213u, 185122869393u}, + {14847900542908711232u, 2266540253968903499u, 31488807865u}, + {9097257915916965135u, 9016913589137908809u, 31u}, + {2472027983230314217u, 580865979874u, 0u}, + {15974509111133272205u, 580u, 0u}, + {1u, 0u, 177631789056u}, + {12099486841948187399u, 11654451024602552033u, 236287260081u}, + {5319910566029976328u, 5299013208454526792u, 13808736236u}, + {11549214421017285864u, 14918550373926182539u, 74337487885u}, + {1998791413186046700u, 6225552657491071053u, 190560788042u}, + {17075171930090011210u, 10344713496596235784u, 15703235518u}, + {15158296003813501474u, 12972405634433280208u, 165699954703u}, + {1360083178079384115u, 12911885282402784944u, 211375909797u}, + {6167980558592741158u, 6934311832970995867u, 107540785363u}, + {3630180428124865653u, 9975729197003430460u, 50107490923u}, + {2276550099763657677u, 1982857556803548934u, 83113610034u}, + {407006713016100655u, 2095735223386298222u, 186385484371u}, + {14242579061653496002u, 7110931538347639364u, 204857722298u}, + {17944493332678643704u, 15822183724630969534u, 44917884620u}, + {987185901870869452u, 16931982690156327500u, 67365379884u}, + {5578665155415167745u, 6740069226761666109u, 124170154307u}, + {4849210377429577536u, 3138792961008474901u, 234658901884u}, + {10811995403388891862u, 12154594426971851389u, 195855442410u}, + {7051931074990177294u, 15780127219221910901u, 216890213571u}, + {2030832259446664275u, 16421541930960194380u, 22405811160u}, + {6069512651054767896u, 7485894627196740575u, 190482321942u}, + {10608701253763958799u, 8897269432694476706u, 244931862206u}, + {15700053443426906717u, 17189823634941678804u, 250519635444u}, + {17759719234725541222u, 9585582064286255215u, 87695812346u}, + {15187321568916405210u, 12835472279575022096u, 103367328599u}, + {11040156458113129594u, 6776016669542754607u, 190994214247u}, + {2800727824598008497u, 18340015775620871026u, 115284830142u}, + {2997236166375604479u, 5254188752292365829u, 116368563827u}, + {6260091886451512841u, 6798802596750151182u, 34512248692u}, + {17573059315228347474u, 9449320530215271999u, 2063650u}, + {7519453664590169251u, 38067632857031246u, 0u}, + {15809436065653866529u, 38067632u, 0u}, + {1u, 0u, 188927574016u}, + {228921437623588922u, 17110720482574968810u, 137876709820u}, + {2195862230003073884u, 16172441693558688212u, 9337981321u}, + {960207412233973688u, 6234654946353717319u, 101606084361u}, + {2464387149230492479u, 11180283100679445437u, 143805142629u}, + {3631866936444955213u, 14852260031176961271u, 7242944399u}, + {1578304441149380227u, 4481533167346438749u, 48231461895u}, + {18190538519673445181u, 4269718344362365663u, 59624502064u}, + {1271000736479934749u, 11520029752381101465u, 112909574203u}, + {18292963032817745634u, 16778682550309368416u, 132525165168u}, + {17168014021925537455u, 9687587467301363607u, 21547195268u}, + {18046757712870378949u, 10093971076828497317u, 175103745301u}, + {14857998893911743220u, 1913763026490934695u, 147688546991u}, + {11933607369968684575u, 12701450127613556999u, 250486512531u}, + {3483798509902859162u, 8974572160711134643u, 137536137978u}, + {7378828438829845831u, 9890000077336694123u, 143232687497u}, + {15791137430347699565u, 4292326716201059147u, 173793880975u}, + {17044141236829932641u, 14644519175104337419u, 254273824941u}, + {9075651910862456484u, 5051178622270136797u, 229036645118u}, + {17811207355884564095u, 675983118348065838u, 227240240101u}, + {4438638126207305937u, 4431647660065117243u, 121450817507u}, + {12507972635512950185u, 8316115180008411961u, 142521564025u}, + {14658269128098109408u, 9621158095544965601u, 6828519054u}, + {3642436268910286111u, 15283478958951102071u, 32757941510u}, + {3783099432964819561u, 13981553073094447812u, 9247109664u}, + {9497579866027539638u, 4558368743929911606u, 132824915465u}, + {3395179445046271361u, 15217004469858477790u, 234628251268u}, + {5938502732309497276u, 11589190369996515736u, 90198984938u}, + {5793671185917606255u, 3670624237398152928u, 34730303066u}, + {889272970253526588u, 13471713758418039776u, 135243399970u}, + {8594177504370135501u, 4489936967610296410u, 135u}, + {7374354721120724712u, 2494800386918u, 0u}, + {14764532643665507567u, 2494u, 0u}, + {1u, 0u, 117490712576u}, + {5392404173658087695u, 9052049303222747949u, 112054824309u}, + {4976586473237854316u, 1011330006193020537u, 133943910512u}, + {6308932742419013569u, 17412075644359478611u, 40344704645u}, + {4831846642430703059u, 6358678384745980467u, 29827373864u}, + {18139507855949846901u, 15262353928842850918u, 49604185629u}, + {4865833876326628410u, 11145257686438581735u, 65086766641u}, + {14296661839130179261u, 1600562031807691889u, 223367281473u}, + {9254773150378118248u, 6775147337046626723u, 217855008735u}, + {12174712433727875143u, 15772127322106297821u, 113224509657u}, + {705653145340915199u, 4141472200527441473u, 20989118065u}, + {17763928858962481812u, 18246007807879281266u, 143052082196u}, + {3982836567612046296u, 960746958654787122u, 68615608975u}, + {12730849277561967739u, 11355981212264408476u, 140085276740u}, + {17314488764367235908u, 1573078209576251480u, 64338558092u}, + {15951418930590301119u, 6245294478780491366u, 145407838528u}, + {7193356087283467261u, 7523292955659721509u, 59783592849u}, + {17592945625696089446u, 14454736751015226504u, 25391385403u}, + {3554461664875361428u, 7219786377781411315u, 97574471193u}, + {2213779057785318208u, 10597123082209392430u, 128375261537u}, + {3880940796082421148u, 6922353544343010713u, 104776154496u}, + {4528237545358141043u, 14317523356293377429u, 133219971944u}, + {11681196539088147363u, 4057766168681892716u, 25824757125u}, + {9835005502912643017u, 15214083611901244044u, 8454853657u}, + {4964088126040986696u, 8390569016883950720u, 66578989576u}, + {3355564873147047622u, 10680472538208175054u, 45659930434u}, + {1853093467828272927u, 12173567833130544926u, 213075153709u}, + {14755341584803008677u, 1386341248286610025u, 240676937941u}, + {4701571132542556621u, 12487300952797237351u, 245141746416u}, + {6128849686644853851u, 2614759871804869719u, 79460481781u}, + {12026867901170202094u, 8494389567327729476u, 8863311u}, + {17909760324981426303u, 163499238157084246u, 0u}, + {2897692901883393664u, 163499238u, 0u}, + {1u, 0u, 159339380736u}, + {12323704802554838154u, 6260469580539185877u, 8965946783u}, + {7135886931147821732u, 17818573101084525840u, 164119318024u}, + {15341283120292884947u, 2201029069927307149u, 62563676580u}, + {3092789040392634166u, 10397997613804897038u, 206773573694u}, + {8811761390822097865u, 14269915965770103740u, 171909436366u}, + {16870860798610218169u, 16776139909196366726u, 54338624171u}, + {17452041453591904833u, 6246513436385199719u, 6158620214u}, + {10314783684009874908u, 2926026498821554287u, 225852481030u}, + {4932636630789274903u, 15725499391028340981u, 121464937185u}, + {18143884346082124480u, 8576577277771450826u, 54841522553u}, + {2823209155405527322u, 15523351176022259334u, 85258861878u}, + {16195396106620226251u, 4775158829429176133u, 152549789013u}, + {1150544491807648944u, 10141817222123532461u, 212696472984u}, + {7767455475523884824u, 12847658900242624585u, 171743122900u}, + {15204378045683991808u, 13708197964460514654u, 104105793195u}, + {17239732561718805622u, 1951540006613246931u, 153540978792u}, + {12886430624522800062u, 9979297327280092198u, 49833822361u}, + {18162250541178258136u, 15381307706282553683u, 16544130097u}, + {17028935366700158084u, 10037428657543061176u, 17140126480u}, + {16075467823964198637u, 2584877324547208667u, 178061074449u}, + {9803858825574498304u, 1126624732730703575u, 80081372850u}, + {17464070808143041817u, 1501064139624981019u, 35282958416u}, + {17682703471239266776u, 5219661484955306108u, 113289319203u}, + {18147688354161351336u, 5336997298570282211u, 56660882545u}, + {6663423873348080051u, 12191131175733833361u, 241200960568u}, + {9417270363716235133u, 3707068178994436535u, 61273516273u}, + {9295013721571344179u, 5045484691732942021u, 75804906301u}, + {6199479138350037783u, 14847900542908711231u, 73493163339u}, + {887603005365085688u, 9097257915916965134u, 226134008905u}, + {333989628642975696u, 2472027983230314216u, 68865979874u}, + {4620735991403939439u, 15974509111133272204u, 580u}, + {12418523063962801201u, 10715086071862u, 0u}, + {1587745622680169419u, 10715u, 0u}, + {1u, 0u, 225655914496u}, + {10968905082284365638u, 12099486841948187398u, 72288392929u}, + {14076907092801977812u, 5319910566029976327u, 139626084168u}, + {3438322122816124202u, 11549214421017285863u, 77108354699u}, + {14645413324829073676u, 1998791413186046699u, 8925646925u}, + {12271281439492289999u, 17075171930090011209u, 208821732872u}, + {6233751789862708246u, 15158296003813501473u, 176073730256u}, + {1962644459455827991u, 1360083178079384114u, 155334366896u}, + {8726934184642952500u, 6167980558592741157u, 60196792475u}, + {4531087719737475147u, 3630180428124865652u, 6123412028u}, + {481513520412720775u, 2276550099763657676u, 110022063878u}, + {992149349835802669u, 407006713016100654u, 68772091758u}, + {11165474436676191361u, 14242579061653496001u, 190972772932u}, + {10240785855143707184u, 17944493332678643703u, 76053515454u}, + {10059329918238932466u, 987185901870869451u, 61302420044u}, + {14791716450947031886u, 5578665155415167744u, 21262876221u}, + {15378882314737417403u, 4849210377429577535u, 125586119445u}, + {14726970229242271128u, 10811995403388891861u, 117382285949u}, + {5090110549507128156u, 7051931074990177293u, 76110091637u}, + {17185220781106503841u, 2030832259446664274u, 223329028940u}, + {9858517691519529306u, 6069512651054767895u, 162575098847u}, + {5595905546638020703u, 10608701253763958798u, 212851101602u}, + {15555173226968030256u, 15700053443426906716u, 111962756308u}, + {10745236628845355771u, 17759719234725541221u, 16823306351u}, + {9973314042399760760u, 15187321568916405209u, 47598488080u}, + {4374506813558796576u, 11040156458113129593u, 114151827759u}, + {15960826480426749933u, 2800727824598008496u, 5162480498u}, + {9636454862798615738u, 2997236166375604478u, 14339360261u}, + {17973331528911319269u, 6260091886451512840u, 63952637454u}, + {7366495200039369602u, 17573059315228347473u, 78407630399u}, + {10505831326526933399u, 7519453664590169250u, 176857031246u}, + {2803218632575724145u, 15809436065653866528u, 38067632u}, + {8425731874431741636u, 702223880805592151u, 0u}, + {14860552245711912111u, 702223880u, 0u}, + {1u, 0u, 234012409856u}, + {6993664200669526994u, 228921437623588921u, 212119037930u}, + {4065363582031999356u, 2195862230003073883u, 71052052948u}, + {6899780515342669867u, 960207412233973687u, 189133594695u}, + {17713500890201844939u, 2464387149230492478u, 247196883901u}, + {6445781125105107086u, 3631866936444955212u, 93085560055u}, + {13563044070717478571u, 1578304441149380226u, 223986111069u}, + {13167612994149348885u, 18190538519673445180u, 153068901087u}, + {5505463469596727288u, 1271000736479934748u, 96991663513u}, + {12125446212518819372u, 18292963032817745633u, 151930679904u}, + {12537707724735421794u, 17168014021925537454u, 165978316695u}, + {15173675086703777069u, 18046757712870378948u, 167805453733u}, + {13535510174093048476u, 14857998893911743219u, 7646922151u}, + {10698912997087096629u, 11933607369968684574u, 179188857095u}, + {16952559548431933861u, 3483798509902859161u, 107400007091u}, + {13528255827744249993u, 7378828438829845830u, 75856039275u}, + {14122167436324771955u, 15791137430347699564u, 11923964747u}, + {13071007137740038297u, 17044141236829932640u, 221491992075u}, + {13011887609328904025u, 9075651910862456483u, 46965547485u}, + {3116434332871336590u, 17811207355884564094u, 59240619054u}, + {9050993820536772770u, 4438638126207305936u, 57678058555u}, + {11993719123438634238u, 12507972635512950184u, 225794626361u}, + {1414857165879849301u, 14658269128098109407u, 119197456865u}, + {13819438220812375094u, 3642436268910286110u, 196205082231u}, + {6073063033888264440u, 3783099432964819560u, 54514864836u}, + {6828883869150720294u, 9497579866027539637u, 222184053046u}, + {4548265621068768345u, 3395179445046271360u, 152321926878u}, + {10422524923581371874u, 5938502732309497275u, 224314075544u}, + {1858996082510682634u, 5793671185917606254u, 224048207584u}, + {890276727450878316u, 889272970253526587u, 90465891296u}, + {3886008133802710905u, 8594177504370135500u, 102399764570u}, + {612074409233016757u, 7374354721120724711u, 190800386918u}, + {3927020336901729264u, 14764532643665507566u, 2494u}, + {5298603480094474942u, 46020944252475u, 0u}, + {17418383752590430025u, 46020u, 0u}, + {1u, 0u, 45292322816u}, + {8973799690601597929u, 5392404173658087694u, 121269781293u}, + {1343055462055792431u, 4976586473237854315u, 83342007929u}, + {17425118728683169659u, 6308932742419013568u, 51261934931u}, + {18389781726026675967u, 4831846642430703058u, 102983344691u}, + {272526939565961561u, 18139507855949846900u, 231263777382u}, + {11293026845930963228u, 4865833876326628409u, 113775023591u}, + {13997416438903902597u, 14296661839130179260u, 163501702257u}, + {6186605805999441184u, 9254773150378118247u, 221659992483u}, + {4401776373281836138u, 12174712433727875142u, 65038253533u}, + {16338917089754547008u, 705653145340915198u, 114962984513u}, + {13337700757935003056u, 17763928858962481811u, 50215910002u}, + {14612496890816348693u, 3982836567612046295u, 156690140722u}, + {3219935399907691719u, 12730849277561967738u, 88938620316u}, + {10887238730052330387u, 17314488764367235907u, 102864728152u}, + {360256418697768294u, 15951418930590301118u, 37389952614u}, + {321440824631118565u, 7193356087283467260u, 136953715493u}, + {10069228080701402580u, 17592945625696089445u, 243192687752u}, + {9428069607611622975u, 3554461664875361427u, 46120009203u}, + {14736799017468812344u, 2213779057785318207u, 153210386222u}, + {10875332567307979280u, 3880940796082421147u, 149245476249u}, + {4611492910339012807u, 4528237545358141042u, 108633238933u}, + {10743508637597314786u, 11681196539088147362u, 140533156716u}, + {9356196315668016028u, 9835005502912643016u, 128269103756u}, + {15755598617722189347u, 4964088126040986695u, 206181905536u}, + {1275276394173375542u, 3355564873147047621u, 30100456398u}, + {12644999363867216251u, 1853093467828272926u, 105799888670u}, + {4553830511509832021u, 14755341584803008676u, 103254872681u}, + {8869400642218174412u, 4701571132542556620u, 87332245607u}, + {16570849151159054040u, 6128849686644853850u, 68651977815u}, + {16127119334101797673u, 12026867901170202093u, 86970890052u}, + {9686867250420930550u, 17909760324981426302u, 230157084246u}, + {10678226869774428035u, 2897692901883393663u, 163499238u}, + {7767227962910162068u, 3016028602530220424u, 0u}, + {9780840471948993674u, 3016028602u, 0u}, + {1u, 0u, 213668069376u}, + {6288709332106746357u, 12323704802554838153u, 16386837205u}, + {9066785620141948673u, 7135886931147821731u, 141831652624u}, + {8442375916704414909u, 15341283120292884946u, 14167660429u}, + {11604629218100425803u, 3092789040392634165u, 188477686542u}, + {3877248044010875762u, 8811761390822097864u, 134914571196u}, + {16435137704395217283u, 16870860798610218168u, 103946077062u}, + {14994442577577813271u, 17452041453591904832u, 111559165543u}, + {4410105917142436089u, 10314783684009874907u, 245267398767u}, + {4632574728444936970u, 4932636630789274902u, 202983581941u}, + {9117147535650050359u, 18143884346082124479u, 134153046474u}, + {588939301256904809u, 2823209155405527321u, 69877954182u}, + {324393982565305683u, 16195396106620226250u, 173062371141u}, + {9380909186923521175u, 1150544491807648943u, 73421074605u}, + {4463385697777230217u, 7767455475523884823u, 94824230985u}, + {16378985502426333808u, 15204378045683991807u, 211934567774u}, + {18210894922387834354u, 17239732561718805621u, 38698574803u}, + {1555748035329493205u, 12886430624522800061u, 83984577574u}, + {4277055533891898507u, 18162250541178258135u, 184923140435u}, + {11574429772510874408u, 17028935366700158083u, 219871452856u}, + {17391099253493808815u, 16075467823964198636u, 215531468251u}, + {5791212393959129882u, 9803858825574498303u, 27946729175u}, + {11254268231455680880u, 17464070808143041816u, 124958581275u}, + {16355477587312235322u, 17682703471239266775u, 227983788156u}, + {2411485149249320633u, 18147688354161351335u, 145361224931u}, + {12763114642070638360u, 6663423873348080050u, 183510511249u}, + {1147543073987366419u, 9417270363716235132u, 197503883703u}, + {8410777835225272692u, 9295013721571344178u, 63336074437u}, + {8134725822306818018u, 6199479138350037782u, 14048117055u}, + {8899607004752328377u, 887603005365085687u, 232018105614u}, + {690976506652396830u, 333989628642975695u, 140250490600u}, + {12281570945595192074u, 4620735991403939438u, 54673209484u}, + {12592957291365552899u, 12418523063962801200u, 219086071862u}, + {13595807339013970272u, 1587745622680169418u, 10715u}, + {9698096389749839992u, 197658450495420u, 0u}, + {8310173728816391804u, 197658u, 0u}, +}; + +constexpr uint16_t POW10_OFFSET_2[69] = { + 0, 2, 6, 12, 20, 29, 40, 52, 66, 80, 95, 112, + 130, 150, 170, 192, 215, 240, 265, 292, 320, 350, 381, 413, + 446, 480, 516, 552, 590, 629, 670, 712, 755, 799, 845, 892, + 940, 989, 1040, 1092, 1145, 1199, 1254, 1311, 1369, 1428, 1488, 1550, + 1613, 1678, 1743, 1810, 1878, 1947, 2017, 2088, 2161, 2235, 2311, 2387, + 2465, 2544, 2625, 2706, 2789, 2873, 2959, 3046, 3133}; + +constexpr uint8_t MIN_BLOCK_2[69] = { + 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, + 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, + 17, 17, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 26, 26, + 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 34, 0}; + +constexpr uint64_t POW10_SPLIT_2[3133][3] = { + {0u, 0u, 3906250u}, + {0u, 0u, 202000000000u}, + {0u, 11153727427136454656u, 59u}, + {0u, 7205759403792793600u, 59604644775u}, + {0u, 0u, 167390625000u}, + {0u, 0u, 232000000000u}, + {0u, 16777216000000000u, 0u}, + {0u, 12945425605062557696u, 909494u}, + {0u, 4388757836872548352u, 182701772928u}, + {0u, 1152921504606846976u, 128237915039u}, + {0u, 0u, 159062500000u}, + {0u, 0u, 160000000000u}, + {0u, 256000000000u, 0u}, + {0u, 16192327041775828992u, 13u}, + {0u, 15024075324038053888u, 13877787807u}, + {0u, 5449091666327633920u, 159814456755u}, + {0u, 2494994193563254784u, 179295395851u}, + {0u, 4611686018427387904u, 11135253906u}, + {0u, 0u, 146250000000u}, + {0u, 0u, 128000000000u}, + {0u, 3906250u, 0u}, + {0u, 3906250000000000u, 0u}, + {0u, 4368439412768899072u, 211758u}, + {0u, 1563676642168012800u, 46236813575u}, + {0u, 11532349341402398720u, 7084767080u}, + {0u, 9048364970084925440u, 104625169910u}, + {0u, 16609275425742389248u, 246490512847u}, + {0u, 0u, 207900390625u}, + {0u, 0u, 225000000000u}, + {11153727427136454656u, 59u, 0u}, + {7205759403792793600u, 59604644775u, 0u}, + {0u, 4264412554261970152u, 3u}, + {0u, 14485570586272534528u, 3231174267u}, + {0u, 17827675094632103936u, 123785264354u}, + {0u, 7347197909193981952u, 226966440203u}, + {0u, 13677404030777688064u, 11398292396u}, + {0u, 3810326759732150272u, 172741453558u}, + {0u, 9943947977234055168u, 246206558227u}, + {0u, 0u, 19539062500u}, + {0u, 0u, 228000000000u}, + {12945425605062557696u, 909494u, 0u}, + {4388757836872548352u, 909494701772928u, 0u}, + {1152921504606846976u, 14878706826214591391u, 49303u}, + {0u, 4387341015746028192u, 151806576313u}, + {0u, 651726680428265472u, 185237838233u}, + {0u, 2570638187944738816u, 153035330174u}, + {0u, 7419175577111756800u, 126139354575u}, + {0u, 17299322326264840192u, 207402194313u}, + {0u, 7990511638862102528u, 137937798142u}, + {0u, 16717361816799281152u, 254433166503u}, + {0u, 0u, 167906250000u}, + {0u, 0u, 16000000000u}, + {16192327041775828992u, 13u, 0u}, + {15024075324038053888u, 13877787807u, 0u}, + {5449091666327633920u, 13877787807814456755u, 0u}, + {2494994193563254784u, 9707857417284919307u, 752316384u}, + {4611686018427387904u, 1844515466944871826u, 224526264005u}, + {0u, 15167599819856275072u, 197099991383u}, + {0u, 14830185305589481472u, 87822237233u}, + {0u, 6163721531743535104u, 49803945956u}, + {0u, 14122847407012052992u, 228334136013u}, + {0u, 335491783960035328u, 205765601092u}, + {0u, 941252322120433664u, 68018187046u}, + {0u, 11529215046068469760u, 38051025390u}, + {0u, 0u, 238625000000u}, + {0u, 0u, 64000000000u}, + {4368439412768899072u, 211758u, 0u}, + {1563676642168012800u, 211758236813575u, 0u}, + {11532349341402398720u, 8061591463141767016u, 11479u}, + {9048364970084925440u, 16628725344207857142u, 215437019748u}, + {16609275425742389248u, 3555541870038531535u, 100901445007u}, + {0u, 18316647450161853665u, 143192746310u}, + {0u, 16709574568378075648u, 70992947447u}, + {0u, 7696022835795591168u, 247905827852u}, + {0u, 16664449640376041472u, 12417202233u}, + {0u, 3109186955116544000u, 57903381625u}, + {0u, 10515518101817131008u, 121168549362u}, + {0u, 9961962375743537152u, 242570047378u}, + {0u, 9223372036854775808u, 146540039062u}, + {0u, 0u, 150500000000u}, + {14485570586272534528u, 3231174267u, 0u}, + {17827675094632103936u, 3231174267785264354u, 0u}, + {7347197909193981952u, 748977172262750475u, 175162308u}, + {13677404030777688064u, 15965033457315095468u, 196040602133u}, + {3810326759732150272u, 16809402149066729206u, 21865466197u}, + {9943947977234055168u, 7563769067065700371u, 85911239516u}, + {0u, 13550322810840051428u, 92410032742u}, + {0u, 8663209637545764864u, 102734564471u}, + {0u, 8969247575312957440u, 119469633535u}, + {0u, 6193172891660451840u, 255486223885u}, + {0u, 3427954273864908800u, 13335732575u}, + {0u, 10058367555266936832u, 95185829773u}, + {0u, 13907115649320091648u, 141545265197u}, + {0u, 0u, 45753906250u}, + {0u, 0u, 74000000000u}, + {14878706826214591391u, 49303u, 0u}, + {4387341015746028192u, 49303806576313u, 0u}, + {651726680428265472u, 14106411361315920281u, 2672u}, + {2570638187944738816u, 3609034283485221502u, 112764710092u}, + {7419175577111756800u, 9896072247338192335u, 204195646140u}, + {17299322326264840192u, 8889095178479228297u, 188536467151u}, + {7990511638862102528u, 3631796911038383102u, 207481878815u}, + {16717361816799281152u, 898318840772166823u, 31196880105u}, + {0u, 17293677953982795024u, 233048697961u}, + {0u, 7353628266884669440u, 105937492160u}, + {0u, 2404693032470315008u, 192398640987u}, + {0u, 9191155893041889280u, 91130358670u}, + {0u, 6353946855033798656u, 142498253559u}, + {0u, 3767824038248841216u, 247344448149u}, + {0u, 7205759403792793600u, 149204254150u}, + {0u, 0u, 198390625000u}, + {0u, 0u, 232000000000u}, + {9707857417284919307u, 752316384u, 0u}, + {1844515466944871826u, 752316384526264005u, 0u}, + {15167599819856275072u, 17063068157692817751u, 40783152u}, + {14830185305589481472u, 5385330256507239985u, 48924990778u}, + {6163721531743535104u, 3373050282752075748u, 58291939338u}, + {14122847407012052992u, 4116064001262906061u, 10182853422u}, + {335491783960035328u, 11306582046748043076u, 46223132276u}, + {941252322120433664u, 17035410946089626406u, 116612931040u}, + {11529215046068469760u, 15618595715183448558u, 224923491477u}, + {0u, 5141740092277295680u, 149846685770u}, + {0u, 16973644291514990592u, 74278734288u}, + {0u, 14625255268443750400u, 208920143100u}, + {0u, 14021170507320131584u, 252792836676u}, + {0u, 4451355232865091584u, 68760089176u}, + {0u, 12891553933348044800u, 88241308450u}, + {0u, 1152921504606846976u, 34698852539u}, + {0u, 0u, 187062500000u}, + {0u, 0u, 160000000000u}, + {8061591463141767016u, 11479u, 0u}, + {16628725344207857142u, 11479437019748u, 0u}, + {3555541870038531535u, 5562205901560339855u, 622u}, + {18316647450161853665u, 2106077949367544134u, 110301527786u}, + {16709574568378075648u, 7496855998374373623u, 234114170714u}, + {7696022835795591168u, 229183437194837004u, 90406405378u}, + {16664449640376041472u, 465169186276472889u, 2012424059u}, + {3109186955116544000u, 2152980561625316473u, 123025216872u}, + {10515518101817131008u, 2059790725449340402u, 104116713310u}, + {9961962375743537152u, 17891190926410198930u, 94111661478u}, + {9223372036854775808u, 9930696175609809814u, 166969883403u}, + {0u, 7276914261609005312u, 11538344118u}, + {0u, 10539762974036983808u, 182394482312u}, + {0u, 12851089458992250880u, 136571361695u}, + {0u, 9449311677678878720u, 159696658955u}, + {0u, 8699564697382289408u, 11512248212u}, + {0u, 4224376450473525248u, 148471604347u}, + {0u, 4611686018427387904u, 123229003906u}, + {0u, 0u, 130250000000u}, + {0u, 0u, 128000000000u}, + {748977172262750475u, 175162308u, 0u}, + {15965033457315095468u, 175162308040602133u, 0u}, + {16809402149066729206u, 13756840147955779925u, 9495567u}, + {7563769067065700371u, 13788447602092505948u, 15745759798u}, + {13550322810840051428u, 4972540435632173670u, 54747473242u}, + {8663209637545764864u, 2844874687533091959u, 90269561957u}, + {8969247575312957440u, 15377573779532804095u, 101154220965u}, + {6193172891660451840u, 17824715805091194381u, 165833619944u}, + {3427954273864908800u, 18277569135638159711u, 232966279779u}, + {10058367555266936832u, 4254645803379752845u, 99990829008u}, + {13907115649320091648u, 2933643244178200621u, 208230644811u}, + {0u, 17188148801879487562u, 75159033118u}, + {0u, 11069762501163246592u, 30931771413u}, + {0u, 11676570643941818368u, 21600093027u}, + {0u, 17840016768744030208u, 99632988162u}, + {0u, 16463817321652158464u, 2967109246u}, + {0u, 6954191143357644800u, 126892505325u}, + {0u, 5080060379673919488u, 237376987457u}, + {0u, 0u, 65275390625u}, + {0u, 0u, 161000000000u}, + {14106411361315920281u, 2672u, 0u}, + {3609034283485221502u, 2672764710092u, 0u}, + {9896072247338192335u, 16433563478020213436u, 144u}, + {8889095178479228297u, 4194750497955655375u, 144890865261u}, + {3631796911038383102u, 2691539602252904735u, 109227397880u}, + {898318840772166823u, 3775467271962795241u, 248145908654u}, + {17293677953982795024u, 16980212613224918121u, 174204668490u}, + {7353628266884669440u, 4172857038337333440u, 74920499170u}, + {2404693032470315008u, 5936867627376461659u, 226226211033u}, + {9191155893041889280u, 17856837443266866062u, 217321838238u}, + {6353946855033798656u, 8956297047799810807u, 158968021097u}, + {3767824038248841216u, 15356974049716912789u, 105485521835u}, + {7205759403792793600u, 6923608913322982854u, 171832503231u}, + {0u, 4855902993563955944u, 191375329591u}, + {0u, 13835893222288330752u, 55263239028u}, + {0u, 9114973913760137216u, 116750045274u}, + {0u, 17937099003422310400u, 90494123725u}, + {0u, 7007960010734960640u, 205972372085u}, + {0u, 7683422439270776832u, 117379902273u}, + {0u, 720575940379279360u, 65416519165u}, + {0u, 0u, 253039062500u}, + {0u, 0u, 228000000000u}, + {17063068157692817751u, 40783152u, 0u}, + {5385330256507239985u, 40783152924990778u, 0u}, + {3373050282752075748u, 2768933352715741194u, 2210859u}, + {4116064001262906061u, 15201941611824153390u, 43150104177u}, + {11306582046748043076u, 1418128541727000180u, 113824098906u}, + {17035410946089626406u, 5353350204565757408u, 90076876902u}, + {15618595715183448558u, 1721001680354286741u, 102290205696u}, + {5141740092277295680u, 637631411660453962u, 93295688u}, + {16973644291514990592u, 1630012588870568400u, 72034566068u}, + {14625255268443750400u, 9253063571656828156u, 180088363159u}, + {14021170507320131584u, 6029146854993203780u, 151501609581u}, + {4451355232865091584u, 16987401965352759896u, 109326840705u}, + {12891553933348044800u, 14499131620542087970u, 129920888905u}, + {1152921504606846976u, 1978417255298660539u, 73785999500u}, + {0u, 5790079354402454176u, 140107250214u}, + {0u, 13748918935842078720u, 38313880830u}, + {0u, 18047438014740692992u, 254745330388u}, + {0u, 3116889656839372800u, 212978353575u}, + {0u, 15995952446606147584u, 167168966926u}, + {0u, 12530140063251562496u, 14867142319u}, + {0u, 16717361816799281152u, 175679260253u}, + {0u, 0u, 93906250000u}, + {0u, 0u, 16000000000u}, + {5562205901560339855u, 622u, 0u}, + {2106077949367544134u, 622301527786u, 0u}, + {7496855998374373623u, 13558973353698967386u, 33u}, + {229183437194837004u, 6228991722850501890u, 33735033418u}, + {465169186276472889u, 16886831391703377787u, 74337674317u}, + {2152980561625316473u, 1181713637872883048u, 77915436964u}, + {2059790725449340402u, 12393932434925221726u, 164064060824u}, + {17891190926410198930u, 10684799845419711910u, 152671876423u}, + {9930696175609809814u, 4590318792215640843u, 71579224160u}, + {7276914261609005312u, 6383712187366189238u, 96248841680u}, + {10539762974036983808u, 1904270214927675016u, 208346061731u}, + {12851089458992250880u, 3711506775113308575u, 163103230695u}, + {9449311677678878720u, 8091219444738793995u, 231201201185u}, + {8699564697382289408u, 39436684991068052u, 33438625885u}, + {4224376450473525248u, 18025182908196512891u, 93002137866u}, + {4611686018427387904u, 7853924592034603138u, 10977147123u}, + {0u, 4815749283615688320u, 243425762105u}, + {0u, 14242399906544287744u, 57261062291u}, + {0u, 76242322576113664u, 147772082046u}, + {0u, 10858088421377703936u, 126004133104u}, + {0u, 14293835879041466368u, 240588618152u}, + {0u, 12182236992037191680u, 168774870395u}, + {0u, 11529215046068469760u, 123660400390u}, + {0u, 0u, 6625000000u}, + {0u, 0u, 64000000000u}, + {13756840147955779925u, 9495567u, 0u}, + {13788447602092505948u, 9495567745759798u, 0u}, + {4972540435632173670u, 14000097438505379162u, 514755u}, + {2844874687533091959u, 16451062686452429925u, 195758946802u}, + {15377573779532804095u, 4009347599785716645u, 242891813895u}, + {17824715805091194381u, 16544162347546196456u, 7217347168u}, + {18277569135638159711u, 17674258299745817187u, 96896860837u}, + {4254645803379752845u, 5215238411201214416u, 165958123462u}, + {2933643244178200621u, 14253990228345322571u, 198282718640u}, + {17188148801879487562u, 11214836553940194590u, 176772710358u}, + {11069762501163246592u, 14620711348380590101u, 214607957507u}, + {11676570643941818368u, 6638710787931587427u, 3792590350u}, + {17840016768744030208u, 17320000343692853250u, 14359885232u}, + {16463817321652158464u, 75147386268843646u, 176938919100u}, + {6954191143357644800u, 17938801582125480173u, 188004073747u}, + {5080060379673919488u, 6573358613626446145u, 19972464382u}, + {0u, 8688505427903736481u, 254356342484u}, + {0u, 539870168696556032u, 212471004823u}, + {0u, 9002861336394465280u, 151029266420u}, + {0u, 17989846818158018560u, 244488046090u}, + {0u, 2700938287723315200u, 10975231550u}, + {0u, 17800090499088908288u, 62146418157u}, + {0u, 8809040871136690176u, 237964944839u}, + {0u, 9223372036854775808u, 199477539062u}, + {0u, 0u, 246500000000u}, + {16433563478020213436u, 144u, 0u}, + {4194750497955655375u, 144890865261u, 0u}, + {2691539602252904735u, 15763656745260536568u, 7u}, + {3775467271962795241u, 8787336846248645550u, 7854549544u}, + {16980212613224918121u, 17584084447880694346u, 40476362484u}, + {4172857038337333440u, 18041672551129683938u, 244953235127u}, + {5936867627376461659u, 14025886302294509785u, 183978041028u}, + {17856837443266866062u, 18430498103283160734u, 196760344819u}, + {8956297047799810807u, 3292348826238025833u, 243999119304u}, + {15356974049716912789u, 9211721212658275243u, 200178478587u}, + {6923608913322982854u, 10233245872666307519u, 251499368407u}, + {4855902993563955944u, 6200995035623311671u, 215554745370u}, + {13835893222288330752u, 8480542380570450804u, 26336156614u}, + {9114973913760137216u, 11870363864499900506u, 198459731123u}, + {17937099003422310400u, 9301051379839581901u, 179643493714u}, + {7007960010734960640u, 11456694803569638005u, 82504211005u}, + {7683422439270776832u, 14327208890643983169u, 61621068669u}, + {720575940379279360u, 4510081789599866365u, 125776679550u}, + {0u, 13255356976020303332u, 126244492023u}, + {0u, 9658806854127314944u, 247718574341u}, + {0u, 13708435528809971712u, 5523604968u}, + {0u, 1580190652103131136u, 232743135779u}, + {0u, 16557336970347413504u, 35085662306u}, + {0u, 12751520132434493440u, 98897575035u}, + {0u, 9295429630892703744u, 123691261291u}, + {0u, 0u, 107503906250u}, + {0u, 0u, 202000000000u}, + {2768933352715741194u, 2210859u, 0u}, + {15201941611824153390u, 2210859150104177u, 0u}, + {1418128541727000180u, 16872870088062921306u, 119850u}, + {5353350204565757408u, 5112979788807802982u, 42914680120u}, + {1721001680354286741u, 13742728082020150272u, 56277175189u}, + {637631411660453962u, 2217110934613627976u, 149744994782u}, + {1630012588870568400u, 11021433940188610484u, 222120189824u}, + {9253063571656828156u, 1713669895470733463u, 128597473131u}, + {6029146854993203780u, 3313382510572018285u, 107092898231u}, + {16987401965352759896u, 14976595232784069505u, 183179618825u}, + {14499131620542087970u, 7213172372862496841u, 9811882854u}, + {1978417255298660539u, 15836474542502248588u, 102391026857u}, + {5790079354402454176u, 3221099285878340134u, 169858497005u}, + {13748918935842078720u, 3265814602578095358u, 237174616142u}, + {18047438014740692992u, 6502528252282225364u, 78177040164u}, + {3116889656839372800u, 16392476834556790183u, 36352502762u}, + {15995952446606147584u, 15167629413417091342u, 234888637949u}, + {12530140063251562496u, 1366763272626280111u, 253822238838u}, + {16717361816799281152u, 8720523635169216093u, 118074092385u}, + {0u, 9649171375767398672u, 97472740533u}, + {0u, 7647980704001073152u, 181523082628u}, + {0u, 13286434495608651776u, 132414597864u}, + {0u, 4358271637167013888u, 232720259057u}, + {0u, 15954987941890097152u, 241236262378u}, + {0u, 7911135695429697536u, 234864921629u}, + {0u, 7205759403792793600u, 29428863525u}, + {0u, 0u, 37390625000u}, + {0u, 0u, 232000000000u}, + {13558973353698967386u, 33u, 0u}, + {6228991722850501890u, 33735033418u, 0u}, + {16886831391703377787u, 15288289344628122701u, 1u}, + {1181713637872883048u, 952589339068938148u, 1828779826u}, + {12393932434925221726u, 10058155040190817688u, 50051639971u}, + {10684799845419711910u, 5322725640026584391u, 163545253677u}, + {4590318792215640843u, 2269982385930389600u, 45288545535u}, + {6383712187366189238u, 13216683679976310224u, 255123055991u}, + {1904270214927675016u, 17417440642083494819u, 119716477857u}, + {3711506775113308575u, 3029180749090900711u, 161944201349u}, + {8091219444738793995u, 8315443826261908513u, 133164212217u}, + {39436684991068052u, 1488962797247197277u, 249450781113u}, + {18025182908196512891u, 18009099634999034122u, 185080716834u}, + {7853924592034603138u, 8092455412807497971u, 34976275247u}, + {4815749283615688320u, 17808458047236758329u, 47438692886u}, + {14242399906544287744u, 3164591817527425171u, 22965398445u}, + {76242322576113664u, 3314036340472350590u, 173171552866u}, + {10858088421377703936u, 33234902404332784u, 98179654270u}, + {14293835879041466368u, 12349284717857274280u, 126001801667u}, + {12182236992037191680u, 18209607903013119355u, 195669456065u}, + {11529215046068469760u, 7891549145984268038u, 193987144822u}, + {0u, 7703609897518594624u, 118427801736u}, + {0u, 6336912652634587136u, 136417613529u}, + {0u, 4461621834659397632u, 217343524723u}, + {0u, 5484660635557953536u, 115241865004u}, + {0u, 15142619273265938432u, 44297324048u}, + {0u, 12170977992968765440u, 16820883035u}, + {0u, 1152921504606846976u, 91659790039u}, + {0u, 0u, 215062500000u}, + {0u, 0u, 160000000000u}, + {14000097438505379162u, 514755u, 0u}, + {16451062686452429925u, 514755758946802u, 0u}, + {4009347599785716645u, 17812314011563521031u, 27904u}, + {16544162347546196456u, 7684138864490314336u, 965607477u}, + {17674258299745817187u, 9740522787420029605u, 53416558002u}, + {5215238411201214416u, 6701109407732989894u, 178528034798u}, + {14253990228345322571u, 16534886227502443952u, 238363267868u}, + {11214836553940194590u, 8908667306968317910u, 28896357978u}, + {14620711348380590101u, 7531472173477105155u, 90482939822u}, + {6638710787931587427u, 11527371604834801166u, 174408281924u}, + {17320000343692853250u, 15688593496691078576u, 68624900066u}, + {75147386268843646u, 11394944804253312188u, 226850480357u}, + {17938801582125480173u, 11182279880854372627u, 229617721195u}, + {6573358613626446145u, 150579373068361470u, 107606192607u}, + {8688505427903736481u, 3147220002440857300u, 223008162924u}, + {539870168696556032u, 3630514817795505815u, 108170611138u}, + {9002861336394465280u, 11708796588334233588u, 194196810602u}, + {17989846818158018560u, 16844495466426369546u, 106634735134u}, + {2700938287723315200u, 17636655472325475902u, 30913141928u}, + {17800090499088908288u, 17038926655686645229u, 168956085008u}, + {8809040871136690176u, 15602838456783529415u, 16923682064u}, + {9223372036854775808u, 10869815869248876790u, 16845831567u}, + {0u, 18407124180939800832u, 143589253898u}, + {0u, 5705018517251293184u, 10997852201u}, + {0u, 9660452258743058432u, 41309269673u}, + {0u, 5646292272224927744u, 169523694166u}, + {0u, 7410409304047484928u, 86306086117u}, + {0u, 5953758707383795712u, 229401719093u}, + {0u, 4611686018427387904u, 53322753906u}, + {0u, 0u, 114250000000u}, + {0u, 0u, 128000000000u}, + {15763656745260536568u, 7u, 0u}, + {8787336846248645550u, 7854549544u, 0u}, + {17584084447880694346u, 7854549544476362484u, 0u}, + {18041672551129683938u, 15035424419724983u, 425795984u}, + {14025886302294509785u, 18280822466032836292u, 144000815071u}, + {18430498103283160734u, 11524250747302615283u, 223991005371u}, + {3292348826238025833u, 15212285943691810760u, 187624730884u}, + {9211721212658275243u, 7951804027551297019u, 4824659673u}, + {10233245872666307519u, 1706416229965221847u, 217431068160u}, + {6200995035623311671u, 3406023111930700826u, 92505009u}, + {8480542380570450804u, 16132696204133391302u, 177184640882u}, + {11870363864499900506u, 11593846688794356915u, 114874555213u}, + {9301051379839581901u, 6875759884161133906u, 77628503688u}, + {11456694803569638005u, 3593593325323835965u, 136372735690u}, + {14327208890643983169u, 9542049733257388925u, 202194809084u}, + {4510081789599866365u, 9926551925937787518u, 252517275552u}, + {13255356976020303332u, 3128491553219547895u, 160538119458u}, + {9658806854127314944u, 17158408656931354885u, 34169595866u}, + {13708435528809971712u, 2065169543154992616u, 218930159197u}, + {1580190652103131136u, 4832622393556232739u, 93111953065u}, + {16557336970347413504u, 16505930714733656162u, 169261976984u}, + {12751520132434493440u, 18270988073492888699u, 152894788296u}, + {9295429630892703744u, 2525111411519708523u, 200990472248u}, + {0u, 16728989342518570442u, 56136886563u}, + {0u, 7974052022039438336u, 35906880329u}, + {0u, 5356554962386550784u, 73432274226u}, + {0u, 6693869495028547584u, 50290379426u}, + {0u, 8157517147199766528u, 162362875392u}, + {0u, 12065776720423157760u, 442219890u}, + {0u, 11997589407315001344u, 114654087066u}, + {0u, 0u, 154650390625u}, + {0u, 0u, 97000000000u}, + {16872870088062921306u, 119850u, 0u}, + {5112979788807802982u, 119850914680120u, 0u}, + {13742728082020150272u, 2418433229320326037u, 6497u}, + {2217110934613627976u, 1143911773589293534u, 97131103528u}, + {11021433940188610484u, 9276183703610924928u, 40062011581u}, + {1713669895470733463u, 3532180128827684715u, 189502862926u}, + {3313382510572018285u, 8563997501322031543u, 78191479868u}, + {14976595232784069505u, 14843890409658460681u, 60464255234u}, + {7213172372862496841u, 9489417861634552678u, 2804688911u}, + {15836474542502248588u, 1113198223322322089u, 15514422373u}, + {3221099285878340134u, 11190777557146597869u, 101060346596u}, + {3265814602578095358u, 17764553645932638286u, 228606653266u}, + {6502528252282225364u, 14900777150991234852u, 82963018382u}, + {16392476834556790183u, 17364899863357893610u, 142807772747u}, + {15167629413417091342u, 15537570181590167037u, 75941353107u}, + {1366763272626280111u, 5558052627121307766u, 147842293367u}, + {8720523635169216093u, 12095241565795232609u, 119301302636u}, + {9649171375767398672u, 2187936505958366389u, 108655684359u}, + {7647980704001073152u, 12009203621325860228u, 7118608275u}, + {13286434495608651776u, 14814842834750302952u, 147651020232u}, + {4358271637167013888u, 5965296499605198833u, 200803114239u}, + {15954987941890097152u, 4051026394962148842u, 255323379371u}, + {7911135695429697536u, 16799526299141688349u, 171219606580u}, + {7205759403792793600u, 9460214166646215205u, 52910704145u}, + {0u, 10750736995029068008u, 17512839237u}, + {0u, 5377963045376430080u, 69582798620u}, + {0u, 15996910350253424640u, 28291539960u}, + {0u, 13651157529655246848u, 248867194247u}, + {0u, 9771305410219737088u, 135740030732u}, + {0u, 12709439623416250368u, 12529703527u}, + {0u, 9943947977234055168u, 103688980102u}, + {0u, 0u, 134539062500u}, + {0u, 0u, 228000000000u}, + {952589339068938148u, 1828779826u, 0u}, + {10058155040190817688u, 1828779826051639971u, 0u}, + {5322725640026584391u, 371564423966525229u, 99138353u}, + {2269982385930389600u, 14464859121514339583u, 49020142547u}, + {13216683679976310224u, 3913119023023056247u, 211784141584u}, + {17417440642083494819u, 5493396321716566945u, 16212130607u}, + {3029180749090900711u, 5837454566818211973u, 47297797611u}, + {8315443826261908513u, 2886670683193253881u, 235316449046u}, + {1488962797247197277u, 5504823105587173817u, 22156486731u}, + {18009099634999034122u, 9431834277334851106u, 75298417058u}, + {8092455412807497971u, 12921661346456247087u, 162511300760u}, + {17808458047236758329u, 3643076516404724246u, 152700484665u}, + {3164591817527425171u, 12559396953196866477u, 57197491573u}, + {3314036340472350590u, 1626880974916825698u, 117680846273u}, + {33234902404332784u, 6806994170946429566u, 193088193394u}, + {12349284717857274280u, 7596631230206896579u, 114369007893u}, + {18209607903013119355u, 3100480253729502401u, 21411814204u}, + {7891549145984268038u, 6310570748781063286u, 60168077371u}, + {7703609897518594624u, 14251867077375744136u, 59342096725u}, + {6336912652634587136u, 6701165793751570137u, 85772595262u}, + {4461621834659397632u, 10856833140463959923u, 62363270925u}, + {5484660635557953536u, 15867563727561248556u, 13588550103u}, + {15142619273265938432u, 5048961008671491600u, 215860182353u}, + {12170977992968765440u, 13278183119599849051u, 81273704724u}, + {1152921504606846976u, 4547591784941053655u, 20719811749u}, + {0u, 11815437715887182496u, 165246525444u}, + {0u, 398495392178782208u, 4640516162u}, + {0u, 9154841240825495552u, 66021602478u}, + {0u, 1902683298245640192u, 174496284938u}, + {0u, 5081900962138816512u, 10103144668u}, + {0u, 3234710432358858752u, 220275490403u}, + {0u, 16717361816799281152u, 99175354003u}, + {0u, 0u, 147906250000u}, + {0u, 0u, 16000000000u}, + {17812314011563521031u, 27904u, 0u}, + {7684138864490314336u, 27904965607477u, 0u}, + {9740522787420029605u, 13488568028574514610u, 1512u}, + {6701109407732989894u, 275784718433886190u, 232731216738u}, + {16534886227502443952u, 10020568880357102364u, 98014950319u}, + {8908667306968317910u, 8876397213146246746u, 175543216127u}, + {7531472173477105155u, 2155905919114811310u, 255481190457u}, + {11527371604834801166u, 1087100407155601220u, 57116871894u}, + {15688593496691078576u, 2903498381705011170u, 214058931831u}, + {11394944804253312188u, 12223476257006657765u, 119157398962u}, + {11182279880854372627u, 12148657163736735595u, 178662635975u}, + {150579373068361470u, 8951241323311673823u, 199658580024u}, + {3147220002440857300u, 8463862715901576300u, 56485247764u}, + {3630514817795505815u, 3873401978748963266u, 20458826917u}, + {11708796588334233588u, 248364795947002730u, 165209977542u}, + {16844495466426369546u, 10454378025404001822u, 198013463882u}, + {17636655472325475902u, 6574176865628265640u, 74566732968u}, + {17038926655686645229u, 16703315293848336u, 168356386842u}, + {15602838456783529415u, 9896033222450013456u, 26000905488u}, + {10869815869248876790u, 17311376269334085007u, 16536465035u}, + {18407124180939800832u, 18378511316495639306u, 139938451587u}, + {5705018517251293184u, 15120796393727584297u, 131996301094u}, + {9660452258743058432u, 18253447805740347049u, 38819700014u}, + {5646292272224927744u, 5842497225601731158u, 46989521388u}, + {7410409304047484928u, 4369968404176723173u, 236316722409u}, + {5953758707383795712u, 16142207253674488117u, 233236896461u}, + {4611686018427387904u, 12124259227391928178u, 205875070808u}, + {0u, 13019483264566077056u, 88657257409u}, + {0u, 74901376448135168u, 193705787602u}, + {0u, 13897060093813325824u, 210004060411u}, + {0u, 4495486210810052608u, 251753361137u}, + {0u, 14885496280087265280u, 241243700795u}, + {0u, 4976477588244398080u, 59806944370u}, + {0u, 11529215046068469760u, 114269775390u}, + {0u, 0u, 30625000000u}, + {0u, 0u, 64000000000u}, + {15035424419724983u, 425795984u, 0u}, + {18280822466032836292u, 425795984000815071u, 0u}, + {11524250747302615283u, 10043594327130472635u, 23082446u}, + {15212285943691810760u, 8336034337032909060u, 206544464339u}, + {7951804027551297019u, 16717215784895280857u, 211451897326u}, + {1706416229965221847u, 10968831263951212032u, 238906242083u}, + {3406023111930700826u, 5536629379734406065u, 35594621534u}, + {16132696204133391302u, 1618806894932332402u, 94300141280u}, + {11593846688794356915u, 11363331325254998861u, 224087755697u}, + {6875759884161133906u, 8775167772751754888u, 177616007425u}, + {3593593325323835965u, 2898202945316114122u, 1475702798u}, + {9542049733257388925u, 8868842714495185148u, 14157111896u}, + {9926551925937787518u, 17052094667531999136u, 88480780926u}, + {3128491553219547895u, 3658615537031138594u, 126924395904u}, + {17158408656931354885u, 12486952437987190746u, 128198333945u}, + {2065169543154992616u, 912079238520577629u, 249676919048u}, + {4832622393556232739u, 10960072898031888041u, 8049443914u}, + {16505930714733656162u, 6129550094334741912u, 74594146742u}, + {18270988073492888699u, 7965724516573729480u, 182332283576u}, + {2525111411519708523u, 5801761178810791992u, 184431822791u}, + {16728989342518570442u, 13197466483098446115u, 199314514103u}, + {7974052022039438336u, 11326268638393107273u, 183715436091u}, + {5356554962386550784u, 3597339351794947378u, 59613998253u}, + {6693869495028547584u, 353880726151383714u, 173195012157u}, + {8157517147199766528u, 11154818162602073600u, 61019183912u}, + {12065776720423157760u, 5141043976157511026u, 40604703904u}, + {11997589407315001344u, 7188225141808859034u, 160278696552u}, + {0u, 13894168943295705185u, 104389674465u}, + {0u, 12176538069834828288u, 225753204407u}, + {0u, 7994239409235165184u, 183660091451u}, + {0u, 13707777025480065024u, 59433368586u}, + {0u, 10120227247676719104u, 10743100081u}, + {0u, 7358494763030413312u, 177548618618u}, + {0u, 7656119366529843200u, 122398904800u}, + {0u, 9223372036854775808u, 224415039062u}, + {0u, 0u, 86500000000u}, + {2418433229320326037u, 6497u, 0u}, + {1143911773589293534u, 6497131103528u, 0u}, + {9276183703610924928u, 3877189582299842749u, 352u}, + {3532180128827684715u, 7625565791857948238u, 96210182868u}, + {8563997501322031543u, 16568435163612007484u, 212413382749u}, + {14843890409658460681u, 17592071940521808130u, 93898176669u}, + {9489417861634552678u, 15158637878035490831u, 157953668130u}, + {1113198223322322089u, 17789243229146401893u, 34821751405u}, + {11190777557146597869u, 14677686051252896484u, 109964356807u}, + {17764553645932638286u, 3531237481269211986u, 199795678955u}, + {14900777150991234852u, 8074435404989280910u, 235191428767u}, + {17364899863357893610u, 7086549341467684427u, 159437716020u}, + {15537570181590167037u, 10556134770918626963u, 52384162609u}, + {5558052627121307766u, 10772666134712966775u, 49572249212u}, + {12095241565795232609u, 6195173298198112620u, 124583987401u}, + {2187936505958366389u, 8144773843324250887u, 201335841017u}, + {12009203621325860228u, 14144284817150924691u, 249441529074u}, + {14814842834750302952u, 6464447844648863176u, 242766763216u}, + {5965296499605198833u, 15760468443293179135u, 208350438419u}, + {4051026394962148842u, 5172191224908322475u, 19854376706u}, + {16799526299141688349u, 2357554307308969012u, 2280385048u}, + {9460214166646215205u, 1602046917604361745u, 24127803275u}, + {10750736995029068008u, 7830970218109515845u, 139086847137u}, + {5377963045376430080u, 2899479134887821084u, 161424517746u}, + {15996910350253424640u, 15792042302392017912u, 114157181078u}, + {13651157529655246848u, 11286099112296056199u, 150856088328u}, + {9771305410219737088u, 15161477829153947404u, 8611820658u}, + {12709439623416250368u, 423831848142641767u, 114821905360u}, + {9943947977234055168u, 9707413321046312582u, 208022975970u}, + {0u, 10969483299803835620u, 226526239930u}, + {0u, 4326479556120930304u, 186594656881u}, + {0u, 12876227232041795584u, 113234538926u}, + {0u, 16967986827791171584u, 174698021676u}, + {0u, 1288146316538413056u, 44919836409u}, + {0u, 13715290452691779584u, 249069830551u}, + {0u, 4683743612465315840u, 151743507385u}, + {0u, 0u, 185253906250u}, + {0u, 0u, 74000000000u}, + {371564423966525229u, 99138353u, 0u}, + {14464859121514339583u, 99138353020142547u, 0u}, + {3913119023023056247u, 16344805304534272784u, 5374300u}, + {5493396321716566945u, 26429987091348271u, 92886053671u}, + {5837454566818211973u, 8691371289609838059u, 39001432772u}, + {2886670683193253881u, 12980168378493046550u, 196471160181u}, + {5504823105587173817u, 14010125458129496139u, 117703656337u}, + {9431834277334851106u, 17061829677031795106u, 145759490422u}, + {12921661346456247087u, 2227928323072698520u, 118924923640u}, + {3643076516404724246u, 7394752319272287289u, 248120776236u}, + {12559396953196866477u, 8805771303577744757u, 44400870326u}, + {1626880974916825698u, 16371027194302248385u, 182477361818u}, + {6806994170946429566u, 9114324123731231602u, 154887475162u}, + {7596631230206896579u, 14468189808746991893u, 218494088500u}, + {3100480253729502401u, 2376054557800684348u, 52784322141u}, + {6310570748781063286u, 12462238943546048571u, 93128806175u}, + {14251867077375744136u, 15334855370842605909u, 31675579326u}, + {6701165793751570137u, 7211347914013798462u, 190831304175u}, + {10856833140463959923u, 13763642332572548877u, 239390927953u}, + {15867563727561248556u, 16868268377740071383u, 81746128545u}, + {5048961008671491600u, 1120013377627684177u, 161914430661u}, + {13278183119599849051u, 15898107650717274388u, 197060716046u}, + {4547591784941053655u, 12281923376333274277u, 14861838142u}, + {11815437715887182496u, 6383530489286615044u, 62665804400u}, + {398495392178782208u, 4253822060257126466u, 112346051881u}, + {9154841240825495552u, 17614372438391501998u, 41230600155u}, + {1902683298245640192u, 4309951310554333450u, 219954877043u}, + {5081900962138816512u, 13106185988973773020u, 115233642928u}, + {3234710432358858752u, 2070134359761960547u, 176710487766u}, + {16717361816799281152u, 9399359914137865875u, 214112222208u}, + {0u, 17415053284723541264u, 509540321u}, + {0u, 4840502610448261120u, 225944071930u}, + {0u, 5690599259712258048u, 250262404172u}, + {0u, 114769594245185536u, 76308488004u}, + {0u, 3150620882578178048u, 68006221672u}, + {0u, 5136918324969472000u, 104170795500u}, + {0u, 7205759403792793600u, 236278472900u}, + {0u, 0u, 196390625000u}, + {0u, 0u, 232000000000u}, + {13488568028574514610u, 1512u, 0u}, + {275784718433886190u, 1512731216738u, 0u}, + {10020568880357102364u, 98202693831717807u, 82u}, + {8876397213146246746u, 12909287260170414079u, 82005323578u}, + {2155905919114811310u, 11728631949380786233u, 58699813864u}, + {1087100407155601220u, 18263701925522197718u, 232635810411u}, + {2903498381705011170u, 4868886449713321591u, 107990077265u}, + {12223476257006657765u, 5870139507184082354u, 81263942863u}, + {12148657163736735595u, 5978562500822661575u, 207318220900u}, + {8951241323311673823u, 10821136839630268472u, 100324098522u}, + {8463862715901576300u, 9490907630136752916u, 218586615003u}, + {3873401978748963266u, 10564005678001613989u, 219514503133u}, + {248364795947002730u, 5754050547468481222u, 221572675895u}, + {10454378025404001822u, 3833909949855542602u, 55311927705u}, + {6574176865628265640u, 15446538552665967784u, 153207836674u}, + {16703315293848336u, 14924837848804399130u, 2837358532u}, + {9896033222450013456u, 18140170340418344208u, 196809077080u}, + {17311376269334085007u, 11380424819825208971u, 88983380604u}, + {18378511316495639306u, 12416915664152252547u, 124616934065u}, + {15120796393727584297u, 17195282241626289958u, 177673122346u}, + {18253447805740347049u, 2649541045825281326u, 42932158118u}, + {5842497225601731158u, 16577429864268509676u, 166143631907u}, + {4369968404176723173u, 12051257060168107241u, 35898664273u}, + {16142207253674488117u, 5363884561143470797u, 81653299954u}, + {12124259227391928178u, 13054029903083620184u, 242290776764u}, + {13019483264566077056u, 566314952158634945u, 188707660379u}, + {74901376448135168u, 1329472079642345682u, 91030699995u}, + {13897060093813325824u, 15686237486658857211u, 219072070825u}, + {4495486210810052608u, 1069073549290598129u, 169850352638u}, + {14885496280087265280u, 4323599065125928507u, 254057954593u}, + {4976477588244398080u, 17861823329752681586u, 33234382774u}, + {11529215046068469760u, 17220149985412802078u, 182968291382u}, + {0u, 4344934572159429184u, 54933506201u}, + {0u, 2252927464837120000u, 153235539375u}, + {0u, 10910018171964489728u, 175122131442u}, + {0u, 3597328585515335680u, 242591433270u}, + {0u, 6972808074239148032u, 54195011573u}, + {0u, 2227030015734710272u, 245377996683u}, + {0u, 1152921504606846976u, 139120727539u}, + {0u, 0u, 243062500000u}, + {0u, 0u, 160000000000u}, + {10043594327130472635u, 23082446u, 0u}, + {8336034337032909060u, 23082446544464339u, 0u}, + {16717215784895280857u, 17238287503805244910u, 1251301u}, + {10968831263951212032u, 1434575446038410275u, 229934489438u}, + {5536629379734406065u, 14009569747841241694u, 94077768490u}, + {1618806894932332402u, 14938795732275951328u, 42759460297u}, + {11363331325254998861u, 6687653542888983473u, 201809833739u}, + {8775167772751754888u, 28238723295162625u, 11362538425u}, + {2898202945316114122u, 4745270274832691214u, 185001530824u}, + {8868842714495185148u, 926478968112308824u, 200257241617u}, + {17052094667531999136u, 9213681606604198526u, 17050224525u}, + {3658615537031138594u, 13346223820579313024u, 141499474680u}, + {12486952437987190746u, 691642518601291257u, 248723500243u}, + {912079238520577629u, 1153720150033789192u, 211037494016u}, + {10960072898031888041u, 12089015034721780810u, 62543294u}, + {6129550094334741912u, 3555868702841788854u, 190655346818u}, + {7965724516573729480u, 11708406782758214328u, 130192764028u}, + {5801761178810791992u, 9417497762905343943u, 124634714003u}, + {13197466483098446115u, 12838336066957615287u, 147510523576u}, + {11326268638393107273u, 13737708142128207419u, 184695967592u}, + {3597339351794947378u, 11683434809834695853u, 104744722650u}, + {353880726151383714u, 2689114340106315837u, 218633360270u}, + {11154818162602073600u, 8859225263374261032u, 142145777180u}, + {5141043976157511026u, 15761671984578600096u, 28480259563u}, + {7188225141808859034u, 7087267079878005352u, 235854441950u}, + {13894168943295705185u, 4601291730423121377u, 222384201518u}, + {12176538069834828288u, 9559411037059581623u, 46249436524u}, + {7994239409235165184u, 12969820289641388091u, 108518216710u}, + {13707777025480065024u, 13628239920285957130u, 6703095366u}, + {10120227247676719104u, 8049893933765800625u, 70738788366u}, + {7358494763030413312u, 10391755948840250234u, 14436385624u}, + {7656119366529843200u, 14454650777462444512u, 88563338218u}, + {9223372036854775808u, 14244638523341127254u, 234783588188u}, + {0u, 12246016810439753984u, 92772203401u}, + {0u, 9382741764551081984u, 137663857901u}, + {0u, 4608696190291148800u, 237508639450u}, + {0u, 1696483666416369664u, 218249837921u}, + {0u, 15416683541605384192u, 97091966563u}, + {0u, 7683140964294066176u, 99835740089u}, + {0u, 4611686018427387904u, 185416503906u}, + {0u, 0u, 98250000000u}, + {0u, 0u, 128000000000u}, + {3877189582299842749u, 352u, 0u}, + {7625565791857948238u, 352210182868u, 0u}, + {16568435163612007484u, 1722045467931902045u, 19u}, + {17592071940521808130u, 16095324008152856733u, 19093352271u}, + {15158637878035490831u, 15216188060094280738u, 79872529262u}, + {17789243229146401893u, 10793385929903030893u, 110824871207u}, + {14677686051252896484u, 12613277226875940039u, 39585110623u}, + {3531237481269211986u, 10644539625155600107u, 95683767128u}, + {8074435404989280910u, 6181262895644173983u, 88577041649u}, + {7086549341467684427u, 148914399627082292u, 241335086933u}, + {10556134770918626963u, 14379289774887985969u, 85008072665u}, + {10772666134712966775u, 11743339675582627452u, 217779502860u}, + {6195173298198112620u, 7841621929809463497u, 12636607719u}, + {8144773843324250887u, 11168944680251236601u, 231425095176u}, + {14144284817150924691u, 6178560202529287410u, 8605469704u}, + {6464447844648863176u, 13295243308201596112u, 8334940419u}, + {15760468443293179135u, 17040673746172470291u, 3720736583u}, + {5172191224908322475u, 14957442487039409922u, 71923776774u}, + {2357554307308969012u, 17778155426506992152u, 6810844581u}, + {1602046917604361745u, 14945404984219733899u, 165963755736u}, + {7830970218109515845u, 11590754866058681505u, 216810192027u}, + {2899479134887821084u, 6020790784469412466u, 155628336080u}, + {15792042302392017912u, 7934351824569522326u, 208326387722u}, + {11286099112296056199u, 5038361112172116744u, 10430122074u}, + {15161477829153947404u, 3305187319649924210u, 90273130103u}, + {423831848142641767u, 11470175511099161552u, 119179174563u}, + {9707413321046312582u, 7308362160352048610u, 163621799460u}, + {10969483299803835620u, 10666410671225576634u, 36396187106u}, + {4326479556120930304u, 2181639019945820785u, 226578227281u}, + {12876227232041795584u, 4615749499734847918u, 81118266888u}, + {16967986827791171584u, 14076159200958497580u, 8250220281u}, + {1288146316538413056u, 5470405257862074105u, 249763070119u}, + {13715290452691779584u, 4565741478181339543u, 167296551263u}, + {4683743612465315840u, 8901832997861862329u, 95247509341u}, + {0u, 14190141170191714122u, 93482569333u}, + {0u, 4240772322245764096u, 117769249094u}, + {0u, 4422842195340951552u, 70229892728u}, + {0u, 15448426386733137920u, 120239762755u}, + {0u, 9203504548935630848u, 67837460872u}, + {0u, 5936377627571912704u, 136498922981u}, + {0u, 468374361246531584u, 229321811676u}, + {0u, 0u, 220025390625u}, + {0u, 0u, 33000000000u}, + {16344805304534272784u, 5374300u, 0u}, + {26429987091348271u, 5374300886053671u, 0u}, + {8691371289609838059u, 8020875056524075716u, 291341u}, + {12980168378493046550u, 1400288714762747253u, 13434812508u}, + {14010125458129496139u, 6136037711314764689u, 92075909803u}, + {17061829677031795106u, 15735488086392394102u, 171332635270u}, + {2227928323072698520u, 7735094782793634552u, 134853022518u}, + {7394752319272287289u, 7273689191766726188u, 54419320328u}, + {8805771303577744757u, 3410634565056431030u, 8394307481u}, + {16371027194302248385u, 4600927904885215898u, 153184890870u}, + {9114324123731231602u, 9154871331680374746u, 246249416801u}, + {14468189808746991893u, 6117978272461042996u, 97496286569u}, + {2376054557800684348u, 13116904339287496285u, 105331656266u}, + {12462238943546048571u, 867037205615660831u, 74711068809u}, + {15334855370842605909u, 1802487145191504830u, 137047002181u}, + {7211347914013798462u, 17242009718457409007u, 69097713023u}, + {13763642332572548877u, 13620802355488468049u, 127934691219u}, + {16868268377740071383u, 4442227880594435745u, 147738385175u}, + {1120013377627684177u, 17354849212854314181u, 23240813655u}, + {15898107650717274388u, 18202319179831567886u, 87940808260u}, + {12281923376333274277u, 17568634016348874558u, 68986749699u}, + {6383530489286615044u, 7496925598312450672u, 3952397558u}, + {4253822060257126466u, 601870379496813865u, 246406409151u}, + {17614372438391501998u, 11995106565680728027u, 191032627458u}, + {4309951310554333450u, 16331071694764184179u, 2650256029u}, + {13106185988973773020u, 9665962217000524208u, 157885309170u}, + {2070134359761960547u, 13682661374415474390u, 242523992861u}, + {9399359914137865875u, 6940361789924260864u, 29741738559u}, + {17415053284723541264u, 9658039831644010465u, 63376237766u}, + {4840502610448261120u, 6843715893910236922u, 198523563388u}, + {5690599259712258048u, 47089792870595660u, 124370998582u}, + {114769594245185536u, 14510386192097156932u, 54002552742u}, + {3150620882578178048u, 12059931208360040296u, 166786609611u}, + {5136918324969472000u, 14877013468459184620u, 203653770180u}, + {7205759403792793600u, 2397668560671695044u, 196806484516u}, + {0u, 2195572305559232232u, 36129977873u}, + {0u, 3261686279425953792u, 17119022213u}, + {0u, 9333850662059900928u, 133176816367u}, + {0u, 5036522340217782272u, 239505989058u}, + {0u, 2800120215143186432u, 194273030423u}, + {0u, 441634238459019264u, 23151794821u}, + {0u, 720575940379279360u, 133023941040u}, + {0u, 0u, 176039062500u}, + {0u, 0u, 228000000000u}, + {98202693831717807u, 82u, 0u}, + {12909287260170414079u, 82005323578u, 0u}, + {11728631949380786233u, 8218347283861607400u, 4u}, + {18263701925522197718u, 17896200385973633643u, 4445517498u}, + {4868886449713321591u, 16333242102094352209u, 186970154966u}, + {5870139507184082354u, 9981905728606788815u, 214885426828u}, + {5978562500822661575u, 15219470018924839012u, 140541120193u}, + {10821136839630268472u, 17152070168529617370u, 193825049122u}, + {9490907630136752916u, 17841343440958328027u, 34929815586u}, + {10564005678001613989u, 17291078023923990493u, 34967181165u}, + {5754050547468481222u, 16744804581790759223u, 109937351217u}, + {3833909949855542602u, 5001622214111594905u, 49907737675u}, + {15446538552665967784u, 9676746897435398146u, 75271138483u}, + {14924837848804399130u, 8109025833995118532u, 179524577500u}, + {18140170340418344208u, 5495826424046694744u, 220439591171u}, + {11380424819825208971u, 7890288164365705852u, 3297929347u}, + {12416915664152252547u, 8616438349039895217u, 131427733378u}, + {17195282241626289958u, 15787154801788760618u, 130467098058u}, + {2649541045825281326u, 12418659311480782502u, 202855823376u}, + {16577429864268509676u, 4486988874116669987u, 16673216870u}, + {12051257060168107241u, 4828971301551875409u, 102243240154u}, + {5363884561143470797u, 14769106422014442226u, 218261779058u}, + {13054029903083620184u, 7763933466423188156u, 114800634863u}, + {566314952158634945u, 10449097116253839963u, 239420883676u}, + {1329472079642345682u, 12870692502472900571u, 220566446689u}, + {15686237486658857211u, 11597479481311003817u, 97697721638u}, + {1069073549290598129u, 8294994869530047486u, 38628700622u}, + {4323599065125928507u, 16879315829924478241u, 206449672572u}, + {17861823329752681586u, 11873324837601439670u, 124915029544u}, + {17220149985412802078u, 3277599055636107318u, 40643654229u}, + {4344934572159429184u, 15363467897354242201u, 85177679000u}, + {2252927464837120000u, 10351182204479784367u, 152832855263u}, + {10910018171964489728u, 12811517584931924466u, 223561138711u}, + {3597328585515335680u, 16988930699558748726u, 23694513759u}, + {6972808074239148032u, 11683499918824718325u, 95920971778u}, + {2227030015734710272u, 13119300691281647499u, 2633363799u}, + {1152921504606846976u, 10125549106595354099u, 87711198715u}, + {0u, 17505352699870800544u, 251548907116u}, + {0u, 6756039242241163264u, 108948967071u}, + {0u, 3537338758766526464u, 159366245621u}, + {0u, 6522626374119718912u, 245191759518u}, + {0u, 4733294203482669056u, 158353592284u}, + {0u, 16997710893603094528u, 220256592392u}, + {0u, 16717361816799281152u, 8921447753u}, + {0u, 0u, 73906250000u}, + {0u, 0u, 16000000000u}, + {17238287503805244910u, 1251301u, 0u}, + {1434575446038410275u, 1251301934489438u, 0u}, + {14009569747841241694u, 3943737498063000362u, 67833u}, + {14938795732275951328u, 2870731037991212489u, 249213790438u}, + {6687653542888983473u, 7389433400402095883u, 230155622641u}, + {28238723295162625u, 5675049236146197433u, 241400581987u}, + {4745270274832691214u, 9953779846262904264u, 99307645035u}, + {926478968112308824u, 12691978937179636241u, 107539595486u}, + {9213681606604198526u, 15523327331528198029u, 222688033556u}, + {13346223820579313024u, 15722603279568118520u, 20841521260u}, + {691642518601291257u, 11838632364171816147u, 108852324031u}, + {1153720150033789192u, 7832751832367143680u, 191641773546u}, + {12089015034721780810u, 12167724027162940862u, 234424614327u}, + {3555868702841788854u, 4108211144748152962u, 183659613641u}, + {11708406782758214328u, 7530983398136343676u, 201222706572u}, + {9417497762905343943u, 1117587133956542355u, 140408255428u}, + {12838336066957615287u, 17134748625149490872u, 196060584519u}, + {13737708142128207419u, 4039918359454207848u, 71928876584u}, + {11683434809834695853u, 1830218764589441242u, 40219004413u}, + {2689114340106315837u, 637895981480825742u, 253099216358u}, + {8859225263374261032u, 8246879226348334620u, 230034580410u}, + {15761671984578600096u, 12389239568142583275u, 186447064218u}, + {7087267079878005352u, 14041257178803154398u, 154671622022u}, + {4601291730423121377u, 16312515716494630702u, 134761178076u}, + {9559411037059581623u, 17088522799596987756u, 220884303248u}, + {12969820289641388091u, 3588932524637852678u, 144926370677u}, + {13628239920285957130u, 107218049069817414u, 117194556422u}, + {8049893933765800625u, 1596707240462008334u, 6005812302u}, + {10391755948840250234u, 17461913142391587672u, 78086557672u}, + {14454650777462444512u, 4366474266651610090u, 232946612208u}, + {14244638523341127254u, 5539304013194805084u, 240236707044u}, + {12246016810439753984u, 4762470619211987849u, 228300286272u}, + {9382741764551081984u, 10835638458986644717u, 64258174049u}, + {4608696190291148800u, 16141642290510052058u, 97587401137u}, + {1696483666416369664u, 17390568670756355425u, 177875040181u}, + {15416683541605384192u, 12536768491333867107u, 181942744616u}, + {7683140964294066176u, 13145148522871947193u, 40679619581u}, + {4611686018427387904u, 5665349945233068642u, 253712599929u}, + {0u, 17074607537751066240u, 121307119235u}, + {0u, 6241525660962062336u, 131925616329u}, + {0u, 1142860629783085056u, 201338353784u}, + {0u, 16287527416870469632u, 120061954598u}, + {0u, 9028002014738513920u, 38882948630u}, + {0u, 16217462258161156096u, 22489408969u}, + {0u, 11529215046068469760u, 201879150390u}, + {0u, 0u, 54625000000u}, + {0u, 0u, 64000000000u}, + {1722045467931902045u, 19u, 0u}, + {16095324008152856733u, 19093352271u, 0u}, + {15216188060094280738u, 646608198162977646u, 1u}, + {10793385929903030893u, 12170458846894708007u, 1035052700u}, + {12613277226875940039u, 1797330480103086687u, 156659761896u}, + {10644539625155600107u, 10332188564497263448u, 232097433480u}, + {6181262895644173983u, 7524259485079594225u, 136560109064u}, + {148914399627082292u, 62681109059153749u, 8407890924u}, + {14379289774887985969u, 13480636451804037081u, 236003397949u}, + {11743339675582627452u, 6948168233012789004u, 61730786766u}, + {7841621929809463497u, 12015502974041806055u, 206376660954u}, + {11168944680251236601u, 7343801660689004040u, 218651361721u}, + {6178560202529287410u, 13670580858640731144u, 185398108285u}, + {13295243308201596112u, 5605073897566574851u, 125741083673u}, + {17040673746172470291u, 15387788940505247559u, 25303851664u}, + {14957442487039409922u, 17565181499678113030u, 144834173709u}, + {17778155426506992152u, 1893743623847493029u, 13952210397u}, + {14945404984219733899u, 10243498996716269784u, 221102660047u}, + {11590754866058681505u, 5619675836950314139u, 207555301193u}, + {6020790784469412466u, 10224869737511515088u, 73304643237u}, + {7934351824569522326u, 2574495974386198538u, 165554291299u}, + {5038361112172116744u, 7825756347302873178u, 99139563706u}, + {3305187319649924210u, 12071550103794656887u, 186424235101u}, + {11470175511099161552u, 7195875213867606691u, 93654400042u}, + {7308362160352048610u, 18271364438406891044u, 42390089176u}, + {10666410671225576634u, 16966521933952564706u, 216990492650u}, + {2181639019945820785u, 289920862029570129u, 234919756997u}, + {4615749499734847918u, 7804199568098625032u, 197015716641u}, + {14076159200958497580u, 5758118571242446585u, 33423066506u}, + {5470405257862074105u, 4030788293606375591u, 138312148233u}, + {4565741478181339543u, 4387716460037196127u, 9218509471u}, + {8901832997861862329u, 16807506478881285981u, 159237858585u}, + {14190141170191714122u, 17033060604413529717u, 25911136751u}, + {4240772322245764096u, 10498418508292170054u, 239923364065u}, + {4422842195340951552u, 13237752038744465016u, 225569120407u}, + {15448426386733137920u, 17737618428304633155u, 151717619975u}, + {9203504548935630848u, 13546183833248825736u, 7961558221u}, + {5936377627571912704u, 826778452978976229u, 205734340097u}, + {468374361246531584u, 13728076626990147292u, 1044819749u}, + {0u, 2794860281883592225u, 37744200525u}, + {0u, 8680705720425908736u, 77151509679u}, + {0u, 731520517439488000u, 175470582000u}, + {0u, 13120812320768917504u, 240039655806u}, + {0u, 2722954908557901824u, 126711280661u}, + {0u, 6860847004205973504u, 21147611681u}, + {0u, 6503197861922996224u, 33371927261u}, + {0u, 9223372036854775808u, 221352539062u}, + {0u, 0u, 182500000000u}, + {8020875056524075716u, 291341u, 0u}, + {1400288714762747253u, 291341434812508u, 0u}, + {6136037711314764689u, 12005656413127238315u, 15793u}, + {15735488086392394102u, 4821130826186787462u, 177650827938u}, + {7735094782793634552u, 14377899467066168118u, 162261354025u}, + {7273689191766726188u, 16575613239625444872u, 41779427491u}, + {3410634565056431030u, 4317827099179284377u, 163898565794u}, + {4600927904885215898u, 1242354770412171254u, 162234069876u}, + {9154871331680374746u, 994838588328896609u, 116067348187u}, + {6117978272461042996u, 17283309862013060457u, 219053930307u}, + {13116904339287496285u, 124242522249856586u, 67936930105u}, + {867037205615660831u, 11564608014666985609u, 57006735200u}, + {1802487145191504830u, 12401028575581654085u, 96626918656u}, + {17242009718457409007u, 2490725392961465727u, 672261106u}, + {13620802355488468049u, 1949482237120640915u, 242135022494u}, + {4442227880594435745u, 15410502396166200087u, 158105681643u}, + {17354849212854314181u, 15694919529799920727u, 235835405008u}, + {18202319179831567886u, 10324869370171768388u, 208850823292u}, + {17568634016348874558u, 1631866459122189059u, 124559712290u}, + {7496925598312450672u, 172020494461226230u, 34088463658u}, + {601870379496813865u, 12734610307908856767u, 42009325249u}, + {11995106565680728027u, 1467513250829340930u, 193690344608u}, + {16331071694764184179u, 13558759428494307997u, 160079554052u}, + {9665962217000524208u, 7915355143999496434u, 4735021821u}, + {13682661374415474390u, 2876370200608797469u, 253429092262u}, + {6940361789924260864u, 343685370404989503u, 166155928341u}, + {9658039831644010465u, 4837266557407634630u, 21018631221u}, + {6843715893910236922u, 9622591415747161468u, 53262228745u}, + {47089792870595660u, 16503783814424220982u, 9521641725u}, + {14510386192097156932u, 5377083431343591334u, 253894671913u}, + {12059931208360040296u, 16508482371299291595u, 41291492276u}, + {14877013468459184620u, 10515883558812249028u, 180894926622u}, + {2397668560671695044u, 63492062913405476u, 30570067190u}, + {2195572305559232232u, 11571919759617799697u, 246003441911u}, + {3261686279425953792u, 2956602334970088581u, 247627315027u}, + {9333850662059900928u, 13604736747717849839u, 83160277733u}, + {5036522340217782272u, 16573540719338151362u, 229737514256u}, + {2800120215143186432u, 12620703004601168151u, 16898453442u}, + {441634238459019264u, 14649407809089591941u, 194684169680u}, + {720575940379279360u, 11290375247898624432u, 208794145988u}, + {0u, 11020319450292874212u, 196612052468u}, + {0u, 8754634933362354176u, 244597412714u}, + {0u, 12976319450332528640u, 106474589710u}, + {0u, 17447331119627239424u, 14703447686u}, + {0u, 3665184902673858560u, 134945821715u}, + {0u, 12949678516038795264u, 19198690071u}, + {0u, 72057594037927936u, 23702003479u}, + {0u, 0u, 23003906250u}, + {0u, 0u, 202000000000u}, + {8218347283861607400u, 4u, 0u}, + {17896200385973633643u, 4445517498u, 0u}, + {16333242102094352209u, 4445517498970154966u, 0u}, + {9981905728606788815u, 9413159735776077452u, 240991986u}, + {15219470018924839012u, 14279163482889998017u, 242510288411u}, + {17152070168529617370u, 8693044629541194274u, 27774075003u}, + {17841343440958328027u, 11863110253260222498u, 123471250893u}, + {17291078023923990493u, 8319293368489531245u, 205643100495u}, + {16744804581790759223u, 3376307525676489265u, 79450989797u}, + {5001622214111594905u, 13205662254759912523u, 229183029997u}, + {9676746897435398146u, 5276250334231686323u, 237715880385u}, + {8109025833995118532u, 13790198520922745052u, 193286026103u}, + {5495826424046694744u, 14195535250150996227u, 119747568159u}, + {7890288164365705852u, 16425228796427004035u, 31769541507u}, + {8616438349039895217u, 4295900841296269186u, 131890413437u}, + {15787154801788760618u, 4533952595483946442u, 125232881251u}, + {12418659311480782502u, 12885038019373447184u, 99245786062u}, + {4486988874116669987u, 12140736240487831910u, 206698499310u}, + {4828971301551875409u, 6927124077155322074u, 238658150630u}, + {14769106422014442226u, 12477788342407819890u, 230375520148u}, + {7763933466423188156u, 7980854329409711087u, 148676422261u}, + {10449097116253839963u, 2062671021810827996u, 117432642980u}, + {12870692502472900571u, 2739521363598172769u, 164111817620u}, + {11597479481311003817u, 12897585686593465638u, 148148509750u}, + {8294994869530047486u, 1127632646629044686u, 54699179521u}, + {16879315829924478241u, 4833775019274666364u, 1061129088u}, + {11873324837601439670u, 15867662672939849256u, 128262039468u}, + {3277599055636107318u, 2092350330982953557u, 172860187717u}, + {15363467897354242201u, 13330062299842493592u, 69113426538u}, + {10351182204479784367u, 4479193352178519263u, 106722624125u}, + {12811517584931924466u, 3149393938889064983u, 125242817558u}, + {16988930699558748726u, 9736379904070620767u, 22170728987u}, + {11683499918824718325u, 3816238703055069186u, 27527810212u}, + {13119300691281647499u, 11598915938798661975u, 164206878714u}, + {10125549106595354099u, 17821633264606555643u, 250628778492u}, + {17505352699870800544u, 2514623558764574316u, 252966112675u}, + {6756039242241163264u, 4976730480406253215u, 163136318016u}, + {3537338758766526464u, 17276563697191611637u, 64269789099u}, + {6522626374119718912u, 12524734095940998814u, 171936564394u}, + {4733294203482669056u, 15331551308930355164u, 170678967195u}, + {16997710893603094528u, 15417115581125943816u, 155831125061u}, + {16717361816799281152u, 6010750237807115593u, 69835763510u}, + {0u, 5624630987553628432u, 54325843423u}, + {0u, 14881848243837640704u, 223304911856u}, + {0u, 15281613886881529856u, 240806746609u}, + {0u, 14057902358273196032u, 241828417948u}, + {0u, 16075318494433902592u, 156762080413u}, + {0u, 13891916000577716224u, 157871444761u}, + {0u, 7205759403792793600u, 25753082275u}, + {0u, 0u, 163390625000u}, + {0u, 0u, 232000000000u}, + {3943737498063000362u, 67833u, 0u}, + {2870731037991212489u, 67833213790438u, 0u}, + {7389433400402095883u, 4535831408134330609u, 3677u}, + {5675049236146197433u, 6204770794376564579u, 93245887913u}, + {9953779846262904264u, 13869812122751887467u, 169336361298u}, + {12691978937179636241u, 14253229412394467550u, 82751884021u}, + {15523327331528198029u, 12776557610216045332u, 245772669114u}, + {15722603279568118520u, 16493640728678654060u, 186692618575u}, + {11838632364171816147u, 9434398296825833151u, 79894122055u}, + {7832751832367143680u, 8773374058285327850u, 71511439756u}, + {12167724027162940862u, 12932015276748029367u, 140475605560u}, + {4108211144748152962u, 16293958583527755209u, 56701045952u}, + {7530983398136343676u, 13511893936143127948u, 192883297264u}, + {1117587133956542355u, 18409936402005226436u, 240732481237u}, + {17134748625149490872u, 2189663026458466887u, 213998004652u}, + {4039918359454207848u, 9497725274248154664u, 172118701870u}, + {1830218764589441242u, 14766925481127792125u, 46514872718u}, + {637895981480825742u, 6982373971809635814u, 142800516634u}, + {8246879226348334620u, 8616702383006884794u, 26378515251u}, + {12389239568142583275u, 3059473300040871066u, 51467112372u}, + {14041257178803154398u, 17123843157031495558u, 180165854379u}, + {16312515716494630702u, 11210627174210626524u, 171928285397u}, + {17088522799596987756u, 15868067138625928592u, 213607729316u}, + {3588932524637852678u, 4467869511636937589u, 164860209643u}, + {107218049069817414u, 10052108125844341766u, 235242203691u}, + {1596707240462008334u, 7470588003218451534u, 43544925873u}, + {17461913142391587672u, 2613527085490786280u, 177404981387u}, + {4366474266651610090u, 3632919450036549616u, 139141679587u}, + {5539304013194805084u, 179367907231218916u, 227196940958u}, + {4762470619211987849u, 13553068184555874624u, 158009723553u}, + {10835638458986644717u, 8798774862365584481u, 161734713298u}, + {16141642290510052058u, 910911255817064881u, 210476982541u}, + {17390568670756355425u, 2304331144765093813u, 13049380598u}, + {12536768491333867107u, 12248937023083640360u, 246124918041u}, + {13145148522871947193u, 10206039550662130685u, 25664016206u}, + {5665349945233068642u, 12267881323837852537u, 78553270512u}, + {17074607537751066240u, 2858642007937891971u, 240665043179u}, + {6241525660962062336u, 14171330289750320841u, 235154967293u}, + {1142860629783085056u, 6601103619749017720u, 253768229354u}, + {16287527416870469632u, 4919573414486739494u, 234357846544u}, + {9028002014738513920u, 3401998285294974486u, 16266690609u}, + {16217462258161156096u, 10799436256515532233u, 49184422696u}, + {11529215046068469760u, 10083786644665753398u, 40585438612u}, + {0u, 6481194517685688896u, 148546643169u}, + {0u, 15104161756860547072u, 225351346258u}, + {0u, 9556039274244079616u, 82818798249u}, + {0u, 1376343134954323968u, 169518033927u}, + {0u, 15682488278596976640u, 7074611710u}, + {0u, 1506454075355430912u, 254850149393u}, + {0u, 1152921504606846976u, 17081665039u}, + {0u, 0u, 15062500000u}, + {0u, 0u, 160000000000u}, + {12170458846894708007u, 1035052700u, 0u}, + {1797330480103086687u, 1035052700659761896u, 0u}, + {10332188564497263448u, 6172559441576707976u, 56110319u}, + {7524259485079594225u, 15083329738554729992u, 239334615117u}, + {62681109059153749u, 10013126833549229036u, 77817668943u}, + {13480636451804037081u, 5817156823499936061u, 79542812693u}, + {6948168233012789004u, 5282692560913632718u, 21315348703u}, + {12015502974041806055u, 10252307034225766362u, 223286375337u}, + {7343801660689004040u, 17981881283247669689u, 169555778677u}, + {13670580858640731144u, 11689290159733383293u, 117974799737u}, + {5605073897566574851u, 5530668968487988249u, 121633677689u}, + {15387788940505247559u, 10083765740821947024u, 121299818165u}, + {17565181499678113030u, 2798423656816843533u, 181546642036u}, + {1893743623847493029u, 7614494481582904797u, 116151702850u}, + {10243498996716269784u, 17811318500083423695u, 66412782572u}, + {5619675836950314139u, 11641467412200329033u, 236965553510u}, + {10224869737511515088u, 17733593025296340645u, 102631085212u}, + {2574495974386198538u, 3689424000190644835u, 156961340004u}, + {7825756347302873178u, 14966634145516728506u, 100200004075u}, + {12071550103794656887u, 14171681941562070109u, 235811342862u}, + {7195875213867606691u, 8130575762882608170u, 14768248417u}, + {18271364438406891044u, 5234550794400656856u, 97440759395u}, + {16966521933952564706u, 3020576149360486378u, 99283765567u}, + {289920862029570129u, 3038675756589057221u, 63163745761u}, + {7804199568098625032u, 15470260187120878369u, 225164726942u}, + {5758118571242446585u, 3497929414841828746u, 158838644485u}, + {4030788293606375591u, 9935840636861015305u, 5189623133u}, + {4387716460037196127u, 3647355485153741471u, 93538623000u}, + {16807506478881285981u, 766100215038272793u, 24197723537u}, + {17033060604413529717u, 16128087474216800751u, 145041530375u}, + {10498418508292170054u, 16216631732633731297u, 7874305373u}, + {13237752038744465016u, 13760220872779997335u, 93879105367u}, + {17737618428304633155u, 3826276262374222087u, 87745943068u}, + {13546183833248825736u, 14938032745839181005u, 28207422851u}, + {826778452978976229u, 14479259995009508865u, 131809792377u}, + {13728076626990147292u, 2372033248156102437u, 121784922257u}, + {2794860281883592225u, 792005346826701645u, 145128588180u}, + {8680705720425908736u, 16278924527931792559u, 148042934695u}, + {731520517439488000u, 17442516423538940144u, 167882482266u}, + {13120812320768917504u, 13844184233048446u, 90945560710u}, + {2722954908557901824u, 13486193870480782357u, 134000750494u}, + {6860847004205973504u, 11931315179184648737u, 158731088034u}, + {6503197861922996224u, 16492562205587485405u, 162646797891u}, + {9223372036854775808u, 12128987217680380854u, 67894063588u}, + {0u, 10568123814189138176u, 228657513714u}, + {0u, 17007583519117541376u, 242572899139u}, + {0u, 143791533903052800u, 67921982950u}, + {0u, 12398714235792654336u, 230007794954u}, + {0u, 9659957317919047680u, 10672135645u}, + {0u, 9412523221204336640u, 221523667335u}, + {0u, 4611686018427387904u, 135510253906u}, + {0u, 0u, 82250000000u}, + {0u, 0u, 128000000000u}, + {12005656413127238315u, 15793u, 0u}, + {4821130826186787462u, 15793650827938u, 0u}, + {14377899467066168118u, 3237900842885170729u, 856u}, + {16575613239625444872u, 7515893506498066595u, 88175526956u}, + {4317827099179284377u, 7300206309181072546u, 44407437403u}, + {1242354770412171254u, 5999737279837044u, 91395744977u}, + {994838588328896609u, 7556839307242450651u, 209000325246u}, + {17283309862013060457u, 12946035041643640643u, 126409657079u}, + {124242522249856586u, 15885877642352740665u, 247701805965u}, + {11564608014666985609u, 10770818348246089568u, 141861175152u}, + {12401028575581654085u, 11635415503599551744u, 112583887232u}, + {2490725392961465727u, 6248053924100826098u, 128630757138u}, + {1949482237120640915u, 16894170802729859998u, 18338707681u}, + {15410502396166200087u, 6143589029651889899u, 225915834834u}, + {15694919529799920727u, 11812087701837886160u, 210333044628u}, + {10324869370171768388u, 7306705080150829180u, 148640334557u}, + {1631866459122189059u, 1485332570280714274u, 221396097276u}, + {172020494461226230u, 18042602303295630634u, 252080520039u}, + {12734610307908856767u, 13397029889257074369u, 103978091430u}, + {1467513250829340930u, 9948104869613411488u, 166726254445u}, + {13558759428494307997u, 10836066241170646532u, 109539287845u}, + {7915355143999496434u, 18330574781234459389u, 37587424327u}, + {2876370200608797469u, 666297360208433062u, 71993702450u}, + {343685370404989503u, 5035352224889324309u, 50036120052u}, + {4837266557407634630u, 1341745796439923765u, 244272966991u}, + {9622591415747161468u, 6846932182653803785u, 79072736185u}, + {16503783814424220982u, 6727685027257825533u, 185371172937u}, + {5377083431343591334u, 2168538874806877737u, 73364708536u}, + {16508482371299291595u, 17694936100676971444u, 184117556727u}, + {10515883558812249028u, 2163944241059563294u, 247959244408u}, + {63492062913405476u, 6727780864524301558u, 120117307652u}, + {11571919759617799697u, 8599551977795002615u, 4364713731u}, + {2956602334970088581u, 15428264807806859091u, 3466182646u}, + {13604736747717849839u, 2126771385339683557u, 246836367911u}, + {16573540719338151362u, 15094316562082972944u, 39115292507u}, + {12620703004601168151u, 8111300598225956802u, 91818264540u}, + {14649407809089591941u, 9481215200564260304u, 220439714486u}, + {11290375247898624432u, 16836674128623424708u, 182513977705u}, + {11020319450292874212u, 7087243115299722740u, 105912717933u}, + {8754634933362354176u, 2343560867338408810u, 109384200219u}, + {12976319450332528640u, 3431385749090422286u, 27127044689u}, + {17447331119627239424u, 3504545517469224582u, 81186015794u}, + {3665184902673858560u, 3333759805712094227u, 50189981793u}, + {12949678516038795264u, 3595183476205994775u, 97180723481u}, + {72057594037927936u, 14191566632569921303u, 25194895286u}, + {0u, 12917427671358095562u, 182769326368u}, + {0u, 3883793922738316288u, 32700255157u}, + {0u, 7857281689266421760u, 181210540890u}, + {0u, 15987081651486195712u, 90425944093u}, + {0u, 16827562156399525888u, 29866661432u}, + {0u, 7012737938513461248u, 56912223972u}, + {0u, 7385903388887613440u, 228380161285u}, + {0u, 0u, 5400390625u}, + {0u, 0u, 225000000000u}, + {9413159735776077452u, 240991986u, 0u}, + {14279163482889998017u, 240991986510288411u, 0u}, + {8693044629541194274u, 14135788013842776187u, 13064201u}, + {11863110253260222498u, 13284322918167594445u, 9766302603u}, + {8319293368489531245u, 7264587765474046287u, 139720144588u}, + {3376307525676489265u, 16176482219778368741u, 204393814091u}, + {13205662254759912523u, 5401983818872095469u, 75876928858u}, + {5276250334231686323u, 11208857446851049921u, 90292842129u}, + {13790198520922745052u, 13794690008281035639u, 145607633379u}, + {14195535250150996227u, 14519782740993303071u, 227747811643u}, + {16425228796427004035u, 10885858587044789123u, 59787118999u}, + {4295900841296269186u, 8710500938899914621u, 151590123576u}, + {4533952595483946442u, 1284182587483102819u, 56472197202u}, + {12885038019373447184u, 10346074482131502030u, 82069615677u}, + {12140736240487831910u, 9429804686255246574u, 61560861821u}, + {6927124077155322074u, 6412022633845121254u, 125511190736u}, + {12477788342407819890u, 8892351297529018260u, 208347596443u}, + {7980854329409711087u, 14098160105983060597u, 155482055329u}, + {2062671021810827996u, 13793833029739474340u, 161764262790u}, + {2739521363598172769u, 16367653765996977044u, 134747765186u}, + {12897585686593465638u, 10684788343333772342u, 194887292288u}, + {1127632646629044686u, 13272681218705145345u, 128579223536u}, + {4833775019274666364u, 11093568615497829248u, 240719513490u}, + {15867662672939849256u, 12488220765137758124u, 146601383559u}, + {2092350330982953557u, 3727114642519696453u, 135676987804u}, + {13330062299842493592u, 11549865375695057514u, 156202047289u}, + {4479193352178519263u, 11292809154908783229u, 57626119456u}, + {3149393938889064983u, 17723904861837310998u, 32612184410u}, + {9736379904070620767u, 14877674388187150875u, 90960814807u}, + {3816238703055069186u, 12178961950105734308u, 215806520344u}, + {11598915938798661975u, 4540604068069253114u, 24660222850u}, + {17821633264606555643u, 13832478722153359868u, 130246146639u}, + {2514623558764574316u, 1308046668730371491u, 79749860174u}, + {4976730480406253215u, 18400531023544756800u, 78070909351u}, + {17276563697191611637u, 9789823458621466539u, 167997494785u}, + {12524734095940998814u, 1924870562610267306u, 1530707393u}, + {15331551308930355164u, 5290016144582400923u, 193104347442u}, + {15417115581125943816u, 15162883663174059077u, 50286772349u}, + {6010750237807115593u, 8078086116520046390u, 125821981570u}, + {5624630987553628432u, 15731407332173190623u, 130437913925u}, + {14881848243837640704u, 5346389182763011056u, 69852801300u}, + {15281613886881529856u, 6368422217216252401u, 20289828338u}, + {14057902358273196032u, 2961453088119116188u, 242345232860u}, + {16075318494433902592u, 10932141691610170525u, 220160540693u}, + {13891916000577716224u, 11034016191361782553u, 21592632588u}, + {7205759403792793600u, 5455325785621453219u, 12598155216u}, + {0u, 7735615202566149352u, 208295733803u}, + {0u, 7502396497775759360u, 43419348540u}, + {0u, 1601286435751591936u, 60406705729u}, + {0u, 11449383158571597824u, 65086805911u}, + {0u, 13043944595690356736u, 151620672304u}, + {0u, 7773494431818186752u, 48707113653u}, + {0u, 9943947977234055168u, 181421401977u}, + {0u, 0u, 121539062500u}, + {0u, 0u, 228000000000u}, + {4535831408134330609u, 3677u, 0u}, + {6204770794376564579u, 3677245887913u, 0u}, + {13869812122751887467u, 6343817245135589714u, 199u}, + {14253229412394467550u, 17549323075660516085u, 199343899021u}, + {12776557610216045332u, 3948641822109421754u, 141951350710u}, + {16493640728678654060u, 1750739713693534543u, 182214056302u}, + {9434398296825833151u, 962163898128633415u, 110094907790u}, + {8773374058285327850u, 7967320249386531212u, 142052159009u}, + {12932015276748029367u, 3018466665533383224u, 33431909296u}, + {16293958583527755209u, 15076865731854945472u, 176163631405u}, + {13511893936143127948u, 691187172844604400u, 45817318529u}, + {18409936402005226436u, 13274492813370992341u, 129037469331u}, + {2189663026458466887u, 6364168818499152300u, 147719611697u}, + {9497725274248154664u, 17599380787401914158u, 49345002282u}, + {14766925481127792125u, 3782323149461692814u, 42954064344u}, + {6982373971809635814u, 14470163442442237466u, 216205040148u}, + {8616702383006884794u, 476109872130437939u, 20784429132u}, + {3059473300040871066u, 16330548844673355700u, 76025809967u}, + {17123843157031495558u, 14089158961463739563u, 47885280826u}, + {11210627174210626524u, 13385510793074798805u, 58763774837u}, + {15868067138625928592u, 1549401308746959012u, 117725629994u}, + {4467869511636937589u, 4607384943843027435u, 42083993213u}, + {10052108125844341766u, 5157353797716093483u, 125249766838u}, + {7470588003218451534u, 10846828782671550129u, 182279580709u}, + {2613527085490786280u, 9915857350819131531u, 37588007766u}, + {3632919450036549616u, 1673544973504317923u, 86537539704u}, + {179367907231218916u, 14780986291622785694u, 120090723054u}, + {13553068184555874624u, 8168111319515466401u, 238801278872u}, + {8798774862365584481u, 16345760387859734482u, 152442794201u}, + {910911255817064881u, 3177475373321281805u, 217886105446u}, + {2304331144765093813u, 2558676822419554038u, 102172251285u}, + {12248937023083640360u, 8813474062662382873u, 149138706148u}, + {10206039550662130685u, 5426294560236228430u, 228477779386u}, + {12267881323837852537u, 9919177474128333040u, 186294160017u}, + {2858642007937891971u, 6197383943089627371u, 145537719688u}, + {14171330289750320841u, 13673239314867423997u, 136335960856u}, + {6601103619749017720u, 9309584098968723946u, 24741227788u}, + {4919573414486739494u, 4647101757759615504u, 12504673565u}, + {3401998285294974486u, 1405809295505096753u, 29251919891u}, + {10799436256515532233u, 11332704079573859112u, 19076209074u}, + {10083786644665753398u, 2960072434514044308u, 178614347119u}, + {6481194517685688896u, 3887266602785432801u, 111160465848u}, + {15104161756860547072u, 14545546084687849554u, 184210729144u}, + {9556039274244079616u, 4617763804182385321u, 184788515633u}, + {1376343134954323968u, 7857823815580249095u, 49250329477u}, + {15682488278596976640u, 10939326736548364798u, 133425973482u}, + {1506454075355430912u, 12262012446566951953u, 234593022090u}, + {1152921504606846976u, 12555024338687723023u, 138664725026u}, + {0u, 3332969632922829472u, 34680609233u}, + {0u, 15535060143360327680u, 209180680645u}, + {0u, 15794322927987458048u, 197842157297u}, + {0u, 10571474314433921024u, 241856211961u}, + {0u, 16679514427547975680u, 249573080770u}, + {0u, 16925653299565166592u, 194904198288u}, + {0u, 16717361816799281152u, 144917541503u}, + {0u, 0u, 127906250000u}, + {0u, 0u, 16000000000u}, + {6172559441576707976u, 56110319u, 0u}, + {15083329738554729992u, 56110319334615117u, 0u}, + {10013126833549229036u, 9335385384027907407u, 3041746u}, + {5817156823499936061u, 13237828406194798613u, 210506072255u}, + {5282692560913632718u, 15667486867836528863u, 191717624115u}, + {10252307034225766362u, 17982325043592934313u, 51849336164u}, + {17981881283247669689u, 17159117626917379189u, 100974823793u}, + {11689290159733383293u, 8336208968408929657u, 113930197630u}, + {5530668968487988249u, 12767090573379150201u, 126451906793u}, + {10083765740821947024u, 14736070002412246709u, 233692105366u}, + {2798423656816843533u, 9697296975344560756u, 150798843955u}, + {7614494481582904797u, 7291706381199103298u, 51525691522u}, + {17811318500083423695u, 18098546597780825068u, 130395284194u}, + {11641467412200329033u, 132913902678533478u, 226981124177u}, + {17733593025296340645u, 1879347741692007580u, 81007205277u}, + {3689424000190644835u, 4056624629214083684u, 157101879645u}, + {14966634145516728506u, 14713227692042795499u, 93219910061u}, + {14171681941562070109u, 7366415124022528526u, 173797605671u}, + {8130575762882608170u, 825770353378039393u, 39399334164u}, + {5234550794400656856u, 10244023944395357795u, 20044765100u}, + {3020576149360486378u, 14302658294713551167u, 172555329650u}, + {3038675756589057221u, 14246653166206862817u, 114775348659u}, + {15470260187120878369u, 12404486258134291102u, 179772312615u}, + {3497929414841828746u, 8887442218637942533u, 39672448547u}, + {9935840636861015305u, 1186724038081863005u, 35481789208u}, + {3647355485153741471u, 211331772484951576u, 24064332439u}, + {766100215038272793u, 6311919513247413649u, 151011456318u}, + {16128087474216800751u, 8131780018703965703u, 62342169842u}, + {16216631732633731297u, 2262544347226725725u, 242440824678u}, + {13760220872779997335u, 15318188749880522583u, 102122652774u}, + {3826276262374222087u, 1073117094162650652u, 102830400676u}, + {14938032745839181005u, 4447950380665871747u, 164058173794u}, + {14479259995009508865u, 5373227185066463609u, 98241123873u}, + {2372033248156102437u, 6739731406934274193u, 33291283229u}, + {792005346826701645u, 12328812617001239444u, 29365361571u}, + {16278924527931792559u, 3246111484407310759u, 163668346271u}, + {17442516423538940144u, 3250825415176839770u, 159175972056u}, + {13844184233048446u, 16146270540000862342u, 216176227598u}, + {13486193870480782357u, 15686773375425916830u, 14875291079u}, + {11931315179184648737u, 11920791905793880226u, 199850381688u}, + {16492562205587485405u, 1853290561644080707u, 120646227424u}, + {12128987217680380854u, 12157689141506159076u, 224100467082u}, + {10568123814189138176u, 18100318838862562546u, 138659069648u}, + {17007583519117541376u, 7171257882533475139u, 208981220250u}, + {143791533903052800u, 14477550873015039462u, 154388754668u}, + {12398714235792654336u, 8109481182495403274u, 236784829605u}, + {9659957317919047680u, 14565395719337663965u, 165439615855u}, + {9412523221204336640u, 1860318978161305991u, 111789591684u}, + {4611686018427387904u, 16268646275151585618u, 132100848093u}, + {0u, 13759019338835519104u, 221881925081u}, + {0u, 17003783176010661888u, 217745877932u}, + {0u, 18357489540307877888u, 172921776932u}, + {0u, 905481790074912768u, 36995161502u}, + {0u, 3638882110636294144u, 158049086266u}, + {0u, 9011702854368362496u, 58197264194u}, + {0u, 11529215046068469760u, 66488525390u}, + {0u, 0u, 78625000000u}, + {0u, 0u, 64000000000u}, + {3237900842885170729u, 856u, 0u}, + {7515893506498066595u, 856175526956u, 0u}, + {7300206309181072546u, 7625299565768063067u, 46u}, + {5999737279837044u, 13889021769065194705u, 46413368317u}, + {7556839307242450651u, 14498170692313014398u, 253752925378u}, + {12946035041643640643u, 1541631360972245751u, 194785947408u}, + {15885877642352740665u, 9903958882920799117u, 16083572003u}, + {10770818348246089568u, 15744148547788062576u, 35536894686u}, + {11635415503599551744u, 17936061801321712000u, 222853492002u}, + {6248053924100826098u, 9986394078324430610u, 34972315858u}, + {16894170802729859998u, 13849561248103430369u, 210541363507u}, + {6143589029651889899u, 12142378807953854930u, 51750786219u}, + {11812087701837886160u, 2513847703931031444u, 171658239674u}, + {7306705080150829180u, 1752183758129038045u, 186136275957u}, + {1485332570280714274u, 15824833342220556540u, 245094986071u}, + {18042602303295630634u, 8168747198299470695u, 87857865934u}, + {13397029889257074369u, 17414799840149357478u, 206442828672u}, + {9948104869613411488u, 83147520704167789u, 128944058191u}, + {10836066241170646532u, 2383542703041471269u, 79004507436u}, + {18330574781234459389u, 15540952725549257799u, 44129212108u}, + {666297360208433062u, 6949835416232048690u, 204842476735u}, + {5035352224889324309u, 15398868937585367540u, 191376751332u}, + {1341745796439923765u, 14710915985268256079u, 228834774357u}, + {6846932182653803785u, 9665704836873335737u, 85797480353u}, + {6727685027257825533u, 2528789298740305993u, 161523978909u}, + {2168538874806877737u, 10562914675687726264u, 157137085942u}, + {17694936100676971444u, 17671658300096837111u, 246572616751u}, + {2163944241059563294u, 356471401631698552u, 47957982516u}, + {6727780864524301558u, 7450677157218003204u, 52019324353u}, + {8599551977795002615u, 317174560787152643u, 193403902018u}, + {15428264807806859091u, 7251937674440720374u, 66017194067u}, + {2126771385339683557u, 1252631516699038247u, 83393128329u}, + {15094316562082972944u, 10818009768860843867u, 137067905290u}, + {8111300598225956802u, 12330114194950162396u, 10586445484u}, + {9481215200564260304u, 15826681638261168822u, 172668416829u}, + {16836674128623424708u, 14240150078499211625u, 61857966130u}, + {7087243115299722740u, 10725372116242125421u, 50771960082u}, + {2343560867338408810u, 8434925524647833627u, 18581423587u}, + {3431385749090422286u, 17133902668520348241u, 227457258228u}, + {3504545517469224582u, 15093996047981365810u, 244928830724u}, + {3333759805712094227u, 6187974166976813153u, 4818247165u}, + {3595183476205994775u, 13946144707720259865u, 253335450751u}, + {14191566632569921303u, 9138079832881862582u, 127756022019u}, + {12917427671358095562u, 6600697628576225568u, 3495376300u}, + {3883793922738316288u, 8137099536646556597u, 172357824535u}, + {7857281689266421760u, 14169855543453903706u, 23441113049u}, + {15987081651486195712u, 3706403268650100765u, 217768149408u}, + {16827562156399525888u, 14736932266877982264u, 160200924523u}, + {7012737938513461248u, 18004795125138956004u, 107798890698u}, + {7385903388887613440u, 9068489270661002501u, 202976041899u}, + {0u, 7758835715193269217u, 171491603788u}, + {0u, 16943947811135261184u, 76420607326u}, + {0u, 6745843108403216384u, 94918533251u}, + {0u, 12338229654069444608u, 131365692887u}, + {0u, 14358176069683511296u, 215668856769u}, + {0u, 7083775185760813056u, 193778358284u}, + {0u, 5350276357316149248u, 12384012222u}, + {0u, 9223372036854775808u, 190290039062u}, + {0u, 0u, 22500000000u}, + {14135788013842776187u, 13064201u, 0u}, + {13284322918167594445u, 13064201766302603u, 0u}, + {7264587765474046287u, 14699116688460625612u, 708211u}, + {16176482219778368741u, 6684126021499623499u, 115796840712u}, + {5401983818872095469u, 12614606079692508506u, 8362347197u}, + {11208857446851049921u, 15358270276683001489u, 189683839165u}, + {13794690008281035639u, 18077126190953408995u, 189832573499u}, + {14519782740993303071u, 7864121581925945659u, 59979962974u}, + {10885858587044789123u, 3518026639210514839u, 94426314885u}, + {8710500938899914621u, 4698310163811252280u, 133190712606u}, + {1284182587483102819u, 6101155398200416338u, 30254695904u}, + {10346074482131502030u, 16049178580360033341u, 224330744296u}, + {9429804686255246574u, 3167464649127375997u, 232870027714u}, + {6412022633845121254u, 12778923935480989904u, 194171708602u}, + {8892351297529018260u, 11875553912612980379u, 186692746854u}, + {14098160105983060597u, 10628760849351697057u, 102643775067u}, + {13793833029739474340u, 3408944711673234310u, 91576186280u}, + {16367653765996977044u, 2102091496050506178u, 168184799263u}, + {10684788343333772342u, 6254611118630245760u, 31113954608u}, + {13272681218705145345u, 2647941151989776368u, 48339063148u}, + {11093568615497829248u, 8855437735410157458u, 108143545177u}, + {12488220765137758124u, 10184270603132180103u, 89480054241u}, + {3727114642519696453u, 12079083162535627164u, 225552090415u}, + {11549865375695057514u, 5952952868716156729u, 47654808410u}, + {11292809154908783229u, 11958907037815852320u, 90322710221u}, + {17723904861837310998u, 10101562137321697626u, 205648293649u}, + {14877674388187150875u, 13633527411279258327u, 17547606780u}, + {12178961950105734308u, 16555627393501768728u, 252739075001u}, + {4540604068069253114u, 6359650463500280706u, 185897482359u}, + {13832478722153359868u, 8093923611102181967u, 119344757342u}, + {1308046668730371491u, 2848827352928635726u, 94438772478u}, + {18400531023544756800u, 4686723431961561511u, 254154435240u}, + {9789823458621466539u, 6245554925867652609u, 168254067786u}, + {1924870562610267306u, 17527406820792516033u, 74338572210u}, + {5290016144582400923u, 12119966834653692210u, 178950162627u}, + {15162883663174059077u, 11606502845877928061u, 195657024718u}, + {8078086116520046390u, 424311496652297090u, 206629189780u}, + {15731407332173190623u, 5977664048034127173u, 148023001972u}, + {5346389182763011056u, 6702712461535947028u, 116324049817u}, + {6368422217216252401u, 11384349854055020018u, 153363354770u}, + {2961453088119116188u, 3782955013294836188u, 146617146842u}, + {10932141691610170525u, 3531805968821207061u, 218205074402u}, + {11034016191361782553u, 3867566898657193228u, 226191459585u}, + {5455325785621453219u, 12688734637425072080u, 1209661221u}, + {7735615202566149352u, 18435982764454619691u, 37687857682u}, + {7502396497775759360u, 4728836163964677692u, 18999416628u}, + {1601286435751591936u, 2120012917348838977u, 52256350722u}, + {11449383158571597824u, 9856965465824679831u, 2114926130u}, + {13043944595690356736u, 11217197671061248816u, 50534347168u}, + {7773494431818186752u, 3840562972677739189u, 160608085504u}, + {9943947977234055168u, 17104366978925258617u, 208197335u}, + {0u, 16177877219841993444u, 215927229591u}, + {0u, 7338522384267208704u, 151877004481u}, + {0u, 10935240458612244480u, 193397822095u}, + {0u, 1732868046462124032u, 143592800573u}, + {0u, 557965042578882560u, 61093938965u}, + {0u, 10454684322475540480u, 21030247345u}, + {0u, 13907115649320091648u, 177566749572u}, + {0u, 0u, 132753906250u}, + {0u, 0u, 74000000000u}, + {6343817245135589714u, 199u, 0u}, + {17549323075660516085u, 199343899021u, 0u}, + {3948641822109421754u, 14876458284855834550u, 10u}, + {1750739713693534543u, 10450704926982265198u, 10806454419u}, + {962163898128633415u, 5385653213018257806u, 147566533849u}, + {7967320249386531212u, 12735569669880147489u, 217291956845u}, + {3018466665533383224u, 3619762560577729456u, 109690396615u}, + {15076865731854945472u, 11123448126624084269u, 199196227721u}, + {691187172844604400u, 4072715118852885633u, 137603003331u}, + {13274492813370992341u, 18239087231420827283u, 195220782328u}, + {6364168818499152300u, 423431461216085297u, 248988742900u}, + {17599380787401914158u, 9360976716520160042u, 244022954265u}, + {3782323149461692814u, 11655927117263208920u, 25507459564u}, + {14470163442442237466u, 2646622721938364948u, 236631869075u}, + {476109872130437939u, 4496462484548171852u, 147143473705u}, + {16330548844673355700u, 13140258519803350063u, 41243753719u}, + {14089158961463739563u, 13089764333320627770u, 247712334841u}, + {13385510793074798805u, 6926286827289840501u, 249709597546u}, + {1549401308746959012u, 4985580225290866218u, 106375474761u}, + {4607384943843027435u, 10478790837359789693u, 73270268845u}, + {5157353797716093483u, 10041191967455692214u, 173568056389u}, + {10846828782671550129u, 5035461258013813797u, 69544334107u}, + {9915857350819131531u, 14208759661559249750u, 27272972901u}, + {1673544973504317923u, 12347272163241758840u, 101770258404u}, + {14780986291622785694u, 3372534174410277614u, 228669346965u}, + {8168111319515466401u, 17226704187274712984u, 149182825443u}, + {16345760387859734482u, 4250480179449852121u, 227933861505u}, + {3177475373321281805u, 4303723537755414374u, 129230418992u}, + {2558676822419554038u, 8680503847344854165u, 48233305320u}, + {8813474062662382873u, 8817608623911079652u, 232470571056u}, + {5426294560236228430u, 5692030448698539450u, 48478003521u}, + {9919177474128333040u, 16908836314686769809u, 65308565588u}, + {6197383943089627371u, 6073762347067727240u, 84916629853u}, + {13673239314867423997u, 10931066692585106200u, 93329259316u}, + {9309584098968723946u, 14466591364061539596u, 52592574312u}, + {4647101757759615504u, 4958077340960173341u, 104784235489u}, + {1405809295505096753u, 4076890037156765715u, 225268777911u}, + {11332704079573859112u, 14083973146609179058u, 183221008651u}, + {2960072434514044308u, 2565183738039805295u, 11763493714u}, + {3887266602785432801u, 1482420938751351224u, 82139058889u}, + {14545546084687849554u, 2151089495335413944u, 201080362200u}, + {4617763804182385321u, 3738604531753220913u, 216116610795u}, + {7857823815580249095u, 14195686514836005765u, 235202670157u}, + {10939326736548364798u, 17808833916231796970u, 77769549707u}, + {12262012446566951953u, 1302384553035657354u, 139965418821u}, + {12555024338687723023u, 1672033517974833698u, 69070602408u}, + {3332969632922829472u, 11673925532927662545u, 168090641118u}, + {15535060143360327680u, 3905334232240480709u, 222632844771u}, + {15794322927987458048u, 17411087320267472625u, 227211708592u}, + {10571474314433921024u, 16573305231063706617u, 176943856934u}, + {16679514427547975680u, 15481103236037148354u, 38898440676u}, + {16925653299565166592u, 907440704754420880u, 228839232288u}, + {16717361816799281152u, 3224970785139077759u, 32049192459u}, + {0u, 10560826509734608144u, 11174826016u}, + {0u, 4700940027512659968u, 32572503552u}, + {0u, 9733694683502084096u, 254838469u}, + {0u, 1995535635724632064u, 197527664646u}, + {0u, 10629833226245373952u, 6108178203u}, + {0u, 15729384648544878592u, 27576244413u}, + {0u, 7205759403792793600u, 189852691650u}, + {0u, 0u, 194390625000u}, + {0u, 0u, 232000000000u}, + {9335385384027907407u, 3041746u, 0u}, + {13237828406194798613u, 3041746506072255u, 0u}, + {15667486867836528863u, 7535526066623007027u, 164893u}, + {17982325043592934313u, 11302146918409311588u, 29408501686u}, + {17159117626917379189u, 2480833299122194801u, 182612690612u}, + {8336208968408929657u, 11513226205589330558u, 180134486242u}, + {12767090573379150201u, 4073957068281936105u, 226624133243u}, + {14736070002412246709u, 3729887061093812886u, 123220849655u}, + {9697296975344560756u, 13616911779739451443u, 247202197582u}, + {7291706381199103298u, 13039053282195777666u, 78738174266u}, + {18098546597780825068u, 14490756113210417890u, 58706848494u}, + {132913902678533478u, 17432486112977557585u, 238785545462u}, + {1879347741692007580u, 14308820825344039837u, 246945016965u}, + {4056624629214083684u, 4190949538817536349u, 133775682731u}, + {14713227692042795499u, 13616552502810964397u, 171227191829u}, + {7366415124022528526u, 4898145803694965031u, 21738154790u}, + {825770353378039393u, 1399036321001644308u, 38265529016u}, + {10244023944395357795u, 17170331128243738540u, 184075841910u}, + {14302658294713551167u, 10641321388205367410u, 118930805515u}, + {14246653166206862817u, 6648873641312572851u, 11576867188u}, + {12404486258134291102u, 5988456964560374823u, 116360436162u}, + {8887442218637942533u, 9972593758348346915u, 194324634902u}, + {1186724038081863005u, 16709668921872818968u, 22540615390u}, + {211331772484951576u, 6094829131503407767u, 222905832967u}, + {6311919513247413649u, 4892016478899926334u, 7330401349u}, + {8131780018703965703u, 13150857244079031538u, 69265196744u}, + {2262544347226725725u, 12983943395318785894u, 200712909399u}, + {15318188749880522583u, 15341644584614757478u, 87703860981u}, + {1073117094162650652u, 7507635124856644772u, 245831672219u}, + {4447950380665871747u, 11619655367084544354u, 155406989715u}, + {5373227185066463609u, 11553116952478783009u, 147629902779u}, + {6739731406934274193u, 17392150014233193245u, 187626295724u}, + {12328812617001239444u, 8877887560294980515u, 172942830341u}, + {3246111484407310759u, 18404180619915609503u, 5481271248u}, + {3250825415176839770u, 10079413095288181976u, 208997692630u}, + {16146270540000862342u, 14102802966539105550u, 214546406078u}, + {15686773375425916830u, 13333966026135891399u, 190764514480u}, + {11920791905793880226u, 12344968670173516152u, 176722835746u}, + {1853290561644080707u, 10577007819804726752u, 34669222092u}, + {12157689141506159076u, 15337041354031088010u, 204573380742u}, + {18100318838862562546u, 14333607285614673616u, 134831422677u}, + {7171257882533475139u, 17171597563219696538u, 213777026407u}, + {14477550873015039462u, 2849642930482147564u, 103930874169u}, + {8109481182495403274u, 14791248423979435173u, 57154479452u}, + {14565395719337663965u, 13882371364576310127u, 92801835183u}, + {1860318978161305991u, 11735995808941329540u, 175752564859u}, + {16268646275151585618u, 11376996674339273181u, 123636209607u}, + {13759019338835519104u, 9849638057168043481u, 199616748225u}, + {17003783176010661888u, 18241520229279361964u, 193533949948u}, + {18357489540307877888u, 1865852368526961444u, 252988874793u}, + {905481790074912768u, 10601487369276448158u, 41101148059u}, + {3638882110636294144u, 15999931310312762170u, 155574707781u}, + {9011702854368362496u, 5773775867713013570u, 69867358014u}, + {11529215046068469760u, 17726239863982547534u, 62312997016u}, + {0u, 9711316695888316992u, 152960941388u}, + {0u, 17872002620723724288u, 76526451532u}, + {0u, 7429694208660733952u, 76968843203u}, + {0u, 1782821038871019520u, 195402764530u}, + {0u, 3225250234313474048u, 242096646922u}, + {0u, 10009250171830927360u, 10174841165u}, + {0u, 1152921504606846976u, 77542602539u}, + {0u, 0u, 43062500000u}, + {0u, 0u, 160000000000u}, + {7625299565768063067u, 46u, 0u}, + {13889021769065194705u, 46413368317u, 0u}, + {14498170692313014398u, 9519880170333822146u, 2u}, + {1541631360972245751u, 2285186318012886800u, 2516073738u}, + {9903958882920799117u, 9706420951402272035u, 10123880198u}, + {15744148547788062576u, 2369632031840402142u, 6526186134u}, + {17936061801321712000u, 15599123897979399458u, 150128458009u}, + {9986394078324430610u, 17579576584023912658u, 25845630200u}, + {13849561248103430369u, 3480927339588501811u, 248952990756u}, + {12142378807953854930u, 3547346616671294635u, 36188701449u}, + {2513847703931031444u, 7705317123868384954u, 9192302045u}, + {1752183758129038045u, 4969425237478353909u, 221417706078u}, + {15824833342220556540u, 17043246700132217175u, 94269393081u}, + {8168747198299470695u, 17053788362783499470u, 185923916254u}, + {17414799840149357478u, 11102988228454224768u, 222924487719u}, + {83147520704167789u, 16944305387801685839u, 39601894197u}, + {2383542703041471269u, 11725142977459199276u, 53918552635u}, + {15540952725549257799u, 8175984171998533324u, 59635621274u}, + {6949835416232048690u, 1372352885142856895u, 154443220990u}, + {15398868937585367540u, 17975093466502888164u, 254074395398u}, + {14710915985268256079u, 6467823391459085653u, 6974431769u}, + {9665704836873335737u, 11319386883146885025u, 25350621408u}, + {2528789298740305993u, 9141999262922068637u, 224613625192u}, + {10562914675687726264u, 1587330393383478774u, 104495588773u}, + {17671658300096837111u, 884187548095712303u, 165086049353u}, + {356471401631698552u, 488841225726377268u, 73047931903u}, + {7450677157218003204u, 17462624199405856193u, 255026500135u}, + {317174560787152643u, 13183677579115583554u, 39946650754u}, + {7251937674440720374u, 11645015818917277779u, 130714688593u}, + {1252631516699038247u, 8760523002035971977u, 81631277572u}, + {10818009768860843867u, 10068817678491468042u, 4474908903u}, + {12330114194950162396u, 1273658177787418284u, 231545831700u}, + {15826681638261168822u, 3100019384328057661u, 20069045148u}, + {14240150078499211625u, 10363063568089458738u, 156168052387u}, + {10725372116242125421u, 13030756371481403666u, 163561782801u}, + {8434925524647833627u, 6538878900684195299u, 17706398718u}, + {17133902668520348241u, 8984884716779098868u, 254354473335u}, + {15093996047981365810u, 8728727397070363908u, 119487071576u}, + {6187974166976813153u, 6398650562917867005u, 88473185260u}, + {13946144707720259865u, 1190873176164938879u, 236346871542u}, + {9138079832881862582u, 4383628525805121795u, 246064557364u}, + {6600697628576225568u, 10189374699734119852u, 52237636978u}, + {8137099536646556597u, 5276291920541626391u, 114552367109u}, + {14169855543453903706u, 2692252373800386521u, 5286028358u}, + {3706403268650100765u, 11578684995169173920u, 70145947293u}, + {14736932266877982264u, 5799408022254132587u, 157627681771u}, + {18004795125138956004u, 15548569837712345290u, 235314386538u}, + {9068489270661002501u, 15763030464322902955u, 106842889659u}, + {7758835715193269217u, 13257749746581255500u, 187854515593u}, + {16943947811135261184u, 16152470009188707678u, 137718704053u}, + {6745843108403216384u, 13806790848493904003u, 181875627153u}, + {12338229654069444608u, 11981226523265951191u, 145748467631u}, + {14358176069683511296u, 5133628726077003713u, 175649503591u}, + {7083775185760813056u, 16183955741910833164u, 103278294570u}, + {5350276357316149248u, 13640425554331371454u, 42877333998u}, + {9223372036854775808u, 18108120906868035862u, 238739448950u}, + {0u, 6324011669895037184u, 118981643201u}, + {0u, 10444437689515769856u, 193342825359u}, + {0u, 12324712543665782784u, 143566194101u}, + {0u, 13928941951563857920u, 181668124005u}, + {0u, 3975288688270639104u, 101755089456u}, + {0u, 11141905478114607104u, 48215500831u}, + {0u, 4611686018427387904u, 31604003906u}, + {0u, 0u, 66250000000u}, + {0u, 0u, 128000000000u}, + {14699116688460625612u, 708211u, 0u}, + {6684126021499623499u, 708211796840712u, 0u}, + {12614606079692508506u, 4398362855256705725u, 38392u}, + {15358270276683001489u, 2812083125569302717u, 248238435728u}, + {18077126190953408995u, 12868509142973100603u, 144152443331u}, + {7864121581925945659u, 8726243776748165726u, 195697603278u}, + {3518026639210514839u, 358304413426858117u, 206473050623u}, + {4698310163811252280u, 3180720351566429470u, 255019423721u}, + {6101155398200416338u, 14053818240400098784u, 233172427195u}, + {16049178580360033341u, 7340140541492429288u, 187761859013u}, + {3167464649127375997u, 1323571167904965058u, 197397909816u}, + {12778923935480989904u, 14463851737583396026u, 56071750936u}, + {11875553912612980379u, 15122784818916048486u, 24784086973u}, + {10628760849351697057u, 13557974621377508955u, 189819807807u}, + {3408944711673234310u, 17525172074563876264u, 63734979276u}, + {2102091496050506178u, 15148880683074215967u, 204950041481u}, + {6254611118630245760u, 6744828147558597936u, 137821222467u}, + {2647941151989776368u, 9799290779647971692u, 67365637866u}, + {8855437735410157458u, 11170890203898678105u, 234531220617u}, + {10184270603132180103u, 7068779781287527905u, 137605575171u}, + {12079083162535627164u, 14474741922505540911u, 3383199319u}, + {5952952868716156729u, 17107062680405191514u, 87784677331u}, + {11958907037815852320u, 2712598571300237005u, 211927375726u}, + {10101562137321697626u, 3767556054903418641u, 110147050263u}, + {13633527411279258327u, 18158239681706277628u, 23204239622u}, + {16555627393501768728u, 10531652712128330681u, 6984360145u}, + {6359650463500280706u, 9548395326934120567u, 209570922037u}, + {8093923611102181967u, 15875647850297719390u, 53517619547u}, + {2848827352928635726u, 8215825295203192574u, 91860620594u}, + {4686723431961561511u, 12747310908260543144u, 50445380781u}, + {6245554925867652609u, 77706528053613642u, 173691033109u}, + {17527406820792516033u, 6024737704056756146u, 21004212479u}, + {12119966834653692210u, 6819452388570089667u, 255326601685u}, + {11606502845877928061u, 13695926775373186254u, 213369683254u}, + {424311496652297090u, 3746531715392682132u, 54742457678u}, + {5977664048034127173u, 4717376233154528116u, 78203099891u}, + {6702712461535947028u, 385190957950313369u, 243255729478u}, + {11384349854055020018u, 12388374310648616082u, 70020881243u}, + {3782955013294836188u, 1078067332084407770u, 91671575117u}, + {3531805968821207061u, 3257295319358714850u, 77058442147u}, + {3867566898657193228u, 1545453099660723457u, 163176578333u}, + {12688734637425072080u, 7495477664653506341u, 29083779180u}, + {18435982764454619691u, 7225503732673614354u, 108406330658u}, + {4728836163964677692u, 3935478326103643956u, 34391695342u}, + {2120012917348838977u, 10082240682742686210u, 238213342707u}, + {9856965465824679831u, 10838712705567897138u, 243546559362u}, + {11217197671061248816u, 2142546572501643680u, 130587567793u}, + {3840562972677739189u, 7893042119150331392u, 177116147682u}, + {17104366978925258617u, 12084811642251302615u, 226427882670u}, + {16177877219841993444u, 15317234482572954775u, 174655118951u}, + {7338522384267208704u, 2283226355108359361u, 103830348945u}, + {10935240458612244480u, 13359725152575722127u, 145123773948u}, + {1732868046462124032u, 13126551011491594557u, 252724232151u}, + {557965042578882560u, 3598021288691861269u, 215711591756u}, + {10454684322475540480u, 16462621795896662961u, 76195049124u}, + {13907115649320091648u, 14682112756964627332u, 164892440515u}, + {0u, 7174112100896070218u, 195795918927u}, + {0u, 5023109019590616064u, 79388909396u}, + {0u, 10765223023086141440u, 84272303285u}, + {0u, 8228137177297453056u, 181583583909u}, + {0u, 2891199497780592640u, 165446048210u}, + {0u, 15294857653247803392u, 210156732238u}, + {0u, 14303432416528695296u, 78829135894u}, + {0u, 0u, 22775390625u}, + {0u, 0u, 161000000000u}, + {14876458284855834550u, 10u, 0u}, + {10450704926982265198u, 10806454419u, 0u}, + {5385653213018257806u, 10806454419566533849u, 0u}, + {12735569669880147489u, 17118225092618494573u, 585819067u}, + {3619762560577729456u, 13385738875341807559u, 187927980841u}, + {11123448126624084269u, 8272682717439277193u, 41725642358u}, + {4072715118852885633u, 13402436483369350083u, 118448463028u}, + {18239087231420827283u, 10946328903241612536u, 180726547537u}, + {423431461216085297u, 16265808923426731252u, 81593401678u}, + {9360976716520160042u, 11080374459871185177u, 78881771268u}, + {11655927117263208920u, 1240761893433831916u, 4600668303u}, + {2646622721938364948u, 367264070493390483u, 143067261837u}, + {4496462484548171852u, 2863675693461092905u, 141019909425u}, + {13140258519803350063u, 7511929581752138999u, 49155240170u}, + {13089764333320627770u, 11154557789993845753u, 234407222518u}, + {6926286827289840501u, 8325416539745948522u, 246604689789u}, + {4985580225290866218u, 17745129874679852617u, 125451321734u}, + {10478790837359789693u, 1074820986392253357u, 134961965418u}, + {10041191967455692214u, 7820952682162838597u, 106058266162u}, + {5035461258013813797u, 8215518006273528603u, 50423974694u}, + {14208759661559249750u, 9680426791089900133u, 38445364123u}, + {12347272163241758840u, 16128495723604797412u, 155524776987u}, + {3372534174410277614u, 2264789053583348885u, 27874327505u}, + {17226704187274712984u, 11175458488686298083u, 209122774460u}, + {4250480179449852121u, 11026777810412287617u, 188605822818u}, + {4303723537755414374u, 16199890034895598640u, 98597762822u}, + {8680503847344854165u, 9094320719494763752u, 6878197798u}, + {8817608623911079652u, 1250835564687222832u, 38493004114u}, + {5692030448698539450u, 15362466642459337025u, 82067807931u}, + {16908836314686769809u, 7831109835595423828u, 187832800985u}, + {6073762347067727240u, 15426237284335022429u, 217424525314u}, + {10931066692585106200u, 15636308361455434548u, 2836257998u}, + {14466591364061539596u, 13967173875944980328u, 206847645974u}, + {4958077340960173341u, 18245979923595824097u, 22757162012u}, + {4076890037156765715u, 11335054479675278263u, 28989116553u}, + {14083973146609179058u, 11165339882630461707u, 137614474534u}, + {2565183738039805295u, 15944437408299395922u, 38605274287u}, + {1482420938751351224u, 15806416348777321161u, 175864349683u}, + {2151089495335413944u, 4201030477408556248u, 243856867547u}, + {3738604531753220913u, 9485474942554588907u, 219227738318u}, + {14195686514836005765u, 18238757647663230541u, 206514208626u}, + {17808833916231796970u, 4642199687824746379u, 114988725033u}, + {1302384553035657354u, 6134575894869364037u, 41251654149u}, + {1672033517974833698u, 11524208547121316008u, 5332556025u}, + {11673925532927662545u, 2734683241527878366u, 249624728597u}, + {3905334232240480709u, 10629223456178675171u, 21148247475u}, + {17411087320267472625u, 2788042336985254064u, 179576211358u}, + {16573305231063706617u, 17285498758066142502u, 158151140077u}, + {15481103236037148354u, 5525538192421886436u, 237937048765u}, + {907440704754420880u, 11414325503043801888u, 189299540025u}, + {3224970785139077759u, 7246608114685173259u, 57618771825u}, + {10560826509734608144u, 1007884269852184608u, 113392839413u}, + {4700940027512659968u, 13823717876510029312u, 245054637515u}, + {9733694683502084096u, 12487410768239429317u, 203749385247u}, + {1995535635724632064u, 3361062421598631942u, 31676943894u}, + {10629833226245373952u, 17853337379088328475u, 22182203558u}, + {15729384648544878592u, 11551561037491869885u, 166967831358u}, + {7205759403792793600u, 11480877996635204802u, 62626211378u}, + {0u, 5527488381934471912u, 50622379643u}, + {0u, 11143438404407726080u, 123299645745u}, + {0u, 6472279730688098304u, 49604087006u}, + {0u, 4561816853579563008u, 222350862987u}, + {0u, 2888714464062865408u, 139247296587u}, + {0u, 16258276129784201216u, 75156597524u}, + {0u, 720575940379279360u, 20881362915u}, + {0u, 0u, 227039062500u}, + {0u, 0u, 228000000000u}, + {7535526066623007027u, 164893u, 0u}, + {11302146918409311588u, 164893408501686u, 0u}, + {2480833299122194801u, 16409970870640346804u, 8938u}, + {11513226205589330558u, 7721907286269370594u, 234889586303u}, + {4073957068281936105u, 14300743897882155131u, 127418605432u}, + {3729887061093812886u, 2068482633821123575u, 120775244880u}, + {13616911779739451443u, 4922882895416406094u, 80112132668u}, + {13039053282195777666u, 9317632875623428410u, 60266870016u}, + {14490756113210417890u, 5693844901999766254u, 505109890u}, + {17432486112977557585u, 11569484900262102262u, 130308663950u}, + {14308820825344039837u, 3138170119352085637u, 142627183033u}, + {4190949538817536349u, 950584692575235243u, 185170120543u}, + {13616552502810964397u, 8136430299747162645u, 95051531299u}, + {4898145803694965031u, 6698711700804594470u, 35441076770u}, + {1399036321001644308u, 17401191571004302008u, 34363137888u}, + {17170331128243738540u, 4721732028538188150u, 96943320485u}, + {10641321388205367410u, 2984214103553086219u, 165255965606u}, + {6648873641312572851u, 13128675202005662068u, 166161774570u}, + {5988456964560374823u, 14638512997670672834u, 234711706908u}, + {9972593758348346915u, 12942085665769692438u, 28793555379u}, + {16709668921872818968u, 14131134357119205086u, 179701591869u}, + {6094829131503407767u, 8921946894736102919u, 61766050328u}, + {4892016478899926334u, 5601522560505809989u, 24483659710u}, + {13150857244079031538u, 8602606493507716808u, 190303659146u}, + {12983943395318785894u, 8576789731078566487u, 138466348232u}, + {15341644584614757478u, 17881118138842658549u, 200464948702u}, + {7507635124856644772u, 11624372674432704923u, 222969337356u}, + {11619655367084544354u, 6826284072848095635u, 12630158505u}, + {11553116952478783009u, 1646466632033733563u, 169370053601u}, + {17392150014233193245u, 17871081657060299180u, 225089255134u}, + {8877887560294980515u, 15910893124677544709u, 222968793277u}, + {18404180619915609503u, 11031217459450580944u, 189862531244u}, + {10079413095288181976u, 13554987390037243094u, 172598003496u}, + {14102802966539105550u, 15026714590903687870u, 40734817338u}, + {13333966026135891399u, 4406379654994689200u, 58814599830u}, + {12344968670173516152u, 13596329092861950242u, 150238870319u}, + {10577007819804726752u, 284812388227373260u, 47737058477u}, + {15337041354031088010u, 9285079159392309382u, 173015439710u}, + {14333607285614673616u, 15046108141952711893u, 94503345149u}, + {17171597563219696538u, 13795366909944958311u, 253815651156u}, + {2849642930482147564u, 12909920641180059961u, 84747848338u}, + {14791248423979435173u, 5333762939889788252u, 146699848200u}, + {13882371364576310127u, 6411331390005944495u, 8289143868u}, + {11735995808941329540u, 1447104583224217723u, 60347558971u}, + {11376996674339273181u, 11940049226167932871u, 59078447696u}, + {9849638057168043481u, 9772290783590472385u, 80647271365u}, + {18241520229279361964u, 16351989577831528444u, 197529756944u}, + {1865852368526961444u, 4376738725895725097u, 16886443131u}, + {10601487369276448158u, 13851276297739812763u, 123237263481u}, + {15999931310312762170u, 12641996203470333509u, 121750879192u}, + {5773775867713013570u, 7707081716407945022u, 216685323987u}, + {17726239863982547534u, 417638323657040024u, 211417801737u}, + {9711316695888316992u, 16438047707692449100u, 9022640218u}, + {17872002620723724288u, 14850108107043306316u, 90891108351u}, + {7429694208660733952u, 10423290807904720835u, 255805025973u}, + {1782821038871019520u, 16951162310302339314u, 181565047726u}, + {3225250234313474048u, 2752437506572397322u, 174918924350u}, + {10009250171830927360u, 3925815842962784589u, 62149209936u}, + {1152921504606846976u, 5274166674003605291u, 80212818903u}, + {0u, 5538963350863452832u, 215285913148u}, + {0u, 16900671634439028736u, 60300267804u}, + {0u, 2326997710751662080u, 28916187245u}, + {0u, 12327726161625874432u, 109126146798u}, + {0u, 5756455743825903616u, 238668287374u}, + {0u, 3018537650245074944u, 142312058091u}, + {0u, 16717361816799281152u, 235163635253u}, + {0u, 0u, 53906250000u}, + {0u, 0u, 16000000000u}, + {2285186318012886800u, 2516073738u, 0u}, + {9706420951402272035u, 2516073738123880198u, 0u}, + {2369632031840402142u, 11997425759292732054u, 136396630u}, + {15599123897979399458u, 11491152661270395161u, 86650381753u}, + {17579576584023912658u, 18181063258234881272u, 185622936633u}, + {3480927339588501811u, 2466921813123869732u, 57985597414u}, + {3547346616671294635u, 8430880678232179465u, 230133732099u}, + {7705317123868384954u, 6738034873677997533u, 3457038957u}, + {4969425237478353909u, 7678250951042929246u, 109365269602u}, + {17043246700132217175u, 1853560606315563193u, 98416238818u}, + {17053788362783499470u, 14942676593409905118u, 226100481721u}, + {11102988228454224768u, 4909892170837638183u, 185810044121u}, + {16944305387801685839u, 16871149368312132405u, 217266165787u}, + {11725142977459199276u, 16096130589333770811u, 27914586839u}, + {8175984171998533324u, 12512479187631824282u, 215872572987u}, + {1372352885142856895u, 16980304980540557310u, 59678302855u}, + {17975093466502888164u, 8640919162749295366u, 135920504177u}, + {6467823391459085653u, 7862382415464063513u, 113468425166u}, + {11319386883146885025u, 14534157903009925344u, 206426220604u}, + {9141999262922068637u, 12627464554215107944u, 60787898278u}, + {1587330393383478774u, 2456849734836299173u, 166684536225u}, + {884187548095712303u, 18428252197697827913u, 161133186090u}, + {488841225726377268u, 7244734215936736255u, 42998997553u}, + {17462624199405856193u, 14756175050504770087u, 49392737828u}, + {13183677579115583554u, 6764116534566945922u, 36799933852u}, + {11645015818917277779u, 1588822142405565521u, 156366683492u}, + {8760523002035971977u, 17053265624843842052u, 100086130220u}, + {10068817678491468042u, 16996891591759999207u, 44924459381u}, + {1273658177787418284u, 8565556232370585876u, 117921403339u}, + {3100019384328057661u, 14464960359145886620u, 203464339733u}, + {10363063568089458738u, 5813189542048784035u, 21784147072u}, + {13030756371481403666u, 9739241026882027025u, 128315133636u}, + {6538878900684195299u, 18175068535675302910u, 196527965313u}, + {8984884716779098868u, 10562697212061761911u, 129985272439u}, + {8728727397070363908u, 4264834835660801368u, 119572604963u}, + {6398650562917867005u, 13019066443690126316u, 35231197159u}, + {1190873176164938879u, 1828040177823321846u, 231705765006u}, + {4383628525805121795u, 11240369830376975668u, 142099098256u}, + {10189374699734119852u, 8886938465302549874u, 144609341669u}, + {5276291920541626391u, 9985240313589688325u, 229481761899u}, + {2692252373800386521u, 722909126956573766u, 107541300962u}, + {11578684995169173920u, 5493363474638452381u, 226039188982u}, + {5799408022254132587u, 12410535279213120491u, 246297795830u}, + {15548569837712345290u, 10543108918366869098u, 246672776465u}, + {15763030464322902955u, 12953909016524823995u, 17571543079u}, + {13257749746581255500u, 16505942145872588169u, 39702232814u}, + {16152470009188707678u, 12428594380392015797u, 238894788916u}, + {13806790848493904003u, 7528259605829768337u, 52673755451u}, + {11981226523265951191u, 18147447600042811311u, 59408107770u}, + {5133628726077003713u, 12021069431116183911u, 250983775105u}, + {16183955741910833164u, 11819985069665662506u, 129651663479u}, + {13640425554331371454u, 10401877114068152814u, 119640762674u}, + {18108120906868035862u, 4611631138117837942u, 50563886888u}, + {6324011669895037184u, 17200813398607252417u, 40249997024u}, + {10444437689515769856u, 14100466137553658767u, 224932457962u}, + {12324712543665782784u, 17887776768825509301u, 234764387800u}, + {13928941951563857920u, 12632656857970087269u, 216969698321u}, + {3975288688270639104u, 8923681664054686256u, 17684817700u}, + {11141905478114607104u, 6213926103737837599u, 36483753752u}, + {4611686018427387904u, 1233118281776157762u, 24336857609u}, + {0u, 30716279628678784u, 9066847476u}, + {0u, 15775734650898546688u, 244001665132u}, + {0u, 976806005729918976u, 108855204289u}, + {0u, 12460098853279891456u, 193052952759u}, + {0u, 5635665595421687808u, 183675463312u}, + {0u, 1805943450575568896u, 144305510044u}, + {0u, 11529215046068469760u, 156097900390u}, + {0u, 0u, 102625000000u}, + {0u, 0u, 64000000000u}, + {4398362855256705725u, 38392u, 0u}, + {2812083125569302717u, 38392238435728u, 0u}, + {12868509142973100603u, 4564018338575530435u, 2081u}, + {8726243776748165726u, 16553437246451512014u, 33247415929u}, + {358304413426858117u, 4339777136957372927u, 121897363631u}, + {3180720351566429470u, 18439463366554654697u, 175235259789u}, + {14053818240400098784u, 1370067356680643003u, 141999605312u}, + {7340140541492429288u, 4210124040914115013u, 64074271500u}, + {1323571167904965058u, 10692225626142609720u, 12228231281u}, + {14463851737583396026u, 11592856673895384344u, 113579626712u}, + {15122784818916048486u, 10284479231227406269u, 216628450019u}, + {13557974621377508955u, 4961071383534266431u, 227557522736u}, + {17525172074563876264u, 10960611551445686988u, 48268940218u}, + {15148880683074215967u, 14616396723115619209u, 186594175942u}, + {6744828147558597936u, 1025604265437492803u, 198792356454u}, + {9799290779647971692u, 11711588454892179178u, 102055598118u}, + {11170890203898678105u, 5580373263251565705u, 38634886482u}, + {7068779781287527905u, 14109334653033148931u, 82302512640u}, + {14474741922505540911u, 2899414033769399895u, 764868564u}, + {17107062680405191514u, 13233457234892808147u, 212157177549u}, + {2712598571300237005u, 3287946691509034862u, 205717387154u}, + {3767556054903418641u, 5488480288717445911u, 146178239947u}, + {18158239681706277628u, 11687233053874362630u, 203297531112u}, + {10531652712128330681u, 6783772100089274577u, 232633566173u}, + {9548395326934120567u, 7898291058728402485u, 221367749022u}, + {15875647850297719390u, 4423684977486598491u, 158428167216u}, + {8215825295203192574u, 2750833684599526706u, 48239808443u}, + {12747310908260543144u, 15669689830489025709u, 187149122992u}, + {77706528053613642u, 15117307274214954517u, 176849455587u}, + {6024737704056756146u, 8148639818575698175u, 227819510869u}, + {6819452388570089667u, 13006484426078994901u, 85441738649u}, + {13695926775373186254u, 10287496057845513526u, 153705082933u}, + {3746531715392682132u, 14159876032966532430u, 53557686278u}, + {4717376233154528116u, 15742212196465548019u, 6767608417u}, + {385190957950313369u, 2892220461917134150u, 97853387033u}, + {12388374310648616082u, 7487151560715393883u, 25156787585u}, + {1078067332084407770u, 7245756744165177933u, 129405879299u}, + {3257295319358714850u, 3067122860671533987u, 3392793260u}, + {1545453099660723457u, 8135043905834122525u, 172166269063u}, + {7495477664653506341u, 14730019368921022572u, 135441001613u}, + {7225503732673614354u, 495969939682055458u, 141798515950u}, + {3935478326103643956u, 5617761407265775598u, 238026886584u}, + {10082240682742686210u, 2087044847072781811u, 184304539456u}, + {10838712705567897138u, 15929674232061203330u, 64113138927u}, + {2142546572501643680u, 8658086469608285873u, 239863549370u}, + {7893042119150331392u, 18369871790780313570u, 186469355807u}, + {12084811642251302615u, 3545648451947416750u, 31995832745u}, + {15317234482572954775u, 13347376792767929959u, 169192209987u}, + {2283226355108359361u, 14482164459838203025u, 67723562745u}, + {13359725152575722127u, 8899577765623565820u, 249785079708u}, + {13126551011491594557u, 7095320096604405719u, 156482447077u}, + {3598021288691861269u, 2968593824439315788u, 229384638073u}, + {16462621795896662961u, 12621408323612585636u, 121160927793u}, + {14682112756964627332u, 3954422936414648259u, 49684207916u}, + {7174112100896070218u, 17143730087577690191u, 44214369696u}, + {5023109019590616064u, 5033045529399041876u, 160929363470u}, + {10765223023086141440u, 15857648521994521781u, 14272841944u}, + {8228137177297453056u, 16655573486499109541u, 216859644848u}, + {2891199497780592640u, 16652154439190075858u, 176902900447u}, + {15294857653247803392u, 18016950600164130638u, 223902715100u}, + {14303432416528695296u, 2086292996072613910u, 220976700849u}, + {0u, 17324462585194799521u, 177113098169u}, + {0u, 11079151463184927232u, 185939160998u}, + {0u, 5239846817488961536u, 166600602004u}, + {0u, 2778806963520143360u, 148284052665u}, + {0u, 6240890740138835968u, 185150639427u}, + {0u, 17250651344549707776u, 67338319364u}, + {0u, 4197354852709302272u, 4935159683u}, + {0u, 9223372036854775808u, 131227539062u}, + {0u, 0u, 118500000000u}, + {17118225092618494573u, 585819067u, 0u}, + {13385738875341807559u, 585819067927980841u, 0u}, + {8272682717439277193u, 5654803392547571318u, 31757315u}, + {13402436483369350083u, 2931628102185393332u, 3306547506u}, + {10946328903241612536u, 15964697617980212305u, 50158923877u}, + {16265808923426731252u, 450380868305846606u, 101865447992u}, + {11080374459871185177u, 14631133530814566148u, 56024415195u}, + {1240761893433831916u, 31969822783742095u, 219793155338u}, + {367264070493390483u, 10437269029385743245u, 10001733087u}, + {2863675693461092905u, 15196146496377392433u, 223565805487u}, + {7511929581752138999u, 4409099735137480938u, 175823784752u}, + {11154557789993845753u, 10644987914903248118u, 48239017775u}, + {8325416539745948522u, 3154431617534062973u, 47577065951u}, + {17745129874679852617u, 11702056331247960454u, 223171002080u}, + {1074820986392253357u, 15575315065965259114u, 224634369744u}, + {7820952682162838597u, 10759747609480050226u, 208844339521u}, + {8215518006273528603u, 12538236653960743718u, 65583287086u}, + {9680426791089900133u, 17857942663978005403u, 46679699170u}, + {16128495723604797412u, 11443004154750813211u, 226968081011u}, + {2264789053583348885u, 4004313188770806737u, 115620326498u}, + {11175458488686298083u, 17134872954824183228u, 98217074252u}, + {11026777810412287617u, 2659553912986171234u, 76928883324u}, + {16199890034895598640u, 9501854300969137926u, 124144174706u}, + {9094320719494763752u, 14528169966301018150u, 114515096553u}, + {1250835564687222832u, 18172091996515901778u, 233787573671u}, + {15362466642459337025u, 1133541705604751035u, 167985111081u}, + {7831109835595423828u, 18280349987988641497u, 41061449418u}, + {15426237284335022429u, 9936015874712336386u, 202990979758u}, + {15636308361455434548u, 15876720399740689614u, 174538632499u}, + {13967173875944980328u, 8618117825152456982u, 51860678737u}, + {18245979923595824097u, 8085525680745921564u, 81467189103u}, + {11335054479675278263u, 8072355444669730953u, 111438317225u}, + {11165339882630461707u, 9395030504766848294u, 169437603265u}, + {15944437408299395922u, 3537903114058185903u, 193509305624u}, + {15806416348777321161u, 2126094743961928691u, 24191790112u}, + {4201030477408556248u, 289185362555601115u, 32115255827u}, + {9485474942554588907u, 16909937501450129614u, 19015676769u}, + {18238757647663230541u, 14449642060360499058u, 97916689548u}, + {4642199687824746379u, 12433818908498244393u, 140783316665u}, + {6134575894869364037u, 11884444034578008581u, 185674038673u}, + {11524208547121316008u, 988625838444140793u, 145644257002u}, + {2734683241527878366u, 1675370907158909973u, 234053593514u}, + {10629223456178675171u, 15920186275316934067u, 170090822038u}, + {2788042336985254064u, 5600921198503757726u, 150863035027u}, + {17285498758066142502u, 10457357161776341741u, 147303626546u}, + {5525538192421886436u, 12225356765775740093u, 50566894467u}, + {11414325503043801888u, 4486633318598164537u, 131662737918u}, + {7246608114685173259u, 10302486602879381361u, 254243220879u}, + {1007884269852184608u, 15536428611301239541u, 143558498917u}, + {13823717876510029312u, 12026126645955462603u, 101842231482u}, + {12487410768239429317u, 14877968141142123551u, 186651937631u}, + {3361062421598631942u, 734560801645383190u, 95806536269u}, + {17853337379088328475u, 15648943144911081638u, 77039820620u}, + {11551561037491869885u, 13664182862003235646u, 76848330907u}, + {11480877996635204802u, 3895127525902132786u, 155740736837u}, + {5527488381934471912u, 5249187334214137467u, 69211155286u}, + {11143438404407726080u, 10642260063359027505u, 86284559015u}, + {6472279730688098304u, 783598951897779422u, 167576918074u}, + {4561816853579563008u, 5538576558607624843u, 58042478984u}, + {2888714464062865408u, 15974581187564609611u, 136300246836u}, + {16258276129784201216u, 7474269406918257428u, 52865983781u}, + {720575940379279360u, 8045286838779138019u, 37405180956u}, + {0u, 8184246376556341732u, 28436135873u}, + {0u, 1493267152679331840u, 193443668885u}, + {0u, 10179074811222818816u, 149080950174u}, + {0u, 3892499202005008384u, 158551808751u}, + {0u, 10341173215925108736u, 239211012804u}, + {0u, 6230307872002015232u, 196560596123u}, + {0u, 9295429630892703744u, 155337745666u}, + {0u, 0u, 2503906250u}, + {0u, 0u, 202000000000u}, + {16409970870640346804u, 8938u, 0u}, + {7721907286269370594u, 8938889586303u, 0u}, + {14300743897882155131u, 10665454627995623288u, 484u}, + {2068482633821123575u, 16803537892767562832u, 228578175453u}, + {4922882895416406094u, 8099123106849104444u, 221910921614u}, + {9317632875623428410u, 7077413686679401728u, 142439054343u}, + {5693844901999766254u, 13536636358372449666u, 7383667364u}, + {11569484900262102262u, 7280632235418610318u, 164733822527u}, + {3138170119352085637u, 6187823673116858809u, 63394683864u}, + {950584692575235243u, 8624343686231740255u, 216335442593u}, + {8136430299747162645u, 806211610822132771u, 161467526608u}, + {6698711700804594470u, 18388078233202190882u, 208043704818u}, + {17401191571004302008u, 7628864426595573600u, 242996819718u}, + {4721732028538188150u, 4530799784343874981u, 6413561569u}, + {2984214103553086219u, 8561580552078486438u, 225245615148u}, + {13128675202005662068u, 13349114951221999594u, 44464124211u}, + {14638512997670672834u, 10029144738508991772u, 51723656971u}, + {12942085665769692438u, 12601907197916268979u, 11543681025u}, + {14131134357119205086u, 1329580921391066941u, 1683150758u}, + {8921946894736102919u, 3198179786356761112u, 166072076726u}, + {5601522560505809989u, 11406753413634654142u, 182173373673u}, + {8602606493507716808u, 11131812960525182090u, 233618361341u}, + {8576789731078566487u, 14299636753645227208u, 253603456789u}, + {17881118138842658549u, 12964114684643663326u, 21775184861u}, + {11624372674432704923u, 5019257593846306316u, 221702786065u}, + {6826284072848095635u, 6929086798159998121u, 17272094499u}, + {1646466632033733563u, 18359765766933703649u, 35375626547u}, + {17871081657060299180u, 9993076234752063198u, 51995284896u}, + {15910893124677544709u, 3257189215046584509u, 160541725748u}, + {11031217459450580944u, 2905234736672690348u, 52176572581u}, + {13554987390037243094u, 12064985302079670056u, 165157493090u}, + {15026714590903687870u, 14315096064942799930u, 98654044163u}, + {4406379654994689200u, 11943971043551974038u, 3776022912u}, + {13596329092861950242u, 12472773152119929647u, 128647483967u}, + {284812388227373260u, 7791259796982183085u, 63676150387u}, + {9285079159392309382u, 16866829442051086686u, 115422365039u}, + {15046108141952711893u, 3702498393844653053u, 111914352656u}, + {13795366909944958311u, 2057239613841701716u, 16200712840u}, + {12909920641180059961u, 17201969976738286226u, 136111523182u}, + {5333762939889788252u, 18271566505443461640u, 110932520660u}, + {6411331390005944495u, 18368509115417119804u, 212990503604u}, + {1447104583224217723u, 7613923684154518587u, 180995758874u}, + {11940049226167932871u, 17984805084714865232u, 26412751629u}, + {9772290783590472385u, 4220802739051410373u, 13974958237u}, + {16351989577831528444u, 17812459042810815760u, 157228810174u}, + {4376738725895725097u, 10629526089664605307u, 190965615339u}, + {13851276297739812763u, 17437443267816548473u, 235576227763u}, + {12641996203470333509u, 12506371893701049304u, 179945285693u}, + {7707081716407945022u, 15737221540003030739u, 61677971778u}, + {417638323657040024u, 2358380859011605513u, 66853116489u}, + {16438047707692449100u, 10042972713837039706u, 73127848082u}, + {14850108107043306316u, 13424397272769642495u, 146544430641u}, + {10423290807904720835u, 6867102315755663029u, 49727738034u}, + {16951162310302339314u, 8690748404825506734u, 178372266362u}, + {2752437506572397322u, 956229930815387710u, 122471126415u}, + {3925815842962784589u, 7734449506297687888u, 143051837328u}, + {5274166674003605291u, 16332184961683848151u, 144419285347u}, + {5538963350863452832u, 15580777817612768828u, 99885369520u}, + {16900671634439028736u, 17404245271944696092u, 176844635657u}, + {2326997710751662080u, 13201420160494469229u, 9943486026u}, + {12327726161625874432u, 16511717657124068078u, 74715650420u}, + {5756455743825903616u, 14131292492116594062u, 116895102007u}, + {3018537650245074944u, 18429136031865875691u, 55766058900u}, + {16717361816799281152u, 2563978348305862197u, 148999045466u}, + {0u, 14239974392147482896u, 90138993544u}, + {0u, 11164201396098998272u, 136771950558u}, + {0u, 7116971104932986880u, 222605212570u}, + {0u, 12437629862867369984u, 154385811776u}, + {0u, 16501893821638901760u, 64674245265u}, + {0u, 10649324268870959104u, 145894569456u}, + {0u, 7205759403792793600u, 240577301025u}, + {0u, 0u, 33390625000u}, + {0u, 0u, 232000000000u}, + {11997425759292732054u, 136396630u, 0u}, + {11491152661270395161u, 136396630650381753u, 0u}, + {18181063258234881272u, 3016823727048309817u, 7394076u}, + {2466921813123869732u, 17405973192644624358u, 28163542341u}, + {8430880678232179465u, 8937219978302591747u, 69943579697u}, + {6738034873677997533u, 15178463196824222317u, 49484487665u}, + {7678250951042929246u, 11979404627460330594u, 241822826138u}, + {1853560606315563193u, 2006448052689740002u, 154649404826u}, + {14942676593409905118u, 16330465320863239865u, 154108769766u}, + {4909892170837638183u, 17136208883957646553u, 230885276298u}, + {16871149368312132405u, 140455118208931867u, 138928955745u}, + {16096130589333770811u, 3964972929179372247u, 97007614087u}, + {12512479187631824282u, 3378050330022776379u, 135214941613u}, + {16980304980540557310u, 6065353437512901255u, 173183124475u}, + {8640919162749295366u, 12768753059854699889u, 251328803468u}, + {7862382415464063513u, 6848720690951013326u, 140692195490u}, + {14534157903009925344u, 10953228058585475132u, 162371269892u}, + {12627464554215107944u, 15539127852083296166u, 4593775682u}, + {2456849734836299173u, 14534853647735598497u, 66842377808u}, + {18428252197697827913u, 1506909603576368170u, 80787935995u}, + {7244734215936736255u, 5475702579938239025u, 251081689733u}, + {14756175050504770087u, 12039747373985783332u, 133296838431u}, + {6764116534566945922u, 17572399137760898460u, 31652676012u}, + {1588822142405565521u, 869552790852091236u, 172952601666u}, + {17053265624843842052u, 4549585778048181804u, 66047138551u}, + {16996891591759999207u, 4121918231767210357u, 247246633539u}, + {8565556232370585876u, 1558397953312543179u, 67223449635u}, + {14464960359145886620u, 6067524298738069781u, 35084480922u}, + {5813189542048784035u, 5811095224555517056u, 154328921151u}, + {9739241026882027025u, 6440894514158997188u, 63315020103u}, + {18175068535675302910u, 4612748874388784257u, 71349161591u}, + {10562697212061761911u, 9908101430749813367u, 119250057617u}, + {4264834835660801368u, 15150017990912190499u, 145537119254u}, + {13019066443690126316u, 17470426264690059239u, 22821284120u}, + {1828040177823321846u, 9615161096851907726u, 24947073705u}, + {11240369830376975668u, 9227932132124142224u, 169521238927u}, + {8886938465302549874u, 4794113194321211621u, 143500247203u}, + {9985240313589688325u, 391512698859146347u, 163259889397u}, + {722909126956573766u, 17209658878068655842u, 245021223945u}, + {5493363474638452381u, 3077364726606876150u, 9932937477u}, + {12410535279213120491u, 1952989567673965814u, 5166824276u}, + {10543108918366869098u, 11172860676923186449u, 84105871776u}, + {12953909016524823995u, 17338078544784947239u, 160605681990u}, + {16505942145872588169u, 4593380466519703278u, 70939899121u}, + {12428594380392015797u, 786884753602720052u, 241249007654u}, + {7528259605829768337u, 17848875822468020539u, 38042657107u}, + {18147447600042811311u, 2899664567187130618u, 83967589497u}, + {12021069431116183911u, 2973178834961857409u, 121157191131u}, + {11819985069665662506u, 11117453141176836727u, 219161176347u}, + {10401877114068152814u, 7535238370146462002u, 27602678342u}, + {4611631138117837942u, 10246175467290865448u, 70408486090u}, + {17200813398607252417u, 1203128834127050464u, 202555446285u}, + {14100466137553658767u, 14518048959078919658u, 13065221744u}, + {17887776768825509301u, 1553474987376920024u, 112787025011u}, + {12632656857970087269u, 14956572380830948369u, 115084214047u}, + {8923681664054686256u, 7594162606042048292u, 31810797413u}, + {6213926103737837599u, 14461296147288811288u, 101411680379u}, + {1233118281776157762u, 18305427728131488265u, 123783948434u}, + {30716279628678784u, 10253208939347909876u, 146992339225u}, + {15775734650898546688u, 6446028915490812012u, 25555827570u}, + {976806005729918976u, 12986063676957432257u, 114349439927u}, + {12460098853279891456u, 9769714697972762807u, 183703975922u}, + {5635665595421687808u, 97429465146664592u, 242529617295u}, + {1805943450575568896u, 16395571728207795868u, 143005281661u}, + {11529215046068469760u, 6331668478323650406u, 125888805724u}, + {0u, 18129911846294207040u, 92343240435u}, + {0u, 9890094564876124160u, 243982824490u}, + {0u, 12290856656987750400u, 42536143100u}, + {0u, 8498454992640802816u, 252666288674u}, + {0u, 5341660584200896512u, 34460702168u}, + {0u, 9288674231451648000u, 216289572000u}, + {0u, 1152921504606846976u, 160503540039u}, + {0u, 0u, 71062500000u}, + {0u, 0u, 160000000000u}, + {4564018338575530435u, 2081u, 0u}, + {16553437246451512014u, 2081247415929u, 0u}, + {4339777136957372927u, 15212079674427582639u, 112u}, + {18439463366554654697u, 10179808126814248333u, 112824648491u}, + {1370067356680643003u, 6066766544199222848u, 43551848504u}, + {4210124040914115013u, 6625308131806923532u, 56328880073u}, + {10692225626142609720u, 9122786786400665713u, 201359158673u}, + {11592856673895384344u, 11932880778639151320u, 145494547262u}, + {10284479231227406269u, 3884040911779255011u, 62646882763u}, + {4961071383534266431u, 13441817515637357872u, 203210554279u}, + {10960611551445686988u, 11628577856022352826u, 167728682387u}, + {14616396723115619209u, 13296656925520243654u, 147630386468u}, + {1025604265437492803u, 5020720704545399398u, 36720813216u}, + {11711588454892179178u, 14121973606499014694u, 160272173814u}, + {5580373263251565705u, 3642481034345420114u, 246765553723u}, + {14109334653033148931u, 9845536238569696768u, 59197459292u}, + {2899414033769399895u, 17655403572195686356u, 92533727588u}, + {13233457234892808147u, 8377495365136654029u, 100957101345u}, + {3287946691509034862u, 13713682649609025426u, 33454144933u}, + {5488480288717445911u, 1367709905452854731u, 165743420226u}, + {11687233053874362630u, 9981467701727208680u, 66074143702u}, + {6783772100089274577u, 6277920117543306205u, 214541096448u}, + {7898291058728402485u, 9344111460418701726u, 340326731u}, + {4423684977486598491u, 4918507011364617264u, 75506545297u}, + {2750833684599526706u, 6554777203830755259u, 145266632799u}, + {15669689830489025709u, 4198262173120265648u, 95355335184u}, + {15117307274214954517u, 8080325935698446819u, 16227588248u}, + {8148639818575698175u, 12797633874200091733u, 152438035346u}, + {13006484426078994901u, 8376502502208665497u, 146693761122u}, + {10287496057845513526u, 9891973386793349173u, 98454091110u}, + {14159876032966532430u, 14877430279003795462u, 102536244951u}, + {15742212196465548019u, 8759933935842067041u, 215806507111u}, + {2892220461917134150u, 3753418510388703513u, 103474876970u}, + {7487151560715393883u, 2961383332545305985u, 42203473225u}, + {7245756744165177933u, 2497674184068629507u, 73160536912u}, + {3067122860671533987u, 15244544070742305452u, 80135399188u}, + {8135043905834122525u, 45953573565810823u, 20826408390u}, + {14730019368921022572u, 3960077421351906445u, 198002491148u}, + {495969939682055458u, 3173330011013883118u, 12214676227u}, + {5617761407265775598u, 11026266219545759160u, 3172026564u}, + {2087044847072781811u, 8886757764964685632u, 196597735089u}, + {15929674232061203330u, 13952322129918090479u, 177481752103u}, + {8658086469608285873u, 4127250666614902202u, 39756356898u}, + {18369871790780313570u, 17649958504065306911u, 34223738706u}, + {3545648451947416750u, 13269305359002216873u, 82956806167u}, + {13347376792767929959u, 16236593433831947843u, 23719330484u}, + {14482164459838203025u, 13580930396682424057u, 180880187493u}, + {8899577765623565820u, 421976357197961116u, 101736223712u}, + {7095320096604405719u, 2962130818798626533u, 224022875384u}, + {2968593824439315788u, 8234383947306356345u, 248160577433u}, + {12621408323612585636u, 4380469931801381425u, 153446386848u}, + {3954422936414648259u, 15279887469027055916u, 160237465750u}, + {17143730087577690191u, 8534542821713755552u, 150828324359u}, + {5033045529399041876u, 7814613482565088782u, 7462658493u}, + {15857648521994521781u, 13771954404705323224u, 189423631045u}, + {16655573486499109541u, 4568173274762548144u, 197746579144u}, + {16652154439190075858u, 8105292616250821343u, 200247641169u}, + {18016950600164130638u, 2923678426777275612u, 81439388793u}, + {2086292996072613910u, 1808633176918384049u, 121158492925u}, + {17324462585194799521u, 18118642609460438969u, 253098046200u}, + {11079151463184927232u, 18138164175864360870u, 248982213583u}, + {5239846817488961536u, 4031433690465792404u, 207983271850u}, + {2778806963520143360u, 5012226396942308537u, 170218544458u}, + {6240890740138835968u, 7889712298793536835u, 74271713337u}, + {17250651344549707776u, 13500762396543628804u, 57427702160u}, + {4197354852709302272u, 501020624068841347u, 144731877796u}, + {9223372036854775808u, 8370653768288261750u, 164027160382u}, + {0u, 647579990023635200u, 62453774050u}, + {0u, 11106569307181154304u, 226035105381u}, + {0u, 10797461613892861952u, 101602088328u}, + {0u, 17627230675448889344u, 136585331566u}, + {0u, 12197735707942322176u, 110955574089u}, + {0u, 12871287735024877568u, 73661240577u}, + {0u, 4611686018427387904u, 1697753906u}, + {0u, 0u, 50250000000u}, + {0u, 0u, 128000000000u}, + {5654803392547571318u, 31757315u, 0u}, + {2931628102185393332u, 31757315306547506u, 0u}, + {15964697617980212305u, 9451803574512021605u, 1721567u}, + {450380868305846606u, 8662766454758138424u, 223512383298u}, + {14631133530814566148u, 9207992007314947035u, 66469609510u}, + {31969822783742095u, 17118602861291201802u, 38499166246u}, + {10437269029385743245u, 11186560605745599967u, 38928001320u}, + {15196146496377392433u, 10505549821532796847u, 40606424665u}, + {4409099735137480938u, 18133667530488679216u, 89569506996u}, + {10644987914903248118u, 10778135771244330799u, 180983028086u}, + {3154431617534062973u, 17087985777033767391u, 118584283910u}, + {11702056331247960454u, 2639185991757283040u, 6926341565u}, + {15575315065965259114u, 5401720287293896400u, 189143070559u}, + {10759747609480050226u, 9816495392633895233u, 95292827843u}, + {12538236653960743718u, 10042051500090034990u, 195532153281u}, + {17857942663978005403u, 11629689537856384738u, 193544380702u}, + {11443004154750813211u, 2099086731766010483u, 30630446733u}, + {4004313188770806737u, 13665537898516458594u, 141113791719u}, + {17134872954824183228u, 16375672064669490764u, 231740810293u}, + {2659553912986171234u, 7770550512184564348u, 53887726961u}, + {9501854300969137926u, 6197048880720627314u, 113421242387u}, + {14528169966301018150u, 17963594118523106281u, 19335942692u}, + {18172091996515901778u, 8255454642407818663u, 36973808388u}, + {1133541705604751035u, 16744201957549498409u, 4447529092u}, + {18280349987988641497u, 17442505417202859722u, 132907705006u}, + {9936015874712336386u, 6383975767786687150u, 174945560113u}, + {15876720399740689614u, 15245442964998335795u, 49346076019u}, + {8618117825152456982u, 2910016124519524433u, 115826457119u}, + {8085525680745921564u, 3847913871169988463u, 31157752290u}, + {8072355444669730953u, 17210451512590059177u, 226208595828u}, + {9395030504766848294u, 17899408909991454145u, 116932980445u}, + {3537903114058185903u, 5920601932753251608u, 221970328901u}, + {2126094743961928691u, 16521781895108979744u, 69320956473u}, + {289185362555601115u, 3697493405554698771u, 57895647591u}, + {16909937501450129614u, 2816108280295732065u, 103200441519u}, + {14449642060360499058u, 14251078772056398988u, 175152661535u}, + {12433818908498244393u, 4543066550096031417u, 31772552528u}, + {11884444034578008581u, 3099369389734296977u, 80246280131u}, + {988625838444140793u, 5243484113636490986u, 195168017151u}, + {1675370907158909973u, 6823370511605197226u, 255284249843u}, + {15920186275316934067u, 11396290277624641942u, 243369895656u}, + {5600921198503757726u, 15934361408437566099u, 232617794133u}, + {10457357161776341741u, 14939272230935131954u, 85863803462u}, + {12225356765775740093u, 7500666177940329347u, 70809859570u}, + {4486633318598164537u, 4806714453065462270u, 242406611928u}, + {10302486602879381361u, 11557851247268441487u, 216260572512u}, + {15536428611301239541u, 10655523157206817381u, 96626552371u}, + {12026126645955462603u, 14769600176490881210u, 51577637067u}, + {14877968141142123551u, 16688495540925795167u, 203800661629u}, + {734560801645383190u, 909793965395524173u, 125904685156u}, + {15648943144911081638u, 12724590949761703756u, 100049320029u}, + {13664182862003235646u, 10810739657314826395u, 93689801457u}, + {3895127525902132786u, 2431218615388671301u, 241586051371u}, + {5249187334214137467u, 4235001167959059286u, 43131796625u}, + {10642260063359027505u, 6253317787396334247u, 145229579873u}, + {783598951897779422u, 9534525563070371898u, 97338993036u}, + {5538576558607624843u, 8392783992374030728u, 140516867666u}, + {15974581187564609611u, 16356257019231647540u, 82454973731u}, + {7474269406918257428u, 12896334001521091877u, 35886674469u}, + {8045286838779138019u, 1427636373320877084u, 37699111667u}, + {8184246376556341732u, 16116755731295043521u, 243077392322u}, + {1493267152679331840u, 15945633911163986837u, 194873691078u}, + {10179074811222818816u, 7510154241072743838u, 198864414546u}, + {3892499202005008384u, 3571560509790395119u, 82407126277u}, + {10341173215925108736u, 3576991649007035076u, 5193614683u}, + {6230307872002015232u, 15509961892750732443u, 91193909105u}, + {9295429630892703744u, 17789791359353349378u, 113840796718u}, + {0u, 18331227331079738314u, 46964386521u}, + {0u, 15386712883100476416u, 217993737824u}, + {0u, 14082462055028752384u, 96834115376u}, + {0u, 12919043128765186048u, 48763411797u}, + {0u, 6125373368465096704u, 85700342731u}, + {0u, 12335992698065387520u, 203332057155u}, + {0u, 2774217370460225536u, 67668735504u}, + {0u, 0u, 16150390625u}, + {0u, 0u, 97000000000u}, + {10665454627995623288u, 484u, 0u}, + {16803537892767562832u, 484578175453u, 0u}, + {8099123106849104444u, 4962829537462579598u, 26u}, + {7077413686679401728u, 5711259460785241095u, 26269035528u}, + {13536636358372449666u, 13845894607204897444u, 8309607995u}, + {7280632235418610318u, 12116633056637003327u, 59750587450u}, + {6187823673116858809u, 2965791047992089560u, 58656843994u}, + {8624343686231740255u, 16021997451315962529u, 218160775854u}, + {806211610822132771u, 3942052271663803856u, 174868554222u}, + {18388078233202190882u, 15669876414782439922u, 238213699081u}, + {7628864426595573600u, 10594415915406145286u, 9849465702u}, + {4530799784343874981u, 10789820553031921377u, 102574324437u}, + {8561580552078486438u, 3989990218583987244u, 213584917344u}, + {13349114951221999594u, 2937341169808224563u, 96216297803u}, + {10029144738508991772u, 16267436558584536843u, 75159233583u}, + {12601907197916268979u, 16221580362814625793u, 47881859502u}, + {1329580921391066941u, 9695437602320209830u, 174879373633u}, + {3198179786356761112u, 10729753156793715126u, 65525590725u}, + {11406753413634654142u, 2609241432056861929u, 197581661084u}, + {11131812960525182090u, 8462663743997037565u, 156141447261u}, + {14299636753645227208u, 14993422143908194069u, 93458761920u}, + {12964114684643663326u, 1307443894537745373u, 192812795043u}, + {5019257593846306316u, 10017257439419829265u, 163070876675u}, + {6929086798159998121u, 16754772009970777891u, 3543036613u}, + {18359765766933703649u, 11722573031602862387u, 197908278010u}, + {9993076234752063198u, 7363764277467092384u, 250635481957u}, + {3257189215046584509u, 6733958494847390772u, 101399190461u}, + {2905234736672690348u, 8799796600227451045u, 189365048621u}, + {12064985302079670056u, 10512023194742249826u, 45477037929u}, + {14315096064942799930u, 4572542132337197059u, 105569857919u}, + {11943971043551974038u, 12600500455757416832u, 127247878005u}, + {12472773152119929647u, 7873789864743195199u, 117683074498u}, + {7791259796982183085u, 15724851676325671539u, 194426839003u}, + {16866829442051086686u, 8748017220462413167u, 219852445917u}, + {3702498393844653053u, 14172589522760466448u, 221474230963u}, + {2057239613841701716u, 9520545591489413768u, 179768297617u}, + {17201969976738286226u, 12488551088392570222u, 145516109810u}, + {18271566505443461640u, 1135798823651241684u, 242677005711u}, + {18368509115417119804u, 11168725610120161972u, 143061571777u}, + {7613923684154518587u, 9580104948718508826u, 193605457828u}, + {17984805084714865232u, 16638722716909738765u, 164519338529u}, + {4220802739051410373u, 15732724012348272797u, 33901986965u}, + {17812459042810815760u, 12269722190021214142u, 149852872677u}, + {10629526089664605307u, 13110655916311972587u, 229665142972u}, + {17437443267816548473u, 6618112997062866867u, 188710730081u}, + {12506371893701049304u, 8457936459015989309u, 97358768624u}, + {15737221540003030739u, 3329167139937134914u, 240458505654u}, + {2358380859011605513u, 5245511557216705097u, 182180474512u}, + {10042972713837039706u, 5655931353280440466u, 144284359751u}, + {13424397272769642495u, 604622132328697393u, 71306608653u}, + {6867102315755663029u, 8673282619234652338u, 13032776631u}, + {8690748404825506734u, 16929477433058445690u, 183470179592u}, + {956229930815387710u, 11036952409253549455u, 8917748810u}, + {7734449506297687888u, 18199392190170386320u, 74598314388u}, + {16332184961683848151u, 9683116091880335715u, 148986591027u}, + {15580777817612768828u, 2993913337608915120u, 51524922775u}, + {17404245271944696092u, 4490779842162392585u, 151162300367u}, + {13201420160494469229u, 946849923353644618u, 207243445663u}, + {16511717657124068078u, 3613491058474899828u, 159051328837u}, + {14131292492116594062u, 14624054199004410935u, 69195887742u}, + {18429136031865875691u, 12088470271991908244u, 126792771566u}, + {2563978348305862197u, 10071980927725011290u, 238655317286u}, + {14239974392147482896u, 2833441711428854664u, 38546003180u}, + {11164201396098998272u, 17655572411864340446u, 236153601182u}, + {7116971104932986880u, 4997642792058747802u, 158957110498u}, + {12437629862867369984u, 11489200787635734848u, 226270922758u}, + {16501893821638901760u, 12983586226429536913u, 6622830822u}, + {10649324268870959104u, 12311150768725063152u, 230703841619u}, + {7205759403792793600u, 8530052476845967905u, 83667388820u}, + {0u, 6282736361499820264u, 148462415071u}, + {0u, 11337164765929082880u, 223340587820u}, + {0u, 8343856200414134272u, 44614588933u}, + {0u, 17889330377156198400u, 5452321350u}, + {0u, 17730714064155312128u, 70969782542u}, + {0u, 7449235258647511040u, 14961183935u}, + {0u, 9943947977234055168u, 191403823852u}, + {0u, 0u, 236539062500u}, + {0u, 0u, 228000000000u}, + {3016823727048309817u, 7394076u, 0u}, + {17405973192644624358u, 7394076163542341u, 0u}, + {8937219978302591747u, 12396245121240683569u, 400833u}, + {15178463196824222317u, 10248996648596888561u, 193672001794u}, + {11979404627460330594u, 11257495103713935002u, 2555599221u}, + {2006448052689740002u, 7555396579247433114u, 117610270032u}, + {16330465320863239865u, 4805022328730367462u, 80409578869u}, + {17136208883957646553u, 7056637817080232586u, 117260480782u}, + {140455118208931867u, 10811411483818434913u, 14382541102u}, + {3964972929179372247u, 16962406704495245447u, 46586087790u}, + {3378050330022776379u, 18074517319117194669u, 110919533909u}, + {6065353437512901255u, 3702019776117654523u, 85979821547u}, + {12768753059854699889u, 3551977551381082764u, 235200686894u}, + {6848720690951013326u, 16442608985936005282u, 46192553088u}, + {10953228058585475132u, 3580046275479139588u, 128891355619u}, + {15539127852083296166u, 8737412692712715330u, 227194074697u}, + {14534853647735598497u, 3082033243045084752u, 73473656091u}, + {1506909603576368170u, 16401023756841128699u, 27167077356u}, + {5475702579938239025u, 7520296082779572869u, 236889101279u}, + {12039747373985783332u, 9854104766152464159u, 223407676067u}, + {17572399137760898460u, 14169188802648310188u, 163534192089u}, + {869552790852091236u, 2018609909210367042u, 217768113264u}, + {4549585778048181804u, 8270271948267674359u, 112109429062u}, + {4121918231767210357u, 12320338602894572099u, 70448332340u}, + {1558397953312543179u, 17538536685990080547u, 52667886893u}, + {6067524298738069781u, 15833914616956760474u, 45950765978u}, + {5811095224555517056u, 6137696141415969855u, 154858358231u}, + {6440894514158997188u, 9757490468419438919u, 215332725174u}, + {4612748874388784257u, 3566639201356598903u, 182528954618u}, + {9908101430749813367u, 9760900035773954449u, 250193347898u}, + {15150017990912190499u, 3873778773990716438u, 58529139451u}, + {17470426264690059239u, 2295668377270167832u, 251209997968u}, + {9615161096851907726u, 1791721710912807593u, 144124448432u}, + {9227932132124142224u, 10571009006922683279u, 176097129428u}, + {4794113194321211621u, 9840791932778184867u, 212573055546u}, + {391512698859146347u, 11525464956561274613u, 58533470399u}, + {17209658878068655842u, 4435781488897895433u, 191624796707u}, + {3077364726606876150u, 6395563367070996741u, 35240464196u}, + {1952989567673965814u, 15538690795135662932u, 68346704184u}, + {11172860676923186449u, 16294558813563371936u, 56842354115u}, + {17338078544784947239u, 4942096228426070342u, 195883329803u}, + {4593380466519703278u, 6910116424372647153u, 11267911573u}, + {786884753602720052u, 17923400669760829478u, 149374598161u}, + {17848875822468020539u, 4134686917293039955u, 17971629497u}, + {2899664567187130618u, 16857102463116098681u, 185224141826u}, + {2973178834961857409u, 11364321508775167451u, 2913825355u}, + {11117453141176836727u, 7966947780972783899u, 75616061103u}, + {7535238370146462002u, 11261055695926686278u, 175431889104u}, + {10246175467290865448u, 9227040437353594058u, 208610463052u}, + {1203128834127050464u, 7185344074282882061u, 76500198864u}, + {14518048959078919658u, 14197856148610578032u, 208389518282u}, + {1553474987376920024u, 885688687260429427u, 202769667324u}, + {14956572380830948369u, 17407816160380305183u, 252048013279u}, + {7594162606042048292u, 17812728703806357349u, 223943679604u}, + {14461296147288811288u, 17120198191964319867u, 116965629957u}, + {18305427728131488265u, 12091952048375408786u, 5928087803u}, + {10253208939347909876u, 405056939269888281u, 251655506034u}, + {6446028915490812012u, 12485440679452408690u, 114021958180u}, + {12986063676957432257u, 8394369900823444407u, 36676837095u}, + {9769714697972762807u, 2877421667354294258u, 231455059704u}, + {97429465146664592u, 2676980714750756239u, 248155985341u}, + {16395571728207795868u, 6119309228579057021u, 189145119415u}, + {6331668478323650406u, 18203256146533333852u, 183331728417u}, + {18129911846294207040u, 351919978865493747u, 33986800493u}, + {9890094564876124160u, 5190010931882390570u, 109019077620u}, + {12290856656987750400u, 6982466386088036604u, 244281351056u}, + {8498454992640802816u, 4707293888784996898u, 144378520261u}, + {5341660584200896512u, 690306801165964760u, 197255182913u}, + {9288674231451648000u, 12456770961278956704u, 65037421606u}, + {1152921504606846976u, 16946092489294063943u, 38675282906u}, + {0u, 11098404173866185376u, 218918649514u}, + {0u, 15152070965853306880u, 170601645695u}, + {0u, 17370091362040414208u, 127821395412u}, + {0u, 10141938552171134976u, 212941634539u}, + {0u, 10586988556645826560u, 235549795590u}, + {0u, 12169852093061922816u, 6573921799u}, + {0u, 16717361816799281152u, 7659729003u}, + {0u, 0u, 107906250000u}, + {0u, 0u, 16000000000u}, + {15212079674427582639u, 112u, 0u}, + {10179808126814248333u, 112824648491u, 0u}, + {6066766544199222848u, 2144184049294538808u, 6u}, + {6625308131806923532u, 4108002197393276873u, 6116236450u}, + {9122786786400665713u, 6446230217393892753u, 162222695245u}, + {11932880778639151320u, 5571068025259989822u, 77349450840u}, + {3884040911779255011u, 14804812668872528331u, 88302008202u}, + {13441817515637357872u, 17369928488562523047u, 138802570502u}, + {11628577856022352826u, 2967474173531035027u, 6941625710u}, + {13296656925520243654u, 5291425437992807716u, 110160867097u}, + {5020720704545399398u, 14219547193739388064u, 25286848747u}, + {14121973606499014694u, 17720313647158217462u, 235770843197u}, + {3642481034345420114u, 12334850628290578491u, 61960620127u}, + {9845536238569696768u, 7818499847417334620u, 95668673592u}, + {17655403572195686356u, 136007040922198372u, 56423841726u}, + {8377495365136654029u, 8523477092112604449u, 190007372956u}, + {13713682649609025426u, 367934822655966629u, 156462058619u}, + {1367709905452854731u, 12964987687054730050u, 123019945786u}, + {9981467701727208680u, 15267036012420885462u, 58702833390u}, + {6277920117543306205u, 11142900264750765568u, 238827627680u}, + {9344111460418701726u, 13680181547777718603u, 160604057833u}, + {4918507011364617264u, 13001922925761426065u, 233741604127u}, + {6554777203830755259u, 2397730045956515935u, 31704835654u}, + {4198262173120265648u, 4482395522588406288u, 70129981206u}, + {8080325935698446819u, 3255525722490493080u, 22242991148u}, + {12797633874200091733u, 836222287193822098u, 44176482403u}, + {8376502502208665497u, 420898743993182306u, 99045331701u}, + {9891973386793349173u, 11652649973356574054u, 245022816966u}, + {14877430279003795462u, 15058402726661910231u, 198631691420u}, + {8759933935842067041u, 9600134495208339559u, 156816317647u}, + {3753418510388703513u, 14626343323989004842u, 207520424333u}, + {2961383332545305985u, 6813981265331086665u, 141792895660u}, + {2497674184068629507u, 10281745288790487888u, 172369386664u}, + {15244544070742305452u, 17569829347075761940u, 168557374528u}, + {45953573565810823u, 7654580675237889478u, 64952462357u}, + {3960077421351906445u, 16194838649686212364u, 21414955649u}, + {3173330011013883118u, 6495102772252453635u, 129877923962u}, + {11026266219545759160u, 14935159852819761348u, 122352100226u}, + {8886757764964685632u, 17381879863441579697u, 130809636637u}, + {13952322129918090479u, 9062335510435372583u, 29942273595u}, + {4127250666614902202u, 7569219009130126626u, 59491270192u}, + {17649958504065306911u, 12652124168176193362u, 48410328184u}, + {13269305359002216873u, 8940200224697247767u, 120685873025u}, + {16236593433831947843u, 5600570701927432884u, 129484649225u}, + {13580930396682424057u, 2018432801986093157u, 9303607546u}, + {421976357197961116u, 8235849749361824736u, 250109419461u}, + {2962130818798626533u, 9705097287982370040u, 197446466309u}, + {8234383947306356345u, 3517483139049842585u, 5526114378u}, + {4380469931801381425u, 958281614186777760u, 74190683143u}, + {15279887469027055916u, 7336473432636108950u, 7051948550u}, + {8534542821713755552u, 12955383920176764423u, 6397711021u}, + {7814613482565088782u, 10735469126281273789u, 173702312769u}, + {13771954404705323224u, 8637888232514730693u, 65581970947u}, + {4568173274762548144u, 6806336737533581000u, 3468260859u}, + {8105292616250821343u, 16142569672872330321u, 251368972253u}, + {2923678426777275612u, 8141285259947963513u, 221875090455u}, + {1808633176918384049u, 5220241098754220797u, 23441339958u}, + {18118642609460438969u, 154438799943119608u, 54282989837u}, + {18138164175864360870u, 2226876628677628879u, 13008372144u}, + {4031433690465792404u, 17219557081221357482u, 176120719223u}, + {5012226396942308537u, 15401507148161015114u, 119933474059u}, + {7889712298793536835u, 8842629766613985337u, 11834917375u}, + {13500762396543628804u, 3180100571546071440u, 255479359920u}, + {501020624068841347u, 7740848704392475044u, 176172393597u}, + {8370653768288261750u, 2014314126623495998u, 125419632249u}, + {647579990023635200u, 11209566016506885858u, 121109196187u}, + {11106569307181154304u, 7117166613733441125u, 155607671791u}, + {10797461613892861952u, 4197646860931880328u, 239385822375u}, + {17627230675448889344u, 5487263271238026094u, 167227554892u}, + {12197735707942322176u, 18148076225293562697u, 76297465137u}, + {12871287735024877568u, 9127276943027950849u, 49983809183u}, + {4611686018427387904u, 9691696125379324722u, 159494790674u}, + {0u, 13102362262487705216u, 18525387899u}, + {0u, 8929385439893192704u, 123710280481u}, + {0u, 11891353410743566336u, 33484062954u}, + {0u, 1587423090877399040u, 234644631560u}, + {0u, 3489137423026225152u, 8086054378u}, + {0u, 13046928120492326912u, 234189146518u}, + {0u, 11529215046068469760u, 150707275390u}, + {0u, 0u, 126625000000u}, + {0u, 0u, 64000000000u}, + {9451803574512021605u, 1721567u, 0u}, + {8662766454758138424u, 1721567512383298u, 0u}, + {9207992007314947035u, 6674960280855494694u, 93326u}, + {17118602861291201802u, 16378845781483497510u, 142361850321u}, + {11186560605745599967u, 17606907750956804392u, 209887899008u}, + {10505549821532796847u, 13225609159240506969u, 128954472381u}, + {18133667530488679216u, 2668084873338435252u, 189716961709u}, + {10778135771244330799u, 14802814305275861366u, 173144637170u}, + {17087985777033767391u, 8005510553372365574u, 242802462171u}, + {2639185991757283040u, 12748500143273514429u, 219433979596u}, + {5401720287293896400u, 10393733905569036127u, 204691097577u}, + {9816495392633895233u, 603389089974790339u, 233563445444u}, + {10042051500090034990u, 2033494532597735873u, 196032709788u}, + {11629689537856384738u, 9204796763694620958u, 156110235959u}, + {2099086731766010483u, 7826260310402107021u, 55498993032u}, + {13665537898516458594u, 10122690201685169383u, 136424262421u}, + {16375672064669490764u, 7438455564568110133u, 21548752135u}, + {7770550512184564348u, 2805412574380520817u, 7403239484u}, + {6197048880720627314u, 7250965427231182867u, 60152081720u}, + {17963594118523106281u, 8136242944826085924u, 56393075623u}, + {8255454642407818663u, 15357191647956011780u, 167441066613u}, + {16744201957549498409u, 7369614426695395460u, 117832515027u}, + {17442505417202859722u, 10886957545142526638u, 211399507598u}, + {6383975767786687150u, 2030047207417538097u, 142590183151u}, + {15245442964998335795u, 11557093828502314355u, 239110049079u}, + {2910016124519524433u, 15201062539664128543u, 55626511311u}, + {3847913871169988463u, 8846936323343880674u, 207824051251u}, + {17210451512590059177u, 1485291750116245364u, 51479593379u}, + {17899408909991454145u, 2076024439668322013u, 163080517827u}, + {5920601932753251608u, 7029497773682748741u, 195112541510u}, + {16521781895108979744u, 16333533921668749881u, 70381069837u}, + {3697493405554698771u, 2065057316131928423u, 13885442648u}, + {2816108280295732065u, 7800502648925570223u, 88111946981u}, + {14251078772056398988u, 17011619967093802015u, 229422866095u}, + {4543066550096031417u, 5368819344429198672u, 175922201766u}, + {3099369389734296977u, 15598879366754275267u, 166291044279u}, + {5243484113636490986u, 16393893486035835647u, 183845616944u}, + {6823370511605197226u, 12042046205096920307u, 48888714746u}, + {11396290277624641942u, 15437070428008474344u, 250652800632u}, + {15934361408437566099u, 13704569163204647509u, 120836845264u}, + {14939272230935131954u, 18192483750856993350u, 208742926182u}, + {7500666177940329347u, 5152535865317963250u, 102986216520u}, + {4806714453065462270u, 17512614083933854680u, 72279319528u}, + {11557851247268441487u, 14481918350603613536u, 232949360711u}, + {10655523157206817381u, 16124419709964004915u, 71785066366u}, + {14769600176490881210u, 18088011566435813579u, 126874106543u}, + {16688495540925795167u, 15008862380698848893u, 175980553071u}, + {909793965395524173u, 18160498644611827812u, 111813632059u}, + {12724590949761703756u, 3604680497457231965u, 59984482604u}, + {10810739657314826395u, 5957615565551495921u, 44195410121u}, + {2431218615388671301u, 17528455034961565995u, 201322962986u}, + {4235001167959059286u, 8503772325120113809u, 42950219451u}, + {6253317787396334247u, 8501492578048509537u, 187460990421u}, + {9534525563070371898u, 2296237701094386060u, 213460866836u}, + {8392783992374030728u, 3753593040591076946u, 20124479295u}, + {16356257019231647540u, 8518075399775653155u, 63203482686u}, + {12896334001521091877u, 12757855675959554597u, 62461765792u}, + {1427636373320877084u, 121631169379748595u, 160691604742u}, + {16116755731295043521u, 16679062494579173314u, 6006593638u}, + {15945633911163986837u, 10739912744743898054u, 102904173789u}, + {7510154241072743838u, 9367340677776287570u, 221582211836u}, + {3571560509790395119u, 12227321512794715397u, 252507804555u}, + {3576991649007035076u, 7241061891859170651u, 139662844427u}, + {15509961892750732443u, 13148571323079237489u, 11392538751u}, + {17789791359353349378u, 12509763434355012654u, 127712785479u}, + {18331227331079738314u, 11812768946960181977u, 71678155634u}, + {15386712883100476416u, 14170358803552564832u, 114640371487u}, + {14082462055028752384u, 18179989524780635952u, 31768176689u}, + {12919043128765186048u, 17091718978514754901u, 49985539206u}, + {6125373368465096704u, 7394768384359232459u, 134926543942u}, + {12335992698065387520u, 6778628272692852803u, 70400871197u}, + {2774217370460225536u, 18193335045875234320u, 29367470174u}, + {0u, 1378519212560967521u, 94986262669u}, + {0u, 4677732610631043584u, 141074729676u}, + {0u, 17296098591070486528u, 204253580392u}, + {0u, 7343735382392963072u, 104937623383u}, + {0u, 14525996728454217728u, 87398104692u}, + {0u, 9691359370008330240u, 116787455860u}, + {0u, 3044433348102455296u, 116525369644u}, + {0u, 9223372036854775808u, 44165039062u}, + {0u, 0u, 214500000000u}, + {4962829537462579598u, 26u, 0u}, + {5711259460785241095u, 26269035528u, 0u}, + {13845894607204897444u, 7822291454600056379u, 1u}, + {12116633056637003327u, 8201586317771250746u, 1424047269u}, + {2965791047992089560u, 3278889188817135834u, 165444608885u}, + {16021997451315962529u, 1710725240251040430u, 117177748939u}, + {3942052271663803856u, 1850175733663425006u, 203092738601u}, + {15669876414782439922u, 9147599666163914249u, 41100298227u}, + {10594415915406145286u, 10221885933644344166u, 243495892371u}, + {10789820553031921377u, 14901479793736678101u, 147554129546u}, + {3989990218583987244u, 5181831442059703136u, 138807810838u}, + {2937341169808224563u, 6396246577759793483u, 22280907645u}, + {16267436558584536843u, 14167229556464870447u, 125346741221u}, + {16221580362814625793u, 2969982933326311854u, 229768007053u}, + {9695437602320209830u, 7892677766222018881u, 141161003097u}, + {10729753156793715126u, 798698968922663621u, 89427862919u}, + {2609241432056861929u, 15926812109043458972u, 135043297557u}, + {8462663743997037565u, 8663842590352697437u, 21863394214u}, + {14993422143908194069u, 17093523026636671168u, 166469667847u}, + {1307443894537745373u, 839764004742743203u, 7926641740u}, + {10017257439419829265u, 16894643909298232323u, 76045523697u}, + {16754772009970777891u, 9066702926218949317u, 241915860481u}, + {11722573031602862387u, 9119392417260546810u, 1491506950u}, + {7363764277467092384u, 9723021096578315109u, 6494363253u}, + {6733958494847390772u, 14787464248751217597u, 117527086029u}, + {8799796600227451045u, 3733434565920249133u, 205801630043u}, + {10512023194742249826u, 6643788868836820841u, 91202389893u}, + {4572542132337197059u, 4729646697422664063u, 133360160516u}, + {12600500455757416832u, 4090144564201555829u, 4256394661u}, + {7873789864743195199u, 2109480737093400002u, 165221727181u}, + {15724851676325671539u, 16577155033369419739u, 205114355179u}, + {8748017220462413167u, 745377248603805917u, 235898649375u}, + {14172589522760466448u, 11305561465807999667u, 31040406981u}, + {9520545591489413768u, 2211245518782892177u, 197612875715u}, + {12488551088392570222u, 14170095199249735666u, 195119871859u}, + {1135798823651241684u, 17849973668116118927u, 115768162399u}, + {11168725610120161972u, 9020960204585720001u, 95967649011u}, + {9580104948718508826u, 10807134002871850916u, 243489027232u}, + {16638722716909738765u, 3925122626254791201u, 160585855908u}, + {15732724012348272797u, 17208463291312718997u, 164212781323u}, + {12269722190021214142u, 5145077219589447653u, 11932872664u}, + {13110655916311972587u, 17602397765035489468u, 216278915194u}, + {6618112997062866867u, 16422643262490753377u, 122954227894u}, + {8457936459015989309u, 2902509461400906224u, 182890273275u}, + {3329167139937134914u, 3422418805967265206u, 251157345353u}, + {5245511557216705097u, 4228874576277237392u, 73185529695u}, + {5655931353280440466u, 2553488530807495751u, 95229247750u}, + {604622132328697393u, 11546099176912486413u, 6138424890u}, + {8673282619234652338u, 10460791037534167991u, 58625915290u}, + {16929477433058445690u, 8127117908566000904u, 154567080618u}, + {11036952409253549455u, 11541304458088287306u, 170440571944u}, + {18199392190170386320u, 6249718665174839700u, 40625655368u}, + {9683116091880335715u, 13102508413386290995u, 72338797927u}, + {2993913337608915120u, 6274675218640661911u, 103710288404u}, + {4490779842162392585u, 3404497118599817167u, 20340150825u}, + {946849923353644618u, 11258566093988562335u, 41184558158u}, + {3613491058474899828u, 16762592482501635397u, 78610328090u}, + {14624054199004410935u, 5550125446725071998u, 26908701959u}, + {12088470271991908244u, 6370033225258510318u, 7300872903u}, + {10071980927725011290u, 1503521728674735398u, 199345320193u}, + {2833441711428854664u, 4250415082606384364u, 1081506076u}, + {17655572411864340446u, 6020091901030562974u, 28230415463u}, + {4997642792058747802u, 16288222967151527138u, 103326349835u}, + {11489200787635734848u, 6377016228656203782u, 11882986336u}, + {12983586226429536913u, 8378856515587563750u, 96345698742u}, + {12311150768725063152u, 15812881490200838483u, 182454218721u}, + {8530052476845967905u, 4548570371183413652u, 225857218023u}, + {6282736361499820264u, 16731431495283420383u, 231246578493u}, + {11337164765929082880u, 14737727629551135532u, 61907012718u}, + {8343856200414134272u, 12413722258104293893u, 110798933815u}, + {17889330377156198400u, 800899742400762438u, 55672949232u}, + {17730714064155312128u, 603197008376033550u, 240043416862u}, + {7449235258647511040u, 6380777281587743935u, 30032699375u}, + {9943947977234055168u, 10001440249018225388u, 239345902629u}, + {0u, 5505914461980436708u, 37542179162u}, + {0u, 1105464290051876864u, 90298476221u}, + {0u, 4500443576769970176u, 189059927339u}, + {0u, 2843045143185981440u, 43243969535u}, + {0u, 660949699682893824u, 255154121786u}, + {0u, 276549164618219520u, 58035830155u}, + {0u, 4683743612465315840u, 139014991760u}, + {0u, 0u, 144253906250u}, + {0u, 0u, 74000000000u}, + {12396245121240683569u, 400833u, 0u}, + {10248996648596888561u, 400833672001794u, 0u}, + {11257495103713935002u, 4370024159708535157u, 21729u}, + {7555396579247433114u, 7166684413908503888u, 225236899484u}, + {4805022328730367462u, 10217286283215687029u, 156388506740u}, + {7056637817080232586u, 4767369911989629198u, 116553880199u}, + {10811411483818434913u, 14407999214182082862u, 135258439640u}, + {16962406704495245447u, 8472271297615317358u, 216781059202u}, + {18074517319117194669u, 6236024012584764757u, 130459282747u}, + {3702019776117654523u, 1951826556984620523u, 59338055539u}, + {3551977551381082764u, 12357130551551830830u, 115105808729u}, + {16442608985936005282u, 8927758011099278464u, 89669881389u}, + {3580046275479139588u, 10199854049407140323u, 45483974731u}, + {8737412692712715330u, 17895455027038549577u, 75552935195u}, + {3082033243045084752u, 16539200343720527131u, 27970114560u}, + {16401023756841128699u, 3536976106235802604u, 896591847u}, + {7520296082779572869u, 16980391644793590751u, 231191739858u}, + {9854104766152464159u, 10090294316609084067u, 210920508875u}, + {14169188802648310188u, 17603457857266236889u, 203546995950u}, + {2018609909210367042u, 11164962743035868272u, 238954285362u}, + {8270271948267674359u, 1585686890718568774u, 50605253843u}, + {12320338602894572099u, 10882524700472655412u, 211085960258u}, + {17538536685990080547u, 2194808754940947757u, 66589942846u}, + {15833914616956760474u, 274100791137209242u, 62118980821u}, + {6137696141415969855u, 12203404582981010903u, 213014859033u}, + {9757490468419438919u, 541940706340938166u, 25661547888u}, + {3566639201356598903u, 10305434016011833594u, 112029378664u}, + {9760900035773954449u, 7900783531944543546u, 104558658697u}, + {3873778773990716438u, 8920818625012419323u, 137428302333u}, + {2295668377270167832u, 12532363335400447632u, 253483598546u}, + {1791721710912807593u, 13483507182924762800u, 210679380777u}, + {10571009006922683279u, 415911049779278804u, 41730942389u}, + {9840791932778184867u, 3441628281170127418u, 181022546583u}, + {11525464956561274613u, 17830811568183566527u, 151186571042u}, + {4435781488897895433u, 17897295813176613411u, 34966610231u}, + {6395563367070996741u, 2086148701331574596u, 55970214350u}, + {15538690795135662932u, 13015567826878853432u, 206113090347u}, + {16294558813563371936u, 12944531121587846595u, 43705575345u}, + {4942096228426070342u, 3534180912913737995u, 177701724438u}, + {6910116424372647153u, 3447584022400118677u, 22191588331u}, + {17923400669760829478u, 6375676813770849297u, 235186893904u}, + {4134686917293039955u, 11580694081479200185u, 80345626132u}, + {16857102463116098681u, 1872134358882196482u, 20627790684u}, + {11364321508775167451u, 17602652840520938059u, 92101488606u}, + {7966947780972783899u, 10331040597716338351u, 222954241722u}, + {11261055695926686278u, 73785407041056976u, 186560046833u}, + {9227040437353594058u, 17166209109167902028u, 241003999914u}, + {7185344074282882061u, 8762475644006589904u, 170930582060u}, + {14197856148610578032u, 8839001228645872586u, 44475014756u}, + {885688687260429427u, 13558262784529110268u, 100479163216u}, + {17407816160380305183u, 5640853896420358111u, 80734994898u}, + {17812728703806357349u, 8459930353450835572u, 210305791302u}, + {17120198191964319867u, 7643830211500171269u, 70458613743u}, + {12091952048375408786u, 1308629115231236347u, 239414372866u}, + {405056939269888281u, 8957268500971669618u, 2070940926u}, + {12485440679452408690u, 7645679094277669412u, 254485574498u}, + {8394369900823444407u, 3821107497040617191u, 98414473094u}, + {2877421667354294258u, 8847137191985934072u, 134207142652u}, + {2676980714750756239u, 3531126524756088253u, 252479604268u}, + {6119309228579057021u, 8726915034124352183u, 44191422752u}, + {18203256146533333852u, 17611136727168068641u, 32473087011u}, + {351919978865493747u, 18017743272784259949u, 35954701634u}, + {5190010931882390570u, 18113575006829616116u, 66976743819u}, + {6982466386088036604u, 12805550441678740368u, 139981938868u}, + {4707293888784996898u, 8061966093393027781u, 180694190280u}, + {690306801165964760u, 11954593141554100801u, 200437040057u}, + {12456770961278956704u, 14068656112359197734u, 185648059792u}, + {16946092489294063943u, 895878255770467290u, 144762663376u}, + {11098404173866185376u, 10319906489512197802u, 208048565657u}, + {15152070965853306880u, 14551142616794302079u, 153559443251u}, + {17370091362040414208u, 15933181735739307476u, 51788819021u}, + {10141938552171134976u, 11524527334398983147u, 77863739512u}, + {10586988556645826560u, 11828012606225556742u, 120624745878u}, + {12169852093061922816u, 3556238869349799431u, 150641197848u}, + {16717361816799281152u, 7403090230513381483u, 24192784095u}, + {0u, 10172292854665622800u, 223401322325u}, + {0u, 11240746576366182400u, 85551441100u}, + {0u, 17021927826892259328u, 204609362092u}, + {0u, 9046328496309141504u, 172922760556u}, + {0u, 8038996803112140800u, 108490402450u}, + {0u, 17098478935265509376u, 146435794889u}, + {0u, 7205759403792793600u, 201926910400u}, + {0u, 0u, 192390625000u}, + {0u, 0u, 232000000000u}, + {2144184049294538808u, 6u, 0u}, + {4108002197393276873u, 6116236450u, 0u}, + {6446230217393892753u, 6116236450222695245u, 0u}, + {5571068025259989822u, 6240972538554414168u, 331561842u}, + {14804812668872528331u, 4356262642990299018u, 114338323799u}, + {17369928488562523047u, 1335108558830511366u, 87236153471u}, + {2967474173531035027u, 18435704923261947246u, 127072376379u}, + {5291425437992807716u, 8395401931972636441u, 59999401566u}, + {14219547193739388064u, 12482665946362458347u, 94455115650u}, + {17720313647158217462u, 16101242875289374781u, 130676686676u}, + {12334850628290578491u, 4708983440241068127u, 84872850125u}, + {7818499847417334620u, 14856666972541426744u, 205255274503u}, + {136007040922198372u, 6938795288315789246u, 7805381530u}, + {8523477092112604449u, 5556307628265073820u, 154376152846u}, + {367934822655966629u, 1441404248927865979u, 14301208040u}, + {12964987687054730050u, 16710378912353838906u, 232078138680u}, + {15267036012420885462u, 18289940136919312110u, 56905871455u}, + {11142900264750765568u, 10217414145292657824u, 95991499641u}, + {13680181547777718603u, 12461165826430955753u, 121553887130u}, + {13001922925761426065u, 662762458988270879u, 154675521153u}, + {2397730045956515935u, 16488546856395302470u, 129035928424u}, + {4482395522588406288u, 2612816787977180950u, 104893845916u}, + {3255525722490493080u, 16446616379327454252u, 156141641081u}, + {836222287193822098u, 7842178508581740643u, 121891572860u}, + {420898743993182306u, 14779029861369369333u, 124425125348u}, + {11652649973356574054u, 2697664446153849542u, 228801172814u}, + {15058402726661910231u, 12135106444393649308u, 78146240682u}, + {9600134495208339559u, 9550285041205189839u, 170657845438u}, + {14626343323989004842u, 8790318168586740109u, 190517721989u}, + {6813981265331086665u, 14038474217155846828u, 133476524102u}, + {10281745288790487888u, 4263144264274812072u, 70761027212u}, + {17569829347075761940u, 11940456333341715520u, 140231105513u}, + {7654580675237889478u, 15751110736831573013u, 233647293434u}, + {16194838649686212364u, 18384528705472318081u, 250853869423u}, + {6495102772252453635u, 2393654818032310394u, 111996627298u}, + {14935159852819761348u, 12812209822018626434u, 98129760287u}, + {17381879863441579697u, 3110778569433458461u, 31694551286u}, + {9062335510435372583u, 2860264756226872891u, 246168635644u}, + {7569219009130126626u, 2384146980060315184u, 252155055263u}, + {12652124168176193362u, 14117430062880324728u, 159129244866u}, + {8940200224697247767u, 3769610173216737153u, 194765307417u}, + {5600570701927432884u, 17731974340232672009u, 25204350976u}, + {2018432801986093157u, 1971479303384713466u, 961252255u}, + {8235849749361824736u, 3449462959779012549u, 159106874107u}, + {9705097287982370040u, 13743454852043766533u, 251186995761u}, + {3517483139049842585u, 7417711187131879498u, 49745034180u}, + {958281614186777760u, 3650992383501007879u, 196402114929u}, + {7336473432636108950u, 12838770342493958662u, 113197920693u}, + {12955383920176764423u, 16025068246546338477u, 181695991134u}, + {10735469126281273789u, 6579965938260177729u, 94868720690u}, + {8637888232514730693u, 4742939430174291459u, 50356700668u}, + {6806336737533581000u, 13062256857527449083u, 252257115261u}, + {16142569672872330321u, 2301174570202439645u, 125708106363u}, + {8141285259947963513u, 7638687886069412887u, 123124746923u}, + {5220241098754220797u, 936322449610274358u, 171414094100u}, + {154438799943119608u, 12926010544311283981u, 20050758141u}, + {2226876628677628879u, 12647854908989899184u, 253700720435u}, + {17219557081221357482u, 8862093163358513015u, 51685641588u}, + {15401507148161015114u, 444784343917630731u, 116480415033u}, + {8842629766613985337u, 11033952249213387263u, 57024111807u}, + {3180100571546071440u, 18168634046363183536u, 191598151749u}, + {7740848704392475044u, 3837904761417065597u, 69984923625u}, + {2014314126623495998u, 111459007020906105u, 233208053234u}, + {11209566016506885858u, 16191761957496794523u, 242006042204u}, + {7117166613733441125u, 9856250800340378607u, 92877757174u}, + {4197646860931880328u, 9491800102275105959u, 246534308426u}, + {5487263271238026094u, 10777328578953608268u, 74514551514u}, + {18148076225293562697u, 17424440628313779505u, 218584240152u}, + {9127276943027950849u, 3285814872419755679u, 24944580819u}, + {9691696125379324722u, 2824823424107240978u, 211178124381u}, + {13102362262487705216u, 12271707680713669755u, 93153133984u}, + {8929385439893192704u, 6951481875178001185u, 160665250606u}, + {11891353410743566336u, 10202522487003824362u, 46376840587u}, + {1587423090877399040u, 4834668463880990728u, 139553079852u}, + {3489137423026225152u, 10871520987687904746u, 44262087902u}, + {13046928120492326912u, 12057698794225322390u, 222589346333u}, + {11529215046068469760u, 7263351819222681214u, 29653649161u}, + {0u, 1778055686910650944u, 9393747091u}, + {0u, 17108187120491986944u, 147096388591u}, + {0u, 3067636961549221888u, 239927436682u}, + {0u, 16702141595163557888u, 138166296932u}, + {0u, 2432053749942845440u, 100905424910u}, + {0u, 17791470327927144448u, 14131841897u}, + {0u, 1152921504606846976u, 105964477539u}, + {0u, 0u, 99062500000u}, + {0u, 0u, 160000000000u}, + {6674960280855494694u, 93326u, 0u}, + {16378845781483497510u, 93326361850321u, 0u}, + {17606907750956804392u, 4283581425266273664u, 5059u}, + {13225609159240506969u, 6725911039793895357u, 195232213414u}, + {2668084873338435252u, 1188689198788975021u, 166364612368u}, + {14802814305275861366u, 10825527435847761650u, 16064438970u}, + {8005510553372365574u, 3917696829526085083u, 186586853018u}, + {12748500143273514429u, 12646861173976387276u, 154212378770u}, + {10393733905569036127u, 18398576063183996905u, 146685587717u}, + {603389089974790339u, 16919251228485834948u, 5997388806u}, + {2033494532597735873u, 17296019588687185052u, 6917194446u}, + {9204796763694620958u, 12365301604512770359u, 206937619100u}, + {7826260310402107021u, 2814271599679204744u, 156670324343u}, + {10122690201685169383u, 2154994415780170517u, 119152561969u}, + {7438455564568110133u, 6717373824370072839u, 49116822481u}, + {2805412574380520817u, 12709155755801344060u, 209364149564u}, + {7250965427231182867u, 826847911966403896u, 60688964714u}, + {8136242944826085924u, 2277322703890025383u, 106044823515u}, + {15357191647956011780u, 2774508958389496437u, 219123453911u}, + {7369614426695395460u, 245697774950120915u, 215150406432u}, + {10886957545142526638u, 1268929063431863950u, 32013319303u}, + {2030047207417538097u, 6735665673159411439u, 135068788782u}, + {11557093828502314355u, 14734771742997073207u, 46365141167u}, + {15201062539664128543u, 13683287077957612495u, 175798773576u}, + {8846936323343880674u, 15370263741354826803u, 72741772478u}, + {1485291750116245364u, 48035913070297507u, 190833223667u}, + {2076024439668322013u, 1206547475966802115u, 243002604032u}, + {7029497773682748741u, 13512340386605768006u, 65407069u}, + {16333533921668749881u, 2325760467700278797u, 93732505440u}, + {2065057316131928423u, 10848110652847753816u, 96126079727u}, + {7800502648925570223u, 15846378960784301285u, 239588077256u}, + {17011619967093802015u, 14121839924449844911u, 200859033924u}, + {5368819344429198672u, 5147613424753296550u, 68765546476u}, + {15598879366754275267u, 16817040482828810167u, 236279052682u}, + {16393893486035835647u, 5773528746119363888u, 138911653591u}, + {12042046205096920307u, 8716201595536184826u, 215312983620u}, + {15437070428008474344u, 5259122109038474872u, 68472506235u}, + {13704569163204647509u, 14744540084230155984u, 123285097580u}, + {18192483750856993350u, 10719345477982635878u, 108799303119u}, + {5152535865317963250u, 13698037261310555208u, 207581096882u}, + {17512614083933854680u, 16141171632951976936u, 178742572087u}, + {14481918350603613536u, 10060790174955808839u, 55875014667u}, + {16124419709964004915u, 4250043307981877118u, 11545396528u}, + {18088011566435813579u, 7075646198054337199u, 48230395309u}, + {15008862380698848893u, 18141738384245531503u, 173383571548u}, + {18160498644611827812u, 8174370508376809531u, 92983465608u}, + {3604680497457231965u, 3581964982731575596u, 136443133513u}, + {5957615565551495921u, 14798509948722114761u, 73194178710u}, + {17528455034961565995u, 14713923334885122090u, 150802228831u}, + {8503772325120113809u, 5042978054260414139u, 95797643382u}, + {8501492578048509537u, 2052996319372883413u, 118273380388u}, + {2296237701094386060u, 8825683007899981588u, 36111293153u}, + {3753593040591076946u, 9992196755378745151u, 225478441234u}, + {8518075399775653155u, 9301073417573669950u, 18541678071u}, + {12757855675959554597u, 5331614769144850592u, 247504212200u}, + {121631169379748595u, 14354009428310052102u, 232289027415u}, + {16679062494579173314u, 5581221063029119078u, 87778132410u}, + {10739912744743898054u, 1529260335339476189u, 186302558600u}, + {9367340677776287570u, 16483061525949201148u, 136082901368u}, + {12227321512794715397u, 14431217812333089675u, 120893548555u}, + {7241061891859170651u, 3452349151135392267u, 11782317885u}, + {13148571323079237489u, 9075317899834447999u, 61187152222u}, + {12509763434355012654u, 2764331337978901575u, 94491973969u}, + {11812768946960181977u, 1942890683708857202u, 81149854702u}, + {14170358803552564832u, 165089169728028447u, 238105324315u}, + {18179989524780635952u, 15193620741871233073u, 27008949501u}, + {17091718978514754901u, 14995000835194145926u, 253823647830u}, + {7394768384359232459u, 1788823614552255558u, 86812880624u}, + {6778628272692852803u, 8384901184618498845u, 240096972322u}, + {18193335045875234320u, 405511217862281310u, 34454546404u}, + {1378519212560967521u, 3111530463755196557u, 228021982807u}, + {4677732610631043584u, 7893558450035460812u, 87168676404u}, + {17296098591070486528u, 156573858237402216u, 52427910661u}, + {7343735382392963072u, 15915324019419451223u, 5008487885u}, + {14525996728454217728u, 16293363012778802804u, 205862771443u}, + {9691359370008330240u, 14342105318291351412u, 243883264978u}, + {3044433348102455296u, 3788398842525387052u, 210777487087u}, + {9223372036854775808u, 14118764407048307670u, 239205369512u}, + {0u, 2705021334614720768u, 168765379752u}, + {0u, 7017988973805568000u, 168146639500u}, + {0u, 10956732053634154496u, 140380445944u}, + {0u, 14657517938546835456u, 248593965634u}, + {0u, 11268868284797157376u, 66794585639u}, + {0u, 14600669991935148032u, 39610886573u}, + {0u, 4611686018427387904u, 173791503906u}, + {0u, 0u, 34250000000u}, + {0u, 0u, 128000000000u}, + {8201586317771250746u, 1424047269u, 0u}, + {3278889188817135834u, 1424047269444608885u, 0u}, + {1710725240251040430u, 3001188830946823627u, 77197757u}, + {1850175733663425006u, 9732296932705387049u, 189162694772u}, + {9147599666163914249u, 16337535782679529459u, 116527588873u}, + {10221885933644344166u, 7969742269895046547u, 9885659589u}, + {14901479793736678101u, 2923592083903829642u, 197432040594u}, + {5181831442059703136u, 8144196241160608534u, 146158488244u}, + {6396246577759793483u, 16431078457793424253u, 180441497762u}, + {14167229556464870447u, 202362949592775653u, 162890730548u}, + {2969982933326311854u, 8835125248522947981u, 52010970117u}, + {7892677766222018881u, 7959873808777345113u, 5478953099u}, + {798698968922663621u, 14929747122315126151u, 139431505623u}, + {15926812109043458972u, 4310328817360515349u, 215809343213u}, + {8663842590352697437u, 7294899422760201126u, 237233663393u}, + {17093523026636671168u, 2047461597291187207u, 161395457290u}, + {839764004742743203u, 10942374468813517900u, 10110993115u}, + {16894643909298232323u, 10364795403063433969u, 219593187308u}, + {9066702926218949317u, 12330859528790939137u, 236561876684u}, + {9119392417260546810u, 8973160144879916806u, 204668457234u}, + {9723021096578315109u, 2895354388547509877u, 18486435986u}, + {14787464248751217597u, 16766844772497556429u, 146156957475u}, + {3733434565920249133u, 7442407174620948827u, 35908932476u}, + {6643788868836820841u, 6683013428676659077u, 124403453701u}, + {4729646697422664063u, 16713703375071907588u, 5362286883u}, + {4090144564201555829u, 8791044883080637861u, 35906051675u}, + {2109480737093400002u, 602844107089214413u, 91476563498u}, + {16577155033369419739u, 9754832281172880875u, 42032680244u}, + {745377248603805917u, 10587846778003503903u, 52528810517u}, + {11305561465807999667u, 17206244172922947013u, 21573968323u}, + {2211245518782892177u, 11620628420699303875u, 195932752365u}, + {14170095199249735666u, 17864732368219338611u, 237629955528u}, + {17849973668116118927u, 4146383014621345887u, 200968449082u}, + {9020960204585720001u, 11445705075042688243u, 58224775873u}, + {10807134002871850916u, 7369147888966546592u, 193620472915u}, + {3925122626254791201u, 9762476865090597796u, 83399482307u}, + {17208463291312718997u, 5507001428194242827u, 195529224931u}, + {5145077219589447653u, 11371471148365328344u, 227298535145u}, + {17602397765035489468u, 3148788104946538618u, 233616448686u}, + {16422643262490753377u, 3762722308424507574u, 174170696145u}, + {2902509461400906224u, 1156171244825745915u, 209203977585u}, + {3422418805967265206u, 14208921674868257865u, 113062676168u}, + {4228874576277237392u, 7903080886897905503u, 200770267187u}, + {2553488530807495751u, 6367240794154270982u, 51428426873u}, + {11546099176912486413u, 1623672396662369850u, 121345168815u}, + {10460791037534167991u, 18323231215381674394u, 175088019456u}, + {8127117908566000904u, 9842279843006544554u, 993304354u}, + {11541304458088287306u, 7376839231308610600u, 34533551059u}, + {6249718665174839700u, 609751749293657672u, 211399899256u}, + {13102508413386290995u, 10386457966860989799u, 120033054708u}, + {6274675218640661911u, 11160336020836149780u, 244563051014u}, + {3404497118599817167u, 17947559933847409193u, 6605003027u}, + {11258566093988562335u, 10229787001712704590u, 19972939173u}, + {16762592482501635397u, 10441677090043619866u, 165554557864u}, + {5550125446725071998u, 4996681336392922375u, 168566044449u}, + {6370033225258510318u, 124497102381021895u, 33270870638u}, + {1503521728674735398u, 8180812057779384577u, 110006749001u}, + {4250415082606384364u, 5294232873532946716u, 73443482710u}, + {6020091901030562974u, 2885620189169448039u, 86287000939u}, + {16288222967151527138u, 16662526875008170507u, 107156429783u}, + {6377016228656203782u, 15663095032402672480u, 215903277391u}, + {8378856515587563750u, 1824281504410546614u, 79849098083u}, + {15812881490200838483u, 9506565509584809953u, 99098894498u}, + {4548570371183413652u, 16941136942345070055u, 162515351948u}, + {16731431495283420383u, 15924115693705937725u, 140918380873u}, + {14737727629551135532u, 9247807690406628462u, 73863248041u}, + {12413722258104293893u, 7993916633864834871u, 169501324659u}, + {800899742400762438u, 1018504409177639408u, 115433351089u}, + {603197008376033550u, 12097800686634130718u, 177055213234u}, + {6380777281587743935u, 6221488888422637551u, 178655823089u}, + {10001440249018225388u, 8229322865256080421u, 241337267588u}, + {5505914461980436708u, 7927745108183101786u, 132446112486u}, + {1105464290051876864u, 8488683721235326653u, 230429763923u}, + {4500443576769970176u, 11165516518170922283u, 83460172466u}, + {2843045143185981440u, 5463648141113596927u, 178605283863u}, + {660949699682893824u, 3958440403860778042u, 23296184959u}, + {276549164618219520u, 5091534813990256011u, 127214587484u}, + {4683743612465315840u, 6100166970623291280u, 92276012655u}, + {0u, 1913011027739012426u, 111330690714u}, + {0u, 11310957650604221440u, 154103704535u}, + {0u, 16303817257009020928u, 215613168242u}, + {0u, 9090406322154766336u, 114883831704u}, + {0u, 3003279315069566976u, 152492791914u}, + {0u, 16582887146675765248u, 106162808097u}, + {0u, 9691746398101307392u, 33898960113u}, + {0u, 0u, 241525390625u}, + {0u, 0u, 33000000000u}, +}; + +#endif // LLVM_LIBC_SRC___SUPPORT_RYU_CONSTANTS_H diff --git a/contrib/llvm-project/libc/src/__support/ryu_long_double_constants.h b/contrib/llvm-project/libc/src/__support/ryu_long_double_constants.h new file mode 100644 index 000000000000..8ebb29727789 --- /dev/null +++ b/contrib/llvm-project/libc/src/__support/ryu_long_double_constants.h @@ -0,0 +1,120478 @@ +//===-- Ryu Constants for long double conversion ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_RYU_LONG_DOUBLE_CONSTANTS_H +#define LLVM_LIBC_SRC___SUPPORT_RYU_LONG_DOUBLE_CONSTANTS_H + +#include <stddef.h> +#include <stdint.h> + +constexpr size_t TABLE_SHIFT_CONST = 120; +constexpr size_t IDX_SIZE = 128; + +constexpr size_t MID_INT_SIZE = (256 + 64); + +constexpr uint32_t POW10_OFFSET[] = { + 0, 4, 13, 26, 43, 64, 90, 120, 154, 193, 236, + 283, 334, 390, 450, 514, 582, 655, 732, 813, 899, 989, + 1083, 1181, 1284, 1391, 1502, 1618, 1738, 1862, 1990, 2123, 2260, + 2401, 2547, 2697, 2851, 3009, 3172, 3339, 3510, 3686, 3866, 4050, + 4238, 4431, 4628, 4829, 5034, 5244, 5458, 5676, 5899, 6126, 6357, + 6592, 6832, 7076, 7324, 7577, 7834, 8095, 8360, 8630, 8904, 9182, + 9465, 9752, 10043, 10338, 10638, 10942, 11250, 11563, 11880, 12201, 12526, + 12856, 13190, 13528, 13871, 14218, 14569, 14924, 15284, 15648, 16016, 16388, + 16765, 17146, 17531, 17921, 18315, 18713, 19115, 19522, 19933, 20348, 20768, + 21192, 21620, 22052, 22489, 22930, 23375, 23825, 24279, 24737, 25199, 25666, + 26137, 26612, 27092, 27576, 28064, 28556, 29053, 29554, 30059, 30568, 31082, + 31600, 32122, 32649, 33180, 33715, 34254, 34798, 35346}; + +constexpr uint32_t POW10_OFFSET_2[130] = { + 0, 15, 44, 83, 131, 190, 259, 338, 426, 524, 633, + 751, 879, 1017, 1166, 1324, 1492, 1670, 1858, 2056, 2264, 2482, + 2709, 2947, 3195, 3453, 3720, 3997, 4285, 4582, 4889, 5206, 5534, + 5871, 6218, 6575, 6941, 7318, 7705, 8102, 8508, 8925, 9352, 9788, + 10234, 10690, 11157, 11633, 12119, 12615, 13122, 13638, 14164, 14700, 15245, + 15801, 16367, 16943, 17528, 18124, 18730, 19345, 19970, 20605, 21251, 21906, + 22571, 23246, 23931, 24626, 25331, 26046, 26770, 27505, 28250, 29004, 29768, + 30543, 31328, 32122, 32926, 33740, 34565, 35399, 36243, 37097, 37961, 38835, + 39719, 40613, 41516, 42430, 43354, 44287, 45230, 46184, 47148, 48121, 49104, + 50097, 51100, 52113, 53136, 54169, 55212, 56265, 57328, 58400, 59482, 60575, + 61678, 62790, 63912, 65045, 66188, 67340, 68502, 69674, 70856, 72048, 73250, + 74462, 75684, 76916, 78158, 79409, 80670, 81942, 83224, 84515}; + +constexpr uint16_t MIN_BLOCK_2[130] = { + 0, 0, 4, 9, 13, 17, 21, 26, 30, 34, 39, 43, 47, 51, 56, + 60, 64, 68, 73, 77, 81, 86, 90, 94, 98, 103, 107, 111, 116, 120, + 124, 128, 133, 137, 141, 146, 150, 154, 158, 163, 167, 171, 176, 180, 184, + 188, 193, 197, 201, 205, 210, 214, 218, 223, 227, 231, 235, 240, 244, 248, + 253, 257, 261, 265, 270, 274, 278, 283, 287, 291, 295, 300, 304, 308, 313, + 317, 321, 325, 330, 334, 338, 342, 347, 351, 355, 360, 364, 368, 372, 377, + 381, 385, 390, 394, 398, 402, 407, 411, 415, 420, 424, 428, 432, 437, 441, + 445, 450, 454, 458, 462, 467, 471, 475, 479, 484, 488, 492, 497, 501, 505, + 509, 514, 518, 522, 527, 531, 535, 539, 544, 0}; + +constexpr uint64_t POW10_SPLIT[][5] = { + {1u, 72057594037927936u, 0u, 0u, 0u}, + {699646928636035157u, 72057594u, 0u, 0u, 0u}, + {1329227995784915873u, 0u, 0u, 0u, 0u}, + {1329227996u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 72057594037927936u, 0u}, + {17296309485351745867u, 5171444645924616994u, 699646928636035156u, 72057594u, 0u}, + {16598859101615853088u, 16672297533003297785u, 1329227995784915872u, 0u, 0u}, + {7469952526870444257u, 14479142226848862514u, 1329227995u, 0u, 0u}, + {13531654022114669524u, 6073184580144670117u, 1u, 0u, 0u}, + {15757609704383306943u, 24519928653u, 0u, 0u, 0u}, + {9590990814237149590u, 24u, 0u, 0u, 0u}, + {452312848584u, 0u, 0u, 0u, 0u}, + {453u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3000826u}, + {3609144142396852269u, 16798760952716600047u, 17296309485351745866u, 5171444645924616994u, 1463310u}, + {11568848377382068865u, 2419982808370854966u, 16598859101615853087u, 16672297533003297785u, 3665872u}, + {10068303578029323957u, 2922947087773078955u, 7469952526870444256u, 14479142226848862514u, 1102995u}, + {11645070846862630231u, 15419220167069510189u, 13531654022114669523u, 6073184580144670117u, 1u}, + {12449386705878485055u, 3452124642157173415u, 15757609704383306942u, 24519928653u, 0u}, + {15025619323517318418u, 5979700067267186898u, 9590990814237149589u, 24u, 0u}, + {14996237555047131272u, 4913998146922579596u, 452312848583u, 0u, 0u}, + {10211005638256058413u, 5771037749337678923u, 452u, 0u, 0u}, + {1014743503555840530u, 8343699359066u, 0u, 0u, 0u}, + {12900897707145290678u, 8343u, 0u, 0u, 0u}, + {153914086704666u, 0u, 0u, 0u, 0u}, + {153915u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 506406u}, + {9917186842884466953u, 16428432973129962469u, 3609144142396852268u, 16798760952716600047u, 2281280u}, + {4751011869809829335u, 3721112279790863773u, 11568848377382068864u, 2419982808370854966u, 2203279u}, + {11068497969931435029u, 18032764903259620752u, 10068303578029323956u, 2922947087773078955u, 3846350u}, + {17118056985122509954u, 18058455550468776078u, 11645070846862630230u, 15419220167069510189u, 3546301u}, + {14607066080907684459u, 15692090139033993189u, 12449386705878485054u, 3452124642157173415u, 3847690u}, + {11768892370493391107u, 389416944300619392u, 15025619323517318417u, 5979700067267186898u, 763373u}, + {4043396447647747170u, 12009691357260487292u, 14996237555047131271u, 4913998146922579596u, 348583u}, + {1670341095362518057u, 13494259174449809899u, 10211005638256058412u, 5771037749337678923u, 452u}, + {3190817644167043165u, 18288583400616279876u, 1014743503555840529u, 8343699359066u, 0u}, + {10425820027224322486u, 7216107869057471u, 12900897707145290677u, 8343u, 0u}, + {13139964660506311565u, 17237061291959073877u, 153914086704665u, 0u, 0u}, + {2297772885416059937u, 1599418782488783272u, 153914u, 0u, 0u}, + {7677687919964523763u, 2839213766779714u, 0u, 0u, 0u}, + {14144589152747892828u, 2839213u, 0u, 0u, 0u}, + {52374249726338270u, 0u, 0u, 0u, 0u}, + {52374250u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3868386u}, + {3757709791947931308u, 8142946531605512549u, 9917186842884466952u, 16428432973129962469u, 2503150u}, + {3452755398462519465u, 5328402096432654514u, 4751011869809829334u, 3721112279790863773u, 995644u}, + {3105818720159874523u, 1932004361303814511u, 11068497969931435028u, 18032764903259620752u, 2388336u}, + {16859138458894499364u, 2511477647985517770u, 17118056985122509953u, 18058455550468776078u, 3013660u}, + {12271894740606233755u, 17451375493324716693u, 14607066080907684458u, 15692090139033993189u, 1579084u}, + {5429638071845793701u, 9489266854478998488u, 11768892370493391106u, 389416944300619392u, 2609173u}, + {145278150038876889u, 8803053132063235168u, 4043396447647747169u, 12009691357260487292u, 1056505u}, + {9050266019724932450u, 16198682197142616772u, 1670341095362518056u, 13494259174449809899u, 3144842u}, + {11907016253451490866u, 13696242485403414201u, 3190817644167043164u, 18288583400616279876u, 391185u}, + {2472757296513770735u, 16409082426079859930u, 10425820027224322485u, 7216107869057471u, 829215u}, + {10558733798178239360u, 11653410736879597609u, 13139964660506311564u, 17237061291959073877u, 767165u}, + {15917322570831255850u, 13589514120653213260u, 2297772885416059936u, 1599418782488783272u, 153914u}, + {12254334656791355238u, 8032934885905905773u, 7677687919964523762u, 2839213766779714u, 0u}, + {7869542424662730262u, 2753021350129449272u, 14144589152747892827u, 2839213u, 0u}, + {1378558986933000253u, 16974897459201404132u, 52374249726338269u, 0u, 0u}, + {13521405041909411105u, 13398576176159101588u, 52374249u, 0u, 0u}, + {3206744593298092012u, 966134380754314586u, 0u, 0u, 0u}, + {13914648122214918505u, 966134380u, 0u, 0u, 0u}, + {17822033662586700073u, 0u, 0u, 0u, 0u}, + {17822033663u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 23766u}, + {4307062684900157136u, 5782377197813462996u, 3757709791947931307u, 8142946531605512549u, 3697006u}, + {15300759383869911853u, 17732139848231399225u, 3452755398462519464u, 5328402096432654514u, 3171666u}, + {16007534237643445447u, 3628839527415562920u, 3105818720159874522u, 1932004361303814511u, 3334976u}, + {7138502295759677634u, 3188692267613601003u, 16859138458894499363u, 2511477647985517770u, 728461u}, + {8218537071653683708u, 5168130193478377351u, 12271894740606233754u, 17451375493324716693u, 2695436u}, + {2254219416760329296u, 12556227529405091289u, 5429638071845793700u, 9489266854478998488u, 651966u}, + {3057410459568460683u, 15087090312791441191u, 145278150038876888u, 8803053132063235168u, 3132321u}, + {8217810929938874370u, 10281804758610642493u, 9050266019724932449u, 16198682197142616772u, 287292u}, + {11741126472498340929u, 14238177586158586579u, 11907016253451490865u, 13696242485403414201u, 2819390u}, + {1175325363726654805u, 7107927498217678127u, 2472757296513770734u, 16409082426079859930u, 2826411u}, + {9428843070696730900u, 3845814658485364449u, 10558733798178239359u, 11653410736879597609u, 2314036u}, + {12662500978715131896u, 714293333681725945u, 15917322570831255849u, 13589514120653213260u, 1872522u}, + {6443045597035184564u, 16766172658649116981u, 12254334656791355237u, 8032934885905905773u, 804086u}, + {1921385512639171183u, 812461421432632214u, 7869542424662730261u, 2753021350129449272u, 2242285u}, + {10469475094355551399u, 15218024718633799195u, 1378558986933000252u, 16974897459201404132u, 3682019u}, + {14679174489076953574u, 8110797782612805145u, 13521405041909411104u, 13398576176159101588u, 1592999u}, + {11853074234719825644u, 15941193964933529226u, 3206744593298092011u, 966134380754314586u, 0u}, + {8270896886596139124u, 14144280602323277932u, 13914648122214918504u, 966134380u, 0u}, + {16532667046659118126u, 15072402647813125244u, 17822033662586700072u, 0u, 0u}, + {148341279888833483u, 10822706091283369888u, 17822033662u, 0u, 0u}, + {10364629296397276041u, 15163844593710966730u, 17u, 0u, 0u}, + {14265682585545771671u, 328758493846u, 0u, 0u, 0u}, + {13991741872911347878u, 328u, 0u, 0u, 0u}, + {6064523798050u, 0u, 0u, 0u, 0u}, + {6065u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 963296u}, + {2484134775182816690u, 419091135888749534u, 4307062684900157135u, 5782377197813462996u, 323727u}, + {18400539815335991277u, 1073142712661309789u, 15300759383869911852u, 17732139848231399225u, 1407284u}, + {485494064952118286u, 11076438902195672285u, 16007534237643445446u, 3628839527415562920u, 984354u}, + {17577048805241314891u, 1820390940081322072u, 7138502295759677633u, 3188692267613601003u, 2821149u}, + {2863946907557583807u, 18417808973944523596u, 8218537071653683707u, 5168130193478377351u, 986958u}, + {13045307417786230800u, 10251294197731582956u, 2254219416760329295u, 12556227529405091289u, 1466554u}, + {12032088871615097766u, 1502394029870156427u, 3057410459568460682u, 15087090312791441191u, 2690252u}, + {8848763446997690580u, 321014853559106074u, 8217810929938874369u, 10281804758610642493u, 2321903u}, + {10031289150307672684u, 2390953058510591777u, 11741126472498340928u, 14238177586158586579u, 2509021u}, + {11592215575498656563u, 10685224265907994086u, 1175325363726654804u, 7107927498217678127u, 1450780u}, + {15894436747956898388u, 5967405799190505022u, 9428843070696730899u, 3845814658485364449u, 3565669u}, + {2091546719588500923u, 11210723659228214760u, 12662500978715131895u, 714293333681725945u, 2646041u}, + {5863809244813756109u, 12327123641078462772u, 6443045597035184563u, 16766172658649116981u, 1074871u}, + {11303008753675411245u, 1709976940107894236u, 1921385512639171182u, 812461421432632214u, 752023u}, + {13238426537506910532u, 16607686590938553510u, 10469475094355551398u, 15218024718633799195u, 2187228u}, + {17258458071023005565u, 18332088094272679456u, 14679174489076953573u, 8110797782612805145u, 892606u}, + {8385733444777075179u, 2946170632136780881u, 11853074234719825643u, 15941193964933529226u, 1137987u}, + {9530757096163247300u, 4824449494694383418u, 8270896886596139123u, 14144280602323277932u, 670334u}, + {14423000845391072217u, 17008332258693407133u, 16532667046659118125u, 15072402647813125244u, 762572u}, + {10953140011159884311u, 1773419466622750660u, 148341279888833482u, 10822706091283369888u, 1721162u}, + {12228340237948264127u, 3892343466023784378u, 10364629296397276040u, 15163844593710966730u, 17u}, + {11279134946966259189u, 12001571085575422795u, 14265682585545771670u, 328758493846u, 0u}, + {14640097792684582651u, 12933506765500977581u, 13991741872911347877u, 328u, 0u}, + {6232313315128656728u, 11884830007749143733u, 6064523798049u, 0u, 0u}, + {16136121832933322088u, 9662368568096205336u, 6064u, 0u, 0u}, + {15074767079673358271u, 111870718431542u, 0u, 0u, 0u}, + {13252722804829281908u, 111870u, 0u, 0u, 0u}, + {2063650512248693u, 0u, 0u, 0u, 0u}, + {2063651u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3187726u}, + {12099486841948187399u, 11654451024602552033u, 2484134775182816689u, 419091135888749534u, 3487683u}, + {5319910566029976328u, 5299013208454526792u, 18400539815335991276u, 1073142712661309789u, 2798706u}, + {11549214421017285864u, 14918550373926182539u, 485494064952118285u, 11076438902195672285u, 1027340u}, + {1998791413186046700u, 6225552657491071053u, 17577048805241314890u, 1820390940081322072u, 2337675u}, + {17075171930090011210u, 10344713496596235784u, 2863946907557583806u, 18417808973944523596u, 1036271u}, + {15158296003813501474u, 12972405634433280208u, 13045307417786230799u, 10251294197731582956u, 3319943u}, + {1360083178079384115u, 12911885282402784944u, 12032088871615097765u, 1502394029870156427u, 1777250u}, + {6167980558592741158u, 6934311832970995867u, 8848763446997690579u, 321014853559106074u, 707575u}, + {3630180428124865653u, 9975729197003430460u, 10031289150307672683u, 2390953058510591777u, 1122168u}, + {2276550099763657677u, 1982857556803548934u, 11592215575498656562u, 10685224265907994086u, 3181216u}, + {407006713016100655u, 2095735223386298222u, 15894436747956898387u, 5967405799190505022u, 2265797u}, + {14242579061653496002u, 7110931538347639364u, 2091546719588500922u, 11210723659228214760u, 285961u}, + {17944493332678643704u, 15822183724630969534u, 5863809244813756108u, 12327123641078462772u, 2854285u}, + {987185901870869452u, 16931982690156327500u, 11303008753675411244u, 1709976940107894236u, 1866994u}, + {5578665155415167745u, 6740069226761666109u, 13238426537506910531u, 16607686590938553510u, 1596986u}, + {4849210377429577536u, 3138792961008474901u, 17258458071023005564u, 18332088094272679456u, 3462229u}, + {10811995403388891862u, 12154594426971851389u, 8385733444777075178u, 2946170632136780881u, 3721431u}, + {7051931074990177294u, 15780127219221910901u, 9530757096163247299u, 4824449494694383418u, 148539u}, + {2030832259446664275u, 16421541930960194380u, 14423000845391072216u, 17008332258693407133u, 2387261u}, + {6069512651054767896u, 7485894627196740575u, 10953140011159884310u, 1773419466622750660u, 66862u}, + {10608701253763958799u, 8897269432694476706u, 12228340237948264126u, 3892343466023784378u, 2168972u}, + {15700053443426906717u, 17189823634941678804u, 11279134946966259188u, 12001571085575422795u, 1908056u}, + {17759719234725541222u, 9585582064286255215u, 14640097792684582650u, 12933506765500977581u, 3652925u}, + {15187321568916405210u, 12835472279575022096u, 6232313315128656727u, 11884830007749143733u, 360549u}, + {11040156458113129594u, 6776016669542754607u, 16136121832933322087u, 9662368568096205336u, 6064u}, + {2800727824598008497u, 18340015775620871026u, 15074767079673358270u, 111870718431542u, 0u}, + {2997236166375604479u, 5254188752292365829u, 13252722804829281907u, 111870u, 0u}, + {6260091886451512841u, 6798802596750151182u, 2063650512248692u, 0u, 0u}, + {17573059315228347474u, 9449320530215271999u, 2063650u, 0u, 0u}, + {7519453664590169251u, 38067632857031246u, 0u, 0u, 0u}, + {15809436065653866529u, 38067632u, 0u, 0u, 0u}, + {702223880805592152u, 0u, 0u, 0u, 0u}, + {702223881u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2882806u}, + {18145438202636536773u, 10968905082284365637u, 12099486841948187398u, 11654451024602552033u, 2103831u}, + {12789043364381109412u, 14076907092801977811u, 5319910566029976327u, 5299013208454526792u, 142486u}, + {6353074369953819668u, 3438322122816124201u, 11549214421017285863u, 14918550373926182539u, 1550385u}, + {17062510605820933995u, 14645413324829073675u, 1998791413186046699u, 6225552657491071053u, 2194292u}, + {13874941021389934718u, 12271281439492289998u, 17075171930090011209u, 10344713496596235784u, 110518u}, + {6244875417950487646u, 6233751789862708245u, 15158296003813501473u, 12972405634433280208u, 735953u}, + {17731957631755937344u, 1962644459455827990u, 1360083178079384114u, 12911885282402784944u, 909797u}, + {15561983039146332959u, 8726934184642952499u, 6167980558592741157u, 6934311832970995867u, 1722863u}, + {3903438255588736488u, 4531087719737475146u, 3630180428124865652u, 9975729197003430460u, 2022173u}, + {11340348909323460163u, 481513520412720774u, 2276550099763657676u, 1982857556803548934u, 328784u}, + {6137444972131520667u, 992149349835802668u, 407006713016100654u, 2095735223386298222u, 2671871u}, + {8834868486469757182u, 11165474436676191360u, 14242579061653496001u, 7110931538347639364u, 2253548u}, + {12624729701656990740u, 10240785855143707183u, 17944493332678643703u, 15822183724630969534u, 3822120u}, + {2424312716199525191u, 10059329918238932465u, 987185901870869451u, 16931982690156327500u, 2098634u}, + {15602981927113431576u, 14791716450947031885u, 5578665155415167744u, 6740069226761666109u, 2185557u}, + {1761552748541759270u, 15378882314737417402u, 4849210377429577535u, 3138792961008474901u, 2651884u}, + {2348747960974894420u, 14726970229242271127u, 10811995403388891861u, 12154594426971851389u, 3879910u}, + {2835269122823692251u, 5090110549507128155u, 7051931074990177293u, 15780127219221910901u, 3494821u}, + {11713260335902707556u, 17185220781106503840u, 2030832259446664274u, 16421541930960194380u, 3467410u}, + {10998082825607846436u, 9858517691519529305u, 6069512651054767895u, 7485894627196740575u, 1853192u}, + {9582878005220981545u, 5595905546638020702u, 10608701253763958798u, 8897269432694476706u, 2174706u}, + {3554517550499837147u, 15555173226968030255u, 15700053443426906716u, 17189823634941678804u, 104194u}, + {6068015127447805372u, 10745236628845355770u, 17759719234725541221u, 9585582064286255215u, 499846u}, + {5834261733748302474u, 9973314042399760759u, 15187321568916405209u, 12835472279575022096u, 141099u}, + {12764648529156632042u, 4374506813558796575u, 11040156458113129593u, 6776016669542754607u, 2026747u}, + {16454052395913245109u, 15960826480426749932u, 2800727824598008496u, 18340015775620871026u, 3580142u}, + {1576542808359270498u, 9636454862798615737u, 2997236166375604478u, 5254188752292365829u, 1376327u}, + {6487760493583898347u, 17973331528911319268u, 6260091886451512840u, 6798802596750151182u, 529942u}, + {13937284973699010787u, 7366495200039369601u, 17573059315228347473u, 9449320530215271999u, 2063650u}, + {15526383088238921932u, 10505831326526933398u, 7519453664590169250u, 38067632857031246u, 0u}, + {16696066431351628018u, 2803218632575724144u, 15809436065653866528u, 38067632u, 0u}, + {3165933241245007274u, 8425731874431741635u, 702223880805592151u, 0u, 0u}, + {197521300793533396u, 14860552245711912110u, 702223880u, 0u, 0u}, + {10324683056622278765u, 12953744211667879574u, 0u, 0u, 0u}, + {12320203583960842990u, 12953744211u, 0u, 0u, 0u}, + {17593475384419245734u, 12u, 0u, 0u, 0u}, + {238954404269u, 0u, 0u, 0u, 0u}, + {239u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 875536u}, + {5218809981747799537u, 14486973664692593929u, 18145438202636536772u, 10968905082284365637u, 1391912u}, + {15843024983320533546u, 11970092907999888361u, 12789043364381109411u, 14076907092801977811u, 2798065u}, + {11844573090770795238u, 14018319588989021521u, 6353074369953819667u, 3438322122816124201u, 960697u}, + {4503746032576038050u, 1313838277904518202u, 17062510605820933994u, 14645413324829073675u, 1164999u}, + {8649685863831225007u, 5133200156448565829u, 13874941021389934717u, 12271281439492289998u, 1994861u}, + {11039694637337608570u, 1564267318960847868u, 6244875417950487645u, 6233751789862708245u, 926419u}, + {15788316133629700404u, 288094406765411749u, 17731957631755937343u, 1962644459455827990u, 431800u}, + {11764489945520985933u, 7105132101564153149u, 15561983039146332958u, 8726934184642952499u, 3443257u}, + {10209979424204746268u, 5467126739023988403u, 3903438255588736487u, 4531087719737475146u, 2665400u}, + {2185429517852548770u, 141944436040620692u, 11340348909323460162u, 481513520412720774u, 3003274u}, + {1817943823014982527u, 17787049583145646959u, 6137444972131520666u, 992149349835802668u, 3719082u}, + {859420803257499868u, 4911178998173376303u, 8834868486469757181u, 11165474436676191360u, 466613u}, + {8221570079035201540u, 2492403588465268215u, 12624729701656990739u, 10240785855143707183u, 2348617u}, + {16308871940717542208u, 1302429028955989138u, 2424312716199525190u, 10059329918238932465u, 1079305u}, + {13239827720299124549u, 5915072266190131345u, 15602981927113431575u, 14791716450947031885u, 1659630u}, + {7907558139918110623u, 5486596925715591599u, 1761552748541759269u, 15378882314737417402u, 1475655u}, + {13193563222420714972u, 16112946523525017734u, 2348747960974894419u, 14726970229242271127u, 2497945u}, + {9062488218207158965u, 11314191899605050128u, 2835269122823692250u, 5090110549507128155u, 1925185u}, + {13282680790808053275u, 16509099747728258847u, 11713260335902707555u, 17185220781106503840u, 3181314u}, + {9391866658095311826u, 10050638040060643301u, 10998082825607846435u, 9858517691519529305u, 2573397u}, + {9342871032033568849u, 10813284872894559969u, 9582878005220981544u, 5595905546638020702u, 3403880u}, + {13723153935414647912u, 18029575689662377848u, 3554517550499837146u, 15555173226968030255u, 469194u}, + {4295008710601833712u, 8815066103066201432u, 6068015127447805371u, 10745236628845355770u, 1591937u}, + {18051091670283771329u, 7136306738640812513u, 5834261733748302473u, 9973314042399760759u, 2767489u}, + {7339076420894569709u, 1185996542314059014u, 12764648529156632041u, 4374506813558796575u, 1956887u}, + {8283791229976640581u, 17979021584691093322u, 16454052395913245108u, 15960826480426749932u, 2862014u}, + {16191470718728899227u, 13535623218546078665u, 1576542808359270497u, 9636454862798615737u, 1680004u}, + {3360378322432791764u, 7924302766318446344u, 6487760493583898346u, 17973331528911319268u, 901004u}, + {5736112324315119995u, 8853279777688214857u, 13937284973699010786u, 7366495200039369601u, 3116007u}, + {7891892714625143306u, 18155510465795455292u, 15526383088238921931u, 10505831326526933398u, 3525286u}, + {13946504657791183042u, 7472213693422162789u, 16696066431351628017u, 2803218632575724144u, 3634840u}, + {16360021926960286022u, 15232800345935663933u, 3165933241245007273u, 8425731874431741635u, 904651u}, + {10876513123658431453u, 5822185157630120038u, 197521300793533395u, 14860552245711912110u, 3005130u}, + {13071823993215455991u, 3445343314290737595u, 10324683056622278764u, 12953744211667879574u, 0u}, + {15949423191553045785u, 11941875133909633394u, 12320203583960842989u, 12953744211u, 0u}, + {8499057584590477220u, 2334213467904891796u, 17593475384419245733u, 12u, 0u}, + {8756370509248011348u, 17226770962571993101u, 238954404268u, 0u, 0u}, + {4587524278881828832u, 17605651291878873617u, 238u, 0u, 0u}, + {13874870284098169788u, 4407930740834u, 0u, 0u, 0u}, + {17169137977623855829u, 4407u, 0u, 0u, 0u}, + {81311970270816u, 0u, 0u, 0u, 0u}, + {81312u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 184166u}, + {1881655259298307354u, 7950651768423060596u, 5218809981747799536u, 14486973664692593929u, 462536u}, + {13034942560243803229u, 13937459924082697122u, 15843024983320533545u, 11970092907999888361u, 2122127u}, + {5706855392060411262u, 17711859616632310113u, 11844573090770795237u, 14018319588989021521u, 910815u}, + {3262821746683671640u, 14248630625585449692u, 4503746032576038049u, 1313838277904518202u, 927588u}, + {15052244994238608425u, 4327617408008032323u, 8649685863831225006u, 5133200156448565829u, 2767851u}, + {8053581719267785316u, 9726151443247544558u, 11039694637337608569u, 1564267318960847868u, 3898879u}, + {4301069677845583948u, 5912570361161880607u, 15788316133629700403u, 288094406765411749u, 2357483u}, + {7577538168761665891u, 8964417295096654063u, 11764489945520985932u, 7105132101564153149u, 3404784u}, + {311557822690213759u, 2572033593445436293u, 10209979424204746267u, 5467126739023988403u, 3788573u}, + {12671731498971402023u, 9207651779467426342u, 2185429517852548769u, 141944436040620692u, 3300390u}, + {3542956167420957622u, 16813374933748046376u, 1817943823014982526u, 17787049583145646959u, 610546u}, + {7914979753424182412u, 10524480791318148678u, 859420803257499867u, 4911178998173376303u, 2300969u}, + {6181635693661224934u, 17947877328820635229u, 8221570079035201539u, 2492403588465268215u, 292319u}, + {6542859373210659471u, 12294633987774402167u, 16308871940717542207u, 1302429028955989138u, 344210u}, + {11188979006824460989u, 9761260198426104768u, 13239827720299124548u, 5915072266190131345u, 554015u}, + {16243097808740618663u, 1216081468976033897u, 7907558139918110622u, 5486596925715591599u, 2390831u}, + {2835518573591406799u, 2732784453406997234u, 13193563222420714971u, 16112946523525017734u, 62321u}, + {12831420334808703861u, 13193526249970817570u, 9062488218207158964u, 11314191899605050128u, 428840u}, + {17341607064676150345u, 1685236481417286847u, 13282680790808053274u, 16509099747728258847u, 1877429u}, + {9382996287011977830u, 531757836737635927u, 9391866658095311825u, 10050638040060643301u, 251847u}, + {13234990921736890030u, 1291188577281004766u, 9342871032033568848u, 10813284872894559969u, 822756u}, + {10767906383719677345u, 4263438940362121826u, 13723153935414647911u, 18029575689662377848u, 1303190u}, + {10668876068710551207u, 6511606934376272142u, 4295008710601833711u, 8815066103066201432u, 141213u}, + {13192870789749738065u, 1905252617530164651u, 18051091670283771328u, 7136306738640812513u, 1793001u}, + {3298656436100763360u, 6359732545322737720u, 7339076420894569708u, 1185996542314059014u, 1988463u}, + {5356364108977151127u, 15754782309406975781u, 8283791229976640580u, 17979021584691093322u, 3298854u}, + {6044464503132140273u, 15550980771814298753u, 16191470718728899226u, 13535623218546078665u, 3796063u}, + {18104790457626444879u, 499345888248204407u, 3360378322432791763u, 7924302766318446344u, 3374758u}, + {6093687254364530978u, 3396254309378468364u, 5736112324315119994u, 8853279777688214857u, 3743444u}, + {14486860555351621197u, 15133217604672887569u, 7891892714625143305u, 18155510465795455292u, 2725765u}, + {1132796877625797433u, 7726585104697775938u, 13946504657791183041u, 7472213693422162789u, 1553011u}, + {13004232087919639859u, 14438157407940878867u, 16360021926960286021u, 15232800345935663933u, 3121289u}, + {18131271466680297326u, 11448760194971697390u, 10876513123658431452u, 5822185157630120038u, 3178685u}, + {4336846336397494128u, 2348791099149746199u, 13071823993215455990u, 3445343314290737595u, 2839098u}, + {12802449300467157078u, 3467364351363007272u, 15949423191553045784u, 11941875133909633394u, 1537965u}, + {14374671818035683146u, 10426792023339601096u, 8499057584590477219u, 2334213467904891796u, 271375u}, + {6585560992943418815u, 2421901724551153673u, 8756370509248011347u, 17226770962571993101u, 1279268u}, + {14498137511664355427u, 13582462566798367666u, 4587524278881828831u, 17605651291878873617u, 238u}, + {727431908673339912u, 16939099644694428298u, 13874870284098169787u, 4407930740834u, 0u}, + {17495784791966273762u, 17341000705859382747u, 17169137977623855828u, 4407u, 0u}, + {5085534689834506474u, 11396906529410551655u, 81311970270815u, 0u, 0u}, + {2793550854607092996u, 17898337417891493249u, 81311u, 0u, 0u}, + {4481485673368483845u, 1499941105714815u, 0u, 0u, 0u}, + {1950094141586037287u, 1499941u, 0u, 0u, 0u}, + {27669029702758121u, 0u, 0u, 0u, 0u}, + {27669030u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1318196u}, + {14046376871840856031u, 4952090722795321974u, 1881655259298307353u, 7950651768423060596u, 1644966u}, + {2785896184200364589u, 10735285356131013985u, 13034942560243803228u, 13937459924082697122u, 3130583u}, + {9750182144337853284u, 9629407537254130910u, 5706855392060411261u, 17711859616632310113u, 2888563u}, + {6399944057171624488u, 13663163869594883942u, 3262821746683671639u, 14248630625585449692u, 225609u}, + {10823217241889193790u, 2718139097671871631u, 15052244994238608424u, 4327617408008032323u, 3818226u}, + {1771248979636434831u, 17677320198510536628u, 8053581719267785315u, 9726151443247544558u, 208581u}, + {10519674403320641406u, 13694770196897297222u, 4301069677845583947u, 5912570361161880607u, 1587035u}, + {17161794177878963586u, 11244541566357076814u, 7577538168761665890u, 8964417295096654063u, 2711470u}, + {11184591182664302872u, 12412482389091765403u, 311557822690213758u, 2572033593445436293u, 3054053u}, + {16241222346713000863u, 13193930667620843440u, 12671731498971402022u, 9207651779467426342u, 1298631u}, + {7264887137748358647u, 9403918266398053552u, 3542956167420957621u, 16813374933748046376u, 220746u}, + {16460822216361326608u, 17723030591374925485u, 7914979753424182411u, 10524480791318148678u, 300129u}, + {932859482773616684u, 10393336192439704377u, 6181635693661224933u, 17947877328820635229u, 2430943u}, + {3454530193778488900u, 14871543813922812559u, 6542859373210659470u, 12294633987774402167u, 1815225u}, + {3676119385195842312u, 16226289987773446717u, 11188979006824460988u, 9761260198426104768u, 3423908u}, + {6499583013960315375u, 16492424523187022007u, 16243097808740618662u, 1216081468976033897u, 3613292u}, + {17332882873648836903u, 17266509709130296294u, 2835518573591406798u, 2732784453406997234u, 378741u}, + {9821756798716174120u, 15840105484523919483u, 12831420334808703860u, 13193526249970817570u, 1513102u}, + {13731803429722255350u, 13537945440125113713u, 17341607064676150344u, 1685236481417286847u, 1482900u}, + {15610875373997038901u, 1266322803550945589u, 9382996287011977829u, 531757836737635927u, 3589223u}, + {7983137920747032167u, 4818742402439523181u, 13234990921736890029u, 1291188577281004766u, 652738u}, + {11829317551774974082u, 6737828470199048248u, 10767906383719677344u, 4263438940362121826u, 1432419u}, + {14049966915214822641u, 4287765331301549158u, 10668876068710551206u, 6511606934376272142u, 1721451u}, + {1604662026496967878u, 9252431824271154302u, 13192870789749738064u, 1905252617530164651u, 1011792u}, + {9141786037024652262u, 15095952641849489618u, 3298656436100763359u, 6359732545322737720u, 2505960u}, + {14493758865920036256u, 944411312163049946u, 5356364108977151126u, 15754782309406975781u, 3176606u}, + {15565873159085374358u, 3301258060402739508u, 6044464503132140272u, 15550980771814298753u, 3632094u}, + {12592073142206402214u, 8303690872469265283u, 18104790457626444878u, 499345888248204407u, 517565u}, + {10020141583693054886u, 1362130280201614826u, 6093687254364530977u, 3396254309378468364u, 60870u}, + {14247917632788538712u, 12487226796861850070u, 14486860555351621196u, 15133217604672887569u, 890267u}, + {9254298054435755652u, 11624795977529907060u, 1132796877625797432u, 7726585104697775938u, 1444081u}, + {7457492463327111282u, 11200958493528561239u, 13004232087919639858u, 14438157407940878867u, 3451033u}, + {7216249834797331728u, 10060355761083788165u, 18131271466680297325u, 11448760194971697390u, 2328220u}, + {14315417273369634227u, 5420905676137665798u, 4336846336397494127u, 2348791099149746199u, 466198u}, + {13067123471116473767u, 9816729993703878847u, 12802449300467157077u, 3467364351363007272u, 2737528u}, + {10993049356140036814u, 5630488580048419986u, 14374671818035683145u, 10426792023339601096u, 2385305u}, + {8261952871191511727u, 2304152573664011862u, 6585560992943418814u, 2421901724551153673u, 1931771u}, + {6072889333788581041u, 16555453971605233895u, 14498137511664355426u, 13582462566798367666u, 301681u}, + {13430376765620178392u, 683658820061411732u, 727431908673339911u, 16939099644694428298u, 2557531u}, + {13362075655456164027u, 6062423104791466032u, 17495784791966273761u, 17341000705859382747u, 640040u}, + {6927108066265753408u, 17025259250547833660u, 5085534689834506473u, 11396906529410551655u, 1520815u}, + {7528742493475790373u, 11006943337054026185u, 2793550854607092995u, 17898337417891493249u, 81311u}, + {15220469509235657142u, 2394981284699896215u, 4481485673368483844u, 1499941105714815u, 0u}, + {11656659170428876798u, 3447233161347141192u, 1950094141586037286u, 1499941u, 0u}, + {9670142302521856811u, 2702299366381936521u, 27669029702758120u, 0u, 0u}, + {1569051302105865850u, 12963599188063565286u, 27669029u, 0u, 0u}, + {5601651754467747060u, 510403509694646909u, 0u, 0u, 0u}, + {12813973757518059949u, 510403509u, 0u, 0u, 0u}, + {9415282917660283550u, 0u, 0u, 0u, 0u}, + {9415282918u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2828376u}, + {8240841188795400295u, 15588890659805396943u, 14046376871840856030u, 4952090722795321974u, 3835985u}, + {5569775363105053146u, 6546937164522616449u, 2785896184200364588u, 10735285356131013985u, 2479978u}, + {2272622365614846153u, 8964053544384631388u, 9750182144337853283u, 9629407537254130910u, 2400347u}, + {11441899008581666450u, 4937807399376358139u, 6399944057171624487u, 13663163869594883942u, 2819365u}, + {2919192151358327135u, 771446513002411516u, 10823217241889193789u, 2718139097671871631u, 1258198u}, + {16175040161524358904u, 9727259111332767700u, 1771248979636434830u, 17677320198510536628u, 207479u}, + {8786415393079631325u, 14862635825203308914u, 10519674403320641405u, 13694770196897297222u, 192819u}, + {7324066683358741517u, 18221447011883968751u, 17161794177878963585u, 11244541566357076814u, 1007018u}, + {5905862052703438780u, 973862981048259365u, 11184591182664302871u, 12412482389091765403u, 400664u}, + {11137565089655447797u, 6099432586355824782u, 16241222346713000862u, 13193930667620843440u, 1974930u}, + {13677591014302857514u, 12890547539278126509u, 7264887137748358646u, 9403918266398053552u, 3736163u}, + {8263185909590172353u, 785499379717712108u, 16460822216361326607u, 17723030591374925485u, 923883u}, + {4051095893757478191u, 11570978752138008670u, 932859482773616683u, 10393336192439704377u, 1500505u}, + {3006335798903580880u, 3081071037597410984u, 3454530193778488899u, 14871543813922812559u, 722692u}, + {12529650306932123564u, 10248896548387120547u, 3676119385195842311u, 16226289987773446717u, 3431124u}, + {4964206612172816937u, 16543843026980918793u, 6499583013960315374u, 16492424523187022007u, 2425616u}, + {14877655214805302954u, 4681517697295272482u, 17332882873648836902u, 17266509709130296294u, 3225088u}, + {8885520413637786502u, 3017078150264862998u, 9821756798716174119u, 15840105484523919483u, 3424742u}, + {6739691023568204640u, 10532223853687023700u, 13731803429722255349u, 13537945440125113713u, 2241246u}, + {4685883035689187550u, 15090907477071866159u, 15610875373997038900u, 1266322803550945589u, 3412049u}, + {10634179895294936816u, 2403501341809416807u, 7983137920747032166u, 4818742402439523181u, 1977163u}, + {15522061639988645212u, 6678127000988539899u, 11829317551774974081u, 6737828470199048248u, 1971474u}, + {3830698611595505816u, 13232753292082391627u, 14049966915214822640u, 4287765331301549158u, 1575334u}, + {9390115462334924251u, 3744472716781295804u, 1604662026496967877u, 9252431824271154302u, 1946982u}, + {2473682933167744615u, 10024803768049155665u, 9141786037024652261u, 15095952641849489618u, 415389u}, + {4755197871318507891u, 15500270242350578959u, 14493758865920036255u, 944411312163049946u, 3180308u}, + {16990380698948360618u, 11663091181432298576u, 15565873159085374357u, 3301258060402739508u, 925234u}, + {13665916186511886791u, 3174684463834320203u, 12592073142206402213u, 8303690872469265283u, 3528730u}, + {11245698546116525868u, 16655204058524819458u, 10020141583693054885u, 1362130280201614826u, 1152671u}, + {3694061784631000923u, 6606012918825216908u, 14247917632788538711u, 12487226796861850070u, 1275202u}, + {9891712261947617321u, 9073325175700823032u, 9254298054435755651u, 11624795977529907060u, 1736426u}, + {4542217508598893661u, 9855373491220502128u, 7457492463327111281u, 11200958493528561239u, 2404228u}, + {2474824339056151514u, 1973054034545220287u, 7216249834797331727u, 10060355761083788165u, 899135u}, + {16770014711371832065u, 8895885644674946791u, 14315417273369634226u, 5420905676137665798u, 915999u}, + {17770873815916177993u, 13538957163306360547u, 13067123471116473766u, 9816729993703878847u, 541897u}, + {9768313722327297066u, 17651920924309752159u, 10993049356140036813u, 5630488580048419986u, 3814611u}, + {9051356877558766837u, 5966005495367822315u, 8261952871191511726u, 2304152573664011862u, 2941708u}, + {3774738267154890578u, 12960453025338523956u, 6072889333788581040u, 16555453971605233895u, 1904968u}, + {5136552042988123287u, 5252134259238337751u, 13430376765620178391u, 683658820061411732u, 519615u}, + {4691457843059308407u, 9183651461302986459u, 13362075655456164026u, 6062423104791466032u, 1066153u}, + {17657669013149341105u, 7735098068224041941u, 6927108066265753407u, 17025259250547833660u, 2937593u}, + {1005457161781381485u, 11319168896565264805u, 7528742493475790372u, 11006943337054026185u, 925945u}, + {3312445623362864654u, 16703180930505273978u, 15220469509235657141u, 2394981284699896215u, 3281134u}, + {9856223345405842449u, 6431672888206517397u, 11656659170428876797u, 3447233161347141192u, 1960692u}, + {5271174339730948491u, 4588270115313519435u, 9670142302521856810u, 2702299366381936521u, 3539370u}, + {17991561279569209252u, 14533220579010857575u, 1569051302105865849u, 12963599188063565286u, 325279u}, + {8807102071762500324u, 10383012764076947993u, 5601651754467747059u, 510403509694646909u, 0u}, + {708997684247820969u, 5499011367584209741u, 12813973757518059948u, 510403509u, 0u}, + {12338746960911069334u, 2602475735216039174u, 9415282917660283549u, 0u, 0u}, + {7880529471538140638u, 12180081647086136071u, 9415282917u, 0u, 0u}, + {17352482171673218285u, 7660617700262647252u, 9u, 0u, 0u}, + {11964775821353590828u, 173681314363u, 0u, 0u, 0u}, + {12568031699968224028u, 173u, 0u, 0u, 0u}, + {3203854756452u, 0u, 0u, 0u, 0u}, + {3204u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1325456u}, + {5996678188806087497u, 8921286975312087473u, 8240841188795400294u, 15588890659805396943u, 3347674u}, + {8324010055995596852u, 13655451820145123554u, 5569775363105053145u, 6546937164522616449u, 1567316u}, + {14309190188633688241u, 2721943000759599228u, 2272622365614846152u, 8964053544384631388u, 2054075u}, + {3287449394556261627u, 8873849773695936760u, 11441899008581666449u, 4937807399376358139u, 2757699u}, + {12438547888765241861u, 4941307521400188166u, 2919192151358327134u, 771446513002411516u, 3878273u}, + {678335011817856779u, 3343149144451504213u, 16175040161524358903u, 9727259111332767700u, 1017602u}, + {2912889441547098796u, 6013834383560805398u, 8786415393079631324u, 14862635825203308914u, 3411621u}, + {17555917269122280807u, 16440965475706546237u, 7324066683358741516u, 18221447011883968751u, 2011967u}, + {3369740193988598501u, 4109696337916997543u, 5905862052703438779u, 973862981048259365u, 2525903u}, + {10945282166746569307u, 13792028944357852191u, 11137565089655447796u, 6099432586355824782u, 3485482u}, + {2807022443876894264u, 17311850585877969929u, 13677591014302857513u, 12890547539278126509u, 3519506u}, + {7756808237861946507u, 828384134953902162u, 8263185909590172352u, 785499379717712108u, 2264015u}, + {4127822063066179164u, 16673914570245738654u, 4051095893757478190u, 11570978752138008670u, 2962695u}, + {10159211043844921979u, 15082479110506046760u, 3006335798903580879u, 3081071037597410984u, 906295u}, + {1868844227059255999u, 4029627487590067847u, 12529650306932123563u, 10248896548387120547u, 2312277u}, + {8529890288658179717u, 5969787470109008958u, 4964206612172816936u, 16543843026980918793u, 3785582u}, + {16715251776061556100u, 6839385231513726102u, 14877655214805302953u, 4681517697295272482u, 3399884u}, + {6295984560217228443u, 7500537809080991181u, 8885520413637786501u, 3017078150264862998u, 640499u}, + {6235128427504144163u, 10268339753101670513u, 6739691023568204639u, 10532223853687023700u, 1673483u}, + {10165283179145715391u, 17441859305429297957u, 4685883035689187549u, 15090907477071866159u, 1387818u}, + {14944548057745062109u, 11617639549674399874u, 10634179895294936815u, 2403501341809416807u, 2646990u}, + {8899944291830794317u, 14042848962101142702u, 15522061639988645211u, 6678127000988539899u, 2505243u}, + {9829354044936504669u, 3269423512682252531u, 3830698611595505815u, 13232753292082391627u, 3769522u}, + {16851731507576629945u, 12216708211513756374u, 9390115462334924250u, 3744472716781295804u, 476951u}, + {8423430730944035539u, 15851179650237376188u, 2473682933167744614u, 10024803768049155665u, 427583u}, + {5244059229376537249u, 15920279902793366595u, 4755197871318507890u, 15500270242350578959u, 3351189u}, + {11536676445695695250u, 18328257295136973653u, 16990380698948360617u, 11663091181432298576u, 224989u}, + {18404787427019177530u, 4997839422742885979u, 13665916186511886790u, 3174684463834320203u, 536671u}, + {14456591655800308767u, 11479184050044011168u, 11245698546116525867u, 16655204058524819458u, 2643927u}, + {15210367617940141112u, 12154517383262246593u, 3694061784631000922u, 6606012918825216908u, 3584693u}, + {13134737042487810606u, 8887037323573317953u, 9891712261947617320u, 9073325175700823032u, 3010867u}, + {16225802161889610697u, 6550980868589160983u, 4542217508598893660u, 9855373491220502128u, 1490723u}, + {15203026534991034091u, 6254464434024411338u, 2474824339056151513u, 1973054034545220287u, 1778177u}, + {6812102395581484299u, 13192761193228784521u, 16770014711371832064u, 8895885644674946791u, 3479588u}, + {15052625978393243397u, 67449573667588335u, 17770873815916177992u, 13538957163306360547u, 3787550u}, + {11545718237792455178u, 7726321799253843850u, 9768313722327297065u, 17651920924309752159u, 3105305u}, + {14198416017953244669u, 3331668096639226476u, 9051356877558766836u, 5966005495367822315u, 3368816u}, + {15530779224313979069u, 11293723398046327656u, 3774738267154890577u, 12960453025338523956u, 3468768u}, + {11413409206209599624u, 9319473700261166456u, 5136552042988123286u, 5252134259238337751u, 1752993u}, + {4247728375065598095u, 12338413028113578985u, 4691457843059308406u, 9183651461302986459u, 1351756u}, + {4873311785100705234u, 2099108257789219632u, 17657669013149341104u, 7735098068224041941u, 332125u}, + {14091537752833565772u, 12313049670129066594u, 1005457161781381484u, 11319168896565264805u, 3137502u}, + {17867084854542725382u, 11375724792245546594u, 3312445623362864653u, 16703180930505273978u, 1005435u}, + {17761587191090964610u, 12189174277374245450u, 9856223345405842448u, 6431672888206517397u, 2636871u}, + {8989649335338757104u, 12719033297638867089u, 5271174339730948490u, 4588270115313519435u, 2691216u}, + {4329373827932773363u, 8197289361093609026u, 17991561279569209251u, 14533220579010857575u, 364249u}, + {14204785154956718103u, 13114472807494416489u, 8807102071762500323u, 10383012764076947993u, 1227003u}, + {836134715836846537u, 5621707601125683727u, 708997684247820968u, 5499011367584209741u, 455492u}, + {9957289456594291802u, 4239592617267627628u, 12338746960911069333u, 2602475735216039174u, 127299u}, + {12074224183470484214u, 9079706234150892191u, 7880529471538140637u, 12180081647086136071u, 1220417u}, + {7591547076706253199u, 4290316536795565027u, 17352482171673218284u, 7660617700262647252u, 9u}, + {5763628875512439444u, 12574787941437969382u, 11964775821353590827u, 173681314363u, 0u}, + {17202296139559059930u, 11515406471665721310u, 12568031699968224027u, 173u, 0u}, + {10591766840242427666u, 13293712444279139829u, 3203854756451u, 0u, 0u}, + {6873527005022905249u, 15767473510242971188u, 3203u, 0u, 0u}, + {17280858868324015226u, 59100688741601u, 0u, 0u, 0u}, + {12705040063844837458u, 59100u, 0u, 0u, 0u}, + {1090215279796299u, 0u, 0u, 0u, 0u}, + {1090216u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3155186u}, + {11183867204584591889u, 572048586268897342u, 5996678188806087496u, 8921286975312087473u, 1982276u}, + {14964236065799331528u, 13627490126448491784u, 8324010055995596851u, 13655451820145123554u, 3025575u}, + {619862709446141156u, 11657370401500403360u, 14309190188633688240u, 2721943000759599228u, 583610u}, + {4098677048842999935u, 4819707159098881715u, 3287449394556261626u, 8873849773695936760u, 2243817u}, + {963951642015149703u, 3184523009495905097u, 12438547888765241860u, 4941307521400188166u, 1544978u}, + {4272576590052029139u, 8365341735721274925u, 678335011817856778u, 3343149144451504213u, 1791865u}, + {9536659386070890849u, 63095731410403802u, 2912889441547098795u, 6013834383560805398u, 641524u}, + {12832284091854352050u, 841557195902600330u, 17555917269122280806u, 16440965475706546237u, 130834u}, + {5958467357709672591u, 9997842022454850337u, 3369740193988598500u, 4109696337916997543u, 1573637u}, + {2427622830183337436u, 8545702495319023939u, 10945282166746569306u, 13792028944357852191u, 977300u}, + {18105171821996583077u, 3979124335616426621u, 2807022443876894263u, 17311850585877969929u, 1938043u}, + {17469339317232270704u, 11678082765032880127u, 7756808237861946506u, 828384134953902162u, 1550970u}, + {9013278673420983406u, 6213834046483130198u, 4127822063066179163u, 16673914570245738654u, 1216580u}, + {7731833068139598859u, 15102063583953909972u, 10159211043844921978u, 15082479110506046760u, 3602793u}, + {17737051867639546550u, 565996778042699033u, 1868844227059255998u, 4029627487590067847u, 3310327u}, + {653457940972740867u, 10556202091327826647u, 8529890288658179716u, 5969787470109008958u, 3576316u}, + {14728649458523364682u, 16362851192942288657u, 16715251776061556099u, 6839385231513726102u, 354969u}, + {5039639003344541039u, 3124173704591913163u, 6295984560217228442u, 7500537809080991181u, 1960313u}, + {14979520238584583892u, 8881603051312812030u, 6235128427504144162u, 10268339753101670513u, 212587u}, + {17965223231003297464u, 1321521839736591682u, 10165283179145715390u, 17441859305429297957u, 887251u}, + {7257801560606206956u, 12232245514717514709u, 14944548057745062108u, 11617639549674399874u, 3451867u}, + {9736461091632852022u, 17449639350833499238u, 8899944291830794316u, 14042848962101142702u, 1454553u}, + {9565070199760131337u, 14009562722142593229u, 9829354044936504668u, 3269423512682252531u, 2112829u}, + {14024591664036500799u, 4980875257618429965u, 16851731507576629944u, 12216708211513756374u, 3825420u}, + {11806955381632608979u, 8239087867645557606u, 8423430730944035538u, 15851179650237376188u, 3665102u}, + {8895981706705239945u, 1534102412947410551u, 5244059229376537248u, 15920279902793366595u, 1389318u}, + {4138721968577346501u, 17392176477967153871u, 11536676445695695249u, 18328257295136973653u, 1402167u}, + {7143329261859377017u, 5236913504646706052u, 18404787427019177529u, 4997839422742885979u, 1194064u}, + {9514234475381229988u, 10447622992407642687u, 14456591655800308766u, 11479184050044011168u, 2647707u}, + {1988164684612060451u, 484921488509897592u, 15210367617940141111u, 12154517383262246593u, 1298508u}, + {7362308511019233638u, 9501789612641167023u, 13134737042487810605u, 8887037323573317953u, 3566884u}, + {11851301384617011735u, 12392444408684761638u, 16225802161889610696u, 6550980868589160983u, 3117696u}, + {17138413152458092596u, 4518245893388863949u, 15203026534991034090u, 6254464434024411338u, 337267u}, + {520876099414987261u, 12742771925301049611u, 6812102395581484298u, 13192761193228784521u, 3656448u}, + {4109956033706721924u, 7649653048381644942u, 15052625978393243396u, 67449573667588335u, 875994u}, + {7813252416785099900u, 17366318649896917700u, 11545718237792455177u, 7726321799253843850u, 922589u}, + {3102503955290790377u, 3884817191587865991u, 14198416017953244668u, 3331668096639226476u, 2858972u}, + {8405470100167672903u, 586848412924051707u, 15530779224313979068u, 11293723398046327656u, 1303431u}, + {4814580049352390508u, 2224247526739302905u, 11413409206209599623u, 9319473700261166456u, 897960u}, + {10591304534001480341u, 4951517086619109355u, 4247728375065598094u, 12338413028113578985u, 511636u}, + {12935581450949937070u, 968267203303801868u, 4873311785100705233u, 2099108257789219632u, 3429260u}, + {7652623453985667623u, 3372675497104933393u, 14091537752833565771u, 12313049670129066594u, 3398026u}, + {14313077562574674821u, 12522895607680760813u, 17867084854542725381u, 11375724792245546594u, 620211u}, + {10770102561913459476u, 5793356804642750897u, 17761587191090964609u, 12189174277374245450u, 2000176u}, + {16042283619303032320u, 670134523541442186u, 8989649335338757103u, 12719033297638867089u, 2969696u}, + {15623319273158482449u, 4352699321666094656u, 4329373827932773362u, 8197289361093609026u, 3905745u}, + {14095840134597372686u, 12109809681178022732u, 14204785154956718102u, 13114472807494416489u, 65879u}, + {1268197657389515829u, 13027536165832875118u, 836134715836846536u, 5621707601125683727u, 3266276u}, + {6525519152166773351u, 1406697507927077954u, 9957289456594291801u, 4239592617267627628u, 24361u}, + {4474150679807678939u, 17104158036330700071u, 12074224183470484213u, 9079706234150892191u, 2109775u}, + {2944778737651505787u, 14036077204731690560u, 7591547076706253198u, 4290316536795565027u, 1993120u}, + {13934363522403587502u, 15944803887993569165u, 5763628875512439443u, 12574787941437969382u, 3157685u}, + {6640920206423891021u, 1116030153779800237u, 17202296139559059929u, 11515406471665721310u, 1903595u}, + {4873334292521666991u, 6673685374216256852u, 10591766840242427665u, 13293712444279139829u, 3193951u}, + {11851786107222062383u, 13787907907402286366u, 6873527005022905248u, 15767473510242971188u, 3203u}, + {14386666443484068114u, 12747412655764311031u, 17280858868324015225u, 59100688741601u, 0u}, + {7077013817458146012u, 5902818677396016002u, 12705040063844837457u, 59100u, 0u}, + {10417727038657012658u, 6370454996014308562u, 1090215279796298u, 0u, 0u}, + {7582093838134998784u, 5161330708347826665u, 1090215u, 0u, 0u}, + {3004312471310853993u, 20110922251649967u, 0u, 0u, 0u}, + {4642122540410766704u, 20110922u, 0u, 0u, 0u}, + {370981035862457584u, 0u, 0u, 0u, 0u}, + {370981036u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3667066u}, + {1244844139083335697u, 2049582611429151937u, 11183867204584591888u, 572048586268897342u, 466470u}, + {1899830486990840114u, 13589289872428425122u, 14964236065799331527u, 13627490126448491784u, 3041065u}, + {8887170867745724715u, 16061489892436420098u, 619862709446141155u, 11657370401500403360u, 3464348u}, + {7118608618853951082u, 131739338878526247u, 4098677048842999934u, 4819707159098881715u, 758338u}, + {527087661527122945u, 8360461056227981034u, 963951642015149702u, 3184523009495905097u, 361084u}, + {7797991421830051616u, 15486313895288669443u, 4272576590052029138u, 8365341735721274925u, 3420426u}, + {6511902602324838041u, 1912156191347248896u, 9536659386070890848u, 63095731410403802u, 2652157u}, + {116798296732717538u, 7065941792489434181u, 12832284091854352049u, 841557195902600330u, 2921602u}, + {2428610463019374784u, 13544666484107462023u, 5958467357709672590u, 9997842022454850337u, 2325960u}, + {8066914201603888806u, 8934956136895837177u, 2427622830183337435u, 8545702495319023939u, 865012u}, + {16982479777305866411u, 14230746830470478128u, 18105171821996583076u, 3979124335616426621u, 257635u}, + {5350664078742198216u, 4261551556235034413u, 17469339317232270703u, 11678082765032880127u, 915118u}, + {9345804945743801626u, 11263540301367229410u, 9013278673420983405u, 6213834046483130198u, 2278257u}, + {14466166373912553007u, 5117045006000603017u, 7731833068139598858u, 15102063583953909972u, 3338996u}, + {3523128778581486154u, 4970508141662999334u, 17737051867639546549u, 565996778042699033u, 1940362u}, + {15417842527928779104u, 15191280190511924038u, 653457940972740866u, 10556202091327826647u, 313190u}, + {15362997565787255153u, 4894973752269781953u, 14728649458523364681u, 16362851192942288657u, 1393045u}, + {11328502698440044304u, 17780962586629465818u, 5039639003344541038u, 3124173704591913163u, 1003916u}, + {13705548826024933025u, 8391869238206865112u, 14979520238584583891u, 8881603051312812030u, 1327342u}, + {3514124682230818016u, 5640171754203195291u, 17965223231003297463u, 1321521839736591682u, 2955108u}, + {4525489164591782943u, 2174369804766836685u, 7257801560606206955u, 12232245514717514709u, 634344u}, + {12328558459040769555u, 3851155594703700103u, 9736461091632852021u, 17449639350833499238u, 1647416u}, + {3487602376499761751u, 13549471562575971984u, 9565070199760131336u, 14009562722142593229u, 482538u}, + {4734401732486746061u, 872433757001176757u, 14024591664036500798u, 4980875257618429965u, 1329348u}, + {12973911897710307199u, 8258329256452032917u, 11806955381632608978u, 8239087867645557606u, 1132608u}, + {1979122942677032842u, 11653869333233260933u, 8895981706705239944u, 1534102412947410551u, 1425526u}, + {189374073725640389u, 10823926229304848018u, 4138721968577346500u, 17392176477967153871u, 2643649u}, + {14236010913740978340u, 2093612860534710315u, 7143329261859377016u, 5236913504646706052u, 3866777u}, + {8746635780755642598u, 9632047847985216610u, 9514234475381229987u, 10447622992407642687u, 2850146u}, + {4228559881016487158u, 9244304581558185938u, 1988164684612060450u, 484921488509897592u, 3374297u}, + {4944118523850570505u, 11464938371712113389u, 7362308511019233637u, 9501789612641167023u, 3827007u}, + {5526986550509370837u, 17236360917437805537u, 11851301384617011734u, 12392444408684761638u, 2747100u}, + {13023294496470999140u, 2314998920297088015u, 17138413152458092595u, 4518245893388863949u, 3287050u}, + {7728596941390019741u, 6301942346090693781u, 520876099414987260u, 12742771925301049611u, 626022u}, + {16045517920793458342u, 12328266541092256281u, 4109956033706721923u, 7649653048381644942u, 23770u}, + {10328836006410333690u, 7883351030160942609u, 7813252416785099899u, 17366318649896917700u, 3565111u}, + {13875125297629556477u, 6478767970409190193u, 3102503955290790376u, 3884817191587865991u, 563116u}, + {4799375030871385428u, 6613872162408128848u, 8405470100167672902u, 586848412924051707u, 3389200u}, + {6318324772859722829u, 7447994933139407142u, 4814580049352390507u, 2224247526739302905u, 2797279u}, + {2187896710640520550u, 1513799058631821420u, 10591304534001480340u, 4951517086619109355u, 1708620u}, + {13340413411286997961u, 14395815833739200265u, 12935581450949937069u, 968267203303801868u, 3145605u}, + {8051554752423646381u, 2401888523833216664u, 7652623453985667622u, 3372675497104933393u, 3086281u}, + {18021063326167370014u, 18111305641076518301u, 14313077562574674820u, 12522895607680760813u, 1558501u}, + {137060156592208612u, 16061323378199682491u, 10770102561913459475u, 5793356804642750897u, 1171815u}, + {18360899623095666276u, 5028059798954706735u, 16042283619303032319u, 670134523541442186u, 1585303u}, + {845498102817335237u, 5086432591081313367u, 15623319273158482448u, 4352699321666094656u, 224098u}, + {17670067508717179323u, 7067191747042145139u, 14095840134597372685u, 12109809681178022732u, 3099150u}, + {15322055480736483626u, 5655218282404096764u, 1268197657389515828u, 13027536165832875118u, 2038474u}, + {5998647357164523324u, 6865226241954348498u, 6525519152166773350u, 1406697507927077954u, 1437015u}, + {6819181361308879309u, 17909775114108531758u, 4474150679807678938u, 17104158036330700071u, 3084769u}, + {2388668269734532694u, 8890543686442106396u, 2944778737651505786u, 14036077204731690560u, 1088300u}, + {10247696347185050016u, 8098407430332406734u, 13934363522403587501u, 15944803887993569165u, 1906365u}, + {17020730154787897513u, 8659373562457820522u, 6640920206423891020u, 1116030153779800237u, 2406209u}, + {7426570230896272208u, 1176059559505779608u, 4873334292521666990u, 6673685374216256852u, 1350235u}, + {17324490657486698475u, 5988403091271145392u, 11851786107222062382u, 13787907907402286366u, 3538624u}, + {7156574941180528775u, 14894018898222173480u, 14386666443484068113u, 12747412655764311031u, 3586191u}, + {15749541590212477294u, 12291956661179173679u, 7077013817458146011u, 5902818677396016002u, 1593057u}, + {2849273756751293582u, 5101746568766369835u, 10417727038657012657u, 6370454996014308562u, 2452548u}, + {1005694851717120050u, 7687472832141700014u, 7582093838134998783u, 5161330708347826665u, 1090215u}, + {176539436968279625u, 482243332104894058u, 3004312471310853992u, 20110922251649967u, 0u}, + {368327651729312099u, 1144632718893985953u, 4642122540410766703u, 20110922u, 0u}, + {8812939969023249853u, 11346899511405925550u, 370981035862457583u, 0u, 0u}, + {2859792802708540022u, 15909534319378013242u, 370981035u, 0u, 0u}, + {4936640212434321574u, 6843392224754420067u, 0u, 0u, 0u}, + {13916593904956453082u, 6843392224u, 0u, 0u, 0u}, + {15557840523801312573u, 6u, 0u, 0u, 0u}, + {126238304967u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1733096u}, + {2988483515553294799u, 3717900242497340198u, 1244844139083335696u, 2049582611429151937u, 2301880u}, + {3277242762846083311u, 1430603445919301482u, 1899830486990840113u, 13589289872428425122u, 3507611u}, + {16017735441113386872u, 10963432764851782776u, 8887170867745724714u, 16061489892436420098u, 3235353u}, + {1392278650305550307u, 14301890740856167785u, 7118608618853951081u, 131739338878526247u, 96502u}, + {4985050056779675619u, 980318009388928130u, 527087661527122944u, 8360461056227981034u, 3577258u}, + {13607246415660587362u, 3612638694574493815u, 7797991421830051615u, 15486313895288669443u, 2095694u}, + {17339247450183787869u, 13643063737833078960u, 6511902602324838040u, 1912156191347248896u, 232972u}, + {10741743628958608648u, 7289806620358445386u, 116798296732717537u, 7065941792489434181u, 3789091u}, + {2105331523560233183u, 16619234903944567950u, 2428610463019374783u, 13544666484107462023u, 3896192u}, + {10232312979829348368u, 7873614621568878186u, 8066914201603888805u, 8934956136895837177u, 1919081u}, + {3062258290335869190u, 4174660025039844806u, 16982479777305866410u, 14230746830470478128u, 550422u}, + {16966205556617293943u, 14885705096428362108u, 5350664078742198215u, 4261551556235034413u, 1222743u}, + {5474193143137377777u, 8896927972414738738u, 9345804945743801625u, 11263540301367229410u, 51815u}, + {8204040714605793978u, 17130030709188952604u, 14466166373912553006u, 5117045006000603017u, 3826786u}, + {5842181771665398962u, 8194761202335816396u, 3523128778581486153u, 4970508141662999334u, 3208449u}, + {8198069762171539857u, 13021586920933358645u, 15417842527928779103u, 15191280190511924038u, 3638308u}, + {9463887870069315378u, 4555994554773938666u, 15362997565787255152u, 4894973752269781953u, 2970413u}, + {10172713696908061704u, 14788616894377223327u, 11328502698440044303u, 17780962586629465818u, 1799142u}, + {15333177457963027072u, 5793697001762679535u, 13705548826024933024u, 8391869238206865112u, 1066823u}, + {4980967695576598061u, 3480500391943266189u, 3514124682230818015u, 5640171754203195291u, 685323u}, + {5927077835186953884u, 5591550485345129462u, 4525489164591782942u, 2174369804766836685u, 1740313u}, + {12951524358446063105u, 465625894204819714u, 12328558459040769554u, 3851155594703700103u, 143325u}, + {7432527934867064239u, 3887046297687784371u, 3487602376499761750u, 13549471562575971984u, 419728u}, + {9000781879717949341u, 6930291632776452991u, 4734401732486746060u, 872433757001176757u, 2372426u}, + {13488625240652884346u, 2756822153069241282u, 12973911897710307198u, 8258329256452032917u, 2851272u}, + {4594606449832582503u, 4933085524748347093u, 1979122942677032841u, 11653869333233260933u, 828716u}, + {9628059166355384205u, 14053118220948934637u, 189374073725640388u, 10823926229304848018u, 213730u}, + {1788558185594936934u, 6759410118535252041u, 14236010913740978339u, 2093612860534710315u, 2623110u}, + {2595328964789340923u, 18325835615860851353u, 8746635780755642597u, 9632047847985216610u, 1134755u}, + {14857427250754958361u, 5200831452811260422u, 4228559881016487157u, 9244304581558185938u, 421804u}, + {9797918880531002886u, 329266805304732654u, 4944118523850570504u, 11464938371712113389u, 791247u}, + {10442200336740508183u, 14769989958280674031u, 5526986550509370836u, 17236360917437805537u, 496342u}, + {6109622724824431885u, 7230433414500895980u, 13023294496470999139u, 2314998920297088015u, 1785229u}, + {12895521630040816134u, 18038421766859841584u, 7728596941390019740u, 6301942346090693781u, 347918u}, + {15839243094867485483u, 15736335281864050271u, 16045517920793458341u, 12328266541092256281u, 1576065u}, + {8649100984252376960u, 4640445928573930052u, 10328836006410333689u, 7883351030160942609u, 3558465u}, + {11582983993278500820u, 5318470679515517941u, 13875125297629556476u, 6478767970409190193u, 3069978u}, + {3716473896488312748u, 10944939003915296573u, 4799375030871385427u, 6613872162408128848u, 1412864u}, + {7156846703452949977u, 15063127529459802115u, 6318324772859722828u, 7447994933139407142u, 31961u}, + {18051614287851961587u, 10221516445522195499u, 2187896710640520549u, 1513799058631821420u, 3054990u}, + {12704111123477529012u, 9977856958432561174u, 13340413411286997960u, 14395815833739200265u, 1300387u}, + {13130228747963659866u, 1033196095014272767u, 8051554752423646380u, 2401888523833216664u, 1347096u}, + {6546300251331321568u, 7793881819797930887u, 18021063326167370013u, 18111305641076518301u, 3498584u}, + {12536728529087355182u, 11143175115351164112u, 137060156592208611u, 16061323378199682491u, 3040417u}, + {735361313438991275u, 17313767550426511923u, 18360899623095666275u, 5028059798954706735u, 2298563u}, + {8533222728735100581u, 2765863558359284831u, 845498102817335236u, 5086432591081313367u, 300732u}, + {1187941383938666203u, 10001309975371525948u, 17670067508717179322u, 7067191747042145139u, 1882497u}, + {5093219753128467129u, 17754245526657805918u, 15322055480736483625u, 5655218282404096764u, 1070910u}, + {10641514597847141557u, 18140513548465656281u, 5998647357164523323u, 6865226241954348498u, 2140854u}, + {7774242337307477853u, 13208228763127150947u, 6819181361308879308u, 17909775114108531758u, 1488588u}, + {10805423311015807025u, 17339282074323396568u, 2388668269734532693u, 8890543686442106396u, 1515546u}, + {13022151523039884783u, 4788103409623719014u, 10247696347185050015u, 8098407430332406734u, 675581u}, + {3226898804397498749u, 9734127243996436285u, 17020730154787897512u, 8659373562457820522u, 1254316u}, + {13805079240143953071u, 17185081974001365870u, 7426570230896272207u, 1176059559505779608u, 413232u}, + {14092048921043615718u, 11970175755025631700u, 17324490657486698474u, 5988403091271145392u, 2718882u}, + {11525132943270959347u, 15701207030375774718u, 7156574941180528774u, 14894018898222173480u, 2285805u}, + {140225924973976041u, 9851567325803423270u, 15749541590212477293u, 12291956661179173679u, 3128735u}, + {17377053208592351787u, 14044995239008046584u, 2849273756751293581u, 5101746568766369835u, 2676237u}, + {17821502621180711209u, 10174633989100498162u, 1005694851717120049u, 7687472832141700014u, 2704963u}, + {16810713021851828709u, 3739132916269415723u, 176539436968279624u, 482243332104894058u, 3456914u}, + {6526079893388897265u, 4947124125160049331u, 368327651729312098u, 1144632718893985953u, 1835405u}, + {11139253594547708568u, 9392377901271758019u, 8812939969023249852u, 11346899511405925550u, 3082583u}, + {18256927438818471325u, 10627344514325150827u, 2859792802708540021u, 15909534319378013242u, 3793535u}, + {2387054357086525850u, 8942539793381402015u, 4936640212434321573u, 6843392224754420067u, 0u}, + {8723493590596454461u, 2158266206321225907u, 13916593904956453081u, 6843392224u, 0u}, + {17544199257461222069u, 7701277044297410572u, 15557840523801312572u, 6u, 0u}, + {5356854437680173148u, 1081389982517690133u, 126238304966u, 0u, 0u}, + {4497596398122978697u, 4395950720377446174u, 126u, 0u, 0u}, + {14405980915044815254u, 2328685704007u, 0u, 0u, 0u}, + {12649006341852123813u, 2328u, 0u, 0u, 0u}, + {42956669209938u, 0u, 0u, 0u, 0u}, + {42957u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2329026u}, + {7971194062623543553u, 8384448353539466205u, 2988483515553294798u, 3717900242497340198u, 3334418u}, + {11793420187795591436u, 15728567901682959977u, 3277242762846083310u, 1430603445919301482u, 578881u}, + {7637249143122481650u, 115088477241190698u, 16017735441113386871u, 10963432764851782776u, 1869550u}, + {17041524428901980138u, 603534798887822515u, 1392278650305550306u, 14301890740856167785u, 2361895u}, + {14961414254769289329u, 9524238175046096361u, 4985050056779675618u, 980318009388928130u, 529036u}, + {6362292837329121728u, 8206405148524230805u, 13607246415660587361u, 3612638694574493815u, 1310717u}, + {13920046878618287103u, 5364614844446980130u, 17339247450183787868u, 13643063737833078960u, 649958u}, + {17432153720707319466u, 12708074080160116811u, 10741743628958608647u, 7289806620358445386u, 2493029u}, + {5103925650890506057u, 5176020760881800277u, 2105331523560233182u, 16619234903944567950u, 1048253u}, + {16859001032649257158u, 16010422637152512338u, 10232312979829348367u, 7873614621568878186u, 3652523u}, + {16315385771388561110u, 455642545177744330u, 3062258290335869189u, 4174660025039844806u, 2268190u}, + {4319849873526973926u, 6728640363973762548u, 16966205556617293942u, 14885705096428362108u, 1834681u}, + {16663464935941305701u, 10038091053023336670u, 5474193143137377776u, 8896927972414738738u, 2839575u}, + {13316048117639783220u, 17492117404087638709u, 8204040714605793977u, 17130030709188952604u, 2832644u}, + {3922958192093231392u, 12783071709949271062u, 5842181771665398961u, 8194761202335816396u, 2776641u}, + {8364435374136392463u, 10180650946820537215u, 8198069762171539856u, 13021586920933358645u, 887209u}, + {12014897442241476180u, 2887403927499267603u, 9463887870069315377u, 4555994554773938666u, 911278u}, + {10490029149225521239u, 7631425423325418988u, 10172713696908061703u, 14788616894377223327u, 1576943u}, + {4766123572255063022u, 15714175179354562570u, 15333177457963027071u, 5793697001762679535u, 1178304u}, + {10358227727419158907u, 2653679535101475232u, 4980967695576598060u, 3480500391943266189u, 2337309u}, + {1967128332109044583u, 15674592981046934043u, 5927077835186953883u, 5591550485345129462u, 1804130u}, + {2022429504181869800u, 228329294366671752u, 12951524358446063104u, 465625894204819714u, 3685952u}, + {4341042622524027762u, 1034623272960239864u, 7432527934867064238u, 3887046297687784371u, 691862u}, + {7934959201367574798u, 1550058618005775834u, 9000781879717949340u, 6930291632776452991u, 1010128u}, + {10757861831123605594u, 2428682904816612562u, 13488625240652884345u, 2756822153069241282u, 1798102u}, + {11811709713056228530u, 13749328087453622561u, 4594606449832582502u, 4933085524748347093u, 102315u}, + {5439897633930571862u, 10233431454460022089u, 9628059166355384204u, 14053118220948934637u, 3147106u}, + {10879450646051580964u, 7370469137481780628u, 1788558185594936933u, 6759410118535252041u, 1258039u}, + {419976959418619713u, 4163060711863150756u, 2595328964789340922u, 18325835615860851353u, 687637u}, + {5075574187275402506u, 1240485288302243283u, 14857427250754958360u, 5200831452811260422u, 2224589u}, + {11834457365168668041u, 17277071008262877989u, 9797918880531002885u, 329266805304732654u, 3807760u}, + {1111367144809013267u, 8824374679861427991u, 10442200336740508182u, 14769989958280674031u, 1337580u}, + {15422970738816252799u, 5259328300823565393u, 6109622724824431884u, 7230433414500895980u, 1302303u}, + {13761940803453892270u, 17803298255206405292u, 12895521630040816133u, 18038421766859841584u, 1505944u}, + {18411074503899875798u, 16692649487883537742u, 15839243094867485482u, 15736335281864050271u, 1559077u}, + {9179804940940932715u, 14258586645937469861u, 8649100984252376959u, 4640445928573930052u, 3158623u}, + {2827213030689390648u, 9107638636087690550u, 11582983993278500819u, 5318470679515517941u, 3482582u}, + {5655285147611385246u, 14405115343082686818u, 3716473896488312747u, 10944939003915296573u, 167529u}, + {13964743135887692846u, 12483593133363707678u, 7156846703452949976u, 15063127529459802115u, 3328266u}, + {2509064715212950894u, 4818900373126296686u, 18051614287851961586u, 10221516445522195499u, 1838209u}, + {14056409209901383981u, 4568525696521684122u, 12704111123477529011u, 9977856958432561174u, 1322172u}, + {4352608042115948555u, 3417971886606555312u, 13130228747963659865u, 1033196095014272767u, 632180u}, + {10560008064245213814u, 14232685319501223720u, 6546300251331321567u, 7793881819797930887u, 2510233u}, + {12577584695470164163u, 7495174204273931332u, 12536728529087355181u, 11143175115351164112u, 1081219u}, + {16451196046533575868u, 1114276265797130396u, 735361313438991274u, 17313767550426511923u, 1500263u}, + {8555797593147179958u, 16058292302896925604u, 8533222728735100580u, 2765863558359284831u, 3109600u}, + {14777473072708145837u, 9574138293427204836u, 1187941383938666202u, 10001309975371525948u, 1522078u}, + {13198007953828446147u, 8937885402097237768u, 5093219753128467128u, 17754245526657805918u, 2930459u}, + {579458140052480360u, 8021915681788358507u, 10641514597847141556u, 18140513548465656281u, 1175765u}, + {9345739971539968082u, 12429517474405864373u, 7774242337307477852u, 13208228763127150947u, 2464364u}, + {11838385824950259159u, 16303457253690789564u, 10805423311015807024u, 17339282074323396568u, 1751105u}, + {3460119180756723688u, 6838573142386294897u, 13022151523039884782u, 4788103409623719014u, 344345u}, + {2420214910412892682u, 2348781981847986734u, 3226898804397498748u, 9734127243996436285u, 1917660u}, + {2962322456208639266u, 756284559610137933u, 13805079240143953070u, 17185081974001365870u, 467027u}, + {9084762559211202114u, 16627162809951836264u, 14092048921043615717u, 11970175755025631700u, 3507888u}, + {7058900898810034498u, 17476590066766850262u, 11525132943270959346u, 15701207030375774718u, 2804534u}, + {7830518719760989495u, 15261824038790501220u, 140225924973976040u, 9851567325803423270u, 3568217u}, + {8319286270947274062u, 13122539889337033607u, 17377053208592351786u, 14044995239008046584u, 786763u}, + {15013468080130984027u, 11484729961094007969u, 17821502621180711208u, 10174633989100498162u, 3480051u}, + {13895963039567756039u, 8826864006841601826u, 16810713021851828708u, 3739132916269415723u, 2559136u}, + {3466779601123042621u, 1382566727507775972u, 6526079893388897264u, 4947124125160049331u, 1349326u}, + {7087213767653120203u, 9790513790582633137u, 11139253594547708567u, 9392377901271758019u, 1890750u}, + {1997875970602644137u, 16612201937693220764u, 18256927438818471324u, 10627344514325150827u, 401053u}, + {310531532504010730u, 1275056011778530253u, 2387054357086525849u, 8942539793381402015u, 3718595u}, + {9393768246182744990u, 8386930419569872058u, 8723493590596454460u, 2158266206321225907u, 3424565u}, + {16793182556022014083u, 1368505142995335067u, 17544199257461222068u, 7701277044297410572u, 28518u}, + {8564415893873659496u, 5416123219917497463u, 5356854437680173147u, 1081389982517690133u, 23716u}, + {16007313423380539654u, 746513377681867442u, 4497596398122978696u, 4395950720377446174u, 126u}, + {7397779289602372557u, 11664601899677946303u, 14405980915044815253u, 2328685704007u, 0u}, + {8633986451586678497u, 5706326245836316242u, 12649006341852123812u, 2328u, 0u}, + {1277732220537040402u, 12696633114679408370u, 42956669209937u, 0u, 0u}, + {16989756808139578037u, 12344744452118925507u, 42956u, 0u, 0u}, + {11402714726238588169u, 792410683174719u, 0u, 0u, 0u}, + {12602349210424152940u, 792410u, 0u, 0u, 0u}, + {14617397073797397u, 0u, 0u, 0u, 0u}, + {14617398u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1396856u}, + {10069247043632869529u, 14417649324724067537u, 7971194062623543552u, 8384448353539466205u, 1084874u}, + {11832242543388386886u, 14642977055871841983u, 11793420187795591435u, 15728567901682959977u, 2332708u}, + {1500639377154813521u, 2736890214002610577u, 7637249143122481649u, 115088477241190698u, 1467687u}, + {7266784942484822990u, 11432773423199414256u, 17041524428901980137u, 603534798887822515u, 684986u}, + {14314248100334033550u, 4313106901155890008u, 14961414254769289328u, 9524238175046096361u, 3463864u}, + {10845686011274574573u, 3973146221244887678u, 6362292837329121727u, 8206405148524230805u, 1753853u}, + {622372458645795581u, 2593475253661961885u, 13920046878618287102u, 5364614844446980130u, 1406076u}, + {4854151738701797565u, 16064971280109404462u, 17432153720707319465u, 12708074080160116811u, 3248897u}, + {16252917631465525496u, 10992416156200810468u, 5103925650890506056u, 5176020760881800277u, 739250u}, + {11937594173926533789u, 13723486402732633502u, 16859001032649257157u, 16010422637152512338u, 1262931u}, + {5916821175737436746u, 11057585327831760759u, 16315385771388561109u, 455642545177744330u, 1479075u}, + {6348605307288348014u, 6164562257486176411u, 4319849873526973925u, 6728640363973762548u, 1197256u}, + {2378753310345034420u, 15414398726365835820u, 16663464935941305700u, 10038091053023336670u, 2937084u}, + {8566184719301714186u, 7893338266509277809u, 13316048117639783219u, 17492117404087638709u, 1565455u}, + {1270384790070959786u, 12907914431194410858u, 3922958192093231391u, 12783071709949271062u, 1112943u}, + {16677478370962315553u, 13278752062440893047u, 8364435374136392462u, 10180650946820537215u, 276480u}, + {480219659483037365u, 2419046669482593464u, 12014897442241476179u, 2887403927499267603u, 3544151u}, + {12298075191966950942u, 3072609285577939445u, 10490029149225521238u, 7631425423325418988u, 304643u}, + {2524671378455660106u, 5176083599303394611u, 4766123572255063021u, 15714175179354562570u, 3231255u}, + {2699735360266849480u, 16231906624266805513u, 10358227727419158906u, 2653679535101475232u, 2065138u}, + {18365118137773581823u, 17313279214859380118u, 1967128332109044582u, 15674592981046934043u, 659005u}, + {16852017864920650231u, 6560941491625907526u, 2022429504181869799u, 228329294366671752u, 1399540u}, + {1188181771779485848u, 297938369163068435u, 4341042622524027761u, 1034623272960239864u, 1997596u}, + {12270040181519826678u, 16685223180148983865u, 7934959201367574797u, 1550058618005775834u, 2752914u}, + {4474056072201845913u, 14539821924495284267u, 10757861831123605593u, 2428682904816612562u, 3165069u}, + {12805963110202503304u, 7405191761752763840u, 11811709713056228529u, 13749328087453622561u, 67930u}, + {16441597763098545434u, 16086357462322743917u, 5439897633930571861u, 10233431454460022089u, 1116432u}, + {3390141701523991400u, 7903741363841837268u, 10879450646051580963u, 7370469137481780628u, 3023723u}, + {11791705798160560731u, 15769134597263349505u, 419976959418619712u, 4163060711863150756u, 840592u}, + {12561112362986593700u, 10962224130071860404u, 5075574187275402505u, 1240485288302243283u, 2998146u}, + {13757569715456559900u, 4743735368187551151u, 11834457365168668040u, 17277071008262877989u, 1807809u}, + {17361164986198777320u, 12147331650287069166u, 1111367144809013266u, 8824374679861427991u, 3858758u}, + {12204644184108500318u, 18303382816211319903u, 15422970738816252798u, 5259328300823565393u, 274982u}, + {3498453636683718972u, 11504711848390374557u, 13761940803453892269u, 17803298255206405292u, 2566591u}, + {13482982560605849088u, 10192022330245951164u, 18411074503899875797u, 16692649487883537742u, 3428280u}, + {5358047716599596574u, 9285031193003631926u, 9179804940940932714u, 14258586645937469861u, 1538579u}, + {8513913032149565226u, 14361511796615616201u, 2827213030689390647u, 9107638636087690550u, 3559117u}, + {14343549666184348913u, 11113495528189304285u, 5655285147611385245u, 14405115343082686818u, 955689u}, + {4066816381158153891u, 3382327065110455440u, 13964743135887692845u, 12483593133363707678u, 3420612u}, + {16469520221928891379u, 16401582430794176048u, 2509064715212950893u, 4818900373126296686u, 1566524u}, + {6841850464891469400u, 10009100288837245322u, 14056409209901383980u, 4568525696521684122u, 1694877u}, + {9778479324675669501u, 11730949460924396948u, 4352608042115948554u, 3417971886606555312u, 2024167u}, + {538130567719046915u, 4006446475532031458u, 10560008064245213813u, 14232685319501223720u, 64207u}, + {9299982435442178419u, 5565396064934071637u, 12577584695470164162u, 7495174204273931332u, 1811287u}, + {480610981334321104u, 3455085242493459328u, 16451196046533575867u, 1114276265797130396u, 3334270u}, + {11596968019070432259u, 10874225087299056277u, 8555797593147179957u, 16058292302896925604u, 3390076u}, + {2659214550330560919u, 2159499041052845358u, 14777473072708145836u, 9574138293427204836u, 148738u}, + {14817214326415593030u, 12737538397181150621u, 13198007953828446146u, 8937885402097237768u, 1275170u}, + {18215884654417537170u, 8327353811800978021u, 579458140052480359u, 8021915681788358507u, 1930492u}, + {13277398039840364843u, 13868151946752866154u, 9345739971539968081u, 12429517474405864373u, 999688u}, + {4863826939496275290u, 977134691223877426u, 11838385824950259158u, 16303457253690789564u, 3532292u}, + {14352665766754328975u, 10749503161704125516u, 3460119180756723687u, 6838573142386294897u, 2327726u}, + {9510186381497079079u, 17621368409414496344u, 2420214910412892681u, 2348781981847986734u, 1935768u}, + {131113415854057698u, 422670873324829798u, 2962322456208639265u, 756284559610137933u, 2922802u}, + {3668081157802074376u, 9808294403321201109u, 9084762559211202113u, 16627162809951836264u, 2095345u}, + {10479138220071074982u, 9833536051853573251u, 7058900898810034497u, 17476590066766850262u, 3126388u}, + {4142613421503316487u, 9586013212679202446u, 7830518719760989494u, 15261824038790501220u, 436812u}, + {13632671857322849781u, 15577893273976986732u, 8319286270947274061u, 13122539889337033607u, 1494708u}, + {7573780594772197509u, 4600762259546455929u, 15013468080130984026u, 11484729961094007969u, 1942756u}, + {13684093322004358973u, 15997471472711007540u, 13895963039567756038u, 8826864006841601826u, 730342u}, + {5697720306789844022u, 6010037890264061637u, 3466779601123042620u, 1382566727507775972u, 3401066u}, + {9795551766725013459u, 8954519381066723479u, 7087213767653120202u, 9790513790582633137u, 2111771u}, + {12167217817299410748u, 4081677312602576978u, 1997875970602644136u, 16612201937693220764u, 2714674u}, + {16189029406714634798u, 11247055571260069436u, 310531532504010729u, 1275056011778530253u, 1531409u}, + {1108397204920973997u, 10379449440131552659u, 9393768246182744989u, 8386930419569872058u, 3874312u}, + {9766239111039314784u, 13141626306272612586u, 16793182556022014082u, 1368505142995335067u, 639878u}, + {14780699741498472482u, 16295387431059948973u, 8564415893873659495u, 5416123219917497463u, 1406071u}, + {1488110609782824224u, 5005691498685919471u, 16007313423380539653u, 746513377681867442u, 3433086u}, + {10736767400979403845u, 13725468554736861157u, 7397779289602372556u, 11664601899677946303u, 746815u}, + {10082714745516691168u, 5455824610017803751u, 8633986451586678496u, 5706326245836316242u, 785860u}, + {3223978036235151169u, 4420535844277046091u, 1277732220537040401u, 12696633114679408370u, 1241187u}, + {13982971043805148870u, 8612869538331056041u, 16989756808139578036u, 12344744452118925507u, 42956u}, + {13962912175738854553u, 1961834926471270995u, 11402714726238588168u, 792410683174719u, 0u}, + {4049638588228637329u, 2128460448328311137u, 12602349210424152939u, 792410u, 0u}, + {1231495802420076948u, 4061742444411638271u, 14617397073797396u, 0u, 0u}, + {557222029730347u, 1361321681379939414u, 14617397u, 0u, 0u}, + {793264708212990565u, 269643382844131460u, 0u, 0u, 0u}, + {15571477007980056130u, 269643382u, 0u, 0u, 0u}, + {4974042474494977792u, 0u, 0u, 0u, 0u}, + {4974042475u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 332336u}, + {16192645214640281085u, 5947990590367701453u, 10069247043632869528u, 14417649324724067537u, 828626u}, + {14781808969092774815u, 10889090453843992688u, 11832242543388386885u, 14642977055871841983u, 3835865u}, + {12933402175242317533u, 14007550858333133347u, 1500639377154813520u, 2736890214002610577u, 2584389u}, + {9864070323254593939u, 9599986975977189638u, 7266784942484822989u, 11432773423199414256u, 3345243u}, + {4957752960752817445u, 1452948454066474438u, 14314248100334033549u, 4313106901155890008u, 540938u}, + {16899204622853834087u, 3639029879944314230u, 10845686011274574572u, 3973146221244887678u, 3873825u}, + {14971542605481336415u, 12571482284248673973u, 622372458645795580u, 2593475253661961885u, 3696338u}, + {8571476309559255582u, 1379814034314739015u, 4854151738701797564u, 16064971280109404462u, 2150073u}, + {4566685545319187163u, 4083084311985349754u, 16252917631465525495u, 10992416156200810468u, 1764188u}, + {9059002881754994605u, 18018401659943248095u, 11937594173926533788u, 13723486402732633502u, 1776651u}, + {2845220483878926821u, 15825219663784602627u, 5916821175737436745u, 11057585327831760759u, 2150339u}, + {709450619639925245u, 8584319154997978114u, 6348605307288348013u, 6164562257486176411u, 3584979u}, + {3081910851653326627u, 5751650778388853404u, 2378753310345034419u, 15414398726365835820u, 2117474u}, + {1199465077956944757u, 7402709448401569895u, 8566184719301714185u, 7893338266509277809u, 520693u}, + {13321863862520133993u, 18414693545813721445u, 1270384790070959785u, 12907914431194410858u, 1092591u}, + {12865253500153895765u, 8406712725054155715u, 16677478370962315552u, 13278752062440893047u, 2230532u}, + {14255179915861285268u, 3314955476316045064u, 480219659483037364u, 2419046669482593464u, 2503983u}, + {16067365716045364772u, 2979231000975759037u, 12298075191966950941u, 3072609285577939445u, 3252304u}, + {13060737486771265069u, 5682310789976264352u, 2524671378455660105u, 5176083599303394611u, 1027171u}, + {6096738654384918820u, 9331699753899950770u, 2699735360266849479u, 16231906624266805513u, 1054746u}, + {16652248099836270210u, 2473314791437849884u, 18365118137773581822u, 17313279214859380118u, 200600u}, + {6259785370560251943u, 8795889221305793558u, 16852017864920650230u, 6560941491625907526u, 526271u}, + {14373221712941384908u, 16079525472238070086u, 1188181771779485847u, 297938369163068435u, 2164011u}, + {14602923234591799201u, 7257628399133889284u, 12270040181519826677u, 16685223180148983865u, 3049075u}, + {1838733758725404678u, 621760742577509686u, 4474056072201845912u, 14539821924495284267u, 2998749u}, + {340034996561942543u, 10450817059975596808u, 12805963110202503303u, 7405191761752763840u, 949435u}, + {3072291501438769979u, 3405197079495945042u, 16441597763098545433u, 16086357462322743917u, 2681427u}, + {17255278358687397066u, 16600096181722555864u, 3390141701523991399u, 7903741363841837268u, 3283999u}, + {6168590497633989471u, 1765520016999829942u, 11791705798160560730u, 15769134597263349505u, 513360u}, + {12003101983142346983u, 722429286521884975u, 12561112362986593699u, 10962224130071860404u, 3252159u}, + {18330220559744816568u, 10546742693356981265u, 13757569715456559899u, 4743735368187551151u, 2258168u}, + {3592474520637192235u, 4767423090091537182u, 17361164986198777319u, 12147331650287069166u, 40870u}, + {9956812777037022878u, 11806954671399165603u, 12204644184108500317u, 18303382816211319903u, 2577928u}, + {14561788411290311641u, 11021131460572574570u, 3498453636683718971u, 11504711848390374557u, 1729387u}, + {5672031630124908222u, 6522963420868526916u, 13482982560605849087u, 10192022330245951164u, 3342549u}, + {8279787805230254901u, 16845040132324941917u, 5358047716599596573u, 9285031193003631926u, 1195364u}, + {5148712897503069184u, 16251193666095517215u, 8513913032149565225u, 14361511796615616201u, 901299u}, + {13608557407478824667u, 11473457656981307829u, 14343549666184348912u, 11113495528189304285u, 3668817u}, + {5629994506246977164u, 14225963463143458246u, 4066816381158153890u, 3382327065110455440u, 2412815u}, + {18231421987275465504u, 4249273366481301820u, 16469520221928891378u, 16401582430794176048u, 3531913u}, + {9779072915396044849u, 3762771914812423901u, 6841850464891469399u, 10009100288837245322u, 3123544u}, + {16223080230765406283u, 7178178112517716098u, 9778479324675669500u, 11730949460924396948u, 2346148u}, + {15340109363054668108u, 13385122716101752907u, 538130567719046914u, 4006446475532031458u, 919475u}, + {11866760575785320435u, 13545234668590857274u, 9299982435442178418u, 5565396064934071637u, 3706796u}, + {3246543036154106282u, 1614990062851200429u, 480610981334321103u, 3455085242493459328u, 3555423u}, + {9807201399665217834u, 11557273264842590925u, 11596968019070432258u, 10874225087299056277u, 3785427u}, + {6520845770328423147u, 1438432879132855344u, 2659214550330560918u, 2159499041052845358u, 3003340u}, + {1093757637794965576u, 12761872345117942120u, 14817214326415593029u, 12737538397181150621u, 2208004u}, + {6813503116536708463u, 4671460657771523869u, 18215884654417537169u, 8327353811800978021u, 1794023u}, + {8138116092462618157u, 11427695110277468755u, 13277398039840364842u, 13868151946752866154u, 2189327u}, + {5546468197013101211u, 2307684337741338602u, 4863826939496275289u, 977134691223877426u, 700484u}, + {2888567285226837421u, 13540655566891769753u, 14352665766754328974u, 10749503161704125516u, 2131295u}, + {7468779595384969692u, 13541355466041641596u, 9510186381497079078u, 17621368409414496344u, 3381783u}, + {3176936567283735596u, 12002872660592787594u, 131113415854057697u, 422670873324829798u, 458705u}, + {17858320869305681083u, 7117413254506932421u, 3668081157802074375u, 9808294403321201109u, 1827057u}, + {1518244476109494327u, 16088909126355705358u, 10479138220071074981u, 9833536051853573251u, 127567u}, + {11831596695880619673u, 2274596989406606080u, 4142613421503316486u, 9586013212679202446u, 729286u}, + {2575923424341950680u, 9475532352895627685u, 13632671857322849780u, 15577893273976986732u, 3314071u}, + {1660826281748569721u, 2438771510862974346u, 7573780594772197508u, 4600762259546455929u, 37166u}, + {1821849035104271751u, 11324501715853439163u, 13684093322004358972u, 15997471472711007540u, 1586056u}, + {7310340103640790482u, 7168425935230230092u, 5697720306789844021u, 6010037890264061637u, 1050468u}, + {831336249640227789u, 11041498284704899666u, 9795551766725013458u, 8954519381066723479u, 2518170u}, + {13684597889052562805u, 2153861070595150336u, 12167217817299410747u, 4081677312602576978u, 329104u}, + {17161977062064633829u, 4920163893516401722u, 16189029406714634797u, 11247055571260069436u, 171081u}, + {3117556323336221279u, 12631358369204477010u, 1108397204920973996u, 10379449440131552659u, 1471489u}, + {7713288255278671117u, 7576057955007247906u, 9766239111039314783u, 13141626306272612586u, 562222u}, + {6308553350970351367u, 6618119766136063415u, 14780699741498472481u, 16295387431059948973u, 1827829u}, + {1242576062867794237u, 6374675906921579576u, 1488110609782824223u, 5005691498685919471u, 1871641u}, + {12212040758961146714u, 17237719662622524370u, 10736767400979403844u, 13725468554736861157u, 2792094u}, + {7157246139297944873u, 5412503837025497579u, 10082714745516691167u, 5455824610017803751u, 1356478u}, + {99339321109266449u, 13816883424542789287u, 3223978036235151168u, 4420535844277046091u, 2060843u}, + {7523072898303711071u, 226925071009839203u, 13982971043805148869u, 8612869538331056041u, 882534u}, + {3831862224212686673u, 7606895456904555234u, 13962912175738854552u, 1961834926471270995u, 2102822u}, + {18107739001433328408u, 14118424106415509998u, 4049638588228637328u, 2128460448328311137u, 1437499u}, + {14851558932702407694u, 4382453213882258871u, 1231495802420076947u, 4061742444411638271u, 3484896u}, + {15382861923130001614u, 15601176251081172939u, 557222029730346u, 1361321681379939414u, 2898647u}, + {4665007657274136520u, 882186073029305769u, 793264708212990564u, 269643382844131460u, 0u}, + {15684583094012540679u, 14248817123785105425u, 15571477007980056129u, 269643382u, 0u}, + {17980854615254796245u, 7781970050942138783u, 4974042474494977791u, 0u, 0u}, + {7937616265577019841u, 9130728640529065085u, 4974042474u, 0u, 0u}, + {155009271214338714u, 17967912243931618654u, 4u, 0u, 0u}, + {14200766933414265542u, 91754888538u, 0u, 0u, 0u}, + {13925235678863534590u, 91u, 0u, 0u, 0u}, + {1692578946387u, 0u, 0u, 0u, 0u}, + {1693u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2128716u}, + {2839351182024271403u, 327807791774879292u, 16192645214640281084u, 5947990590367701453u, 455026u}, + {8647315271085917742u, 146780521561385809u, 14781808969092774814u, 10889090453843992688u, 1538353u}, + {8819743431664526734u, 2828450152547669559u, 12933402175242317532u, 14007550858333133347u, 885086u}, + {7111101033756196817u, 2848204957925315486u, 9864070323254593938u, 9599986975977189638u, 639493u}, + {7535752293301281118u, 16317634784415231703u, 4957752960752817444u, 1452948454066474438u, 1959705u}, + {4723078811427803802u, 9035025852452424316u, 16899204622853834086u, 3639029879944314230u, 1813920u}, + {2799081132777703020u, 16351143891507756357u, 14971542605481336414u, 12571482284248673973u, 581118u}, + {15381518656067564432u, 7111488994762211461u, 8571476309559255581u, 1379814034314739015u, 2594444u}, + {14146550178473967405u, 16113309999795138176u, 4566685545319187162u, 4083084311985349754u, 217011u}, + {4913246911437027887u, 17180700546621649281u, 9059002881754994604u, 18018401659943248095u, 2418126u}, + {16997910254208928276u, 17458322902300236009u, 2845220483878926820u, 15825219663784602627u, 513123u}, + {11193599594628582786u, 13863819129295570124u, 709450619639925244u, 8584319154997978114u, 3203863u}, + {16556979563123064844u, 7771834579259561444u, 3081910851653326626u, 5751650778388853404u, 2864183u}, + {7767725680390767519u, 761996968270496167u, 1199465077956944756u, 7402709448401569895u, 2168787u}, + {2894591791148383633u, 16789653648355454020u, 13321863862520133992u, 18414693545813721445u, 2603809u}, + {17463161395197684975u, 12853230413896531654u, 12865253500153895764u, 8406712725054155715u, 16596u}, + {7105304614243053397u, 8948607427795220976u, 14255179915861285267u, 3314955476316045064u, 1348186u}, + {7606003729727667585u, 12568274160956160472u, 16067365716045364771u, 2979231000975759037u, 3351185u}, + {2711487656870333671u, 5229539856601196111u, 13060737486771265068u, 5682310789976264352u, 1966207u}, + {13899031052846626841u, 2182716384200492074u, 6096738654384918819u, 9331699753899950770u, 1266163u}, + {10195750585638263733u, 8865993433982925761u, 16652248099836270209u, 2473314791437849884u, 263610u}, + {610940844672685683u, 15048833772587437520u, 6259785370560251942u, 8795889221305793558u, 579072u}, + {5146434108198564661u, 10068057723304294951u, 14373221712941384907u, 16079525472238070086u, 2811823u}, + {16510376200910169537u, 15214656315528047985u, 14602923234591799200u, 7257628399133889284u, 2455717u}, + {17439904583988819700u, 6478055582931112889u, 1838733758725404677u, 621760742577509686u, 133678u}, + {1872256457718472110u, 12052593841485067773u, 340034996561942542u, 10450817059975596808u, 1002353u}, + {13056464911500779499u, 5540299517475610116u, 3072291501438769978u, 3405197079495945042u, 1455517u}, + {6187830226143126202u, 4996496210285201041u, 17255278358687397065u, 16600096181722555864u, 1959031u}, + {13789860605457097817u, 12833997992752821301u, 6168590497633989470u, 1765520016999829942u, 100470u}, + {13377237422151455295u, 16791334417066987016u, 12003101983142346982u, 722429286521884975u, 1427567u}, + {2923579471563924407u, 15556584487872074201u, 18330220559744816567u, 10546742693356981265u, 630023u}, + {16217361364312181404u, 1723558543129064477u, 3592474520637192234u, 4767423090091537182u, 3337545u}, + {12400859377324901919u, 6517121530636994994u, 9956812777037022877u, 11806954671399165603u, 3706733u}, + {18402305178660569883u, 8341997181514409197u, 14561788411290311640u, 11021131460572574570u, 2048055u}, + {4012363072450844704u, 513462178154650757u, 5672031630124908221u, 6522963420868526916u, 3015205u}, + {7176138898996934961u, 17254954486642865623u, 8279787805230254900u, 16845040132324941917u, 2072723u}, + {16180026302257685269u, 1797772839948740164u, 5148712897503069183u, 16251193666095517215u, 883635u}, + {5852448942244906107u, 5387577898463623683u, 13608557407478824666u, 11473457656981307829u, 1659774u}, + {13139956465578571753u, 13657919031737784982u, 5629994506246977163u, 14225963463143458246u, 3791070u}, + {12894925032474317961u, 17142570699890786974u, 18231421987275465503u, 4249273366481301820u, 855274u}, + {11011843765827105131u, 13374361098487728153u, 9779072915396044848u, 3762771914812423901u, 2411065u}, + {1966544991374817705u, 18110635260475864124u, 16223080230765406282u, 7178178112517716098u, 2952706u}, + {11802800554066608483u, 5643238774931888484u, 15340109363054668107u, 13385122716101752907u, 3819892u}, + {17919706218866092787u, 8195862037195111226u, 11866760575785320434u, 13545234668590857274u, 1611286u}, + {2056955313339773948u, 13677663691532804877u, 3246543036154106281u, 1614990062851200429u, 1521039u}, + {11489343167126608900u, 12465799218835315056u, 9807201399665217833u, 11557273264842590925u, 3758852u}, + {7512904640085172517u, 5418014335876996021u, 6520845770328423146u, 1438432879132855344u, 416236u}, + {11335529350555532526u, 11463888969508957954u, 1093757637794965575u, 12761872345117942120u, 3240389u}, + {15717740477519512712u, 10830597733916797671u, 6813503116536708462u, 4671460657771523869u, 2309093u}, + {12536017231807313168u, 4866254307208646275u, 8138116092462618156u, 11427695110277468755u, 99818u}, + {12372168156461537341u, 5413957870808898305u, 5546468197013101210u, 2307684337741338602u, 3571659u}, + {12230055583651962450u, 7860296854352378026u, 2888567285226837420u, 13540655566891769753u, 3609600u}, + {7396050752118431838u, 11796432153610305449u, 7468779595384969691u, 13541355466041641596u, 2239530u}, + {13460197367584529050u, 13311991544623733190u, 3176936567283735595u, 12002872660592787594u, 3023245u}, + {3660739662137727105u, 18344958993059765997u, 17858320869305681082u, 7117413254506932421u, 1087761u}, + {14494996618519591719u, 5360871659724840906u, 1518244476109494326u, 16088909126355705358u, 2212399u}, + {17593590918552172411u, 17622097105757008590u, 11831596695880619672u, 2274596989406606080u, 1950888u}, + {11730333826872171596u, 9795550948545906940u, 2575923424341950679u, 9475532352895627685u, 3299818u}, + {11545199013964720324u, 10299825285370989621u, 1660826281748569720u, 2438771510862974346u, 621218u}, + {13820157617068103468u, 5602022801008819636u, 1821849035104271750u, 11324501715853439163u, 1882398u}, + {13770929291495643380u, 1419673346111381509u, 7310340103640790481u, 7168425935230230092u, 904571u}, + {18032252628779766777u, 5094705325000687141u, 831336249640227788u, 11041498284704899666u, 3479792u}, + {652348406505396146u, 15629653173149541213u, 13684597889052562804u, 2153861070595150336u, 1097619u}, + {15441332590514716401u, 3955517712267857859u, 17161977062064633828u, 4920163893516401722u, 1153559u}, + {14274976078733553911u, 12062113521049440674u, 3117556323336221278u, 12631358369204477010u, 542674u}, + {182187179190144063u, 11072524993707547843u, 7713288255278671116u, 7576057955007247906u, 3300241u}, + {12792639391601075476u, 11756997445211520257u, 6308553350970351366u, 6618119766136063415u, 1821873u}, + {5598294661184104822u, 12397265227695960504u, 1242576062867794236u, 6374675906921579576u, 864905u}, + {8861509937804644859u, 4068258453429831696u, 12212040758961146713u, 17237719662622524370u, 443670u}, + {15897790400192281294u, 1304408993360251544u, 7157246139297944872u, 5412503837025497579u, 2921001u}, + {4769564633302334053u, 2078394508515311584u, 99339321109266448u, 13816883424542789287u, 582882u}, + {12573479625040533703u, 8808328266268145247u, 7523072898303711070u, 226925071009839203u, 2214379u}, + {16203168412178281282u, 151981663320464986u, 3831862224212686672u, 7606895456904555234u, 3642554u}, + {10526893255897901893u, 17903366450249663449u, 18107739001433328407u, 14118424106415509998u, 3198264u}, + {10960479671582800573u, 415006731059547436u, 14851558932702407693u, 4382453213882258871u, 1991459u}, + {10988924016422468979u, 17870237813703505017u, 15382861923130001613u, 15601176251081172939u, 948402u}, + {864100862080444617u, 8378775868479829816u, 4665007657274136519u, 882186073029305769u, 2898674u}, + {11951351961628818488u, 11072078302116465313u, 15684583094012540678u, 14248817123785105425u, 3892691u}, + {2757657223747774370u, 16095255972416603135u, 17980854615254796244u, 7781970050942138783u, 2790291u}, + {6698459611403292882u, 13659689819196074731u, 7937616265577019840u, 9130728640529065085u, 1386224u}, + {64464644174487591u, 14117834554527708604u, 155009271214338713u, 17967912243931618654u, 4u}, + {8713699935143971241u, 13440840098945124996u, 14200766933414265541u, 91754888538u, 0u}, + {16776955507982625691u, 8338720603968779180u, 13925235678863534589u, 91u, 0u}, + {17946237806906582715u, 7982489916249056126u, 1692578946386u, 0u, 0u}, + {234567007806609242u, 10679675822923552438u, 1692u, 0u, 0u}, + {8944581044347588987u, 31222570648539u, 0u, 0u, 0u}, + {10526607563913844985u, 31222u, 0u, 0u, 0u}, + {575954770076924u, 0u, 0u, 0u, 0u}, + {575955u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2145496u}, + {5170925185611501334u, 11178767048783092671u, 2839351182024271402u, 327807791774879292u, 144488u}, + {2318104620510646098u, 3775343894336984707u, 8647315271085917741u, 146780521561385809u, 986840u}, + {13328154572302789967u, 15764110179664619470u, 8819743431664526733u, 2828450152547669559u, 2057750u}, + {3283186609274208765u, 7573644257018187043u, 7111101033756196816u, 2848204957925315486u, 1768254u}, + {2782744823913342155u, 2531631459397448300u, 7535752293301281117u, 16317634784415231703u, 1508482u}, + {1041444364964279123u, 6141529054013978438u, 4723078811427803801u, 9035025852452424316u, 3584786u}, + {3966699412960856981u, 11728566672678080577u, 2799081132777703019u, 16351143891507756357u, 2702090u}, + {15365911162222322240u, 16868975083114088491u, 15381518656067564431u, 7111488994762211461u, 2410535u}, + {1710300277676805739u, 10254994539256958907u, 14146550178473967404u, 16113309999795138176u, 1680142u}, + {3112689927670691399u, 9779847080374902843u, 4913246911437027886u, 17180700546621649281u, 1105080u}, + {16837107660028091843u, 8699714398265918190u, 16997910254208928275u, 17458322902300236009u, 1559140u}, + {8752041767728236592u, 14495020936367255603u, 11193599594628582785u, 13863819129295570124u, 3343246u}, + {12238070358290469534u, 11649660216747445788u, 16556979563123064843u, 7771834579259561444u, 2245438u}, + {6562484335331535590u, 6638910800307238533u, 7767725680390767518u, 761996968270496167u, 12698u}, + {13331280820052317535u, 10265459569854094863u, 2894591791148383632u, 16789653648355454020u, 1462516u}, + {11722972852301432512u, 18425774710755733705u, 17463161395197684974u, 12853230413896531654u, 729980u}, + {9400497556046299259u, 1608347985486608020u, 7105304614243053396u, 8948607427795220976u, 1640007u}, + {11039034964073600335u, 115675918132742136u, 7606003729727667584u, 12568274160956160472u, 2243923u}, + {16909320860278626556u, 2685333560484395276u, 2711487656870333670u, 5229539856601196111u, 1137792u}, + {14054929315811582704u, 14983260848546801197u, 13899031052846626840u, 2182716384200492074u, 157717u}, + {6865745581539966677u, 17611556239987310520u, 10195750585638263732u, 8865993433982925761u, 3298913u}, + {9243691058530736166u, 9643788773384218350u, 610940844672685682u, 15048833772587437520u, 2821752u}, + {9019044361076269731u, 9225381155182608583u, 5146434108198564660u, 10068057723304294951u, 569421u}, + {5441992701649333999u, 2891387906755085011u, 16510376200910169536u, 15214656315528047985u, 3519846u}, + {6115194595765176367u, 240159492152585866u, 17439904583988819699u, 6478055582931112889u, 1028671u}, + {1567365432163277754u, 16673150487071236888u, 1872256457718472109u, 12052593841485067773u, 3465238u}, + {11378537762397150474u, 8291992348131236660u, 13056464911500779498u, 5540299517475610116u, 1329352u}, + {12632657155572848548u, 6087120554149629667u, 6187830226143126201u, 4996496210285201041u, 419925u}, + {2735633324638084403u, 15960478207611252037u, 13789860605457097816u, 12833997992752821301u, 103812u}, + {4167239411269844221u, 13070265359105657059u, 13377237422151455294u, 16791334417066987016u, 3480384u}, + {17350998680801520502u, 8584233946732147344u, 2923579471563924406u, 15556584487872074201u, 3590545u}, + {1986758921423199473u, 17665833306161468097u, 16217361364312181403u, 1723558543129064477u, 1731366u}, + {7268197815993036096u, 13492965620624527039u, 12400859377324901918u, 6517121530636994994u, 3001823u}, + {18324759433320378836u, 9573795808611405662u, 18402305178660569882u, 8341997181514409197u, 491090u}, + {197240833208718834u, 11826378710333528932u, 4012363072450844703u, 513462178154650757u, 1799207u}, + {17759872991281327055u, 7838637819124837606u, 7176138898996934960u, 17254954486642865623u, 3707460u}, + {8823339910235415237u, 16825155152271711851u, 16180026302257685268u, 1797772839948740164u, 2998683u}, + {10830815624217247270u, 7775353187972493122u, 5852448942244906106u, 5387577898463623683u, 2116024u}, + {17022994308738623900u, 11278316792520114972u, 13139956465578571752u, 13657919031737784982u, 3519369u}, + {18024361981914070312u, 7395187701798460470u, 12894925032474317960u, 17142570699890786974u, 2369317u}, + {1620915530461684725u, 15680903764510010837u, 11011843765827105130u, 13374361098487728153u, 1310754u}, + {10481537180197207135u, 3610917000863703963u, 1966544991374817704u, 18110635260475864124u, 1233086u}, + {6777245736852962629u, 6398719961989116125u, 11802800554066608482u, 5643238774931888484u, 2892321u}, + {9752191441480687576u, 17473272538743959267u, 17919706218866092786u, 8195862037195111226u, 3186384u}, + {59298230722007439u, 4909584461301867805u, 2056955313339773947u, 13677663691532804877u, 3897329u}, + {16693230763938788454u, 11315347244876512642u, 11489343167126608899u, 12465799218835315056u, 742395u}, + {6490503189056209512u, 5984428436805103102u, 7512904640085172516u, 5418014335876996021u, 364916u}, + {12511730516033790989u, 12229640654649772780u, 11335529350555532525u, 11463888969508957954u, 1190379u}, + {15049440212944597804u, 1421653924309961336u, 15717740477519512711u, 10830597733916797671u, 2081424u}, + {11048035283730058472u, 5242424305894251637u, 12536017231807313167u, 4866254307208646275u, 522494u}, + {11897938409776402849u, 5210003050200833059u, 12372168156461537340u, 5413957870808898305u, 326296u}, + {12950901842144668203u, 5150242332431179760u, 12230055583651962449u, 7860296854352378026u, 2767118u}, + {6678955971321124761u, 3520676828043284638u, 7396050752118431837u, 11796432153610305449u, 2894507u}, + {14251387166859712687u, 2709081699295705052u, 13460197367584529049u, 13311991544623733190u, 2294719u}, + {1037059364005671821u, 17081038511924575197u, 3660739662137727104u, 18344958993059765997u, 1550934u}, + {17216009721078047204u, 2900347645781295686u, 14494996618519591718u, 5360871659724840906u, 2170798u}, + {4439063581317424339u, 11198238069668586665u, 17593590918552172410u, 17622097105757008590u, 3674130u}, + {9033162959230081407u, 12348013084543183279u, 11730333826872171595u, 9795550948545906940u, 3667147u}, + {5269555046819609733u, 12378183418155040993u, 11545199013964720323u, 10299825285370989621u, 2905014u}, + {12600817423556600566u, 1828777808916410857u, 13820157617068103467u, 5602022801008819636u, 2741896u}, + {3060395300680137485u, 17760448070159361925u, 13770929291495643379u, 1419673346111381509u, 2747029u}, + {15035304260595394149u, 6398735526743901331u, 18032252628779766776u, 5094705325000687141u, 3535196u}, + {3648512516104736728u, 15737692286505402401u, 652348406505396145u, 15629653173149541213u, 3491544u}, + {3246816464023262819u, 17488886148968080462u, 15441332590514716400u, 3955517712267857859u, 1544734u}, + {8801038077285149041u, 10731195042977137276u, 14274976078733553910u, 12062113521049440674u, 2586532u}, + {2026076967274730061u, 7011490960406114210u, 182187179190144062u, 11072524993707547843u, 629358u}, + {9203238856570436550u, 11319541944347060325u, 12792639391601075475u, 11756997445211520257u, 182094u}, + {3062645431124670009u, 8652069946297851214u, 5598294661184104821u, 12397265227695960504u, 1790732u}, + {18361993204350173274u, 5654020721363709739u, 8861509937804644858u, 4068258453429831696u, 399653u}, + {15960763664803921269u, 5948897179705968704u, 15897790400192281293u, 1304408993360251544u, 3294992u}, + {13639395080166568650u, 107078725164018625u, 4769564633302334052u, 2078394508515311584u, 937932u}, + {5908935471048887925u, 10706541690010579985u, 12573479625040533702u, 8808328266268145247u, 426442u}, + {2451352426562320337u, 33617467786934419u, 16203168412178281281u, 151981663320464986u, 1793440u}, + {2274785538386970840u, 362428659532778920u, 10526893255897901892u, 17903366450249663449u, 2966309u}, + {10904405379822639076u, 2726823165844996298u, 10960479671582800572u, 415006731059547436u, 3903783u}, + {16244812211956767455u, 15635371661444509014u, 10988924016422468978u, 17870237813703505017u, 1089349u}, + {9147683549532143686u, 8860129725556638762u, 864100862080444616u, 8378775868479829816u, 2562317u}, + {7372247660779155357u, 12940959579006708207u, 11951351961628818487u, 11072078302116465313u, 1431824u}, + {12806859255927795703u, 5085583606044964738u, 2757657223747774369u, 16095255972416603135u, 2212018u}, + {590180162080222749u, 18191602310017967028u, 6698459611403292881u, 13659689819196074731u, 3610594u}, + {1740473989564067001u, 5808382421229256978u, 64464644174487590u, 14117834554527708604u, 2066901u}, + {8255381688978023249u, 17458174025703243048u, 8713699935143971240u, 13440840098945124996u, 2824199u}, + {4949102210936810127u, 7444894156985382872u, 16776955507982625690u, 8338720603968779180u, 3044145u}, + {16935548287338741454u, 14047300581548497119u, 17946237806906582714u, 7982489916249056126u, 821386u}, + {16503126051982505503u, 13273914497180669236u, 234567007806609241u, 10679675822923552438u, 1692u}, + {1787534748662050340u, 8559890645778693452u, 8944581044347588986u, 31222570648539u, 0u}, + {9375698093866303435u, 6697607137821647964u, 10526607563913844984u, 31222u, 0u}, + {1667979327157574522u, 9857935169747556062u, 575954770076923u, 0u, 0u}, + {16722224933607412529u, 14205411925508671873u, 575954u, 0u, 0u}, + {11070140848929852665u, 10624490241641236u, 0u, 0u, 0u}, + {4457494049216992007u, 10624490u, 0u, 0u, 0u}, + {195987252401180444u, 0u, 0u, 0u, 0u}, + {195987253u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 533426u}, + {1403090639924297508u, 17785027192663925450u, 5170925185611501333u, 11178767048783092671u, 1536802u}, + {2576404099170517348u, 12900018090924419526u, 2318104620510646097u, 3775343894336984707u, 3011625u}, + {10505082623735122649u, 13944975003440484200u, 13328154572302789966u, 15764110179664619470u, 411827u}, + {3715885720975621150u, 8958543177286458857u, 3283186609274208764u, 7573644257018187043u, 521266u}, + {1598086176175722924u, 9923306965017832895u, 2782744823913342154u, 2531631459397448300u, 901707u}, + {1791031849051760247u, 1884341299626187166u, 1041444364964279122u, 6141529054013978438u, 2994373u}, + {11231636857935413845u, 16204948493845511853u, 3966699412960856980u, 11728566672678080577u, 406471u}, + {10758725197383165079u, 15276693035579473231u, 15365911162222322239u, 16868975083114088491u, 1236867u}, + {3334270824579965851u, 14339060879137720581u, 1710300277676805738u, 10254994539256958907u, 2822822u}, + {1742189705527709315u, 10752575443398039883u, 3112689927670691398u, 9779847080374902843u, 2862462u}, + {7731370066039003855u, 15958284912853086934u, 16837107660028091842u, 8699714398265918190u, 620409u}, + {14179693232986867956u, 14159580313428359508u, 8752041767728236591u, 14495020936367255603u, 2623095u}, + {9453248956214099823u, 17545018519695110379u, 12238070358290469533u, 11649660216747445788u, 521075u}, + {2247850790284057400u, 15176102074488633608u, 6562484335331535589u, 6638910800307238533u, 1804178u}, + {11215785829464111201u, 2350448819533271987u, 13331280820052317534u, 10265459569854094863u, 2769498u}, + {18297393102138808371u, 7419930347590147266u, 11722972852301432511u, 18425774710755733705u, 1251218u}, + {16752721476474364409u, 17550291330281489551u, 9400497556046299258u, 1608347985486608020u, 2364554u}, + {14144151402139313183u, 8614448758774217728u, 11039034964073600334u, 115675918132742136u, 1040974u}, + {5507611040518326962u, 6196081561005744773u, 16909320860278626555u, 2685333560484395276u, 3650448u}, + {2843877668039433367u, 2219601885874268966u, 14054929315811582703u, 14983260848546801197u, 1599376u}, + {1716151184993327367u, 13638019363592621833u, 6865745581539966676u, 17611556239987310520u, 3259586u}, + {18087187979807187548u, 14882541895111449880u, 9243691058530736165u, 9643788773384218350u, 108914u}, + {12355907080410572013u, 12038502898600481422u, 9019044361076269730u, 9225381155182608583u, 492452u}, + {2638861022421123293u, 9358401662110510413u, 5441992701649333998u, 2891387906755085011u, 1300322u}, + {5482182505902077218u, 12518894053708297534u, 6115194595765176366u, 240159492152585866u, 1509549u}, + {16991845500282006307u, 7368167613296142781u, 1567365432163277753u, 16673150487071236888u, 291055u}, + {7313688313540629673u, 17484097808558878558u, 11378537762397150473u, 8291992348131236660u, 1858466u}, + {3212452932043984705u, 8308035924984946948u, 12632657155572848547u, 6087120554149629667u, 1938007u}, + {14996323468167860220u, 14267608589591170239u, 2735633324638084402u, 15960478207611252037u, 1509254u}, + {4201049095684175147u, 8993525952005356711u, 4167239411269844220u, 13070265359105657059u, 508504u}, + {8325969651822917925u, 15187635837328995716u, 17350998680801520501u, 8584233946732147344u, 635492u}, + {16247025707986712431u, 2239891431779008230u, 1986758921423199472u, 17665833306161468097u, 986381u}, + {14494410928534793413u, 14133433405044544192u, 7268197815993036095u, 13492965620624527039u, 3371510u}, + {9475639688272462467u, 6589171075857637581u, 18324759433320378835u, 9573795808611405662u, 484274u}, + {8742766423851858205u, 12150345905454381236u, 197240833208718833u, 11826378710333528932u, 3058407u}, + {12022241700178105434u, 3441858767556862756u, 17759872991281327054u, 7838637819124837606u, 1937238u}, + {2020243224576111186u, 14403160185459278548u, 8823339910235415236u, 16825155152271711851u, 3533990u}, + {9086866501664449825u, 14798086798549044788u, 10830815624217247269u, 7775353187972493122u, 2023778u}, + {18093087016125002221u, 17067539860783226299u, 17022994308738623899u, 11278316792520114972u, 2456428u}, + {5654144803605366581u, 13972630550790752067u, 18024361981914070311u, 7395187701798460470u, 2407246u}, + {6390198951776095644u, 12346405951633641963u, 1620915530461684724u, 15680903764510010837u, 435702u}, + {11726920079657243013u, 5540469043347459617u, 10481537180197207134u, 3610917000863703963u, 3125304u}, + {4150677416922920477u, 4164241172526659557u, 6777245736852962628u, 6398719961989116125u, 1915502u}, + {12401897252866781166u, 6249047434559962390u, 9752191441480687575u, 17473272538743959267u, 524106u}, + {5810121519130589037u, 15717942740981799020u, 59298230722007438u, 4909584461301867805u, 124953u}, + {15996772895722295420u, 16679396330284705232u, 16693230763938788453u, 11315347244876512642u, 197765u}, + {10129097446989816770u, 15733481956578447515u, 6490503189056209511u, 5984428436805103102u, 2813898u}, + {17148691178471669630u, 14877996969955287840u, 12511730516033790988u, 12229640654649772780u, 2849263u}, + {14895520363669597083u, 10945567383364949705u, 15049440212944597803u, 1421653924309961336u, 2942391u}, + {11446000046006799334u, 5075586132844408619u, 11048035283730058471u, 5242424305894251637u, 1184831u}, + {13949092204583253686u, 11467931259535633946u, 11897938409776402848u, 5210003050200833059u, 1851446u}, + {7961759267955208123u, 6704313602111638275u, 12950901842144668202u, 5150242332431179760u, 3356273u}, + {10198833565591286952u, 133256518881180346u, 6678955971321124760u, 3520676828043284638u, 2328363u}, + {11202240651496186084u, 5392468368460720722u, 14251387166859712686u, 2709081699295705052u, 183703u}, + {14272815868529710215u, 2117285672453508364u, 1037059364005671820u, 17081038511924575197u, 978160u}, + {16664376805347323307u, 16018066632796529161u, 17216009721078047203u, 2900347645781295686u, 1588952u}, + {12048731029675377921u, 14436604384848794788u, 4439063581317424338u, 11198238069668586665u, 1418380u}, + {11394327226574919615u, 12344307653405975409u, 9033162959230081406u, 12348013084543183279u, 3053917u}, + {1574643915203148u, 12060175477612358543u, 5269555046819609732u, 12378183418155040993u, 1481993u}, + {5253318951524105219u, 17511793514995480985u, 12600817423556600565u, 1828777808916410857u, 1858319u}, + {1444447230819949220u, 103263802478519236u, 3060395300680137484u, 17760448070159361925u, 3126147u}, + {3217073282162885653u, 577352025293352641u, 15035304260595394148u, 6398735526743901331u, 1579508u}, + {3078372602626915134u, 5376094965078015336u, 3648512516104736727u, 15737692286505402401u, 2761917u}, + {1248912018164842730u, 13733377670415843889u, 3246816464023262818u, 17488886148968080462u, 3614248u}, + {17044287136033330272u, 17926813345459900571u, 8801038077285149040u, 10731195042977137276u, 1187436u}, + {17630618129696672352u, 8545525635865816534u, 2026076967274730060u, 7011490960406114210u, 352348u}, + {347962094791133972u, 569858818718921065u, 9203238856570436549u, 11319541944347060325u, 279651u}, + {761790486440206652u, 2316055219536478747u, 3062645431124670008u, 8652069946297851214u, 1817577u}, + {14829194617797071856u, 15116995057238922383u, 18361993204350173273u, 5654020721363709739u, 2177862u}, + {8473694288046333919u, 17534526197090839867u, 15960763664803921268u, 5948897179705968704u, 1898499u}, + {11544435149482732547u, 4677199204817835804u, 13639395080166568649u, 107078725164018625u, 2277788u}, + {12422860859648921308u, 7846432852618885546u, 5908935471048887924u, 10706541690010579985u, 1822406u}, + {5276260718381262161u, 12351512244074720027u, 2451352426562320336u, 33617467786934419u, 116047u}, + {1987252599560106199u, 16318467074117656617u, 2274785538386970839u, 362428659532778920u, 3290130u}, + {900319928262857482u, 11094514568364175383u, 10904405379822639075u, 2726823165844996298u, 3845196u}, + {12285680732810205394u, 3695289027916296767u, 16244812211956767454u, 15635371661444509014u, 3746094u}, + {8133077960086872368u, 9095848628857354430u, 9147683549532143685u, 8860129725556638762u, 2312074u}, + {12633495556845538845u, 6851172796336608033u, 7372247660779155356u, 12940959579006708207u, 2252539u}, + {7606066029910595444u, 2976467977397639846u, 12806859255927795702u, 5085583606044964738u, 1793737u}, + {17999690153274830309u, 13856518668272592054u, 590180162080222748u, 18191602310017967028u, 2373041u}, + {240957402729052346u, 2104730937581456386u, 1740473989564067000u, 5808382421229256978u, 1097010u}, + {15187376209100333779u, 7979877168524698460u, 8255381688978023248u, 17458174025703243048u, 1244770u}, + {1331468219766444589u, 12936220830934848551u, 4949102210936810126u, 7444894156985382872u, 3693190u}, + {4100195419506056552u, 190295112167594521u, 16935548287338741453u, 14047300581548497119u, 830346u}, + {10954965121695731708u, 14871387522903979011u, 16503126051982505502u, 13273914497180669236u, 3095101u}, + {5863488630818429366u, 7258202294580628513u, 1787534748662050339u, 8559890645778693452u, 3703010u}, + {11603544528523260322u, 11085595410970319445u, 9375698093866303434u, 6697607137821647964u, 3149736u}, + {14134630036249514755u, 14465731475214061695u, 1667979327157574521u, 9857935169747556062u, 545673u}, + {15055917290686890443u, 4613541793793678633u, 16722224933607412528u, 14205411925508671873u, 575954u}, + {11783849359972087495u, 10500593610601923123u, 11070140848929852664u, 10624490241641236u, 0u}, + {13322750718772605936u, 7856284581922517496u, 4457494049216992006u, 10624490u, 0u}, + {6844786740679376688u, 4900706771631966389u, 195987252401180443u, 0u, 0u}, + {4984536726238100520u, 7400472964299129342u, 195987252u, 0u, 0u}, + {12380137050116178993u, 3615326686754093431u, 0u, 0u, 0u}, + {13910568541702689726u, 3615326686u, 0u, 0u, 0u}, + {11350773912276406665u, 3u, 0u, 0u, 0u}, + {66691006134u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3190756u}, + {4242555158744157782u, 5764621099837873130u, 1403090639924297507u, 17785027192663925450u, 92631u}, + {3293094641578503931u, 1304285217403879600u, 2576404099170517347u, 12900018090924419526u, 2052359u}, + {7374526307433015495u, 7404450521446857336u, 10505082623735122648u, 13944975003440484200u, 1268598u}, + {16810361305782343049u, 3398785596952111495u, 3715885720975621149u, 8958543177286458857u, 2787298u}, + {3226318565850869997u, 2441794575651771185u, 1598086176175722923u, 9923306965017832895u, 587846u}, + {2493481245569193896u, 12405343508779236890u, 1791031849051760246u, 1884341299626187166u, 3472018u}, + {16428896247154110857u, 11225926789602173154u, 11231636857935413844u, 16204948493845511853u, 26188u}, + {13341671751728241521u, 9229422949071760804u, 10758725197383165078u, 15276693035579473231u, 3884547u}, + {15266143561141370882u, 6912489497070031797u, 3334270824579965850u, 14339060879137720581u, 867032u}, + {18423980899022457959u, 5535745011223706883u, 1742189705527709314u, 10752575443398039883u, 1819108u}, + {9248731218631998923u, 6421523570683446851u, 7731370066039003854u, 15958284912853086934u, 1967386u}, + {3145182325368459524u, 2043220667861046410u, 14179693232986867955u, 14159580313428359508u, 1898609u}, + {17284543896872299209u, 5561648828273200618u, 9453248956214099822u, 17545018519695110379u, 2385641u}, + {12371145307697920885u, 12507364392143618461u, 2247850790284057399u, 15176102074488633608u, 2418085u}, + {3858369942040262676u, 1308790730706162008u, 11215785829464111200u, 2350448819533271987u, 3797730u}, + {16743562838070185193u, 5539318767136384163u, 18297393102138808370u, 7419930347590147266u, 2184449u}, + {9475053582122160403u, 2839654341355697512u, 16752721476474364408u, 17550291330281489551u, 2146452u}, + {13320801356783820901u, 5343706985752437664u, 14144151402139313182u, 8614448758774217728u, 3859004u}, + {12216306986434786963u, 4779762683848472078u, 5507611040518326961u, 6196081561005744773u, 3137359u}, + {7710595261103589070u, 11241719463853208772u, 2843877668039433366u, 2219601885874268966u, 1037261u}, + {11258427549888571555u, 8604381183633001842u, 1716151184993327366u, 13638019363592621833u, 2096712u}, + {3409734887111967714u, 8369143283053331311u, 18087187979807187547u, 14882541895111449880u, 264799u}, + {155514301645707356u, 16408950176044496304u, 12355907080410572012u, 12038502898600481422u, 3413720u}, + {9267113842001585737u, 10703285782196465405u, 2638861022421123292u, 9358401662110510413u, 2869356u}, + {11610594361003023260u, 12924582782822153808u, 5482182505902077217u, 12518894053708297534u, 991666u}, + {777728023413922129u, 17382696357090017502u, 16991845500282006306u, 7368167613296142781u, 2502341u}, + {4521235545586173672u, 2403774909315818800u, 7313688313540629672u, 17484097808558878558u, 1160779u}, + {6534485785672648125u, 4481887793552770693u, 3212452932043984704u, 8308035924984946948u, 11111u}, + {15382299030864263294u, 4964762017142369743u, 14996323468167860219u, 14267608589591170239u, 3165018u}, + {14371189794757435388u, 12312512706721478742u, 4201049095684175146u, 8993525952005356711u, 3010888u}, + {7635246511823377127u, 5257378335889159731u, 8325969651822917924u, 15187635837328995716u, 331007u}, + {13189674427136736486u, 2531099379195120300u, 16247025707986712430u, 2239891431779008230u, 549960u}, + {13751572163077924925u, 606046934252023405u, 14494410928534793412u, 14133433405044544192u, 1730929u}, + {17118599414315071576u, 8100524407291297037u, 9475639688272462466u, 6589171075857637581u, 2421571u}, + {10871582088365177493u, 7324477823704765369u, 8742766423851858204u, 12150345905454381236u, 2989787u}, + {927055910137858647u, 14022024151722009158u, 12022241700178105433u, 3441858767556862756u, 3453128u}, + {10182792915546128348u, 1415852129943258000u, 2020243224576111185u, 14403160185459278548u, 1424642u}, + {15596944961172629219u, 14918684459425693255u, 9086866501664449824u, 14798086798549044788u, 3358189u}, + {11477665838265618190u, 9360623501527393994u, 18093087016125002220u, 17067539860783226299u, 3551569u}, + {3611811294813159477u, 4920223834194659636u, 5654144803605366580u, 13972630550790752067u, 1331257u}, + {10432053256254798889u, 8832984408599823644u, 6390198951776095643u, 12346405951633641963u, 3474428u}, + {14982156818660709377u, 18092659180535818581u, 11726920079657243012u, 5540469043347459617u, 3087716u}, + {1901561616979005992u, 3659992315380786649u, 4150677416922920476u, 4164241172526659557u, 2824040u}, + {8562622523416680662u, 10225340665526469160u, 12401897252866781165u, 6249047434559962390u, 508883u}, + {15195999959595993673u, 6287887300075930302u, 5810121519130589036u, 15717942740981799020u, 1848136u}, + {14402248485334320720u, 11183363909907172096u, 15996772895722295419u, 16679396330284705232u, 1351265u}, + {10366524750498245050u, 7833265462524771931u, 10129097446989816769u, 15733481956578447515u, 1850331u}, + {9439587275293197973u, 9238921635371254368u, 17148691178471669629u, 14877996969955287840u, 3516646u}, + {17514937944369697314u, 15360892398727898451u, 14895520363669597082u, 10945567383364949705u, 1710575u}, + {8702779904377922182u, 17015600710670005296u, 11446000046006799333u, 5075586132844408619u, 584049u}, + {5002989282894186454u, 5815206608555883490u, 13949092204583253685u, 11467931259535633946u, 160318u}, + {15933093959609466716u, 12473936069783771256u, 7961759267955208122u, 6704313602111638275u, 3317600u}, + {2435789416673580067u, 13195622381687808877u, 10198833565591286951u, 133256518881180346u, 3263796u}, + {17353381297428118981u, 10335213817749970637u, 11202240651496186083u, 5392468368460720722u, 1497036u}, + {8930036596974278465u, 9614761246334647683u, 14272815868529710214u, 2117285672453508364u, 1153632u}, + {9000346538055318457u, 7264966636588855234u, 16664376805347323306u, 16018066632796529161u, 1359891u}, + {17165442130680676227u, 10535097473279970586u, 12048731029675377920u, 14436604384848794788u, 1217508u}, + {9008722087523207002u, 13770992080927410143u, 11394327226574919614u, 12344307653405975409u, 1439672u}, + {7550288938271539730u, 11260132219568819874u, 1574643915203147u, 12060175477612358543u, 97478u}, + {12010681013794169730u, 7167788692391834299u, 5253318951524105218u, 17511793514995480985u, 1691691u}, + {15504080419324880913u, 9856816153828738247u, 1444447230819949219u, 103263802478519236u, 48316u}, + {13738708937155083994u, 16888781719289161392u, 3217073282162885652u, 577352025293352641u, 2376192u}, + {11444403423810176125u, 10299906697945817672u, 3078372602626915133u, 5376094965078015336u, 2300395u}, + {14999153428301646641u, 2782197516033395280u, 1248912018164842729u, 13733377670415843889u, 3064498u}, + {16959086785548703828u, 1457411600083830856u, 17044287136033330271u, 17926813345459900571u, 2316372u}, + {12962037869901953929u, 16462993004949701135u, 17630618129696672351u, 8545525635865816534u, 3548358u}, + {13796478971963559121u, 15153641354715947490u, 347962094791133971u, 569858818718921065u, 553605u}, + {16897316201608246304u, 17366205597306478240u, 761790486440206651u, 2316055219536478747u, 3087694u}, + {9321208271656754244u, 4189887711084818574u, 14829194617797071855u, 15116995057238922383u, 1329819u}, + {9010343991204909982u, 17404489147336562157u, 8473694288046333918u, 17534526197090839867u, 3551476u}, + {17373595393732597072u, 411695300191766310u, 11544435149482732546u, 4677199204817835804u, 3480977u}, + {12152911692318761890u, 4483745341795425488u, 12422860859648921307u, 7846432852618885546u, 1608070u}, + {6950609512154400593u, 13435013906556283506u, 5276260718381262160u, 12351512244074720027u, 1813372u}, + {13968034921769482532u, 7951753568988109026u, 1987252599560106198u, 16318467074117656617u, 3778589u}, + {247427852435667772u, 11858763443672409707u, 900319928262857481u, 11094514568364175383u, 1103269u}, + {5823520428661267085u, 12226060608668002606u, 12285680732810205393u, 3695289027916296767u, 899442u}, + {7681860244958351080u, 4040545632935532112u, 8133077960086872367u, 9095848628857354430u, 309071u}, + {4422733812952952367u, 4815497143315834584u, 12633495556845538844u, 6851172796336608033u, 1198402u}, + {17019422237914620824u, 14103706922267224730u, 7606066029910595443u, 2976467977397639846u, 1163382u}, + {2054241722599270997u, 11178556677770638936u, 17999690153274830308u, 13856518668272592054u, 816442u}, + {7618935482568085447u, 14699271866966204313u, 240957402729052345u, 2104730937581456386u, 2902508u}, + {6564181966122760131u, 17443310736577437686u, 15187376209100333778u, 7979877168524698460u, 2055186u}, + {4334235003739330303u, 13566767778367215339u, 1331468219766444588u, 12936220830934848551u, 2503418u}, + {1205463941935295181u, 4252151832660855922u, 4100195419506056551u, 190295112167594521u, 1492033u}, + {10792866808670239349u, 10287427001774721431u, 10954965121695731707u, 14871387522903979011u, 2842934u}, + {16569544802255812277u, 4580610403840570836u, 5863488630818429365u, 7258202294580628513u, 3295081u}, + {9461043224483927741u, 8963352437016295148u, 11603544528523260321u, 11085595410970319445u, 2938874u}, + {955631889099111765u, 8001717696091478374u, 14134630036249514754u, 14465731475214061695u, 100601u}, + {7925629830953861754u, 12933914877267010942u, 15055917290686890442u, 4613541793793678633u, 2832070u}, + {10947397035170277523u, 17245958630721124606u, 11783849359972087494u, 10500593610601923123u, 108790u}, + {6642079267707307926u, 6065335622435331623u, 13322750718772605935u, 7856284581922517496u, 42846u}, + {12413713833783431734u, 11727024045181979110u, 6844786740679376687u, 4900706771631966389u, 2742943u}, + {1084679890248696727u, 8997700466095396712u, 4984536726238100519u, 7400472964299129342u, 674752u}, + {2177253708839596352u, 8551469739726319158u, 12380137050116178992u, 3615326686754093431u, 0u}, + {15379341367795972996u, 12861318786425835320u, 13910568541702689725u, 3615326686u, 0u}, + {13169051952683859969u, 2248921922333511248u, 11350773912276406664u, 3u, 0u}, + {13881444988968728652u, 7472066048222752348u, 66691006133u, 0u, 0u}, + {10308285501244665000u, 12746813296286770275u, 66u, 0u, 0u}, + {2161532867808008545u, 1230231922161u, 0u, 0u, 0u}, + {4278208751150195365u, 1230u, 0u, 0u, 0u}, + {22693773419414u, 0u, 0u, 0u, 0u}, + {22694u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 736u}, + {7406210136613019200u, 7445689120409809433u, 4242555158744157781u, 5764621099837873130u, 392943u}, + {4036216546216463483u, 8352517286801237050u, 3293094641578503930u, 1304285217403879600u, 2958567u}, + {8761568170075843155u, 9051468349817407827u, 7374526307433015494u, 7404450521446857336u, 654786u}, + {11291392306874377128u, 7742077947114469050u, 16810361305782343048u, 3398785596952111495u, 3463699u}, + {4074584025334274519u, 17039344429685666094u, 3226318565850869996u, 2441794575651771185u, 620019u}, + {227633084198576925u, 2372115167947128791u, 2493481245569193895u, 12405343508779236890u, 3089960u}, + {4900361164253093944u, 14500799114366328858u, 16428896247154110856u, 11225926789602173154u, 328020u}, + {11120994101747372513u, 7534108511326570939u, 13341671751728241520u, 9229422949071760804u, 3633056u}, + {12715858298320952247u, 7588811954975584537u, 15266143561141370881u, 6912489497070031797u, 3218338u}, + {17502852102097475681u, 18354232940345691294u, 18423980899022457958u, 5535745011223706883u, 455240u}, + {12803481279836878377u, 17499694264958104205u, 9248731218631998922u, 6421523570683446851u, 1388214u}, + {3028862362776225938u, 1980068398176825044u, 3145182325368459523u, 2043220667861046410u, 716337u}, + {6015836020999212767u, 5989929984422367392u, 17284543896872299208u, 5561648828273200618u, 2244332u}, + {462511530827140867u, 7745147519160284102u, 12371145307697920884u, 12507364392143618461u, 637187u}, + {8201153351424719052u, 2599480724094367843u, 3858369942040262675u, 1308790730706162008u, 3412072u}, + {530248032591351892u, 14269745159568208374u, 16743562838070185192u, 5539318767136384163u, 1594220u}, + {10214166842321980497u, 7213173533440644102u, 9475053582122160402u, 2839654341355697512u, 620436u}, + {13340572098205790142u, 11286725408202542490u, 13320801356783820900u, 5343706985752437664u, 1298954u}, + {9723397943666104772u, 10291492911010813550u, 12216306986434786962u, 4779762683848472078u, 39833u}, + {12572490552470622855u, 12497518926839465987u, 7710595261103589069u, 11241719463853208772u, 1600688u}, + {9904351518696750031u, 16982927594895604508u, 11258427549888571554u, 8604381183633001842u, 567166u}, + {3737503312180917679u, 4229873887726637450u, 3409734887111967713u, 8369143283053331311u, 2812221u}, + {7198149941132450986u, 7460233441557855543u, 155514301645707355u, 16408950176044496304u, 2101284u}, + {11802380176447517666u, 9150398993708935329u, 9267113842001585736u, 10703285782196465405u, 1424286u}, + {5784099120941403591u, 7918276561132478609u, 11610594361003023259u, 12924582782822153808u, 911607u}, + {9937694038715076761u, 198243089747992822u, 777728023413922128u, 17382696357090017502u, 1402648u}, + {5349614636427059141u, 12703181481956563220u, 4521235545586173671u, 2403774909315818800u, 776124u}, + {17309197197767993240u, 15447875625795006106u, 6534485785672648124u, 4481887793552770693u, 3515288u}, + {15705328185914815465u, 12561814726423370017u, 15382299030864263293u, 4964762017142369743u, 3400151u}, + {4412915154061562851u, 548750748447242453u, 14371189794757435387u, 12312512706721478742u, 3753050u}, + {14718269663859986267u, 1072184884051686107u, 7635246511823377126u, 5257378335889159731u, 492422u}, + {15860034108341062300u, 1072472561548949743u, 13189674427136736485u, 2531099379195120300u, 1603870u}, + {7443700706385906169u, 11512170347850555064u, 13751572163077924924u, 606046934252023405u, 1630308u}, + {2822571293188762953u, 11951753447214908188u, 17118599414315071575u, 8100524407291297037u, 2529488u}, + {5356132196034571307u, 5789471809089221063u, 10871582088365177492u, 7324477823704765369u, 2322952u}, + {13342610993523478539u, 3285400321704835589u, 927055910137858646u, 14022024151722009158u, 2534747u}, + {13388995228802835562u, 11935405085839789366u, 10182792915546128347u, 1415852129943258000u, 149755u}, + {727476843832761185u, 4752796741891131566u, 15596944961172629218u, 14918684459425693255u, 3534166u}, + {523553092950771756u, 18202970244847812191u, 11477665838265618189u, 9360623501527393994u, 1100868u}, + {4629110942530175556u, 7123326475200322045u, 3611811294813159476u, 4920223834194659636u, 2274544u}, + {17678339438371813147u, 15954723912854360926u, 10432053256254798888u, 8832984408599823644u, 336269u}, + {1978498580434797535u, 16013715502428837088u, 14982156818660709376u, 18092659180535818581u, 3096080u}, + {15216725091339611296u, 15066908619001599081u, 1901561616979005991u, 3659992315380786649u, 3535578u}, + {1453518021353232410u, 12015514455639726861u, 8562622523416680661u, 10225340665526469160u, 1023303u}, + {1861967954692414782u, 13953161298641011390u, 15195999959595993672u, 6287887300075930302u, 782622u}, + {2582882965082962931u, 4972861032705717280u, 14402248485334320719u, 11183363909907172096u, 2767171u}, + {17157651953560420668u, 9299719998048972217u, 10366524750498245049u, 7833265462524771931u, 842945u}, + {7110881488946140048u, 3256098723718408357u, 9439587275293197972u, 9238921635371254368u, 684395u}, + {11068578400095466021u, 2473446070839821445u, 17514937944369697313u, 15360892398727898451u, 542562u}, + {17682374854544845306u, 16687559277993986144u, 8702779904377922181u, 17015600710670005296u, 2742981u}, + {7943806125592705542u, 5738244430769084373u, 5002989282894186453u, 5815206608555883490u, 432179u}, + {8645698326838591675u, 7198821902679565121u, 15933093959609466715u, 12473936069783771256u, 492372u}, + {2441696075285330307u, 12721428915961135153u, 2435789416673580066u, 13195622381687808877u, 1679313u}, + {1874874847361062230u, 6140644893313578922u, 17353381297428118980u, 10335213817749970637u, 1686001u}, + {3634690560524061558u, 2712516762363358942u, 8930036596974278464u, 9614761246334647683u, 3209630u}, + {6629791072510364276u, 14261278786680942455u, 9000346538055318456u, 7264966636588855234u, 796278u}, + {1374820033583692786u, 14975756171231239167u, 17165442130680676226u, 10535097473279970586u, 433226u}, + {13916889565808646319u, 10803893843325937378u, 9008722087523207001u, 13770992080927410143u, 1037990u}, + {12767328092836662849u, 18315062536898847962u, 7550288938271539729u, 11260132219568819874u, 1847853u}, + {14474954553784743975u, 17058812562104977459u, 12010681013794169729u, 7167788692391834299u, 3089074u}, + {17163536384578285236u, 16400606464135209720u, 15504080419324880912u, 9856816153828738247u, 1480191u}, + {5555500414466540427u, 7526385230417597574u, 13738708937155083993u, 16888781719289161392u, 3671560u}, + {7419737471639164155u, 10826114175045202531u, 11444403423810176124u, 10299906697945817672u, 2385729u}, + {7536058159073403734u, 14164249437475661690u, 14999153428301646640u, 2782197516033395280u, 881441u}, + {1891210864731987798u, 4914345747105709876u, 16959086785548703827u, 1457411600083830856u, 1835639u}, + {7790635341272925366u, 14813611845573825414u, 12962037869901953928u, 16462993004949701135u, 1168043u}, + {17958978041714770050u, 17929104395260601325u, 13796478971963559120u, 15153641354715947490u, 17641u}, + {9639955263611962202u, 8900521862372298500u, 16897316201608246303u, 17366205597306478240u, 571767u}, + {16780981326335527392u, 528405055983804228u, 9321208271656754243u, 4189887711084818574u, 2092997u}, + {654563766983656993u, 3284322122699404587u, 9010343991204909981u, 17404489147336562157u, 2786796u}, + {16905992522307680018u, 3715924470364159511u, 17373595393732597071u, 411695300191766310u, 876822u}, + {15724375795380033283u, 10933880751089627772u, 12152911692318761889u, 4483745341795425488u, 1751063u}, + {1475543489625124540u, 7259314463290069764u, 6950609512154400592u, 13435013906556283506u, 1377924u}, + {1766812104063920236u, 14630917600455783945u, 13968034921769482531u, 7951753568988109026u, 2239854u}, + {3854688477827651109u, 8384708743962984216u, 247427852435667771u, 11858763443672409707u, 2619823u}, + {11748601291748070398u, 12781685723172628308u, 5823520428661267084u, 12226060608668002606u, 288417u}, + {16701977612925290152u, 8933454386697815721u, 7681860244958351079u, 4040545632935532112u, 3236123u}, + {6796272415887301894u, 11242721605825448820u, 4422733812952952366u, 4815497143315834584u, 2844734u}, + {13470850048092668726u, 12302370010578182092u, 17019422237914620823u, 14103706922267224730u, 522021u}, + {17230582642883324361u, 8001405838775185813u, 2054241722599270996u, 11178556677770638936u, 3880374u}, + {7896484268293512522u, 13852695290440348432u, 7618935482568085446u, 14699271866966204313u, 291269u}, + {5453667737084745050u, 7857997881970697172u, 6564181966122760130u, 17443310736577437686u, 1080954u}, + {17651336191330814288u, 11244576812248229358u, 4334235003739330302u, 13566767778367215339u, 40862u}, + {5437681909105784718u, 11128610768719622834u, 1205463941935295180u, 4252151832660855922u, 2995035u}, + {9277743931130181063u, 9807877277803402210u, 10792866808670239348u, 10287427001774721431u, 2221637u}, + {16846172968080033005u, 18088790843938222336u, 16569544802255812276u, 4580610403840570836u, 1529309u}, + {8187152621097828267u, 18366448292537560280u, 9461043224483927740u, 8963352437016295148u, 180235u}, + {5246515376220185418u, 12397301648178212854u, 955631889099111764u, 8001717696091478374u, 1930180u}, + {8737803968765744918u, 10846800414060609061u, 7925629830953861753u, 12933914877267010942u, 1311540u}, + {16744539432027625477u, 7243045172799740550u, 10947397035170277522u, 17245958630721124606u, 677502u}, + {14611079944470653515u, 9090624293122507145u, 6642079267707307925u, 6065335622435331623u, 2910747u}, + {10552097391221860186u, 9108602399510603226u, 12413713833783431733u, 11727024045181979110u, 3391319u}, + {18097505492411232465u, 8650120233918785011u, 1084679890248696726u, 8997700466095396712u, 2638603u}, + {11068990695812137433u, 8519062185795396732u, 2177253708839596351u, 8551469739726319158u, 1900988u}, + {17047839748954332451u, 16409747739621186112u, 15379341367795972995u, 12861318786425835320u, 820551u}, + {5544125561659184123u, 17160680830530468182u, 13169051952683859968u, 2248921922333511248u, 2717762u}, + {3657847499898802821u, 10321289204717269063u, 13881444988968728651u, 7472066048222752348u, 3506133u}, + {16379028888362856975u, 18387394765579940647u, 10308285501244664999u, 12746813296286770275u, 66u}, + {14243663912197748962u, 18329339697206101571u, 2161532867808008544u, 1230231922161u, 0u}, + {5969091373988679880u, 17188136025545421677u, 4278208751150195364u, 1230u, 0u}, + {12680675224025632914u, 16577776133238396243u, 22693773419413u, 0u, 0u}, + {10668077713986553971u, 14267069989827446276u, 22693u, 0u, 0u}, + {12585626221615774165u, 418626230334680u, 0u, 0u, 0u}, + {4248924905845412207u, 418626u, 0u, 0u, 0u}, + {7722290933525641u, 0u, 0u, 0u, 0u}, + {7722291u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1287866u}, + {18175944690115874681u, 7655267744919564287u, 7406210136613019199u, 7445689120409809433u, 3572119u}, + {10847625266000508027u, 14539874783833844083u, 4036216546216463482u, 8352517286801237050u, 2399832u}, + {4165445768668573088u, 5126565539914075663u, 8761568170075843154u, 9051468349817407827u, 1730136u}, + {6024937110706186328u, 17531409296094507868u, 11291392306874377127u, 7742077947114469050u, 1829712u}, + {14355216620579439851u, 63504760232817724u, 4074584025334274518u, 17039344429685666094u, 3592620u}, + {14560738150314878831u, 3863433358066670588u, 227633084198576924u, 2372115167947128791u, 933645u}, + {13606233366945235474u, 3644897699410925774u, 4900361164253093943u, 14500799114366328858u, 2174840u}, + {1330407788655480480u, 8068523054051308694u, 11120994101747372512u, 7534108511326570939u, 1234070u}, + {10347368863617013259u, 17800478193568587624u, 12715858298320952246u, 7588811954975584537u, 2797461u}, + {8801496633549885713u, 12577492874818635365u, 17502852102097475680u, 18354232940345691294u, 3347826u}, + {10038024628370783513u, 12510608406678776922u, 12803481279836878376u, 17499694264958104205u, 1870972u}, + {13832474229877783844u, 16883915415516076844u, 3028862362776225937u, 1980068398176825044u, 496005u}, + {10570456235781452797u, 4038551618345995211u, 6015836020999212766u, 5989929984422367392u, 1896538u}, + {7067351040161245267u, 13961557824291287445u, 462511530827140866u, 7745147519160284102u, 293132u}, + {11557432760844213196u, 14404507029657287286u, 8201153351424719051u, 2599480724094367843u, 126935u}, + {11167416668031507503u, 15586958248640974381u, 530248032591351891u, 14269745159568208374u, 401920u}, + {4607500481811223949u, 2512073841962189877u, 10214166842321980496u, 7213173533440644102u, 2479610u}, + {16911135367827902514u, 14487362376995788978u, 13340572098205790141u, 11286725408202542490u, 3215448u}, + {12292719934125828030u, 5233825885718834446u, 9723397943666104771u, 10291492911010813550u, 1710608u}, + {7991571344544263038u, 3793145310017822514u, 12572490552470622854u, 12497518926839465987u, 2677599u}, + {7961953321745342688u, 6454183529323349911u, 9904351518696750030u, 16982927594895604508u, 2739422u}, + {9875061404911095300u, 152248179524697205u, 3737503312180917678u, 4229873887726637450u, 2076315u}, + {7468169753012386974u, 807995392738230431u, 7198149941132450985u, 7460233441557855543u, 3856623u}, + {6271579527007372757u, 2448465137078963239u, 11802380176447517665u, 9150398993708935329u, 3469382u}, + {3492691310623885220u, 14325732614100891615u, 5784099120941403590u, 7918276561132478609u, 2934279u}, + {4949256697655737066u, 14493347803859044289u, 9937694038715076760u, 198243089747992822u, 1140848u}, + {5822402818926646164u, 15213616458543158985u, 5349614636427059140u, 12703181481956563220u, 1493515u}, + {18038093081365905633u, 5846335837866421506u, 17309197197767993239u, 15447875625795006106u, 1289840u}, + {163672554861360263u, 16132924237036119649u, 15705328185914815464u, 12561814726423370017u, 2404087u}, + {922893871245062469u, 15084522603380053824u, 4412915154061562850u, 548750748447242453u, 3435759u}, + {1481440603756102380u, 13934154016424142174u, 14718269663859986266u, 1072184884051686107u, 3451354u}, + {17291074116397626963u, 5314444299533513371u, 15860034108341062299u, 1072472561548949743u, 2982255u}, + {10019438398507966052u, 833982230167520808u, 7443700706385906168u, 11512170347850555064u, 3374602u}, + {13056031255141532602u, 8484212921116599970u, 2822571293188762952u, 11951753447214908188u, 1347895u}, + {9571758180824089341u, 12106226995569028610u, 5356132196034571306u, 5789471809089221063u, 2320658u}, + {17521868644504777930u, 9749420838083518027u, 13342610993523478538u, 3285400321704835589u, 2488356u}, + {1860944360932115263u, 5507214541806476084u, 13388995228802835561u, 11935405085839789366u, 3743377u}, + {15966751775023847800u, 11866383330036118252u, 727476843832761184u, 4752796741891131566u, 2409994u}, + {10368810008505575774u, 10263087803409034261u, 523553092950771755u, 18202970244847812191u, 3343801u}, + {9873769803191398991u, 6901049952680570484u, 4629110942530175555u, 7123326475200322045u, 1626066u}, + {11060889486333782941u, 14937479225258295234u, 17678339438371813146u, 15954723912854360926u, 917756u}, + {3357100865835890481u, 13565409062479890677u, 1978498580434797534u, 16013715502428837088u, 372502u}, + {4509703953489492536u, 9771510667997014693u, 15216725091339611295u, 15066908619001599081u, 2924843u}, + {5933665978681151066u, 13777459932911179602u, 1453518021353232409u, 12015514455639726861u, 2496139u}, + {15818649474863133815u, 17523635238050186623u, 1861967954692414781u, 13953161298641011390u, 48086u}, + {12223248258919899027u, 10282108855623242520u, 2582882965082962930u, 4972861032705717280u, 232581u}, + {16783985122936806956u, 17242823714594456088u, 17157651953560420667u, 9299719998048972217u, 732215u}, + {9027219559761662247u, 4115992120237492483u, 7110881488946140047u, 3256098723718408357u, 1273280u}, + {1151355514189417111u, 16345487247858751812u, 11068578400095466020u, 2473446070839821445u, 2290651u}, + {12286441864168466310u, 16354311389243114419u, 17682374854544845305u, 16687559277993986144u, 2477103u}, + {14760406720670860315u, 3762139258935965907u, 7943806125592705541u, 5738244430769084373u, 3530167u}, + {11444007391683355438u, 483220968721978943u, 8645698326838591674u, 7198821902679565121u, 2130043u}, + {3238968452126550556u, 1028402625285107056u, 2441696075285330306u, 12721428915961135153u, 853776u}, + {10743192200776949914u, 14664154531868512355u, 1874874847361062229u, 6140644893313578922u, 2514578u}, + {9989884789492617769u, 15427118133839132304u, 3634690560524061557u, 2712516762363358942u, 3574222u}, + {2371603448217064448u, 5439927521271379692u, 6629791072510364275u, 14261278786680942455u, 3243618u}, + {14845207297153324320u, 6735078983616046958u, 1374820033583692785u, 14975756171231239167u, 3649008u}, + {8471516668371189260u, 17702829411697014283u, 13916889565808646318u, 10803893843325937378u, 674029u}, + {15077345244300726975u, 16285254048805653063u, 12767328092836662848u, 18315062536898847962u, 2885081u}, + {14063293713378669578u, 1618837871937554884u, 14474954553784743974u, 17058812562104977459u, 2359907u}, + {12653504340244137727u, 1000962947037128411u, 17163536384578285235u, 16400606464135209720u, 1756160u}, + {1370774816205994139u, 2467468124466438983u, 5555500414466540426u, 7526385230417597574u, 947325u}, + {17300801766966558950u, 15743838774592983168u, 7419737471639164154u, 10826114175045202531u, 2220500u}, + {18316125795277420432u, 1762627917160952277u, 7536058159073403733u, 14164249437475661690u, 782216u}, + {9395166232241221257u, 3218242381780225829u, 1891210864731987797u, 4914345747105709876u, 2266257u}, + {16261644403246186430u, 12259477467212816755u, 7790635341272925365u, 14813611845573825414u, 3188696u}, + {16751912492477263177u, 16148201652423666791u, 17958978041714770049u, 17929104395260601325u, 2029506u}, + {3750307038069343789u, 14009969822036118227u, 9639955263611962201u, 8900521862372298500u, 1301145u}, + {13286580334959333925u, 7678555389816786890u, 16780981326335527391u, 528405055983804228u, 2262209u}, + {1990108145106291980u, 188639050460711805u, 654563766983656992u, 3284322122699404587u, 2221919u}, + {12833897418097743373u, 10282651375478198204u, 16905992522307680017u, 3715924470364159511u, 2883113u}, + {9078361087720598019u, 4704700433734530499u, 15724375795380033282u, 10933880751089627772u, 2903225u}, + {738973680532346154u, 10061932139549093029u, 1475543489625124539u, 7259314463290069764u, 174882u}, + {15238720784819392855u, 14386825175926968416u, 1766812104063920235u, 14630917600455783945u, 1410971u}, + {12388355785831475458u, 16082039935066949316u, 3854688477827651108u, 8384708743962984216u, 1490321u}, + {3774166144724443385u, 2550475259698996054u, 11748601291748070397u, 12781685723172628308u, 3814782u}, + {14425957557561591728u, 16442666132919574618u, 16701977612925290151u, 8933454386697815721u, 94159u}, + {10687727611794265415u, 8366166447566721381u, 6796272415887301893u, 11242721605825448820u, 2850314u}, + {1495325053510103605u, 16815907966015786545u, 13470850048092668725u, 12302370010578182092u, 163329u}, + {5117733354934242316u, 413694465492173402u, 17230582642883324360u, 8001405838775185813u, 956116u}, + {18256462703973502121u, 8526326099546828163u, 7896484268293512521u, 13852695290440348432u, 201668u}, + {6997949821849426122u, 9040513917043740886u, 5453667737084745049u, 7857997881970697172u, 194730u}, + {795618814902093683u, 17354731531912062725u, 17651336191330814287u, 11244576812248229358u, 1720698u}, + {12009700581038726018u, 6535185280594675103u, 5437681909105784717u, 11128610768719622834u, 436092u}, + {6750706112534374918u, 13858197897391083212u, 9277743931130181062u, 9807877277803402210u, 126566u}, + {17758538486581523890u, 18166215559108204833u, 16846172968080033004u, 18088790843938222336u, 3459656u}, + {17851731245735552108u, 2382343814875895571u, 8187152621097828266u, 18366448292537560280u, 184068u}, + {3928825109794581548u, 11354409163709299731u, 5246515376220185417u, 12397301648178212854u, 2068728u}, + {89564757131068202u, 5844029050214052759u, 8737803968765744917u, 10846800414060609061u, 2021265u}, + {4086412896535992850u, 16069868801677807776u, 16744539432027625476u, 7243045172799740550u, 616230u}, + {664449364438189511u, 11185831798898310757u, 14611079944470653514u, 9090624293122507145u, 1590825u}, + {9993001578186057046u, 3070295168747421785u, 10552097391221860185u, 9108602399510603226u, 173957u}, + {18148594395200317835u, 2309989711224550511u, 18097505492411232464u, 8650120233918785011u, 881786u}, + {11938928447267806039u, 15307120335738287995u, 11068990695812137432u, 8519062185795396732u, 2855457u}, + {13019958630578139549u, 2644741736702570710u, 17047839748954332450u, 16409747739621186112u, 594871u}, + {1268497711052737284u, 5123244081068006769u, 5544125561659184122u, 17160680830530468182u, 924458u}, + {4673506242621971035u, 12175904070816763636u, 3657847499898802820u, 10321289204717269063u, 688917u}, + {17798896566336690957u, 10863135964947173124u, 16379028888362856974u, 18387394765579940647u, 1447995u}, + {10183315897612458670u, 17949110807595267139u, 14243663912197748961u, 18329339697206101571u, 2083220u}, + {6126912857785835408u, 7937744986925422378u, 5969091373988679879u, 17188136025545421677u, 245544u}, + {15370269484371110672u, 354398393913251049u, 12680675224025632913u, 16577776133238396243u, 3888163u}, + {8492849867248894701u, 15753647256792042207u, 10668077713986553970u, 14267069989827446276u, 22693u}, + {2317732147176234437u, 5499103440654516118u, 12585626221615774164u, 418626230334680u, 0u}, + {12947017446324628699u, 564784780460608025u, 4248924905845412206u, 418626u, 0u}, + {12968289412116232536u, 11071953871013697054u, 7722290933525640u, 0u, 0u}, + {8358797025175129917u, 17220508578397870217u, 7722290u, 0u, 0u}, + {13772170475209282336u, 142451124513475111u, 0u, 0u, 0u}, + {9471943974608774673u, 142451124u, 0u, 0u, 0u}, + {2627759436912208452u, 0u, 0u, 0u, 0u}, + {2627759437u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 930396u}, + {12181986584403920101u, 15971496792247495598u, 18175944690115874680u, 7655267744919564287u, 3051941u}, + {15111231234345070610u, 218567517507441426u, 10847625266000508026u, 14539874783833844083u, 567924u}, + {17654902731381076938u, 5684059778361461492u, 4165445768668573087u, 5126565539914075663u, 1160852u}, + {18228386366202115938u, 5563814848603174704u, 6024937110706186327u, 17531409296094507868u, 3442599u}, + {1182835648468876290u, 2960982063587611246u, 14355216620579439850u, 63504760232817724u, 2405892u}, + {10458164288020765787u, 12421679337107547124u, 14560738150314878830u, 3863433358066670588u, 2277800u}, + {13514109289920887984u, 15207972453761210196u, 13606233366945235473u, 3644897699410925774u, 3801761u}, + {1168810879383263021u, 5463192776038925383u, 1330407788655480479u, 8068523054051308694u, 122106u}, + {17057831288854468897u, 11549069632666333526u, 10347368863617013258u, 17800478193568587624u, 2139754u}, + {10653854005857538886u, 11061321990370634964u, 8801496633549885712u, 12577492874818635365u, 2420190u}, + {7029265320580996012u, 7085065910154696146u, 10038024628370783512u, 12510608406678776922u, 1216388u}, + {16635451233485039907u, 8779366145209329704u, 13832474229877783843u, 16883915415516076844u, 180321u}, + {11911329626309943437u, 3248861290734687151u, 10570456235781452796u, 4038551618345995211u, 2951316u}, + {4385046362723326112u, 11736554017735608681u, 7067351040161245266u, 13961557824291287445u, 3526140u}, + {6259531770902268921u, 11528592037470678311u, 11557432760844213195u, 14404507029657287286u, 1220699u}, + {1428407972321512321u, 13980697232648261136u, 11167416668031507502u, 15586958248640974381u, 3367295u}, + {3640085384168927337u, 8843161006750416686u, 4607500481811223948u, 2512073841962189877u, 205238u}, + {13062080710907200045u, 2180805600275982094u, 16911135367827902513u, 14487362376995788978u, 2476269u}, + {2549157310601946578u, 10638765347538213953u, 12292719934125828029u, 5233825885718834446u, 2501819u}, + {4737677596594630706u, 17307311373963744549u, 7991571344544263037u, 3793145310017822514u, 2225740u}, + {10308515873487634167u, 2217724793202046242u, 7961953321745342687u, 6454183529323349911u, 440890u}, + {10222748203656361726u, 6967053059013726903u, 9875061404911095299u, 152248179524697205u, 832768u}, + {14697197917020932749u, 10096249597489203439u, 7468169753012386973u, 807995392738230431u, 3825311u}, + {395313721750049535u, 770636447841600833u, 6271579527007372756u, 2448465137078963239u, 3162021u}, + {1482441763369634669u, 11081504377815806663u, 3492691310623885219u, 14325732614100891615u, 529708u}, + {6829471190444661862u, 15530681066071851219u, 4949256697655737065u, 14493347803859044289u, 513050u}, + {1405011819808813327u, 346040440020806363u, 5822402818926646163u, 15213616458543158985u, 524250u}, + {9771534212328799578u, 6163498496830876988u, 18038093081365905632u, 5846335837866421506u, 3473825u}, + {13187544808009946639u, 4547095266725626469u, 163672554861360262u, 16132924237036119649u, 1327358u}, + {12968385261638966893u, 14766181337036579976u, 922893871245062468u, 15084522603380053824u, 1465752u}, + {1229914537990081165u, 13084219581933358516u, 1481440603756102379u, 13934154016424142174u, 2940352u}, + {16907874551947151006u, 15174809580457566136u, 17291074116397626962u, 5314444299533513371u, 2241517u}, + {12623441536697841520u, 18197772995807521805u, 10019438398507966051u, 833982230167520808u, 2898854u}, + {15464050431895369498u, 7195396096510188790u, 13056031255141532601u, 8484212921116599970u, 29880u}, + {4335184208302255568u, 8096080464106081053u, 9571758180824089340u, 12106226995569028610u, 1173412u}, + {16076924163268322774u, 2597872906231836263u, 17521868644504777929u, 9749420838083518027u, 1671698u}, + {13614697823000339778u, 1518754550216172579u, 1860944360932115262u, 5507214541806476084u, 2652929u}, + {11953981945128748294u, 911668161834320737u, 15966751775023847799u, 11866383330036118252u, 1675604u}, + {1042204472225073446u, 5276920897393723454u, 10368810008505575773u, 10263087803409034261u, 3012917u}, + {15201856092342703604u, 13887976253730079273u, 9873769803191398990u, 6901049952680570484u, 1168621u}, + {5619768001860692748u, 17624449295514440037u, 11060889486333782940u, 14937479225258295234u, 1007298u}, + {10049542477040773946u, 16358332338008287380u, 3357100865835890480u, 13565409062479890677u, 2370904u}, + {6520495263986619669u, 15097751280289553108u, 4509703953489492535u, 9771510667997014693u, 783849u}, + {7022295103518921674u, 15955706228397454839u, 5933665978681151065u, 13777459932911179602u, 739419u}, + {9763747552124664881u, 16474269919928624034u, 15818649474863133814u, 17523635238050186623u, 2706737u}, + {9881937375226132544u, 12657153293100334419u, 12223248258919899026u, 10282108855623242520u, 1141596u}, + {1287427258621066781u, 5001560217585169563u, 16783985122936806955u, 17242823714594456088u, 472129u}, + {15035545505341422080u, 13369369766335253340u, 9027219559761662246u, 4115992120237492483u, 3278139u}, + {1025798881911427490u, 14689606402451692103u, 1151355514189417110u, 16345487247858751812u, 3756496u}, + {6367309710592256847u, 7352198490483173656u, 12286441864168466309u, 16354311389243114419u, 820977u}, + {6716135893926928294u, 18065448497552368146u, 14760406720670860314u, 3762139258935965907u, 2757961u}, + {15962543524153503973u, 13632461947298126041u, 11444007391683355437u, 483220968721978943u, 1062318u}, + {11029053160716200959u, 4879022389941825218u, 3238968452126550555u, 1028402625285107056u, 1976660u}, + {11333919266908695456u, 5551916771657570950u, 10743192200776949913u, 14664154531868512355u, 368249u}, + {1950897079867767236u, 16300025211631531126u, 9989884789492617768u, 15427118133839132304u, 1930311u}, + {11833761458623810241u, 15817416172814212974u, 2371603448217064447u, 5439927521271379692u, 1828113u}, + {13894200652905991281u, 10601514412020745078u, 14845207297153324319u, 6735078983616046958u, 2641055u}, + {6740268928175226052u, 8135651057840059644u, 8471516668371189259u, 17702829411697014283u, 12890u}, + {8721762201997654727u, 9123546142823230246u, 15077345244300726974u, 16285254048805653063u, 1819876u}, + {17504684616106405965u, 12533201938472821501u, 14063293713378669577u, 1618837871937554884u, 3481060u}, + {13696869768241643114u, 10709911793451761417u, 12653504340244137726u, 1000962947037128411u, 949215u}, + {5413744727511742053u, 1953638265413113001u, 1370774816205994138u, 2467468124466438983u, 1912710u}, + {6353748886222320295u, 1716403609348992605u, 17300801766966558949u, 15743838774592983168u, 1802250u}, + {5733115192565114599u, 3289689720584482998u, 18316125795277420431u, 1762627917160952277u, 2586269u}, + {7483103070727639371u, 18368303485236696200u, 9395166232241221256u, 3218242381780225829u, 525105u}, + {4504639570050754447u, 13460843734022380491u, 16261644403246186429u, 12259477467212816755u, 395765u}, + {14252516640378285448u, 16144523077708830194u, 16751912492477263176u, 16148201652423666791u, 1669485u}, + {11659428154873596249u, 3310592755293446813u, 3750307038069343788u, 14009969822036118227u, 2192821u}, + {8915981943183589720u, 11389130401096335885u, 13286580334959333924u, 7678555389816786890u, 2413643u}, + {17941469998232085959u, 16412849839208409694u, 1990108145106291979u, 188639050460711805u, 2736148u}, + {10745236668125140690u, 1719796367424984913u, 12833897418097743372u, 10282651375478198204u, 1136071u}, + {11668869914406259700u, 5004055866653544802u, 9078361087720598018u, 4704700433734530499u, 2489684u}, + {2398137578613066719u, 1069068255755505776u, 738973680532346153u, 10061932139549093029u, 2567605u}, + {12173252274844085091u, 3119600778335745775u, 15238720784819392854u, 14386825175926968416u, 715381u}, + {7779451514898190370u, 4662559300903692274u, 12388355785831475457u, 16082039935066949316u, 1542790u}, + {13941398414451698301u, 2611548968366425961u, 3774166144724443384u, 2550475259698996054u, 733717u}, + {4874433356834056814u, 4106772810299803251u, 14425957557561591727u, 16442666132919574618u, 405791u}, + {17374778453081109726u, 1678950910308113541u, 10687727611794265414u, 8366166447566721381u, 1435947u}, + {5138078875148400339u, 8119812951156970227u, 1495325053510103604u, 16815907966015786545u, 2895171u}, + {2912354010813359165u, 10241434937681767316u, 5117733354934242315u, 413694465492173402u, 1275564u}, + {3471031822902840676u, 10205128629966580448u, 18256462703973502120u, 8526326099546828163u, 1805991u}, + {12019928546986503950u, 12545564689178187098u, 6997949821849426121u, 9040513917043740886u, 3301881u}, + {3739081728399905738u, 120764076041066072u, 795618814902093682u, 17354731531912062725u, 2710603u}, + {10746521026925628521u, 11003026283172687303u, 12009700581038726017u, 6535185280594675103u, 1254413u}, + {4874935658480306537u, 14840364906338189881u, 6750706112534374917u, 13858197897391083212u, 417518u}, + {13067573027275812528u, 13099618056963303354u, 17758538486581523889u, 18166215559108204833u, 240866u}, + {8010180642101603212u, 13212386617306981441u, 17851731245735552107u, 2382343814875895571u, 2242504u}, + {12732483497093545816u, 15657055284633139906u, 3928825109794581547u, 11354409163709299731u, 399199u}, + {17639855793648380614u, 7360630664187411837u, 89564757131068201u, 5844029050214052759u, 55583u}, + {18367056462793991361u, 12656967691294569571u, 4086412896535992849u, 16069868801677807776u, 916406u}, + {14407224184124611121u, 17002474724306247746u, 664449364438189510u, 11185831798898310757u, 2378534u}, + {16841924614262361654u, 14849782583929821480u, 9993001578186057045u, 3070295168747421785u, 224793u}, + {15424349999154457458u, 2291827427723944976u, 18148594395200317834u, 2309989711224550511u, 1675656u}, + {5430325087087786125u, 5340493746854411284u, 11938928447267806038u, 15307120335738287995u, 2746736u}, + {5387313836954760779u, 4708781826258913330u, 13019958630578139548u, 2644741736702570710u, 387868u}, + {6194829614151815332u, 15752093805487746337u, 1268497711052737283u, 5123244081068006769u, 3807082u}, + {5908875843727476230u, 16638176951558943788u, 4673506242621971034u, 12175904070816763636u, 2954280u}, + {11375067196308633171u, 3247336988790455116u, 17798896566336690956u, 10863135964947173124u, 366996u}, + {8849437582602842620u, 11698288977271296823u, 10183315897612458669u, 17949110807595267139u, 618517u}, + {17828695938951382696u, 16357392894746685255u, 6126912857785835407u, 7937744986925422378u, 3586975u}, + {129956130789614939u, 15969048538284681688u, 15370269484371110671u, 354398393913251049u, 2444429u}, + {18027076071370085168u, 6713406209680871802u, 8492849867248894700u, 15753647256792042207u, 1231994u}, + {247647889258020129u, 1300024629214192236u, 2317732147176234436u, 5499103440654516118u, 3273294u}, + {16832433418235468468u, 6471803819875948446u, 12947017446324628698u, 564784780460608025u, 2555572u}, + {15919822867243450136u, 9093874608657053415u, 12968289412116232535u, 11071953871013697054u, 3838140u}, + {15144482471953204266u, 629101109709054547u, 8358797025175129916u, 17220508578397870217u, 3816040u}, + {16769134371627316483u, 4617309103158989748u, 13772170475209282335u, 142451124513475111u, 0u}, + {14749365850763347666u, 18356571062185531128u, 9471943974608774672u, 142451124u, 0u}, + {15861942479386815961u, 15568887028888437367u, 2627759436912208451u, 0u, 0u}, + {7827768558830313940u, 16827275853040906932u, 2627759436u, 0u, 0u}, + {5791456914435240281u, 11580117672575526403u, 2u, 0u, 0u}, + {18347678330763601335u, 48473605819u, 0u, 0u, 0u}, + {8736485353260286892u, 48u, 0u, 0u, 0u}, + {894180200892u, 0u, 0u, 0u, 0u}, + {895u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2535326u}, + {8163866615124625078u, 8815600413425464813u, 12181986584403920100u, 15971496792247495598u, 129818u}, + {3756679973730394940u, 10929723099882762541u, 15111231234345070609u, 218567517507441426u, 3445998u}, + {3792339739226977707u, 6081303320703483891u, 17654902731381076937u, 5684059778361461492u, 833757u}, + {11032014551946102358u, 15317589696874915092u, 18228386366202115937u, 5563814848603174704u, 358909u}, + {3021922972585390783u, 2971753975756252492u, 1182835648468876289u, 2960982063587611246u, 1505586u}, + {5625459086928660130u, 1127890032187084112u, 10458164288020765786u, 12421679337107547124u, 207088u}, + {2290231166394691172u, 463350815901060515u, 13514109289920887983u, 15207972453761210196u, 3191523u}, + {1591530238799760142u, 2565060475876834645u, 1168810879383263020u, 5463192776038925383u, 1076319u}, + {1962225123427322875u, 7017923811513828080u, 17057831288854468896u, 11549069632666333526u, 1979216u}, + {2922100916717916140u, 7892354751505768996u, 10653854005857538885u, 11061321990370634964u, 1269692u}, + {4192073728047168845u, 8297940602657473012u, 7029265320580996011u, 7085065910154696146u, 3274142u}, + {15322983430719117805u, 6589890861975900925u, 16635451233485039906u, 8779366145209329704u, 339873u}, + {14721982192695353033u, 10463484998501465487u, 11911329626309943436u, 3248861290734687151u, 3427368u}, + {13897733594665952942u, 16933322656287143035u, 4385046362723326111u, 11736554017735608681u, 3872476u}, + {8870826049923397106u, 9164151788758737963u, 6259531770902268920u, 11528592037470678311u, 82615u}, + {16512539122270692071u, 16194524578090662401u, 1428407972321512320u, 13980697232648261136u, 2826218u}, + {7992104736368973538u, 93368285110581768u, 3640085384168927336u, 8843161006750416686u, 1034208u}, + {15271283335199573411u, 15256910214614412835u, 13062080710907200044u, 2180805600275982094u, 2509875u}, + {3438487923346234946u, 7749328667439011339u, 2549157310601946577u, 10638765347538213953u, 731229u}, + {3672830183137505039u, 3718938303875928723u, 4737677596594630705u, 17307311373963744549u, 3035601u}, + {2081933537181018026u, 3925779722682659896u, 10308515873487634166u, 2217724793202046242u, 2684703u}, + {14874539317041307377u, 11179073822062818183u, 10222748203656361725u, 6967053059013726903u, 443787u}, + {4273994457605610278u, 2215654029371070351u, 14697197917020932748u, 10096249597489203439u, 2713785u}, + {5085023259080016616u, 8158277917968731766u, 395313721750049534u, 770636447841600833u, 3073306u}, + {16206861719554542673u, 13081309306299922235u, 1482441763369634668u, 11081504377815806663u, 2076157u}, + {16552221470310186548u, 677118523475933345u, 6829471190444661861u, 15530681066071851219u, 3133889u}, + {12369429741319999396u, 7919448234502527948u, 1405011819808813326u, 346040440020806363u, 2092673u}, + {11585815203279262519u, 12374220222995960014u, 9771534212328799577u, 6163498496830876988u, 404778u}, + {17816198623065959496u, 17674728532857981929u, 13187544808009946638u, 4547095266725626469u, 3601294u}, + {5027940966784259144u, 156697840563726132u, 12968385261638966892u, 14766181337036579976u, 2265714u}, + {6048252117424139692u, 3206554947404307076u, 1229914537990081164u, 13084219581933358516u, 2315575u}, + {685897838456388597u, 10467977920998210419u, 16907874551947151005u, 15174809580457566136u, 2128250u}, + {15047940978887662530u, 3764220119568123171u, 12623441536697841519u, 18197772995807521805u, 3344453u}, + {7670743600567911675u, 9213816018446259947u, 15464050431895369497u, 7195396096510188790u, 1389401u}, + {7613167468013899454u, 1293706935464005776u, 4335184208302255567u, 8096080464106081053u, 205972u}, + {6331109402334264113u, 17255129547024369884u, 16076924163268322773u, 2597872906231836263u, 300599u}, + {16804516859707540894u, 17023318147755151793u, 13614697823000339777u, 1518754550216172579u, 2546630u}, + {5751453701595367597u, 1934523368135715970u, 11953981945128748293u, 911668161834320737u, 906205u}, + {7227253740206374409u, 7229163988971997067u, 1042204472225073445u, 5276920897393723454u, 2868701u}, + {11591773625600103219u, 4425627829944260033u, 15201856092342703603u, 13887976253730079273u, 2298310u}, + {16651686420421004799u, 6998660229026357949u, 5619768001860692747u, 17624449295514440037u, 68222u}, + {17099059740448597138u, 6845471827983439696u, 10049542477040773945u, 16358332338008287380u, 2044486u}, + {17299385238770679644u, 8836205156700109104u, 6520495263986619668u, 15097751280289553108u, 1679317u}, + {5273368384467493325u, 4491740648716826981u, 7022295103518921673u, 15955706228397454839u, 2446961u}, + {11886070801882379352u, 5367572960611975694u, 9763747552124664880u, 16474269919928624034u, 2551904u}, + {9361893483037278945u, 18321602252724794516u, 9881937375226132543u, 12657153293100334419u, 1603872u}, + {7656715528543338792u, 3917374183200232908u, 1287427258621066780u, 5001560217585169563u, 2098737u}, + {1550918648730072577u, 9006837886941962213u, 15035545505341422079u, 13369369766335253340u, 3356408u}, + {11898011301811865514u, 10780822660564727221u, 1025798881911427489u, 14689606402451692103u, 125978u}, + {4177149011348618969u, 5023415604492720754u, 6367309710592256846u, 7352198490483173656u, 2767425u}, + {5292367669190950545u, 11147473369970568886u, 6716135893926928293u, 18065448497552368146u, 735992u}, + {1602538428561603188u, 628601979761506876u, 15962543524153503972u, 13632461947298126041u, 2773583u}, + {10445979660577461197u, 10173436099464190426u, 11029053160716200958u, 4879022389941825218u, 188761u}, + {5532138307355905356u, 9228892456553198375u, 11333919266908695455u, 5551916771657570950u, 813637u}, + {18304143497981494122u, 7014856401339363267u, 1950897079867767235u, 16300025211631531126u, 1995098u}, + {12341393680452422847u, 273187782797476880u, 11833761458623810240u, 15817416172814212974u, 490497u}, + {7183239188247144891u, 9374817149641972395u, 13894200652905991280u, 10601514412020745078u, 3534527u}, + {14496459338166671970u, 12135718913014916721u, 6740268928175226051u, 8135651057840059644u, 2400927u}, + {15775681242647362558u, 13617948504299803624u, 8721762201997654726u, 9123546142823230246u, 3644988u}, + {6231388820791498077u, 17074579155588359644u, 17504684616106405964u, 12533201938472821501u, 2460481u}, + {6138631867429751199u, 16822912553937124170u, 13696869768241643113u, 10709911793451761417u, 438192u}, + {8387032859203289224u, 15398798473135002538u, 5413744727511742052u, 1953638265413113001u, 3202676u}, + {13303934280104098670u, 6547817996362043893u, 6353748886222320294u, 1716403609348992605u, 2553187u}, + {6216948061422808697u, 10603746440337321684u, 5733115192565114598u, 3289689720584482998u, 3560227u}, + {4029221447440730378u, 9000164193663859681u, 7483103070727639370u, 18368303485236696200u, 3151300u}, + {7995069779741087642u, 12912561665195494211u, 4504639570050754446u, 13460843734022380491u, 196349u}, + {9660569969765770281u, 2911856306985989197u, 14252516640378285447u, 16144523077708830194u, 3686342u}, + {17371122645233230432u, 2872396073527216567u, 11659428154873596248u, 3310592755293446813u, 218496u}, + {7935189411316950643u, 6974459962369570706u, 8915981943183589719u, 11389130401096335885u, 3023622u}, + {11059459160753215258u, 2271596838729496942u, 17941469998232085958u, 16412849839208409694u, 3386597u}, + {398716164716474284u, 223329088068311825u, 10745236668125140689u, 1719796367424984913u, 1739162u}, + {8976402028527024521u, 1699866894766597984u, 11668869914406259699u, 5004055866653544802u, 3266806u}, + {10129170931797835562u, 10837264156100085344u, 2398137578613066718u, 1069068255755505776u, 1145147u}, + {2019682367876223352u, 16886237453093243005u, 12173252274844085090u, 3119600778335745775u, 2757846u}, + {12083149761780150008u, 17553760563565506991u, 7779451514898190369u, 4662559300903692274u, 947353u}, + {15608685337998466288u, 13080237984139836051u, 13941398414451698300u, 2611548968366425961u, 3878600u}, + {10767801110524943101u, 3262175287910991080u, 4874433356834056813u, 4106772810299803251u, 1172361u}, + {17496032099057695114u, 3946275899566195562u, 17374778453081109725u, 1678950910308113541u, 2675942u}, + {8598671037152785834u, 5702507171798922006u, 5138078875148400338u, 8119812951156970227u, 501800u}, + {11903712109094901176u, 16394690821762138635u, 2912354010813359164u, 10241434937681767316u, 2439881u}, + {14822422460254653228u, 2815315459825800152u, 3471031822902840675u, 10205128629966580448u, 408924u}, + {3934268906962121115u, 16171854464059184793u, 12019928546986503949u, 12545564689178187098u, 2640383u}, + {9617952194617061199u, 14602109937890966171u, 3739081728399905737u, 120764076041066072u, 2725250u}, + {1109239532024534584u, 7761321651423036664u, 10746521026925628520u, 11003026283172687303u, 3716543u}, + {13597218282090962408u, 13674142982417844433u, 4874935658480306536u, 14840364906338189881u, 3100467u}, + {3589842977181610847u, 6033084844158056239u, 13067573027275812527u, 13099618056963303354u, 1401163u}, + {13703557547603748579u, 5036992661637650199u, 8010180642101603211u, 13212386617306981441u, 1114417u}, + {13043672512145332636u, 10170114638474901187u, 12732483497093545815u, 15657055284633139906u, 583087u}, + {13634750685153807422u, 12233485605936462632u, 17639855793648380613u, 7360630664187411837u, 2541843u}, + {3877417811426707578u, 6663196640440377348u, 18367056462793991360u, 12656967691294569571u, 3737251u}, + {7465570360967084747u, 17591102039116459392u, 14407224184124611120u, 17002474724306247746u, 320826u}, + {3131880542454443372u, 7449741813886929166u, 16841924614262361653u, 14849782583929821480u, 3146463u}, + {4993019734488650765u, 16793057319132471236u, 15424349999154457457u, 2291827427723944976u, 446246u}, + {12335434059086661664u, 1101876595089594835u, 5430325087087786124u, 5340493746854411284u, 1357324u}, + {17020645246512663940u, 4149130443893111634u, 5387313836954760778u, 4708781826258913330u, 2360216u}, + {17024184646430041853u, 11622123072869018340u, 6194829614151815331u, 15752093805487746337u, 3519879u}, + {4370762186902936362u, 2578481231218993549u, 5908875843727476229u, 16638176951558943788u, 257240u}, + {7499191415655916224u, 8688030500069425817u, 11375067196308633170u, 3247336988790455116u, 1353016u}, + {12168058433130489341u, 11681436148006713730u, 8849437582602842619u, 11698288977271296823u, 17295u}, + {15077937738970172217u, 18359861894605431662u, 17828695938951382695u, 16357392894746685255u, 2402605u}, + {938794333914822707u, 17805676477893153743u, 129956130789614938u, 15969048538284681688u, 653229u}, + {523010629759113669u, 10271408508410679282u, 18027076071370085167u, 6713406209680871802u, 161976u}, + {6230671190300872015u, 10824812391060944126u, 247647889258020128u, 1300024629214192236u, 3180938u}, + {13054816828403416799u, 8465196699150677018u, 16832433418235468467u, 6471803819875948446u, 792430u}, + {10410315733161809530u, 7960420932742020915u, 15919822867243450135u, 9093874608657053415u, 2853639u}, + {7372054211036686548u, 15238987347492705209u, 15144482471953204265u, 629101109709054547u, 304828u}, + {9830265663053993241u, 17910161231282499678u, 16769134371627316482u, 4617309103158989748u, 2924211u}, + {11424303515517625597u, 11771060474967701561u, 14749365850763347665u, 18356571062185531128u, 241056u}, + {13892957692434102715u, 8020423877981548614u, 15861942479386815960u, 15568887028888437367u, 2052201u}, + {2982846315137791295u, 3222013253014825423u, 7827768558830313939u, 16827275853040906932u, 2759436u}, + {2573329932403645252u, 16303506663310658811u, 5791456914435240280u, 11580117672575526403u, 2u}, + {7693211869949031452u, 4998706841964713392u, 18347678330763601334u, 48473605819u, 0u}, + {4947999685374842836u, 18115714267933000613u, 8736485353260286891u, 48u, 0u}, + {17336551818813049962u, 5880166413083195611u, 894180200891u, 0u, 0u}, + {9165919061031204796u, 3324119724011597289u, 894u, 0u, 0u}, + {6470047789939746098u, 16494713321620u, 0u, 0u, 0u}, + {13158461372853944559u, 16494u, 0u, 0u, 0u}, + {304273755213139u, 0u, 0u, 0u, 0u}, + {304274u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1332156u}, + {10357547517412061369u, 9230365861615905752u, 8163866615124625077u, 8815600413425464813u, 2657726u}, + {12689744145862814663u, 5534427971354952607u, 3756679973730394939u, 10929723099882762541u, 1543113u}, + {15919152305506937448u, 6008357695010552448u, 3792339739226977706u, 6081303320703483891u, 2243201u}, + {11793017079045306904u, 11479523544932461991u, 11032014551946102357u, 15317589696874915092u, 942855u}, + {11095217311000957428u, 6453370386084214955u, 3021922972585390782u, 2971753975756252492u, 2549291u}, + {15530752049156759787u, 17319565929248140390u, 5625459086928660129u, 1127890032187084112u, 1680798u}, + {14303917747449282570u, 3781711845659236640u, 2290231166394691171u, 463350815901060515u, 2333457u}, + {7272449710585464605u, 6017637881266438124u, 1591530238799760141u, 2565060475876834645u, 1536162u}, + {7958188303667288787u, 6843157904319299370u, 1962225123427322874u, 7017923811513828080u, 2064158u}, + {12186468892917602794u, 14021263223047648719u, 2922100916717916139u, 7892354751505768996u, 613511u}, + {8960236162358805589u, 6105792815398911193u, 4192073728047168844u, 8297940602657473012u, 1769949u}, + {14369107409183867743u, 5284844240336108202u, 15322983430719117804u, 6589890861975900925u, 820408u}, + {7759767420768103738u, 17210012596593748736u, 14721982192695353032u, 10463484998501465487u, 3894760u}, + {9014785117066191000u, 11341069046625183976u, 13897733594665952941u, 16933322656287143035u, 695913u}, + {1149041056538286552u, 9450761907999225893u, 8870826049923397105u, 9164151788758737963u, 2906936u}, + {2218190668012101534u, 4199477464437021680u, 16512539122270692070u, 16194524578090662401u, 1155254u}, + {7041643151205768078u, 14168425958174753559u, 7992104736368973537u, 93368285110581768u, 2860010u}, + {15575739300467361829u, 18442781450549783656u, 15271283335199573410u, 15256910214614412835u, 2123198u}, + {7343895722542194328u, 3540318657724348581u, 3438487923346234945u, 7749328667439011339u, 2385299u}, + {17981612915669490926u, 7264219223784778155u, 3672830183137505038u, 3718938303875928723u, 1879445u}, + {8184690701322446864u, 4111656147724130341u, 2081933537181018025u, 3925779722682659896u, 550056u}, + {10560751637884163631u, 16359522600656850341u, 14874539317041307376u, 11179073822062818183u, 2923345u}, + {18041497248255616812u, 7784183348747040153u, 4273994457605610277u, 2215654029371070351u, 854882u}, + {9819148632726950774u, 17584832600669346656u, 5085023259080016615u, 8158277917968731766u, 2107948u}, + {17927564160922959661u, 16936006646224471303u, 16206861719554542672u, 13081309306299922235u, 1550418u}, + {9856905981785408609u, 17382607503135238306u, 16552221470310186547u, 677118523475933345u, 3532899u}, + {5860790369124476509u, 15641234328068079353u, 12369429741319999395u, 7919448234502527948u, 2839072u}, + {2209854884224846680u, 10023447833576035182u, 11585815203279262518u, 12374220222995960014u, 1117703u}, + {2790670337304071223u, 17217281688408550168u, 17816198623065959495u, 17674728532857981929u, 682106u}, + {526870151639811554u, 17157558240288180873u, 5027940966784259143u, 156697840563726132u, 1952692u}, + {5008109961745929957u, 1673636342604286955u, 6048252117424139691u, 3206554947404307076u, 1063970u}, + {17968925205866319588u, 9278985780623921696u, 685897838456388596u, 10467977920998210419u, 933781u}, + {5544956108785444279u, 11574793934687563754u, 15047940978887662529u, 3764220119568123171u, 3388217u}, + {3031796660650761672u, 1338695299993804316u, 7670743600567911674u, 9213816018446259947u, 3725743u}, + {15602331034356274679u, 10561643365093435422u, 7613167468013899453u, 1293706935464005776u, 1808697u}, + {10623993448113185737u, 17780194986381740229u, 6331109402334264112u, 17255129547024369884u, 960925u}, + {11011325022666076761u, 9252028259896739339u, 16804516859707540893u, 17023318147755151793u, 3308221u}, + {11064929896272546838u, 501164048385388930u, 5751453701595367596u, 1934523368135715970u, 1268765u}, + {16821029319824989903u, 4313714950249182321u, 7227253740206374408u, 7229163988971997067u, 1632515u}, + {15400054770191515220u, 10488385555074115298u, 11591773625600103218u, 4425627829944260033u, 491881u}, + {3765921449259374180u, 10305371022968423899u, 16651686420421004798u, 6998660229026357949u, 21u}, + {15427233931600193971u, 15879712850698324049u, 17099059740448597137u, 6845471827983439696u, 2449141u}, + {16429171171914794037u, 2905457558709084234u, 17299385238770679643u, 8836205156700109104u, 1310248u}, + {7631251170475921899u, 7636819140630160850u, 5273368384467493324u, 4491740648716826981u, 1914213u}, + {17558673881488041396u, 10777856072259518578u, 11886070801882379351u, 5367572960611975694u, 1028548u}, + {14408848954087496804u, 16038461564619177652u, 9361893483037278944u, 18321602252724794516u, 1423779u}, + {13851299247256293209u, 8700019919499881452u, 7656715528543338791u, 3917374183200232908u, 3886660u}, + {6928211846133371484u, 13442051638784583457u, 1550918648730072576u, 9006837886941962213u, 2398317u}, + {16483538883289334639u, 14198059296712680673u, 11898011301811865513u, 10780822660564727221u, 2788655u}, + {12612746132506313127u, 14562529937749833136u, 4177149011348618968u, 5023415604492720754u, 2743242u}, + {16972703136619840795u, 9537663692448449164u, 5292367669190950544u, 11147473369970568886u, 2826581u}, + {1442071652390777015u, 11014223576922793060u, 1602538428561603187u, 628601979761506876u, 721826u}, + {1494791398405139302u, 460310082941027851u, 10445979660577461196u, 10173436099464190426u, 299262u}, + {2898418746400981135u, 17971465262637237293u, 5532138307355905355u, 9228892456553198375u, 1369877u}, + {17682288220464515513u, 9415960988236436469u, 18304143497981494121u, 7014856401339363267u, 3090789u}, + {7762163047393904987u, 189307451522884195u, 12341393680452422846u, 273187782797476880u, 397356u}, + {644595414168567178u, 14948711274992337816u, 7183239188247144890u, 9374817149641972395u, 1628640u}, + {8036851928384574849u, 8346875929478381423u, 14496459338166671969u, 12135718913014916721u, 3855467u}, + {13170819124976887831u, 10611914863326403017u, 15775681242647362557u, 13617948504299803624u, 3739790u}, + {5056132899745801070u, 1111475020145813818u, 6231388820791498076u, 17074579155588359644u, 1815666u}, + {12787560325301998230u, 7422093153306839617u, 6138631867429751198u, 16822912553937124170u, 2739287u}, + {2610440400959573337u, 5544755360769602118u, 8387032859203289223u, 15398798473135002538u, 3395424u}, + {12187758610128512368u, 15127584063414998092u, 13303934280104098669u, 6547817996362043893u, 611496u}, + {16651651206182553072u, 12500951409579072644u, 6216948061422808696u, 10603746440337321684u, 3524878u}, + {15468774997568993584u, 1428744760769485674u, 4029221447440730377u, 9000164193663859681u, 772620u}, + {8569212913005387886u, 7870480320092824053u, 7995069779741087641u, 12912561665195494211u, 1602046u}, + {1491757598661686069u, 3044111100577339947u, 9660569969765770280u, 2911856306985989197u, 3369153u}, + {1675893101608463941u, 14522741609347722671u, 17371122645233230431u, 2872396073527216567u, 3086232u}, + {17166329577766864884u, 1998271144189718983u, 7935189411316950642u, 6974459962369570706u, 2049761u}, + {13880847447585226604u, 16007596666569646713u, 11059459160753215257u, 2271596838729496942u, 387944u}, + {7418273306547148640u, 15522197155144027453u, 398716164716474283u, 223329088068311825u, 2306219u}, + {5734838267100076081u, 7249171009140622907u, 8976402028527024520u, 1699866894766597984u, 1551767u}, + {7501168575943300642u, 1531253459909261842u, 10129170931797835561u, 10837264156100085344u, 1342266u}, + {15577198419936373605u, 9023238903158520725u, 2019682367876223351u, 16886237453093243005u, 2372516u}, + {16018000699146378398u, 13381502931803973746u, 12083149761780150007u, 17553760563565506991u, 2049871u}, + {16826388915588212574u, 9020820141032337253u, 15608685337998466287u, 13080237984139836051u, 1061626u}, + {11481921245098449907u, 3980109336884848136u, 10767801110524943100u, 3262175287910991080u, 2990545u}, + {2513895287813735029u, 7917562076670726034u, 17496032099057695113u, 3946275899566195562u, 539783u}, + {16131280757933920094u, 9798492696459038594u, 8598671037152785833u, 5702507171798922006u, 2039220u}, + {250443675894036235u, 13527953884283184663u, 11903712109094901175u, 16394690821762138635u, 274806u}, + {3372695677125126505u, 5396832420334655925u, 14822422460254653227u, 2815315459825800152u, 1677987u}, + {7302741706840235422u, 8037577166880069745u, 3934268906962121114u, 16171854464059184793u, 2519465u}, + {2648938012486823605u, 6528074770860124581u, 9617952194617061198u, 14602109937890966171u, 2773339u}, + {9279731804823052329u, 15543505440912649303u, 1109239532024534583u, 7761321651423036664u, 2995526u}, + {14726248143793099331u, 18131848262013267428u, 13597218282090962407u, 13674142982417844433u, 2835434u}, + {3514998542411777102u, 11884278713554098346u, 3589842977181610846u, 6033084844158056239u, 3524669u}, + {15554864426391329354u, 1611344025330587633u, 13703557547603748578u, 5036992661637650199u, 541769u}, + {5862789393137470636u, 16587788678303420461u, 13043672512145332635u, 10170114638474901187u, 3022333u}, + {2049677894725082041u, 12100098903057597686u, 13634750685153807421u, 12233485605936462632u, 1837613u}, + {10064718111758034697u, 6849557602429764299u, 3877417811426707577u, 6663196640440377348u, 490552u}, + {5833155836991042497u, 296359069904557976u, 7465570360967084746u, 17591102039116459392u, 1507562u}, + {12202923644760736279u, 2916291703301845621u, 3131880542454443371u, 7449741813886929166u, 197211u}, + {16230218532849972251u, 3997867716152174704u, 4993019734488650764u, 16793057319132471236u, 1139099u}, + {1826405653714287293u, 17843282530955401994u, 12335434059086661663u, 1101876595089594835u, 2268562u}, + {5019446022234338116u, 6700065821388904227u, 17020645246512663939u, 4149130443893111634u, 1130304u}, + {10355248375590392454u, 3086640326123279851u, 17024184646430041852u, 11622123072869018340u, 3060997u}, + {5363077900773090026u, 16101442080056283657u, 4370762186902936361u, 2578481231218993549u, 2229077u}, + {3386220281590282362u, 18025561701886839931u, 7499191415655916223u, 8688030500069425817u, 439422u}, + {10412300906750193384u, 5807125939537379717u, 12168058433130489340u, 11681436148006713730u, 3102607u}, + {15797125873696796660u, 6313265569837818155u, 15077937738970172216u, 18359861894605431662u, 403905u}, + {68215392852173069u, 10477265269450223442u, 938794333914822706u, 17805676477893153743u, 2126670u}, + {13437207275351349845u, 15754495540441138616u, 523010629759113668u, 10271408508410679282u, 876755u}, + {15248321719065437839u, 3597828261253747716u, 6230671190300872014u, 10824812391060944126u, 1867982u}, + {4320700968337982685u, 10364882795003823938u, 13054816828403416798u, 8465196699150677018u, 1847783u}, + {12401695906825240178u, 1626632685299482191u, 10410315733161809529u, 7960420932742020915u, 1888409u}, + {805306626018238329u, 17215823704700381238u, 7372054211036686547u, 15238987347492705209u, 2161785u}, + {15776482942900397337u, 5472471084487482916u, 9830265663053993240u, 17910161231282499678u, 1391716u}, + {5313390217525982388u, 5037277939974136358u, 11424303515517625596u, 11771060474967701561u, 1194299u}, + {17807789705401022159u, 1929299145994280848u, 13892957692434102714u, 8020423877981548614u, 2790688u}, + {15558004334779882914u, 3174401794641086716u, 2982846315137791294u, 3222013253014825423u, 1002367u}, + {6386051414189166393u, 14717572689290135939u, 2573329932403645251u, 16303506663310658811u, 1449190u}, + {12713581079923598263u, 2458111064145147702u, 7693211869949031451u, 4998706841964713392u, 1586088u}, + {15093718486348895616u, 3528807744310474918u, 4947999685374842835u, 18115714267933000613u, 2358209u}, + {11332426486655939910u, 4195264554210025581u, 17336551818813049961u, 5880166413083195611u, 513391u}, + {18365993628880011204u, 16414182812188054173u, 9165919061031204795u, 3324119724011597289u, 894u}, + {555702668010015833u, 17771878867964458084u, 6470047789939746097u, 16494713321620u, 0u}, + {313217524572922128u, 2554579237670121667u, 13158461372853944558u, 16494u, 0u}, + {12049093344271314443u, 3657968359976427441u, 304273755213138u, 0u, 0u}, + {8647067153141124437u, 13931223481447062136u, 304273u, 0u, 0u}, + {15604420023057428336u, 5612860090763307u, 0u, 0u, 0u}, + {1674287511116950686u, 5612860u, 0u, 0u, 0u}, + {103538993615848906u, 0u, 0u, 0u, 0u}, + {103538994u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 379136u}, + {1500418613136240896u, 11410824137751307037u, 10357547517412061368u, 9230365861615905752u, 3146941u}, + {15809298207116368646u, 3226569749765384531u, 12689744145862814662u, 5534427971354952607u, 1494973u}, + {6975007677584765351u, 2731746272661017141u, 15919152305506937447u, 6008357695010552448u, 1212468u}, + {11348678779489186091u, 15600906262884203185u, 11793017079045306903u, 11479523544932461991u, 2181659u}, + {4883808579875406732u, 1011247998517725784u, 11095217311000957427u, 6453370386084214955u, 1395550u}, + {1149510632724450365u, 16786454226865816792u, 15530752049156759786u, 17319565929248140390u, 1882009u}, + {4079070816753441219u, 13839210987561932170u, 14303917747449282569u, 3781711845659236640u, 1998053u}, + {1749729056596131064u, 16454273942384132819u, 7272449710585464604u, 6017637881266438124u, 3780833u}, + {17177678088581823250u, 4749959803192160556u, 7958188303667288786u, 6843157904319299370u, 2281702u}, + {13070448720958949614u, 4688218207031747221u, 12186468892917602793u, 14021263223047648719u, 2870691u}, + {5727099937400306634u, 3638044605685119009u, 8960236162358805588u, 6105792815398911193u, 1335730u}, + {14391233021088549113u, 1486186953721418581u, 14369107409183867742u, 5284844240336108202u, 3269152u}, + {5953427616553963702u, 1505761345108496346u, 7759767420768103737u, 17210012596593748736u, 1519334u}, + {10137153978633687843u, 12528132378201955771u, 9014785117066190999u, 11341069046625183976u, 608079u}, + {10056722065032112122u, 14540631990657446346u, 1149041056538286551u, 9450761907999225893u, 1091629u}, + {3747281820686297216u, 10495855445186472506u, 2218190668012101533u, 4199477464437021680u, 2446910u}, + {9766024965426247705u, 10642616076785162519u, 7041643151205768077u, 14168425958174753559u, 3691435u}, + {8384831299265717308u, 960130553098172386u, 15575739300467361828u, 18442781450549783656u, 514808u}, + {14536284070489227853u, 8038913463030811471u, 7343895722542194327u, 3540318657724348581u, 3169113u}, + {4955147565738804529u, 11990563530151584755u, 17981612915669490925u, 7264219223784778155u, 237076u}, + {2795517941477749964u, 4618733811905496979u, 8184690701322446863u, 4111656147724130341u, 132747u}, + {12877107478049780044u, 13646487159391349391u, 10560751637884163630u, 16359522600656850341u, 106424u}, + {12920576797819208370u, 17466447767193287994u, 18041497248255616811u, 7784183348747040153u, 150685u}, + {13234267868247013347u, 18020650479003149334u, 9819148632726950773u, 17584832600669346656u, 134009u}, + {17541372390676420726u, 7470082319583538253u, 17927564160922959660u, 16936006646224471303u, 906790u}, + {5463184440444004004u, 3291296640661166621u, 9856905981785408608u, 17382607503135238306u, 256761u}, + {3925477124037120902u, 1742573895823558279u, 5860790369124476508u, 15641234328068079353u, 403445u}, + {3246440556549493374u, 2448378715017556413u, 2209854884224846679u, 10023447833576035182u, 3663210u}, + {5745069269913380418u, 6890496267433386982u, 2790670337304071222u, 17217281688408550168u, 425595u}, + {5660926902736744815u, 3323347525868257588u, 526870151639811553u, 17157558240288180873u, 884257u}, + {10024635812360818726u, 2484785893231733941u, 5008109961745929956u, 1673636342604286955u, 3014827u}, + {16369793975031000370u, 15369040374171352439u, 17968925205866319587u, 9278985780623921696u, 2470836u}, + {5897524871297612302u, 768814910924089086u, 5544956108785444278u, 11574793934687563754u, 2258317u}, + {4978115653486453314u, 9774012771566578505u, 3031796660650761671u, 1338695299993804316u, 2235334u}, + {5142955960523897460u, 4484820962357936890u, 15602331034356274678u, 10561643365093435422u, 2928801u}, + {15746669540827046178u, 9381292514425799838u, 10623993448113185736u, 17780194986381740229u, 1553456u}, + {13133735255693701584u, 3466839327165682766u, 11011325022666076760u, 9252028259896739339u, 3730657u}, + {11924845736658475185u, 4244691295174732674u, 11064929896272546837u, 501164048385388930u, 3378206u}, + {9549841086550095440u, 16463454434593240601u, 16821029319824989902u, 4313714950249182321u, 2170270u}, + {12335218402758517278u, 11912607727247837677u, 15400054770191515219u, 10488385555074115298u, 61532u}, + {255526912235157505u, 4520326298258916158u, 3765921449259374179u, 10305371022968423899u, 1465958u}, + {904272934658919236u, 9176513824993249914u, 15427233931600193970u, 15879712850698324049u, 1255169u}, + {5155315293426184215u, 4885126136398706481u, 16429171171914794036u, 2905457558709084234u, 3836545u}, + {1033712765046491634u, 15681128886064624823u, 7631251170475921898u, 7636819140630160850u, 2237498u}, + {9385404530036394459u, 9771841457127464276u, 17558673881488041395u, 10777856072259518578u, 2259243u}, + {5676725251404127146u, 4509329675466977560u, 14408848954087496803u, 16038461564619177652u, 2879024u}, + {8336748178094582940u, 16123955502517452197u, 13851299247256293208u, 8700019919499881452u, 2132579u}, + {17879123396884623472u, 17523386117117966745u, 6928211846133371483u, 13442051638784583457u, 147086u}, + {11588940474616668121u, 1564380040957324194u, 16483538883289334638u, 14198059296712680673u, 373829u}, + {5622343920036974006u, 4221301817910989657u, 12612746132506313126u, 14562529937749833136u, 1412784u}, + {1792465570918914845u, 13634254292895157277u, 16972703136619840794u, 9537663692448449164u, 3332256u}, + {17778539197864506267u, 15927187320788329926u, 1442071652390777014u, 11014223576922793060u, 1515959u}, + {16828728038284273739u, 7710522806003747872u, 1494791398405139301u, 460310082941027851u, 1578834u}, + {7753399127558133913u, 2750756735270828239u, 2898418746400981134u, 17971465262637237293u, 2627767u}, + {7530931661655028915u, 2540031327062477012u, 17682288220464515512u, 9415960988236436469u, 2449877u}, + {13120192496529273543u, 12949435925375455642u, 7762163047393904986u, 189307451522884195u, 1777512u}, + {10871509127493959054u, 342954094241844803u, 644595414168567177u, 14948711274992337816u, 3266300u}, + {593574379501179252u, 3837118911904276584u, 8036851928384574848u, 8346875929478381423u, 1054307u}, + {8294687530488038035u, 15756201746947345950u, 13170819124976887830u, 10611914863326403017u, 1659431u}, + {1410514761732378332u, 1128107661211369435u, 5056132899745801069u, 1111475020145813818u, 8726u}, + {9685950764565255940u, 6566967344200086156u, 12787560325301998229u, 7422093153306839617u, 3706790u}, + {11215443539119179420u, 17342808660873914720u, 2610440400959573336u, 5544755360769602118u, 3661725u}, + {8241914948089886320u, 10278850920631325878u, 12187758610128512367u, 15127584063414998092u, 1896683u}, + {15270710416471942352u, 10201593422182734437u, 16651651206182553071u, 12500951409579072644u, 3233658u}, + {10990762072758948218u, 11705046155706961581u, 15468774997568993583u, 1428744760769485674u, 878343u}, + {3201144325287367487u, 3679021877945892029u, 8569212913005387885u, 7870480320092824053u, 959093u}, + {8086659412765480635u, 833367472339097942u, 1491757598661686068u, 3044111100577339947u, 2123150u}, + {9595241102421478642u, 3499288690969915017u, 1675893101608463940u, 14522741609347722671u, 2857745u}, + {5603024255593253072u, 3388242540939061708u, 17166329577766864883u, 1998271144189718983u, 586054u}, + {9359587744425483147u, 2527684202468410140u, 13880847447585226603u, 16007596666569646713u, 1616243u}, + {6994349469677964901u, 13498305716534787966u, 7418273306547148639u, 15522197155144027453u, 2353347u}, + {13333363254975919667u, 12857489819152035479u, 5734838267100076080u, 7249171009140622907u, 978166u}, + {16857226648566244641u, 6190976133678481535u, 7501168575943300641u, 1531253459909261842u, 869511u}, + {13736242535038598961u, 11305185414463043639u, 15577198419936373604u, 9023238903158520725u, 2756477u}, + {5966427737423991138u, 13636123139621148388u, 16018000699146378397u, 13381502931803973746u, 738389u}, + {12971504359033041149u, 13485239861922330280u, 16826388915588212573u, 9020820141032337253u, 918409u}, + {14950552604874484264u, 488044137937567940u, 11481921245098449906u, 3980109336884848136u, 3430650u}, + {7323808471999334943u, 10023298159988174986u, 2513895287813735028u, 7917562076670726034u, 3833603u}, + {18433278437474898032u, 16123596921773371841u, 16131280757933920093u, 9798492696459038594u, 2883099u}, + {13452651479703988811u, 14638785311688200190u, 250443675894036234u, 13527953884283184663u, 3500371u}, + {9331065581055781400u, 4695652254782277679u, 3372695677125126504u, 5396832420334655925u, 2124181u}, + {17360657327375364698u, 12759038079935212317u, 7302741706840235421u, 8037577166880069745u, 2325142u}, + {5501420556231368920u, 5883037348293687136u, 2648938012486823604u, 6528074770860124581u, 2771368u}, + {15971059388553440355u, 10018211032982985018u, 9279731804823052328u, 15543505440912649303u, 2460713u}, + {10603503616821576764u, 9675392982116549359u, 14726248143793099330u, 18131848262013267428u, 3623039u}, + {2140426472468969666u, 15421436771483341171u, 3514998542411777101u, 11884278713554098346u, 1413634u}, + {12557846578657992982u, 1335458342977368895u, 15554864426391329353u, 1611344025330587633u, 788326u}, + {1522392959083756577u, 12550370296947391108u, 5862789393137470635u, 16587788678303420461u, 3603925u}, + {3281773244831007673u, 720352950240542582u, 2049677894725082040u, 12100098903057597686u, 221511u}, + {12276601376885787385u, 3543114686788148532u, 10064718111758034696u, 6849557602429764299u, 440657u}, + {9958277125159208946u, 6791325115095078581u, 5833155836991042496u, 296359069904557976u, 1842490u}, + {1875595089553257196u, 10202841617632956189u, 12202923644760736278u, 2916291703301845621u, 1881093u}, + {7211590450515176u, 2143718680929886684u, 16230218532849972250u, 3997867716152174704u, 2442534u}, + {5915320594963634186u, 10846010698693230588u, 1826405653714287292u, 17843282530955401994u, 3836295u}, + {10081109560366182378u, 4689256727925659817u, 5019446022234338115u, 6700065821388904227u, 3264607u}, + {11518147766021860612u, 8635967555404696045u, 10355248375590392453u, 3086640326123279851u, 1767174u}, + {11615897285666414616u, 7364438544758483676u, 5363077900773090025u, 16101442080056283657u, 605157u}, + {2292807444662463646u, 1695409430669736265u, 3386220281590282361u, 18025561701886839931u, 2304927u}, + {2801502763569196022u, 1684272018798764272u, 10412300906750193383u, 5807125939537379717u, 2399062u}, + {7704517012623009403u, 4892451496998831401u, 15797125873696796659u, 6313265569837818155u, 1567438u}, + {17637789292115556817u, 5891057505135003549u, 68215392852173068u, 10477265269450223442u, 2490414u}, + {17517248315029411083u, 4599476567137914825u, 13437207275351349844u, 15754495540441138616u, 3632410u}, + {3932974704539479581u, 3487214193935136788u, 15248321719065437838u, 3597828261253747716u, 3287672u}, + {1520668493482642113u, 5598906438145884201u, 4320700968337982684u, 10364882795003823938u, 2242434u}, + {11587583073042293374u, 3938202702805811801u, 12401695906825240177u, 1626632685299482191u, 3584173u}, + {3107592696332038624u, 3161711451298202156u, 805306626018238328u, 17215823704700381238u, 3694501u}, + {17184758559057731048u, 4604720383452914038u, 15776482942900397336u, 5472471084487482916u, 3540134u}, + {3797497923466667326u, 3969088085414237649u, 5313390217525982387u, 5037277939974136358u, 3025016u}, + {1511685316364894328u, 9131511147599789879u, 17807789705401022158u, 1929299145994280848u, 209666u}, + {17641444655834883258u, 12551279452525116687u, 15558004334779882913u, 3174401794641086716u, 966214u}, + {1825643564787596253u, 14343515875786572297u, 6386051414189166392u, 14717572689290135939u, 441967u}, + {11460692495656750719u, 12522899990529946661u, 12713581079923598262u, 2458111064145147702u, 3797051u}, + {10728291759239414698u, 9474265293186995724u, 15093718486348895615u, 3528807744310474918u, 863247u}, + {10842138108507433526u, 6973251762574844171u, 11332426486655939909u, 4195264554210025581u, 3095883u}, + {4979702613376983710u, 15548104860291444666u, 18365993628880011203u, 16414182812188054173u, 2477983u}, + {16509344714155068425u, 2879131287572681657u, 555702668010015832u, 17771878867964458084u, 1765267u}, + {14588786592853778961u, 7540629202374030554u, 313217524572922127u, 2554579237670121667u, 2986362u}, + {17217808900919515547u, 14933544535386952236u, 12049093344271314442u, 3657968359976427441u, 1306888u}, + {14218422956419311090u, 5034448993657553859u, 8647067153141124436u, 13931223481447062136u, 304273u}, + {735601916003639096u, 3628247669381011169u, 15604420023057428335u, 5612860090763307u, 0u}, + {9339503902288041755u, 3925143346814914429u, 1674287511116950685u, 5612860u, 0u}, + {12947687568218366101u, 6132531758727718u, 103538993615848905u, 0u, 0u}, + {9468864972390716684u, 11360407138615399182u, 103538993u, 0u, 0u}, + {7702656960298443183u, 1909957316881011887u, 0u, 0u, 0u}, + {16251800813087576120u, 1909957316u, 0u, 0u, 0u}, + {16785749742503450566u, 1u, 0u, 0u, 0u}, + {35232493817u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1394516u}, + {14493207188449981861u, 3076461203129156288u, 1500418613136240895u, 11410824137751307037u, 3037696u}, + {15211851031348188071u, 4036296342501577416u, 15809298207116368645u, 3226569749765384531u, 3557012u}, + {6597876925567922063u, 5835631420910800696u, 6975007677584765350u, 2731746272661017141u, 1976823u}, + {3676122505838937501u, 4797988805354984499u, 11348678779489186090u, 15600906262884203185u, 132363u}, + {7717131690305226906u, 945092706144424867u, 4883808579875406731u, 1011247998517725784u, 3745507u}, + {7594375843659375918u, 17402692800153869316u, 1149510632724450364u, 16786454226865816792u, 225130u}, + {17371357414878862408u, 1716940240583151350u, 4079070816753441218u, 13839210987561932170u, 1362977u}, + {2738429320822780893u, 11160140893393462461u, 1749729056596131063u, 16454273942384132819u, 3589586u}, + {12591485360772537768u, 3019986267499962431u, 17177678088581823249u, 4749959803192160556u, 242568u}, + {5330542347468857347u, 2574072561463704603u, 13070448720958949613u, 4688218207031747221u, 1906293u}, + {10899212901122807752u, 813526448456371811u, 5727099937400306633u, 3638044605685119009u, 2441356u}, + {9222169670528520247u, 663151466699020932u, 14391233021088549112u, 1486186953721418581u, 3502486u}, + {11889098414595766366u, 16956350897705641854u, 5953427616553963701u, 1505761345108496346u, 3370167u}, + {2029991849070577482u, 1593650928058081670u, 10137153978633687842u, 12528132378201955771u, 3092989u}, + {5237640530808698539u, 16423980410319565828u, 10056722065032112121u, 14540631990657446346u, 2575213u}, + {7919002547279485060u, 7340833582320943725u, 3747281820686297215u, 10495855445186472506u, 2718623u}, + {3165168153757486287u, 18286478750091252540u, 9766024965426247704u, 10642616076785162519u, 1267531u}, + {6713501474310132129u, 8123273613846214126u, 8384831299265717307u, 960130553098172386u, 2196622u}, + {14792878795392031955u, 10763577684090367426u, 14536284070489227852u, 8038913463030811471u, 1572251u}, + {52332136457907634u, 13992269409396262922u, 4955147565738804528u, 11990563530151584755u, 382061u}, + {9671482299300532186u, 4558364316722050252u, 2795517941477749963u, 4618733811905496979u, 1496301u}, + {6172826231424398599u, 14391085040138854193u, 12877107478049780043u, 13646487159391349391u, 1545530u}, + {5073442284368909092u, 13024094540625574412u, 12920576797819208369u, 17466447767193287994u, 338919u}, + {1189951577520830110u, 14273403196236126942u, 13234267868247013346u, 18020650479003149334u, 2610223u}, + {16168574686677747574u, 8990053536906716231u, 17541372390676420725u, 7470082319583538253u, 2640298u}, + {13382507917566445227u, 4819054381499028490u, 5463184440444004003u, 3291296640661166621u, 715120u}, + {14339484912549557825u, 3619772478621647366u, 3925477124037120901u, 1742573895823558279u, 3820626u}, + {7246074814198858886u, 8006647324847180261u, 3246440556549493373u, 2448378715017556413u, 2440801u}, + {6355974229472726407u, 1011306540889156800u, 5745069269913380417u, 6890496267433386982u, 471530u}, + {2098821552510387240u, 1709847321968215253u, 5660926902736744814u, 3323347525868257588u, 1888013u}, + {18047896931821690634u, 11475423419722176343u, 10024635812360818725u, 2484785893231733941u, 1126098u}, + {4655475784554428034u, 1173140420412397150u, 16369793975031000369u, 15369040374171352439u, 2615039u}, + {10243985786881430854u, 17463137431155681855u, 5897524871297612301u, 768814910924089086u, 2506544u}, + {10954984718281728355u, 7611926122610597073u, 4978115653486453313u, 9774012771566578505u, 935131u}, + {5563603269719574197u, 11937406986173426349u, 5142955960523897459u, 4484820962357936890u, 748386u}, + {3991281235040991982u, 17489758639268993476u, 15746669540827046177u, 9381292514425799838u, 437736u}, + {13236518251414245908u, 14432511238277971382u, 13133735255693701583u, 3466839327165682766u, 3542676u}, + {7908054670925033194u, 6280151514581838185u, 11924845736658475184u, 4244691295174732674u, 1860653u}, + {16836896006881954843u, 15004897739241947885u, 9549841086550095439u, 16463454434593240601u, 1252508u}, + {8660663957837753231u, 12189392727346739266u, 12335218402758517277u, 11912607727247837677u, 2859879u}, + {7606260251706115933u, 14575273020334261420u, 255526912235157504u, 4520326298258916158u, 1366061u}, + {13877791568848650627u, 4839755083476091874u, 904272934658919235u, 9176513824993249914u, 3104468u}, + {4996480428209765998u, 2063557334623571239u, 5155315293426184214u, 4885126136398706481u, 2419450u}, + {16469891352902574388u, 9899015584550311513u, 1033712765046491633u, 15681128886064624823u, 2388836u}, + {16508762085233689048u, 15155122142085743030u, 9385404530036394458u, 9771841457127464276u, 2263751u}, + {4240277629549115244u, 9337666787018517172u, 5676725251404127145u, 4509329675466977560u, 2987629u}, + {15469890349091292782u, 10365998957887330407u, 8336748178094582939u, 16123955502517452197u, 725914u}, + {3006184860615620170u, 2389850875597171736u, 17879123396884623471u, 17523386117117966745u, 2773961u}, + {6646041804860569300u, 965329316940724453u, 11588940474616668120u, 1564380040957324194u, 2274730u}, + {8837667540583866481u, 2777572446790937072u, 5622343920036974005u, 4221301817910989657u, 833156u}, + {4057721448294402229u, 5616016290626698053u, 1792465570918914844u, 13634254292895157277u, 133304u}, + {17958636828556724752u, 891994159974649029u, 17778539197864506266u, 15927187320788329926u, 19528u}, + {5270976893884796987u, 7974148383365918592u, 16828728038284273738u, 7710522806003747872u, 681321u}, + {2158572473941518808u, 9515720951742996772u, 7753399127558133912u, 2750756735270828239u, 976624u}, + {16189741625494675380u, 17414144787253129409u, 7530931661655028914u, 2540031327062477012u, 2771578u}, + {4554017694166690214u, 8361500953367309637u, 13120192496529273542u, 12949435925375455642u, 2966578u}, + {30956389674569305u, 4637669778449722805u, 10871509127493959053u, 342954094241844803u, 979383u}, + {6013431761612459859u, 9670195514359520070u, 593574379501179251u, 3837118911904276584u, 2582908u}, + {12336583993239140598u, 9310681279435833799u, 8294687530488038034u, 15756201746947345950u, 2561088u}, + {5146471732835374103u, 6696488380437856261u, 1410514761732378331u, 1128107661211369435u, 527263u}, + {9419279507776815142u, 7130777435666604795u, 9685950764565255939u, 6566967344200086156u, 2655541u}, + {5058320274013033784u, 16830103361534415539u, 11215443539119179419u, 17342808660873914720u, 2530124u}, + {4746680532548967616u, 3380688372764019359u, 8241914948089886319u, 10278850920631325878u, 2248237u}, + {14487769960040704283u, 8607402770897988449u, 15270710416471942351u, 10201593422182734437u, 1719323u}, + {8003624357083354517u, 3123159789995197369u, 10990762072758948217u, 11705046155706961581u, 221425u}, + {5938648447749380420u, 4225372702292187851u, 3201144325287367486u, 3679021877945892029u, 2208191u}, + {4658920517433504072u, 11973273300884035663u, 8086659412765480634u, 833367472339097942u, 2196820u}, + {2325294718116715644u, 14473773371074161412u, 9595241102421478641u, 3499288690969915017u, 83246u}, + {6854264740573968950u, 11941726482627573426u, 5603024255593253071u, 3388242540939061708u, 307285u}, + {2294043925156091853u, 16336992898973424400u, 9359587744425483146u, 2527684202468410140u, 1275869u}, + {7141819301778545478u, 7294297335323166548u, 6994349469677964900u, 13498305716534787966u, 1693419u}, + {9507726168922610119u, 852719567780476542u, 13333363254975919666u, 12857489819152035479u, 3582238u}, + {17907093255310619496u, 1096147186460659560u, 16857226648566244640u, 6190976133678481535u, 3480329u}, + {17123845875399340476u, 14021448090569744718u, 13736242535038598960u, 11305185414463043639u, 934466u}, + {4598146088507642822u, 15790635777785234685u, 5966427737423991137u, 13636123139621148388u, 567567u}, + {2428311630246728481u, 6947665433884704707u, 12971504359033041148u, 13485239861922330280u, 3019425u}, + {4709312739087916649u, 10483403239707709422u, 14950552604874484263u, 488044137937567940u, 395332u}, + {451032895446799227u, 7057700220083661497u, 7323808471999334942u, 10023298159988174986u, 2968190u}, + {13201331692295951031u, 14167043340671163636u, 18433278437474898031u, 16123596921773371841u, 601391u}, + {13862369653676243113u, 8874329824762067243u, 13452651479703988810u, 14638785311688200190u, 645568u}, + {17415677550011606713u, 7069213993595866856u, 9331065581055781399u, 4695652254782277679u, 262590u}, + {16995149582333519764u, 18394940144736799296u, 17360657327375364697u, 12759038079935212317u, 2513843u}, + {14687713216733187108u, 3634089342314532439u, 5501420556231368919u, 5883037348293687136u, 119558u}, + {6105974258240070195u, 70782798529315432u, 15971059388553440354u, 10018211032982985018u, 1066604u}, + {10450428945964499475u, 18279706334329188547u, 10603503616821576763u, 9675392982116549359u, 60262u}, + {14264553810914956960u, 14804478359439458338u, 2140426472468969665u, 15421436771483341171u, 2082841u}, + {12703525380225896035u, 13808835968045631722u, 12557846578657992981u, 1335458342977368895u, 669437u}, + {2166748853110786464u, 13020589547988856083u, 1522392959083756576u, 12550370296947391108u, 3894161u}, + {1697403038891068660u, 15511784463189501283u, 3281773244831007672u, 720352950240542582u, 666382u}, + {12661492782633087342u, 16461733788913370363u, 12276601376885787384u, 3543114686788148532u, 970972u}, + {564846897810293548u, 4210844336699469313u, 9958277125159208945u, 6791325115095078581u, 2315902u}, + {9872154375115412988u, 7417789106738698800u, 1875595089553257195u, 10202841617632956189u, 2929972u}, + {16037525815726848892u, 6854217060833032798u, 7211590450515175u, 2143718680929886684u, 2025918u}, + {271093920347083598u, 3617648670118115718u, 5915320594963634185u, 10846010698693230588u, 298866u}, + {7380555991646388215u, 4144490665999232062u, 10081109560366182377u, 4689256727925659817u, 3312989u}, + {17955562442172002640u, 9005675244230345003u, 11518147766021860611u, 8635967555404696045u, 789513u}, + {8099846303881918910u, 12390313846141621964u, 11615897285666414615u, 7364438544758483676u, 2064579u}, + {15373384514228795156u, 16997790247169051655u, 2292807444662463645u, 1695409430669736265u, 1460819u}, + {7119071509489206323u, 12506161067123599585u, 2801502763569196021u, 1684272018798764272u, 3501577u}, + {11098604313006385669u, 2496318290300596630u, 7704517012623009402u, 4892451496998831401u, 2948617u}, + {8217746872437900230u, 12412071977181390237u, 17637789292115556816u, 5891057505135003549u, 3244374u}, + {7358578530256879533u, 13809058193579081319u, 17517248315029411082u, 4599476567137914825u, 1542260u}, + {13220965786406254606u, 14363535925473363203u, 3932974704539479580u, 3487214193935136788u, 2736076u}, + {11740317882921768801u, 10581340995907623844u, 1520668493482642112u, 5598906438145884201u, 2552896u}, + {13256389387027387664u, 78168162380661515u, 11587583073042293373u, 3938202702805811801u, 3427971u}, + {12058794426135873864u, 4182791194458136927u, 3107592696332038623u, 3161711451298202156u, 3528642u}, + {1469616381067963628u, 4151356212667215955u, 17184758559057731047u, 4604720383452914038u, 320946u}, + {13100450618939577637u, 436705105852607680u, 3797497923466667325u, 3969088085414237649u, 2832711u}, + {17878637495962680329u, 14100604931851741768u, 1511685316364894327u, 9131511147599789879u, 718722u}, + {12213901683139363966u, 13721943058997895368u, 17641444655834883257u, 12551279452525116687u, 219803u}, + {16635909123751073888u, 15992637530994416825u, 1825643564787596252u, 14343515875786572297u, 3086518u}, + {10310450063395482288u, 13125382533329605741u, 11460692495656750718u, 12522899990529946661u, 1882200u}, + {15083268901490098129u, 17811956463764383987u, 10728291759239414697u, 9474265293186995724u, 3020735u}, + {11577122048721157537u, 11459944606851339137u, 10842138108507433525u, 6973251762574844171u, 3020703u}, + {5777048037261410725u, 11777091871300057233u, 4979702613376983709u, 15548104860291444666u, 3734269u}, + {16152111101306266775u, 6224846955708328717u, 16509344714155068424u, 2879131287572681657u, 2528328u}, + {329871721887677387u, 15995203225790300763u, 14588786592853778960u, 7540629202374030554u, 955321u}, + {17270697048532243341u, 7640855393556954535u, 17217808900919515546u, 14933544535386952236u, 3386776u}, + {4173682541468461364u, 7567495967541908937u, 14218422956419311089u, 5034448993657553859u, 1375200u}, + {16675241724593420095u, 1366690369940673143u, 735601916003639095u, 3628247669381011169u, 1844947u}, + {597476019250454009u, 1895421973533486793u, 9339503902288041754u, 3925143346814914429u, 332445u}, + {4000556474356054778u, 6349349721624043360u, 12947687568218366100u, 6132531758727718u, 2567655u}, + {16989031595565888473u, 11350541143698465776u, 9468864972390716683u, 11360407138615399182u, 1976493u}, + {11843883755537511398u, 538619168201389078u, 7702656960298443182u, 1909957316881011887u, 0u}, + {13636730886590099165u, 8015157782484665073u, 16251800813087576119u, 1909957316u, 0u}, + {15981068766043842151u, 2700580743144745844u, 16785749742503450565u, 1u, 0u}, + {16322054379173739289u, 3929196722749539997u, 35232493816u, 0u, 0u}, + {11111334567868588090u, 4288753926401315653u, 35u, 0u, 0u}, + {4346462672403414239u, 649924796506u, 0u, 0u, 0u}, + {17059484470789262466u, 649u, 0u, 0u, 0u}, + {11988996388309u, 0u, 0u, 0u, 0u}, + {11989u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2712796u}, + {8231254784835174915u, 17800941567711196154u, 14493207188449981860u, 3076461203129156288u, 58063u}, + {11495968302988237083u, 18054068176626461663u, 15211851031348188070u, 4036296342501577416u, 3850213u}, + {7559610892195970626u, 2854309996889103981u, 6597876925567922062u, 5835631420910800696u, 2286994u}, + {6074589809295185830u, 4782319547661643823u, 3676122505838937500u, 4797988805354984499u, 452328u}, + {9095835958323476574u, 5733385528028085473u, 7717131690305226905u, 945092706144424867u, 1995617u}, + {11071129586785814522u, 16912903378692788177u, 7594375843659375917u, 17402692800153869316u, 3231766u}, + {619044721580574175u, 2661899663713865440u, 17371357414878862407u, 1716940240583151350u, 3429950u}, + {34420739616871207u, 9729757429560099631u, 2738429320822780892u, 11160140893393462461u, 3557533u}, + {16698359585955700725u, 8602932706882883986u, 12591485360772537767u, 3019986267499962431u, 2822003u}, + {8091215716708669934u, 12199618267693665502u, 5330542347468857346u, 2574072561463704603u, 1132607u}, + {18328103441462334730u, 10084679786391993943u, 10899212901122807751u, 813526448456371811u, 793263u}, + {14396872535394278953u, 15475439486041204171u, 9222169670528520246u, 663151466699020932u, 1236874u}, + {13450366034757314738u, 4120539665159391354u, 11889098414595766365u, 16956350897705641854u, 454489u}, + {203961272348283005u, 1385874611395493301u, 2029991849070577481u, 1593650928058081670u, 3627012u}, + {1066422305325710505u, 894771737339918019u, 5237640530808698538u, 16423980410319565828u, 3416135u}, + {10373673274766095017u, 9716253285879627816u, 7919002547279485059u, 7340833582320943725u, 3030749u}, + {6314059743630226835u, 1851226755922422301u, 3165168153757486286u, 18286478750091252540u, 2863544u}, + {1197602126058345647u, 5241660592672428820u, 6713501474310132128u, 8123273613846214126u, 1463465u}, + {9332572409537137085u, 8742184738437002825u, 14792878795392031954u, 10763577684090367426u, 709944u}, + {870881293249778283u, 12138157461268364271u, 52332136457907633u, 13992269409396262922u, 1015674u}, + {6674318576908182146u, 9707616217953053475u, 9671482299300532185u, 4558364316722050252u, 2798533u}, + {6498472781219694284u, 10162928640204634893u, 6172826231424398598u, 14391085040138854193u, 2912579u}, + {10256814964272114707u, 188701163132381235u, 5073442284368909091u, 13024094540625574412u, 325237u}, + {10295912141118409483u, 2233420262065528098u, 1189951577520830109u, 14273403196236126942u, 2976778u}, + {13136127202653493955u, 14012832078718789905u, 16168574686677747573u, 8990053536906716231u, 3428961u}, + {13848731994164089226u, 14012222167352148589u, 13382507917566445226u, 4819054381499028490u, 915759u}, + {4048014573659695906u, 11634733572128803093u, 14339484912549557824u, 3619772478621647366u, 447471u}, + {16730414534039667794u, 469083299702761887u, 7246074814198858885u, 8006647324847180261u, 135537u}, + {8893640469317607955u, 9423012533804135162u, 6355974229472726406u, 1011306540889156800u, 2847259u}, + {3714438646078572776u, 14242995081641852120u, 2098821552510387239u, 1709847321968215253u, 990200u}, + {13987020713362343158u, 16530446267558926501u, 18047896931821690633u, 11475423419722176343u, 1096069u}, + {9524619574863306222u, 14696103846937619098u, 4655475784554428033u, 1173140420412397150u, 1366077u}, + {620729590297524572u, 14239051818668026911u, 10243985786881430853u, 17463137431155681855u, 2487091u}, + {401987296957591555u, 8796754735856724964u, 10954984718281728354u, 7611926122610597073u, 2596879u}, + {73139495979838299u, 6482077889058483678u, 5563603269719574196u, 11937406986173426349u, 2809215u}, + {16258502710494222147u, 1012195358834290911u, 3991281235040991981u, 17489758639268993476u, 1138001u}, + {13991932116175800170u, 652805426016509103u, 13236518251414245907u, 14432511238277971382u, 603945u}, + {13526475898447950327u, 3355336184549483143u, 7908054670925033193u, 6280151514581838185u, 917136u}, + {14220710256759397703u, 13359135179035541921u, 16836896006881954842u, 15004897739241947885u, 632053u}, + {7509533777038230292u, 495962310471382714u, 8660663957837753230u, 12189392727346739266u, 1064633u}, + {10723846034626259757u, 11542916070577274660u, 7606260251706115932u, 14575273020334261420u, 644898u}, + {12020874281914489103u, 8579989091139020456u, 13877791568848650626u, 4839755083476091874u, 2490667u}, + {1534441652352712485u, 6129856052646213034u, 4996480428209765997u, 2063557334623571239u, 1470460u}, + {1187607472425406910u, 13852176289424284828u, 16469891352902574387u, 9899015584550311513u, 1248317u}, + {17901332513283722044u, 12456144525203041401u, 16508762085233689047u, 15155122142085743030u, 2289680u}, + {10131990654681641067u, 2536420073020786904u, 4240277629549115243u, 9337666787018517172u, 3348179u}, + {1446379845734991252u, 6087495994976189603u, 15469890349091292781u, 10365998957887330407u, 647825u}, + {9136072655951628538u, 16428000532196138491u, 3006184860615620169u, 2389850875597171736u, 1549357u}, + {10033130301674234770u, 13296031979685050276u, 6646041804860569299u, 965329316940724453u, 2135004u}, + {6925509320521427795u, 4221374528261036085u, 8837667540583866480u, 2777572446790937072u, 3663603u}, + {16751283264700773862u, 17904609026999861389u, 4057721448294402228u, 5616016290626698053u, 1480100u}, + {17268487919776875576u, 5914606797652355356u, 17958636828556724751u, 891994159974649029u, 2591950u}, + {13825214816125943921u, 14755270476666117855u, 5270976893884796986u, 7974148383365918592u, 223266u}, + {14911896328270347859u, 12207630119072329025u, 2158572473941518807u, 9515720951742996772u, 2616430u}, + {12386480434161885467u, 12852297428339492117u, 16189741625494675379u, 17414144787253129409u, 152874u}, + {16106353811666910040u, 4904525640032862660u, 4554017694166690213u, 8361500953367309637u, 1408582u}, + {5996516537647379318u, 9251577058107771131u, 30956389674569304u, 4637669778449722805u, 784849u}, + {1887713969258625278u, 13049269711013917467u, 6013431761612459858u, 9670195514359520070u, 826793u}, + {8295361409789934308u, 2208694831018762648u, 12336583993239140597u, 9310681279435833799u, 3642362u}, + {15421830312941378119u, 15537855844519534707u, 5146471732835374102u, 6696488380437856261u, 3747719u}, + {18000218125352728233u, 1352344511065605765u, 9419279507776815141u, 7130777435666604795u, 2205481u}, + {6923766203407270434u, 1339311042088535317u, 5058320274013033783u, 16830103361534415539u, 3579983u}, + {14461402444493246552u, 5144429003186354850u, 4746680532548967615u, 3380688372764019359u, 1764489u}, + {6570684837632835258u, 857547502829811695u, 14487769960040704282u, 8607402770897988449u, 1338081u}, + {15290427346331105212u, 6110369642354067623u, 8003624357083354516u, 3123159789995197369u, 2495413u}, + {12155865548917372879u, 6461970972225243320u, 5938648447749380419u, 4225372702292187851u, 634946u}, + {14627070795130179936u, 7252134727770255195u, 4658920517433504071u, 11973273300884035663u, 3374826u}, + {13628368851157465149u, 13133936704091195752u, 2325294718116715643u, 14473773371074161412u, 2831039u}, + {15503375257256863056u, 8085949850240733701u, 6854264740573968949u, 11941726482627573426u, 2817659u}, + {8188583589033060427u, 1361865366292231261u, 2294043925156091852u, 16336992898973424400u, 893400u}, + {10597228229619409786u, 6358826071775568381u, 7141819301778545477u, 7294297335323166548u, 3257270u}, + {5547618870474043202u, 5135060091358273536u, 9507726168922610118u, 852719567780476542u, 828508u}, + {8065443058436274803u, 16339934760464889134u, 17907093255310619495u, 1096147186460659560u, 2291724u}, + {8176244794291896867u, 3048483098072727993u, 17123845875399340475u, 14021448090569744718u, 543330u}, + {12876909845014501173u, 1735713975734845849u, 4598146088507642821u, 15790635777785234685u, 1633697u}, + {118104498598840080u, 17333973993796927784u, 2428311630246728480u, 6947665433884704707u, 1900178u}, + {4323369754353373467u, 5338933425602339054u, 4709312739087916648u, 10483403239707709422u, 3692445u}, + {13537168488641481485u, 12471705691928289925u, 451032895446799226u, 7057700220083661497u, 2371958u}, + {6002923624250571460u, 2746336992385670685u, 13201331692295951030u, 14167043340671163636u, 609633u}, + {3784835605984036312u, 16136150182092987056u, 13862369653676243112u, 8874329824762067243u, 410358u}, + {18066162364533913748u, 3029306766620374576u, 17415677550011606712u, 7069213993595866856u, 1097953u}, + {8190822786518722915u, 12543704364756019774u, 16995149582333519763u, 18394940144736799296u, 1691877u}, + {1761434405266367282u, 14232124436926650986u, 14687713216733187107u, 3634089342314532439u, 3837143u}, + {6817606890571487100u, 5920828198226402271u, 6105974258240070194u, 70782798529315432u, 2663616u}, + {2481395200697804754u, 13189296617656944526u, 10450428945964499474u, 18279706334329188547u, 1771129u}, + {15590607500757732293u, 828171200064505364u, 14264553810914956959u, 14804478359439458338u, 2484747u}, + {7277582702878104779u, 16937667574304206711u, 12703525380225896034u, 13808835968045631722u, 2722573u}, + {13892359091442190027u, 1480444827632289093u, 2166748853110786463u, 13020589547988856083u, 1051770u}, + {7551655588636621580u, 10292244845833209592u, 1697403038891068659u, 15511784463189501283u, 1767376u}, + {10791188124412235279u, 17857397229498474650u, 12661492782633087341u, 16461733788913370363u, 1707828u}, + {16450734839251848410u, 13663900271846296119u, 564846897810293547u, 4210844336699469313u, 3681653u}, + {7907471480325359454u, 3753361299291103805u, 9872154375115412987u, 7417789106738698800u, 474101u}, + {300683651856136027u, 3913935031453865841u, 16037525815726848891u, 6854217060833032798u, 800627u}, + {4693651857070078883u, 10369530434042557756u, 271093920347083597u, 3617648670118115718u, 2017039u}, + {13641383111401768668u, 7304590963036971413u, 7380555991646388214u, 4144490665999232062u, 3823633u}, + {13336971573890979413u, 12389572193095054190u, 17955562442172002639u, 9005675244230345003u, 3711509u}, + {11341856017747815551u, 387835261820989368u, 8099846303881918909u, 12390313846141621964u, 3483305u}, + {18301331648145312212u, 1936074575102879467u, 15373384514228795155u, 16997790247169051655u, 2179099u}, + {2029516907163144915u, 683964301970637040u, 7119071509489206322u, 12506161067123599585u, 2513185u}, + {13826441804515779773u, 4997832487569565345u, 11098604313006385668u, 2496318290300596630u, 984770u}, + {12613736646218997956u, 3367727401844399048u, 8217746872437900229u, 12412071977181390237u, 2496794u}, + {11800928367764271208u, 18113693370148514070u, 7358578530256879532u, 13809058193579081319u, 1305092u}, + {16828866456674192025u, 10593503749682317239u, 13220965786406254605u, 14363535925473363203u, 3303144u}, + {11553334383687896267u, 2056043059178894319u, 11740317882921768800u, 10581340995907623844u, 331254u}, + {584458663344563901u, 4975945168843770688u, 13256389387027387663u, 78168162380661515u, 187065u}, + {4059947150394150852u, 11449203091834694918u, 12058794426135873863u, 4182791194458136927u, 2389221u}, + {10559603526855016472u, 18098352807603875865u, 1469616381067963627u, 4151356212667215955u, 236331u}, + {12823293869238789030u, 6286739736000116973u, 13100450618939577636u, 436705105852607680u, 2676575u}, + {10801860475020974147u, 12459516010605212669u, 17878637495962680328u, 14100604931851741768u, 1680523u}, + {8777726989694478513u, 16278309102673005048u, 12213901683139363965u, 13721943058997895368u, 3681367u}, + {8748684341566976341u, 7486039341760765998u, 16635909123751073887u, 15992637530994416825u, 590912u}, + {1947344234373935851u, 5078406341405845589u, 10310450063395482287u, 13125382533329605741u, 744344u}, + {16836352559840832923u, 2820776625539281458u, 15083268901490098128u, 17811956463764383987u, 151091u}, + {8201070357450228388u, 10100876571712191499u, 11577122048721157536u, 11459944606851339137u, 1718679u}, + {6377178356912081458u, 747822750707716772u, 5777048037261410724u, 11777091871300057233u, 1512129u}, + {2929778087081465815u, 11986677255052765283u, 16152111101306266774u, 6224846955708328717u, 3820454u}, + {7679910882384619482u, 11856542754868763942u, 329871721887677386u, 15995203225790300763u, 149100u}, + {5287837521284090824u, 13437530621669801187u, 17270697048532243340u, 7640855393556954535u, 78528u}, + {2930978729223650513u, 18248232549850861281u, 4173682541468461363u, 7567495967541908937u, 3775933u}, + {16531753060490579882u, 7919962067683071080u, 16675241724593420094u, 1366690369940673143u, 1188531u}, + {14730923607457810789u, 8612421747118092965u, 597476019250454008u, 1895421973533486793u, 448938u}, + {7119981117797020034u, 12043791112687691960u, 4000556474356054777u, 6349349721624043360u, 2032818u}, + {13309596654504424665u, 17961364962417343468u, 16989031595565888472u, 11350541143698465776u, 1854853u}, + {5469982854613385407u, 17915080445693757493u, 11843883755537511397u, 538619168201389078u, 908824u}, + {638200479108354094u, 5265608153446028176u, 13636730886590099164u, 8015157782484665073u, 1867525u}, + {17713594611846903421u, 8400159008010795014u, 15981068766043842150u, 2700580743144745844u, 2064681u}, + {1513084128437356338u, 2960916229994356336u, 16322054379173739288u, 3929196722749539997u, 2025066u}, + {16146481427452167817u, 3727727932830965928u, 11111334567868588089u, 4288753926401315653u, 35u}, + {6160103518511760249u, 16016095876503856662u, 4346462672403414238u, 649924796506u, 0u}, + {6864734562942693081u, 13039411888425910343u, 17059484470789262465u, 649u, 0u}, + {8928938525597900095u, 5317481499710275300u, 11988996388308u, 0u, 0u}, + {15037435806188398586u, 18380120121029968917u, 11988u, 0u, 0u}, + {2485542442813773198u, 221157948075751u, 0u, 0u, 0u}, + {17488910743672524948u, 221157u, 0u, 0u, 0u}, + {4079644068020127u, 0u, 0u, 0u, 0u}, + {4079645u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 147226u}, + {3608671905748565305u, 12909419917425160249u, 8231254784835174914u, 17800941567711196154u, 2150496u}, + {1978559274599876581u, 15903711993555292776u, 11495968302988237082u, 18054068176626461663u, 2388704u}, + {7999530181960704365u, 2024115384506093850u, 7559610892195970625u, 2854309996889103981u, 1437562u}, + {6835989593787868508u, 5601615654644658892u, 6074589809295185829u, 4782319547661643823u, 2213702u}, + {9574705706052609434u, 6600686078378951544u, 9095835958323476573u, 5733385528028085473u, 2787829u}, + {11941776191703784409u, 4647103128013553741u, 11071129586785814521u, 16912903378692788177u, 3676869u}, + {15043836552693652361u, 3871414807642361236u, 619044721580574174u, 2661899663713865440u, 107457u}, + {13183381309357836439u, 15450118575021905850u, 34420739616871206u, 9729757429560099631u, 1522166u}, + {9140365723096672204u, 5037042089882057398u, 16698359585955700724u, 8602932706882883986u, 1186381u}, + {15068045337391559433u, 8077881549880647782u, 8091215716708669933u, 12199618267693665502u, 3722836u}, + {3163496314044384706u, 16237384572288732252u, 18328103441462334729u, 10084679786391993943u, 2987755u}, + {2885140947706126578u, 14737433998102632538u, 14396872535394278952u, 15475439486041204171u, 718652u}, + {11214479247218660510u, 3920792748674548581u, 13450366034757314737u, 4120539665159391354u, 909663u}, + {6791704627632271569u, 1884189716727619278u, 203961272348283004u, 1385874611395493301u, 1630673u}, + {16385671029082078775u, 16041238989746969375u, 1066422305325710504u, 894771737339918019u, 3281646u}, + {11290815226556878058u, 1225154985944012648u, 10373673274766095016u, 9716253285879627816u, 2698953u}, + {9371250150651554771u, 12935802156876629456u, 6314059743630226834u, 1851226755922422301u, 2900990u}, + {15719217653927168025u, 12745901239383269962u, 1197602126058345646u, 5241660592672428820u, 1258534u}, + {5732330938606289605u, 3152258407658584159u, 9332572409537137084u, 8742184738437002825u, 1760834u}, + {10595632104185435343u, 1168907234812453196u, 870881293249778282u, 12138157461268364271u, 2813429u}, + {7250047611939184608u, 14811496645919174996u, 6674318576908182145u, 9707616217953053475u, 152215u}, + {10742379441244141431u, 9880496449754051963u, 6498472781219694283u, 10162928640204634893u, 2417010u}, + {7329969809438989285u, 167827214637764864u, 10256814964272114706u, 188701163132381235u, 3886455u}, + {2233561294565240255u, 13810504442963703533u, 10295912141118409482u, 2233420262065528098u, 1824649u}, + {14041488874276509843u, 3923526444538878339u, 13136127202653493954u, 14012832078718789905u, 1791585u}, + {16800184815592906341u, 7971358205675837864u, 13848731994164089225u, 14012222167352148589u, 1813920u}, + {6624656877184799246u, 12643888507635179272u, 4048014573659695905u, 11634733572128803093u, 1991556u}, + {1336491259614996368u, 10664242230028473417u, 16730414534039667793u, 469083299702761887u, 3010033u}, + {816082944586477770u, 8435054737620409524u, 8893640469317607954u, 9423012533804135162u, 2583060u}, + {2536811372162760925u, 5177357389237617855u, 3714438646078572775u, 14242995081641852120u, 1586037u}, + {1556759971141805214u, 15691511949853392750u, 13987020713362343157u, 16530446267558926501u, 3708635u}, + {5783734547692654664u, 4892839003312083675u, 9524619574863306221u, 14696103846937619098u, 2369295u}, + {3788994793151146528u, 11129144076185800042u, 620729590297524571u, 14239051818668026911u, 310529u}, + {9963661610586253738u, 8564509154947657691u, 401987296957591554u, 8796754735856724964u, 3737896u}, + {2918336811250879972u, 2949080135078227781u, 73139495979838298u, 6482077889058483678u, 183720u}, + {18090456965420163391u, 425349934634598582u, 16258502710494222146u, 1012195358834290911u, 232403u}, + {6628505865413027189u, 4711170969849220084u, 13991932116175800169u, 652805426016509103u, 2205639u}, + {16575279466548853939u, 659674037977842318u, 13526475898447950326u, 3355336184549483143u, 1543919u}, + {2328620438181891467u, 14596825170009340917u, 14220710256759397702u, 13359135179035541921u, 3448670u}, + {2206648320063831965u, 786856176344099224u, 7509533777038230291u, 495962310471382714u, 742734u}, + {1102538431233806462u, 5145845048495974225u, 10723846034626259756u, 11542916070577274660u, 278390u}, + {9539960981155165225u, 16460881170036344093u, 12020874281914489102u, 8579989091139020456u, 268912u}, + {447628941040269919u, 7478344559354151232u, 1534441652352712484u, 6129856052646213034u, 927981u}, + {7503874578884495991u, 10013367952602204229u, 1187607472425406909u, 13852176289424284828u, 3373947u}, + {9209154271704070972u, 9489480884612478199u, 17901332513283722043u, 12456144525203041401u, 780857u}, + {11895777962165097122u, 14223802000816132704u, 10131990654681641066u, 2536420073020786904u, 1878819u}, + {13233853668209785u, 5276292596155962672u, 1446379845734991251u, 6087495994976189603u, 3844943u}, + {7737508642675688552u, 6019296318840221658u, 9136072655951628537u, 16428000532196138491u, 2029337u}, + {2690832062899254903u, 2434318408047112605u, 10033130301674234769u, 13296031979685050276u, 2278671u}, + {8279865001873003809u, 4020205210110449632u, 6925509320521427794u, 4221374528261036085u, 1860800u}, + {9107734866772801449u, 6360731659990210569u, 16751283264700773861u, 17904609026999861389u, 318976u}, + {13663629243532702817u, 1090526155454763099u, 17268487919776875575u, 5914606797652355356u, 3009815u}, + {7769305143065240432u, 3622415007875166181u, 13825214816125943920u, 14755270476666117855u, 1620704u}, + {5207268027770881277u, 17842292678292954031u, 14911896328270347858u, 12207630119072329025u, 1411939u}, + {9761432262567458372u, 10289140847016518410u, 12386480434161885466u, 12852297428339492117u, 249867u}, + {2925813184188004737u, 1667085583320646047u, 16106353811666910039u, 4904525640032862660u, 1528997u}, + {4072992081401878335u, 3459838687841782692u, 5996516537647379317u, 9251577058107771131u, 371078u}, + {15141227513667823356u, 3269622321106868698u, 1887713969258625277u, 13049269711013917467u, 2546086u}, + {13464155622332810186u, 16459350254422700136u, 8295361409789934307u, 2208694831018762648u, 2465103u}, + {8676500318231595833u, 6707115206359251908u, 15421830312941378118u, 15537855844519534707u, 2998242u}, + {17976773063206220420u, 13163135077063015173u, 18000218125352728232u, 1352344511065605765u, 2291697u}, + {8122220175322691109u, 15061310988555339640u, 6923766203407270433u, 1339311042088535317u, 1536305u}, + {10223004795680131328u, 13993751443559622125u, 14461402444493246551u, 5144429003186354850u, 3518993u}, + {3665254960681176789u, 3622349497943441653u, 6570684837632835257u, 857547502829811695u, 3118802u}, + {9599971119881734425u, 4080052499605650684u, 15290427346331105211u, 6110369642354067623u, 2647898u}, + {17566896298266688494u, 18113844302120850259u, 12155865548917372878u, 6461970972225243320u, 2514011u}, + {14609468677538404073u, 12309291235825760612u, 14627070795130179935u, 7252134727770255195u, 1054635u}, + {7865183516733478936u, 3020167637036845486u, 13628368851157465148u, 13133936704091195752u, 840219u}, + {1472489032988719286u, 4108998299700450535u, 15503375257256863055u, 8085949850240733701u, 3514369u}, + {8700936173158794149u, 6520649823314669103u, 8188583589033060426u, 1361865366292231261u, 962652u}, + {7720031154563546240u, 15050136128820441877u, 10597228229619409785u, 6358826071775568381u, 1028415u}, + {9387861901287747993u, 15882383261455431571u, 5547618870474043201u, 5135060091358273536u, 2977138u}, + {3132154792120878752u, 7942620237956447382u, 8065443058436274802u, 16339934760464889134u, 1196099u}, + {1563162744371412851u, 12564547604052634700u, 8176244794291896866u, 3048483098072727993u, 343243u}, + {13516292637654450702u, 8453688330665147053u, 12876909845014501172u, 1735713975734845849u, 2176613u}, + {9326459779612354683u, 13377978809906349480u, 118104498598840079u, 17333973993796927784u, 361660u}, + {16488216518816073472u, 17091203231980408481u, 4323369754353373466u, 5338933425602339054u, 311270u}, + {6278719791043006573u, 12523381121256564510u, 13537168488641481484u, 12471705691928289925u, 441726u}, + {18091126825398094986u, 283403613620766023u, 6002923624250571459u, 2746336992385670685u, 3648704u}, + {1471089322721093588u, 4584042521251925553u, 3784835605984036311u, 16136150182092987056u, 156548u}, + {9747456452118715099u, 14811493937662931447u, 18066162364533913747u, 3029306766620374576u, 308076u}, + {9973921197536422659u, 17940329663302449375u, 8190822786518722914u, 12543704364756019774u, 1993761u}, + {50750673822766843u, 17138938448031363827u, 1761434405266367281u, 14232124436926650986u, 656239u}, + {10730354499645283226u, 3105226058405713357u, 6817606890571487099u, 5920828198226402271u, 149452u}, + {5391335988779365896u, 10406346002334300537u, 2481395200697804753u, 13189296617656944526u, 1926500u}, + {7411260583830575758u, 2092649737162297639u, 15590607500757732292u, 828171200064505364u, 224049u}, + {11517545624731957608u, 610695328852707833u, 7277582702878104778u, 16937667574304206711u, 2130074u}, + {9309049814343816890u, 9502425121547024231u, 13892359091442190026u, 1480444827632289093u, 3256211u}, + {1705451508046681688u, 13887954656818273184u, 7551655588636621579u, 10292244845833209592u, 3207693u}, + {10636203149651253826u, 11378934213694627790u, 10791188124412235278u, 17857397229498474650u, 2440267u}, + {13069715013618686951u, 16968577521073943734u, 16450734839251848409u, 13663900271846296119u, 345123u}, + {11903096435035741023u, 10056349558313711173u, 7907471480325359453u, 3753361299291103805u, 1237343u}, + {2715409236043312216u, 12072651358829587618u, 300683651856136026u, 3913935031453865841u, 3539621u}, + {13068273872263878552u, 3449232318467055465u, 4693651857070078882u, 10369530434042557756u, 1451419u}, + {14969181178601297884u, 5837816049777642020u, 13641383111401768667u, 7304590963036971413u, 3671304u}, + {920522132824782035u, 608386519662864585u, 13336971573890979412u, 12389572193095054190u, 1493341u}, + {9068798523487084660u, 12487799143236481296u, 11341856017747815550u, 387835261820989368u, 3392313u}, + {9342876547286978753u, 4426701454154729157u, 18301331648145312211u, 1936074575102879467u, 1921529u}, + {17735143756490349587u, 14742953436586244054u, 2029516907163144914u, 683964301970637040u, 1401792u}, + {11152254926320155144u, 2175437566756836897u, 13826441804515779772u, 4997832487569565345u, 2877368u}, + {13866020871021907900u, 9940122124688605373u, 12613736646218997955u, 3367727401844399048u, 1476535u}, + {3090565689747655852u, 6981068533948447278u, 11800928367764271207u, 18113693370148514070u, 56238u}, + {15218544642393620968u, 14893363541738132243u, 16828866456674192024u, 10593503749682317239u, 2083317u}, + {14585638433325871470u, 4006260203472789219u, 11553334383687896266u, 2056043059178894319u, 215278u}, + {14569213156621829097u, 15742276853417566112u, 584458663344563900u, 4975945168843770688u, 3475043u}, + {628753006676978123u, 7214306091212325268u, 4059947150394150851u, 11449203091834694918u, 644921u}, + {15700619859170485796u, 524871027067947181u, 10559603526855016471u, 18098352807603875865u, 961093u}, + {6830443532542965188u, 7047499603374225671u, 12823293869238789029u, 6286739736000116973u, 3556716u}, + {6498765051588923094u, 11010970251307557333u, 10801860475020974146u, 12459516010605212669u, 3542654u}, + {7144042452238797858u, 13300867548419269996u, 8777726989694478512u, 16278309102673005048u, 3475255u}, + {15125661563793667249u, 14435635356218659667u, 8748684341566976340u, 7486039341760765998u, 1863459u}, + {15955796469897373711u, 7329175736140104224u, 1947344234373935850u, 5078406341405845589u, 570857u}, + {10202475053099194788u, 14434493607469269676u, 16836352559840832922u, 2820776625539281458u, 694616u}, + {5794535752182825195u, 14984104761943845309u, 8201070357450228387u, 10100876571712191499u, 1477052u}, + {4582979883623947580u, 13551872565024067039u, 6377178356912081457u, 747822750707716772u, 1361576u}, + {10084386346417375063u, 8050152947659456197u, 2929778087081465814u, 11986677255052765283u, 2119470u}, + {10316872696621591112u, 691042010191148514u, 7679910882384619481u, 11856542754868763942u, 1887494u}, + {3099458584815281947u, 15996666286869213943u, 5287837521284090823u, 13437530621669801187u, 957418u}, + {14449237071206744516u, 7276126794008146037u, 2930978729223650512u, 18248232549850861281u, 3560753u}, + {11916213971466310164u, 7297845114763020706u, 16531753060490579881u, 7919962067683071080u, 2036568u}, + {16261391703820168422u, 294560734166587691u, 14730923607457810788u, 8612421747118092965u, 551474u}, + {3044392421815375402u, 4727501540205492623u, 7119981117797020033u, 12043791112687691960u, 1031295u}, + {8359880521657890404u, 17685685153321283772u, 13309596654504424664u, 17961364962417343468u, 2428456u}, + {1226317049352321588u, 6833797207940863099u, 5469982854613385406u, 17915080445693757493u, 292939u}, + {18089990445570519515u, 18065879283848320202u, 638200479108354093u, 5265608153446028176u, 2248532u}, + {9034060831255307936u, 3915673798969283540u, 17713594611846903420u, 8400159008010795014u, 355340u}, + {8506813511220906041u, 13542143759577905732u, 1513084128437356337u, 2960916229994356336u, 2861786u}, + {8265502649454356106u, 5825771940857155537u, 16146481427452167816u, 3727727932830965928u, 1046797u}, + {15392174902863510188u, 17580003444026622898u, 6160103518511760248u, 16016095876503856662u, 3742934u}, + {7780475146392507215u, 813094569843304932u, 6864734562942693080u, 13039411888425910343u, 3104999u}, + {6979855492345257234u, 16456818381001823528u, 8928938525597900094u, 5317481499710275300u, 294558u}, + {6078796164426326198u, 6416540230586495733u, 15037435806188398585u, 18380120121029968917u, 11988u}, + {2384601259987984532u, 18344419714048063858u, 2485542442813773197u, 221157948075751u, 0u}, + {2045811545922764754u, 483983793065195436u, 17488910743672524947u, 221157u, 0u}, + {6462528650127521612u, 18064244545485438721u, 4079644068020126u, 0u, 0u}, + {14928255225593620651u, 1254749874247721533u, 4079644u, 0u, 0u}, + {4438770626287035262u, 75256150034594604u, 0u, 0u, 0u}, + {638157810758099376u, 75256150u, 0u, 0u, 0u}, + {1388230939660854884u, 0u, 0u, 0u, 0u}, + {1388230940u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 602306u}, + {5982983326005765525u, 6810861394117643027u, 3608671905748565304u, 12909419917425160249u, 2766954u}, + {14123299855951440409u, 4547172448550193767u, 1978559274599876580u, 15903711993555292776u, 352514u}, + {9703161663285788341u, 8430217017529777191u, 7999530181960704364u, 2024115384506093850u, 2882943u}, + {11018386767418054319u, 16887274268383602785u, 6835989593787868507u, 5601615654644658892u, 2355159u}, + {2310589607289919146u, 9218566363316199485u, 9574705706052609433u, 6600686078378951544u, 1919965u}, + {8121177549681461589u, 10913528722110162949u, 11941776191703784408u, 4647103128013553741u, 2838567u}, + {7335960313168748276u, 4080482814095837331u, 15043836552693652360u, 3871414807642361236u, 1615106u}, + {8245282932296636910u, 12637201614357816389u, 13183381309357836438u, 15450118575021905850u, 3527348u}, + {2259681977322646471u, 14168736167060821209u, 9140365723096672203u, 5037042089882057398u, 402836u}, + {17559009293263964464u, 8899015331470174486u, 15068045337391559432u, 8077881549880647782u, 1324131u}, + {11708158921999607424u, 15493787077679853079u, 3163496314044384705u, 16237384572288732252u, 2042897u}, + {15367336549878357286u, 16991885705748947491u, 2885140947706126577u, 14737433998102632538u, 1609100u}, + {13111112850911901926u, 17562362630920863408u, 11214479247218660509u, 3920792748674548581u, 579629u}, + {12273273188255860167u, 10620661802072808724u, 6791704627632271568u, 1884189716727619278u, 2409808u}, + {5847532069385770154u, 5207244031408198039u, 16385671029082078774u, 16041238989746969375u, 9534u}, + {6296008179628667158u, 6343102550587862941u, 11290815226556878057u, 1225154985944012648u, 2032490u}, + {14123557409705222395u, 10550111037552025746u, 9371250150651554770u, 12935802156876629456u, 3456690u}, + {12299481769845909045u, 11942353981597066470u, 15719217653927168024u, 12745901239383269962u, 2915520u}, + {16923482906579806101u, 12778497483718293955u, 5732330938606289604u, 3152258407658584159u, 866588u}, + {2692087797294558797u, 13391832171456561917u, 10595632104185435342u, 1168907234812453196u, 2151592u}, + {6237183538764011234u, 17609963435832093318u, 7250047611939184607u, 14811496645919174996u, 466535u}, + {16992361567149213439u, 4969610111314177361u, 10742379441244141430u, 9880496449754051963u, 1285431u}, + {15597359374087813755u, 17687866683964293308u, 7329969809438989284u, 167827214637764864u, 2575196u}, + {1180330651779615835u, 7136213056500462724u, 2233561294565240254u, 13810504442963703533u, 1757294u}, + {12871227853462258941u, 2447138545807120080u, 14041488874276509842u, 3923526444538878339u, 2440694u}, + {15981634840513729043u, 11672105926187292074u, 16800184815592906340u, 7971358205675837864u, 1832819u}, + {5272841728606438519u, 12925062251562937811u, 6624656877184799245u, 12643888507635179272u, 3890979u}, + {14867576688915314267u, 13373118779843831661u, 1336491259614996367u, 10664242230028473417u, 233983u}, + {8201803410644197661u, 1503363298712590004u, 816082944586477769u, 8435054737620409524u, 3321356u}, + {15073362684219220194u, 12011097295420755493u, 2536811372162760924u, 5177357389237617855u, 2982317u}, + {15204094046918140185u, 4672341802644917703u, 1556759971141805213u, 15691511949853392750u, 3522583u}, + {4507762224161798903u, 11110475085518993237u, 5783734547692654663u, 4892839003312083675u, 1749609u}, + {7740569423180647179u, 5413089459682361059u, 3788994793151146527u, 11129144076185800042u, 3345471u}, + {15686628951686341277u, 6512257293934985365u, 9963661610586253737u, 8564509154947657691u, 3619954u}, + {1807951327485173866u, 14446114151528328640u, 2918336811250879971u, 2949080135078227781u, 3527016u}, + {8328137676814059166u, 14244932972470129147u, 18090456965420163390u, 425349934634598582u, 1486840u}, + {11745252603429586881u, 5733449916627516144u, 6628505865413027188u, 4711170969849220084u, 604751u}, + {4193003083836754019u, 20483048991968118u, 16575279466548853938u, 659674037977842318u, 2232978u}, + {636619684097977784u, 14010962406760261861u, 2328620438181891466u, 14596825170009340917u, 3593058u}, + {12602668660371926399u, 4645550306954449273u, 2206648320063831964u, 786856176344099224u, 1613069u}, + {13341627309695540368u, 11114097122137818685u, 1102538431233806461u, 5145845048495974225u, 1721156u}, + {17992198548860432592u, 15378445436819900409u, 9539960981155165224u, 16460881170036344093u, 3058120u}, + {8008604538765826916u, 16476488527707852364u, 447628941040269918u, 7478344559354151232u, 3763264u}, + {15106152878421684472u, 9795464874892450433u, 7503874578884495990u, 10013367952602204229u, 2707039u}, + {4932523630826448552u, 1939100311707199290u, 9209154271704070971u, 9489480884612478199u, 1542601u}, + {11231644461135463995u, 6078711507277016763u, 11895777962165097121u, 14223802000816132704u, 872144u}, + {5971955338674568279u, 3151228685290455886u, 13233853668209784u, 5276292596155962672u, 2087957u}, + {2513013491043557659u, 2001898371445651790u, 7737508642675688551u, 6019296318840221658u, 3058415u}, + {13542383750315644386u, 6419284667374630009u, 2690832062899254902u, 2434318408047112605u, 3092011u}, + {7779515452682281323u, 3380413782567663498u, 8279865001873003808u, 4020205210110449632u, 1065954u}, + {1496846335138906199u, 15118548274154287291u, 9107734866772801448u, 6360731659990210569u, 523791u}, + {17196321548481452118u, 8001840612902437337u, 13663629243532702816u, 1090526155454763099u, 1059011u}, + {14708621955705866271u, 13052008829898198005u, 7769305143065240431u, 3622415007875166181u, 2388874u}, + {4624103292888530781u, 8044246410387655106u, 5207268027770881276u, 17842292678292954031u, 3087942u}, + {632285954050353260u, 5543411220938080455u, 9761432262567458371u, 10289140847016518410u, 529140u}, + {821846555281126719u, 8975019302629442456u, 2925813184188004736u, 1667085583320646047u, 58231u}, + {4074096983927694687u, 13321519598711040576u, 4072992081401878334u, 3459838687841782692u, 1465331u}, + {5708463902289305011u, 16460777618190788838u, 15141227513667823355u, 3269622321106868698u, 1638165u}, + {15555413329901452015u, 2828947732889566823u, 13464155622332810185u, 16459350254422700136u, 312193u}, + {1661585452033669070u, 2842882500411481576u, 8676500318231595832u, 6707115206359251908u, 2637482u}, + {13343858303322963814u, 18289447804392197231u, 17976773063206220419u, 13163135077063015173u, 69054u}, + {18442807680995288817u, 2117181000077869498u, 8122220175322691108u, 15061310988555339640u, 790285u}, + {12378341309932362470u, 5608812006302039709u, 10223004795680131327u, 13993751443559622125u, 1055459u}, + {16046405877915934794u, 9562305711225363916u, 3665254960681176788u, 3622349497943441653u, 2430089u}, + {4492849083884928763u, 6971718561529198220u, 9599971119881734424u, 4080052499605650684u, 1484717u}, + {11578536848060959021u, 991654909797855998u, 17566896298266688493u, 18113844302120850259u, 3225514u}, + {4209663850876019404u, 11814132775357823726u, 14609468677538404072u, 12309291235825760612u, 3567365u}, + {15783295992973962153u, 16101913956497181596u, 7865183516733478935u, 3020167637036845486u, 92994u}, + {1249375782015779178u, 17030469026942109711u, 1472489032988719285u, 4108998299700450535u, 1922635u}, + {8012420599969532444u, 4772918049593428264u, 8700936173158794148u, 6520649823314669103u, 3369514u}, + {6977811962268717143u, 17592050716380403536u, 7720031154563546239u, 15050136128820441877u, 1610721u}, + {9103038176855629368u, 10101238714516376582u, 9387861901287747992u, 15882383261455431571u, 882805u}, + {12251632165076784248u, 7058292599993936006u, 3132154792120878751u, 7942620237956447382u, 1437990u}, + {4039373102567546469u, 545313487333489731u, 1563162744371412850u, 12564547604052634700u, 1244112u}, + {12642418556454936550u, 16694951273797814526u, 13516292637654450701u, 8453688330665147053u, 2565434u}, + {16247401029758085030u, 14326668468567725184u, 9326459779612354682u, 13377978809906349480u, 734733u}, + {3417276769628501049u, 2117974187663515600u, 16488216518816073471u, 17091203231980408481u, 3112600u}, + {5352187618663531028u, 15267897226536528663u, 6278719791043006572u, 12523381121256564510u, 3644590u}, + {6242529739898065410u, 9448012295594659148u, 18091126825398094985u, 283403613620766023u, 2407693u}, + {6367323975142156682u, 9606495443895457648u, 1471089322721093587u, 4584042521251925553u, 2151445u}, + {5715061936002816435u, 12172843262396096594u, 9747456452118715098u, 14811493937662931447u, 3797219u}, + {3285144096355241891u, 14232111579175170508u, 9973921197536422658u, 17940329663302449375u, 3322464u}, + {11208639783208178311u, 4294590966144498128u, 50750673822766842u, 17138938448031363827u, 365891u}, + {11810477138961489357u, 11296944163631032066u, 10730354499645283225u, 3105226058405713357u, 1629147u}, + {18226696011411240045u, 2330306520652125437u, 5391335988779365895u, 10406346002334300537u, 161519u}, + {12238725780582062679u, 14453860562372227013u, 7411260583830575757u, 2092649737162297639u, 1855860u}, + {11561003760520352926u, 14180796926854032567u, 11517545624731957607u, 610695328852707833u, 3408748u}, + {8137311413340135443u, 16181167055915861495u, 9309049814343816889u, 9502425121547024231u, 2867530u}, + {15538823972470627715u, 15448186456910633686u, 1705451508046681687u, 13887954656818273184u, 3572009u}, + {15137653616043326612u, 5867579754212318004u, 10636203149651253825u, 11378934213694627790u, 1899680u}, + {10320671531915677759u, 9278648541442709550u, 13069715013618686950u, 16968577521073943734u, 2187051u}, + {11718241609924054124u, 3772679223361930707u, 11903096435035741022u, 10056349558313711173u, 2115991u}, + {4254558595958370713u, 5942424658051020294u, 2715409236043312215u, 12072651358829587618u, 3389508u}, + {15444660257620615278u, 16318110658166320888u, 13068273872263878551u, 3449232318467055465u, 62392u}, + {10793624873410400685u, 8585534242523004356u, 14969181178601297883u, 5837816049777642020u, 1730699u}, + {17867676954836090432u, 6649865802039654597u, 920522132824782034u, 608386519662864585u, 1183698u}, + {17188246502634016382u, 12262393476607379960u, 9068798523487084659u, 12487799143236481296u, 1690716u}, + {13872678657482238654u, 11394581330688197410u, 9342876547286978752u, 4426701454154729157u, 2342107u}, + {14893810900620273898u, 1977938420320497162u, 17735143756490349586u, 14742953436586244054u, 743206u}, + {17668205489971947805u, 13647063340801696317u, 11152254926320155143u, 2175437566756836897u, 3698850u}, + {9450618177296539992u, 10679858617375152250u, 13866020871021907899u, 9940122124688605373u, 3444483u}, + {14740293107520082608u, 9609608406976718751u, 3090565689747655851u, 6981068533948447278u, 2683355u}, + {18249120706540540661u, 10973451162843731247u, 15218544642393620967u, 14893363541738132243u, 2336050u}, + {670364419321852658u, 11211275369456016629u, 14585638433325871469u, 4006260203472789219u, 1828038u}, + {1618359513802089893u, 7900790322636819416u, 14569213156621829096u, 15742276853417566112u, 463316u}, + {15350287634640521815u, 15443875795028368431u, 628753006676978122u, 7214306091212325268u, 1109565u}, + {1243938327065883824u, 4578257766598090935u, 15700619859170485795u, 524871027067947181u, 3139469u}, + {17701189675125161585u, 5593738196503052494u, 6830443532542965187u, 7047499603374225671u, 3155893u}, + {17875407660143553580u, 5648572546230184168u, 6498765051588923093u, 11010970251307557333u, 2291474u}, + {10317411699827702146u, 14935394631245024206u, 7144042452238797857u, 13300867548419269996u, 1307360u}, + {8129477430376576336u, 6825803585347391648u, 15125661563793667248u, 14435635356218659667u, 2784162u}, + {7012764410334781063u, 208429620540695219u, 15955796469897373710u, 7329175736140104224u, 1245466u}, + {3254563841644055693u, 12806803152215249511u, 10202475053099194787u, 14434493607469269676u, 3696196u}, + {2114498164371881514u, 2870545432269712576u, 5794535752182825194u, 14984104761943845309u, 273483u}, + {16121029348450440362u, 3899932900354692222u, 4582979883623947579u, 13551872565024067039u, 2805915u}, + {12134425249599239670u, 1591858887601879084u, 10084386346417375062u, 8050152947659456197u, 2305212u}, + {2392285570882166584u, 17466264320715590755u, 10316872696621591111u, 691042010191148514u, 3899767u}, + {9628236511150587970u, 5744694040465256781u, 3099458584815281946u, 15996666286869213943u, 3814623u}, + {2943929417814949883u, 14934205867812803636u, 14449237071206744515u, 7276126794008146037u, 1085726u}, + {426345652981058560u, 1390282471705572401u, 11916213971466310163u, 7297845114763020706u, 343169u}, + {12725692431359439098u, 14890490787799259245u, 16261391703820168421u, 294560734166587691u, 2372122u}, + {14142214600665009077u, 8676549849165768907u, 3044392421815375401u, 4727501540205492623u, 1711663u}, + {2788447830170198191u, 12295040802996876278u, 8359880521657890403u, 17685685153321283772u, 3273388u}, + {17954607191384781503u, 8053827869863500704u, 1226317049352321587u, 6833797207940863099u, 2790778u}, + {5190370137855134649u, 5779223605840681702u, 18089990445570519514u, 18065879283848320202u, 1331601u}, + {16572129388412227126u, 17120183409809588383u, 9034060831255307935u, 3915673798969283540u, 3652334u}, + {15314391890493587315u, 4509249033650229254u, 8506813511220906040u, 13542143759577905732u, 3315729u}, + {9905843844587470398u, 4795422529886555786u, 8265502649454356105u, 5825771940857155537u, 3795146u}, + {96036600352163122u, 9785010337028306211u, 15392174902863510187u, 17580003444026622898u, 1109194u}, + {6996918556908303360u, 12907921369061854643u, 7780475146392507214u, 813094569843304932u, 1500912u}, + {9789218742529290188u, 8609560293165338441u, 6979855492345257233u, 16456818381001823528u, 185092u}, + {17285709128999239637u, 6996710449255187460u, 6078796164426326197u, 6416540230586495733u, 2265485u}, + {13163294430616917800u, 1549100112699048988u, 2384601259987984531u, 18344419714048063858u, 2799313u}, + {18201379885664739085u, 7721969162344094104u, 2045811545922764753u, 483983793065195436u, 2702159u}, + {3131191530405611697u, 7233389553530919361u, 6462528650127521611u, 18064244545485438721u, 1613876u}, + {16300011779981120225u, 2099390801463173166u, 14928255225593620650u, 1254749874247721533u, 173394u}, + {15480777666396818457u, 16767530358844783545u, 4438770626287035261u, 75256150034594604u, 0u}, + {4517584488468434352u, 8487629661434224656u, 638157810758099375u, 75256150u, 0u}, + {11409662735262010773u, 11151753626802437991u, 1388230939660854883u, 0u, 0u}, + {18014701397982592973u, 12190620907714022735u, 1388230939u, 0u, 0u}, + {15913455661114028011u, 7161596785419565344u, 1u, 0u, 0u}, + {2381787532608848889u, 25608340859u, 0u, 0u, 0u}, + {11221908137935415480u, 25u, 0u, 0u, 0u}, + {472390509981u, 0u, 0u, 0u, 0u}, + {473u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2030036u}, + {7772429657359560186u, 16810377974264459374u, 5982983326005765524u, 6810861394117643027u, 408962u}, + {12149715968774266711u, 4025371548759000811u, 14123299855951440408u, 4547172448550193767u, 3877980u}, + {17205738843344879363u, 1873391564700514791u, 9703161663285788340u, 8430217017529777191u, 1398472u}, + {13906396040592771009u, 9058720606983884720u, 11018386767418054318u, 16887274268383602785u, 3645733u}, + {12745599562301282401u, 5036369293840803095u, 2310589607289919145u, 9218566363316199485u, 1779827u}, + {7883042084508529144u, 6292830358215926437u, 8121177549681461588u, 10913528722110162949u, 2453416u}, + {3007725488200319980u, 8213797751767338386u, 7335960313168748275u, 4080482814095837331u, 1470322u}, + {11948642985618242572u, 8436323317759914051u, 8245282932296636909u, 12637201614357816389u, 2463726u}, + {7372644803533277686u, 16242664178375022283u, 2259681977322646470u, 14168736167060821209u, 1947837u}, + {10654729792240739909u, 2831407107931592562u, 17559009293263964463u, 8899015331470174486u, 76130u}, + {2779903423954979635u, 10060469034169593430u, 11708158921999607423u, 15493787077679853079u, 3163219u}, + {1067775874641549243u, 16975984274882698488u, 15367336549878357285u, 16991885705748947491u, 2838835u}, + {15229523146319323098u, 18174590070440806094u, 13111112850911901925u, 17562362630920863408u, 1528479u}, + {11651593085772735360u, 4641656037423420187u, 12273273188255860166u, 10620661802072808724u, 1035264u}, + {9427303220764701643u, 12797290982386403155u, 5847532069385770153u, 5207244031408198039u, 110278u}, + {13683799836159668880u, 7917267767686211643u, 6296008179628667157u, 6343102550587862941u, 1610165u}, + {2821010612646505886u, 11082435890197928094u, 14123557409705222394u, 10550111037552025746u, 2865056u}, + {17781280551083101211u, 12809593712745750266u, 12299481769845909044u, 11942353981597066470u, 1317486u}, + {7558463861488035540u, 6126978696841712292u, 16923482906579806100u, 12778497483718293955u, 3316426u}, + {9879118157124063823u, 10316593169151234541u, 2692087797294558796u, 13391832171456561917u, 1513030u}, + {16967405763943821574u, 5261718815880295903u, 6237183538764011233u, 17609963435832093318u, 3778103u}, + {9632257546998895371u, 4063099943441280924u, 16992361567149213438u, 4969610111314177361u, 1829924u}, + {7670972500799438905u, 17299138150044596580u, 15597359374087813754u, 17687866683964293308u, 136134u}, + {11633320286937090244u, 14306383193456608099u, 1180330651779615834u, 7136213056500462724u, 3753396u}, + {14278827755088132162u, 2724259340617122236u, 12871227853462258940u, 2447138545807120080u, 3839880u}, + {13047349557557047590u, 6234510660920134483u, 15981634840513729042u, 11672105926187292074u, 1450278u}, + {294247477308232400u, 8456086991360502711u, 5272841728606438518u, 12925062251562937811u, 2301971u}, + {17036096301094592773u, 11115470633618595635u, 14867576688915314266u, 13373118779843831661u, 3372487u}, + {7665549294572815566u, 13990739621262123138u, 8201803410644197660u, 1503363298712590004u, 2685389u}, + {18330604598172134439u, 2240550920129491204u, 15073362684219220193u, 12011097295420755493u, 3288156u}, + {296267198153373825u, 6024005954033938768u, 15204094046918140184u, 4672341802644917703u, 737561u}, + {5415379962633041614u, 1448014961021700165u, 4507762224161798902u, 11110475085518993237u, 475417u}, + {12363496740780218833u, 17598139356084933464u, 7740569423180647178u, 5413089459682361059u, 1467675u}, + {9728846336125152120u, 705649258501342568u, 15686628951686341276u, 6512257293934985365u, 1875417u}, + {12393696924387679167u, 3368712453685751909u, 1807951327485173865u, 14446114151528328640u, 2688113u}, + {18128959019126170081u, 18038676881468660026u, 8328137676814059165u, 14244932972470129147u, 2217192u}, + {13942726737948465483u, 1681647063460342853u, 11745252603429586880u, 5733449916627516144u, 1110388u}, + {13430156556259263851u, 4668511436589026125u, 4193003083836754018u, 20483048991968118u, 1723294u}, + {6574021981731731943u, 3264866548779154314u, 636619684097977783u, 14010962406760261861u, 1835786u}, + {9412958713900764739u, 18255996903386030074u, 12602668660371926398u, 4645550306954449273u, 933912u}, + {15074492622291866502u, 5836502582619382190u, 13341627309695540367u, 11114097122137818685u, 1635947u}, + {17598067206048594775u, 10682401751489569385u, 17992198548860432591u, 15378445436819900409u, 2567232u}, + {8791641080397579180u, 1070894876478774454u, 8008604538765826915u, 16476488527707852364u, 3669464u}, + {11145685515303170433u, 15008763931782867811u, 15106152878421684471u, 9795464874892450433u, 3556338u}, + {12715677225105816128u, 17519653657147133005u, 4932523630826448551u, 1939100311707199290u, 1402611u}, + {8682497224854271895u, 13254221881931318491u, 11231644461135463994u, 6078711507277016763u, 2859699u}, + {2188669797602078096u, 9476364459606929468u, 5971955338674568278u, 3151228685290455886u, 3054378u}, + {16274739942571801217u, 2455896619511611009u, 2513013491043557658u, 2001898371445651790u, 333869u}, + {7114304170745640402u, 14793432119669662091u, 13542383750315644385u, 6419284667374630009u, 3565098u}, + {12164247224739509260u, 13448628610116547913u, 7779515452682281322u, 3380413782567663498u, 3171894u}, + {5029364164331082585u, 6279488519169202362u, 1496846335138906198u, 15118548274154287291u, 186898u}, + {5260285240324122636u, 18094816026639653034u, 17196321548481452117u, 8001840612902437337u, 519566u}, + {11372047205400759282u, 15530070448962834934u, 14708621955705866270u, 13052008829898198005u, 2485721u}, + {2747283751978851268u, 18266189682535906261u, 4624103292888530780u, 8044246410387655106u, 3633924u}, + {18406622057608379693u, 15652346813602360829u, 632285954050353259u, 5543411220938080455u, 2161771u}, + {1015837661929444958u, 1495424338851327511u, 821846555281126718u, 8975019302629442456u, 3411024u}, + {15081047793528546655u, 15281772700785526475u, 4074096983927694686u, 13321519598711040576u, 1715542u}, + {16198221366860162022u, 12686096233359487486u, 5708463902289305010u, 16460777618190788838u, 1013813u}, + {6881451307608311704u, 6784877507568952723u, 15555413329901452014u, 2828947732889566823u, 1769219u}, + {490311863369736797u, 93356137743334197u, 1661585452033669069u, 2842882500411481576u, 3191702u}, + {10271577813759167248u, 5150958079431336852u, 13343858303322963813u, 18289447804392197231u, 1491361u}, + {16745556789943808478u, 17985035448585013057u, 18442807680995288816u, 2117181000077869498u, 3273058u}, + {9434859713207531581u, 14573850763715077061u, 12378341309932362469u, 5608812006302039709u, 2748631u}, + {2367245681075786596u, 6862169422465782496u, 16046405877915934793u, 9562305711225363916u, 2937620u}, + {14818771268216933395u, 723071219865555399u, 4492849083884928762u, 6971718561529198220u, 2976470u}, + {12652626036174033749u, 7797302251667441384u, 11578536848060959020u, 991654909797855998u, 3726671u}, + {17132967121006535976u, 2436718312782364076u, 4209663850876019403u, 11814132775357823726u, 1792754u}, + {9270041652411441442u, 1163075388191730195u, 15783295992973962152u, 16101913956497181596u, 1348575u}, + {1004513823795312765u, 11538373634303213056u, 1249375782015779177u, 17030469026942109711u, 927905u}, + {6097113480168272935u, 2881415248733692706u, 8012420599969532443u, 4772918049593428264u, 541980u}, + {8248222880894537537u, 16892235975822027043u, 6977811962268717142u, 17592050716380403536u, 714247u}, + {3054158120114828416u, 12865588515043390517u, 9103038176855629367u, 10101238714516376582u, 3724558u}, + {5178387505386029401u, 3734032873839335475u, 12251632165076784247u, 7058292599993936006u, 2217753u}, + {14762118571412846203u, 10991461303503128708u, 4039373102567546468u, 545313487333489731u, 2691372u}, + {16272106202813382036u, 16985012942466847528u, 12642418556454936549u, 16694951273797814526u, 3212753u}, + {624113430884404333u, 5652247185934430005u, 16247401029758085029u, 14326668468567725184u, 1534360u}, + {13694887390455934806u, 8094625604751326817u, 3417276769628501048u, 2117974187663515600u, 3455617u}, + {9634196112061083134u, 7686001947102373671u, 5352187618663531027u, 15267897226536528663u, 459022u}, + {2654013193728301424u, 8936644469288518907u, 6242529739898065409u, 9448012295594659148u, 1237911u}, + {5913465279431734303u, 13694069470136237562u, 6367323975142156681u, 9606495443895457648u, 3641155u}, + {4154841818924337829u, 5980204393045362872u, 5715061936002816434u, 12172843262396096594u, 1993064u}, + {17438711122631948531u, 17800250669338863829u, 3285144096355241890u, 14232111579175170508u, 2341492u}, + {2362632232173779542u, 6654020442294884111u, 11208639783208178310u, 4294590966144498128u, 3033570u}, + {2907320481876007544u, 12287949522064275519u, 11810477138961489356u, 11296944163631032066u, 1326169u}, + {9559072068074727403u, 6603935792628518602u, 18226696011411240044u, 2330306520652125437u, 2295351u}, + {1390561215080136427u, 56028154805061224u, 12238725780582062678u, 14453860562372227013u, 3117541u}, + {10714210888249219074u, 16340409648365290776u, 11561003760520352925u, 14180796926854032567u, 2182823u}, + {9205673060713049036u, 3446801539927988826u, 8137311413340135442u, 16181167055915861495u, 1510365u}, + {1778577113122868433u, 15593084456730380055u, 15538823972470627714u, 15448186456910633686u, 1675885u}, + {3373644874316316741u, 219568843290838193u, 15137653616043326611u, 5867579754212318004u, 2996545u}, + {10615911456137205580u, 1565032743245811059u, 10320671531915677758u, 9278648541442709550u, 1392350u}, + {3529201332199831978u, 13974739717558888826u, 11718241609924054123u, 3772679223361930707u, 1826986u}, + {14358806170013007214u, 9796664593285023471u, 4254558595958370712u, 5942424658051020294u, 1794051u}, + {17461020606671913140u, 10066647833402572150u, 15444660257620615277u, 16318110658166320888u, 578993u}, + {6845521035912244658u, 9797325757578021485u, 10793624873410400684u, 8585534242523004356u, 1114947u}, + {18164244683511948771u, 8180629476409635883u, 17867676954836090431u, 6649865802039654597u, 683182u}, + {2501391113685462227u, 8452338264422706345u, 17188246502634016381u, 12262393476607379960u, 513991u}, + {15983693062507404594u, 10192059220681724999u, 13872678657482238653u, 11394581330688197410u, 1755506u}, + {3008158220023452037u, 12821039602958461121u, 14893810900620273897u, 1977938420320497162u, 1527536u}, + {1704862866142398022u, 9139256833607827595u, 17668205489971947804u, 13647063340801696317u, 831295u}, + {17597580143295186865u, 10751898700945147728u, 9450618177296539991u, 10679858617375152250u, 1406665u}, + {827355378769385012u, 12872695688906516132u, 14740293107520082607u, 9609608406976718751u, 1121979u}, + {13090025127289410428u, 14588158330007467535u, 18249120706540540660u, 10973451162843731247u, 2295705u}, + {18126719031689627733u, 3683488151163898538u, 670364419321852657u, 11211275369456016629u, 2521451u}, + {2814533577863520110u, 16521231923867160913u, 1618359513802089892u, 7900790322636819416u, 1276684u}, + {13827180283806299258u, 14749242773838985427u, 15350287634640521814u, 15443875795028368431u, 2094100u}, + {3401505594235253806u, 5717861828093731016u, 1243938327065883823u, 4578257766598090935u, 2455905u}, + {10371519970218710116u, 15973634535795827405u, 17701189675125161584u, 5593738196503052494u, 1522231u}, + {8199750947615523723u, 8643595018662391647u, 17875407660143553579u, 5648572546230184168u, 1055615u}, + {14804710409399950219u, 1138062790026277466u, 10317411699827702145u, 14935394631245024206u, 2840053u}, + {1439237307995858816u, 7459239970617210744u, 8129477430376576335u, 6825803585347391648u, 3486492u}, + {5754248275723534673u, 12830298131756701137u, 7012764410334781062u, 208429620540695219u, 2851940u}, + {8371952110583069936u, 13272978508169366764u, 3254563841644055692u, 12806803152215249511u, 3268829u}, + {4166784427963584961u, 16654098573697520163u, 2114498164371881513u, 2870545432269712576u, 478286u}, + {17573144703113357217u, 5767351400635577380u, 16121029348450440361u, 3899932900354692222u, 357343u}, + {17174680895874886642u, 13641229285076637546u, 12134425249599239669u, 1591858887601879084u, 1535586u}, + {10374375281720078624u, 828491786481695030u, 2392285570882166583u, 17466264320715590755u, 2826737u}, + {13084880450594737180u, 4308711806202094481u, 9628236511150587969u, 5744694040465256781u, 991172u}, + {5870485077147133106u, 11978623797532698296u, 2943929417814949882u, 14934205867812803636u, 1148613u}, + {16223447888912951550u, 16501280099792868971u, 426345652981058559u, 1390282471705572401u, 2527623u}, + {14707632950996224748u, 4808285216713511564u, 12725692431359439097u, 14890490787799259245u, 1606709u}, + {6400509233474005608u, 9451877781908948901u, 14142214600665009076u, 8676549849165768907u, 2452997u}, + {16154987392052677059u, 16719140461314746008u, 2788447830170198190u, 12295040802996876278u, 3005133u}, + {16352245132355430210u, 14288240820080117066u, 17954607191384781502u, 8053827869863500704u, 792339u}, + {11464523548439324360u, 4094342483482425921u, 5190370137855134648u, 5779223605840681702u, 2305752u}, + {6887516057370471448u, 2803167085961293357u, 16572129388412227125u, 17120183409809588383u, 2259379u}, + {15525602341192977333u, 12838009271951808466u, 15314391890493587314u, 4509249033650229254u, 2147876u}, + {11211019978836467299u, 7176322729627275675u, 9905843844587470397u, 4795422529886555786u, 3102723u}, + {5816026929460260623u, 10538906412247898449u, 96036600352163121u, 9785010337028306211u, 521069u}, + {284283239904566673u, 5261316916889475237u, 6996918556908303359u, 12907921369061854643u, 1881448u}, + {12261495390506568850u, 13162208182067745200u, 9789218742529290187u, 8609560293165338441u, 386183u}, + {6892320752469113902u, 13511747353066990032u, 17285709128999239636u, 6996710449255187460u, 1945635u}, + {4796015631985085415u, 13306919595609237875u, 13163294430616917799u, 1549100112699048988u, 640037u}, + {4539277738133890308u, 8691114843300476566u, 18201379885664739084u, 7721969162344094104u, 1497833u}, + {14027754629983306945u, 12613625278089698009u, 3131191530405611696u, 7233389553530919361u, 526953u}, + {8512881849378807702u, 5538130217827061457u, 16300011779981120224u, 2099390801463173166u, 2719642u}, + {3892933897700813984u, 10051173962345247255u, 15480777666396818456u, 16767530358844783545u, 3084075u}, + {9734252238239110230u, 12321325182620503583u, 4517584488468434351u, 8487629661434224656u, 2975275u}, + {17265605240063445957u, 3320946078815338772u, 11409662735262010772u, 11151753626802437991u, 698633u}, + {14042443526761112331u, 7194117224206963811u, 18014701397982592972u, 12190620907714022735u, 1512189u}, + {4666068269930980128u, 6936343164263880631u, 15913455661114028010u, 7161596785419565344u, 1u}, + {15947921396818761219u, 13559009362450750708u, 2381787532608848888u, 25608340859u, 0u}, + {16005030111229345462u, 3525671458430705192u, 11221908137935415479u, 25u, 0u}, + {7228461016072598814u, 12436903306429060496u, 472390509980u, 0u, 0u}, + {14797759988856335781u, 7203637671726338833u, 472u, 0u, 0u}, + {11708177716470569230u, 8714066840462u, 0u, 0u, 0u}, + {1232988907990686201u, 8714u, 0u, 0u, 0u}, + {160746160847214u, 0u, 0u, 0u, 0u}, + {160747u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1136166u}, + {6991255793763263475u, 13597421490314438860u, 7772429657359560185u, 16810377974264459374u, 3372078u}, + {10351468879509172097u, 9181574255585109552u, 12149715968774266710u, 4025371548759000811u, 3900510u}, + {16603558107575884811u, 4258796972680311085u, 17205738843344879362u, 1873391564700514791u, 2792978u}, + {11351205107612119191u, 494143747553281925u, 13906396040592771008u, 9058720606983884720u, 3490876u}, + {13379793695719558172u, 10351463929284648295u, 12745599562301282400u, 5036369293840803095u, 1291267u}, + {4795088117733788169u, 3661469744265942943u, 7883042084508529143u, 6292830358215926437u, 3864618u}, + {3328973799162074926u, 11799739189455292619u, 3007725488200319979u, 8213797751767338386u, 302753u}, + {16756678970639286532u, 6057728567114739910u, 11948642985618242571u, 8436323317759914051u, 1610339u}, + {8555316686834661274u, 7272491816255995703u, 7372644803533277685u, 16242664178375022283u, 1147136u}, + {8592946579250884653u, 9015422433139917986u, 10654729792240739908u, 2831407107931592562u, 2410369u}, + {3032980649520379116u, 2590058718787602277u, 2779903423954979634u, 10060469034169593430u, 2301201u}, + {4399788216945434713u, 4523532167035681206u, 1067775874641549242u, 16975984274882698488u, 871501u}, + {2568002643259308352u, 5438493183782342439u, 15229523146319323097u, 18174590070440806094u, 1624677u}, + {16206657197985976840u, 2644722855814756153u, 11651593085772735359u, 4641656037423420187u, 2336284u}, + {15040129130334599221u, 15474550345536894440u, 9427303220764701642u, 12797290982386403155u, 3414695u}, + {12816766659349529172u, 11809532559250361547u, 13683799836159668879u, 7917267767686211643u, 3123803u}, + {4629500181123344394u, 11422613814186484771u, 2821010612646505885u, 11082435890197928094u, 3003216u}, + {11036010560271486058u, 9814558559673694339u, 17781280551083101210u, 12809593712745750266u, 112930u}, + {13251076115287297558u, 10617155381871241720u, 7558463861488035539u, 6126978696841712292u, 669886u}, + {5725680331497253562u, 10756544164429872627u, 9879118157124063822u, 10316593169151234541u, 82098u}, + {3614574629770159735u, 13092516960301564047u, 16967405763943821573u, 5261718815880295903u, 1511089u}, + {947139352769244693u, 6576013491884290030u, 9632257546998895370u, 4063099943441280924u, 288158u}, + {3336257141723492977u, 180899883902741728u, 7670972500799438904u, 17299138150044596580u, 2113086u}, + {9241599784519099422u, 1461450678118168594u, 11633320286937090243u, 14306383193456608099u, 3151144u}, + {663832842512944879u, 7038058044185046710u, 14278827755088132161u, 2724259340617122236u, 2036000u}, + {2729389514075423102u, 8040595166532218694u, 13047349557557047589u, 6234510660920134483u, 1374144u}, + {1591415186896130763u, 1291563201268490990u, 294247477308232399u, 8456086991360502711u, 1008370u}, + {6653639316353485790u, 15800560390068166640u, 17036096301094592772u, 11115470633618595635u, 627014u}, + {14946535192845270460u, 16551549879292393674u, 7665549294572815565u, 13990739621262123138u, 366758u}, + {8911194296960550255u, 7911554372078984923u, 18330604598172134438u, 2240550920129491204u, 2343267u}, + {469303385082766042u, 14425111372654830750u, 296267198153373824u, 6024005954033938768u, 372048u}, + {2954938739113855871u, 6799558424366005904u, 5415379962633041613u, 1448014961021700165u, 872046u}, + {892784932338523260u, 9290098141273334560u, 12363496740780218832u, 17598139356084933464u, 3097072u}, + {5883979503880998705u, 11148354132479794759u, 9728846336125152119u, 705649258501342568u, 2930768u}, + {3160152297541380879u, 17923229454096004521u, 12393696924387679166u, 3368712453685751909u, 1316133u}, + {15677102863998819801u, 773541319798099953u, 18128959019126170080u, 18038676881468660026u, 1318519u}, + {14840924216292581336u, 6084211384410290200u, 13942726737948465482u, 1681647063460342853u, 3080512u}, + {11736110643387115925u, 15078578941710327311u, 13430156556259263850u, 4668511436589026125u, 1207520u}, + {10490199080353141452u, 15063260184130076098u, 6574021981731731942u, 3264866548779154314u, 1378325u}, + {903793698482556430u, 7358305986458703786u, 9412958713900764738u, 18255996903386030074u, 3897438u}, + {407831428677391660u, 4661751411538945299u, 15074492622291866501u, 5836502582619382190u, 969159u}, + {8557518713666124663u, 3218422720049413908u, 17598067206048594774u, 10682401751489569385u, 3365827u}, + {17918212472072698242u, 3316448735060521847u, 8791641080397579179u, 1070894876478774454u, 1126723u}, + {16317804306616532535u, 8285088198083091339u, 11145685515303170432u, 15008763931782867811u, 523577u}, + {2481110318682527800u, 10368935512470589716u, 12715677225105816127u, 17519653657147133005u, 3669057u}, + {2982198417180587094u, 3516303589857447200u, 8682497224854271894u, 13254221881931318491u, 1995996u}, + {5934782724593123833u, 2717823851115535729u, 2188669797602078095u, 9476364459606929468u, 321922u}, + {2639337440059190634u, 10843675286127371908u, 16274739942571801216u, 2455896619511611009u, 1172312u}, + {18125616145751005172u, 5156751013456843379u, 7114304170745640401u, 14793432119669662091u, 2489117u}, + {9823790018087455732u, 14450327238945305031u, 12164247224739509259u, 13448628610116547913u, 568004u}, + {2180192781971738402u, 17154374255707127860u, 5029364164331082584u, 6279488519169202362u, 453192u}, + {974111830031303551u, 99006053781214854u, 5260285240324122635u, 18094816026639653034u, 2043055u}, + {10262620979211233468u, 9857269659963007758u, 11372047205400759281u, 15530070448962834934u, 1930876u}, + {1511464496856711007u, 15219081873687983581u, 2747283751978851267u, 18266189682535906261u, 859170u}, + {9198715917323135308u, 13513541706813401599u, 18406622057608379692u, 15652346813602360829u, 2942115u}, + {14869107551238377464u, 12696871749567961337u, 1015837661929444957u, 1495424338851327511u, 301558u}, + {3475732452631200958u, 7655420588891086721u, 15081047793528546654u, 15281772700785526475u, 214654u}, + {14492779836205758685u, 17293019737562549241u, 16198221366860162021u, 12686096233359487486u, 621446u}, + {9591060098943060575u, 7742555486219856557u, 6881451307608311703u, 6784877507568952723u, 1154596u}, + {5494977174543801240u, 9496639288953421314u, 490311863369736796u, 93356137743334197u, 1890247u}, + {13281098536214363868u, 8840026199471960688u, 10271577813759167247u, 5150958079431336852u, 2314475u}, + {13492464252182612918u, 6377882063943961171u, 16745556789943808477u, 17985035448585013057u, 987532u}, + {16233202442567387968u, 5807499548244168992u, 9434859713207531580u, 14573850763715077061u, 905199u}, + {7861253255064868144u, 11923457021544882474u, 2367245681075786595u, 6862169422465782496u, 135269u}, + {8387240054755346517u, 231355294513387107u, 14818771268216933394u, 723071219865555399u, 817602u}, + {16928542863013726989u, 9919860034586519792u, 12652626036174033748u, 7797302251667441384u, 3188514u}, + {17853279277221478117u, 13999726172802949031u, 17132967121006535975u, 2436718312782364076u, 550443u}, + {13916264606597888283u, 943694839527000598u, 9270041652411441441u, 1163075388191730195u, 496488u}, + {6949671054259747607u, 16215667360930519876u, 1004513823795312764u, 11538373634303213056u, 3858083u}, + {12865762900619298446u, 4265073705746412750u, 6097113480168272934u, 2881415248733692706u, 1667447u}, + {6510050462053888712u, 4531602471668991532u, 8248222880894537536u, 16892235975822027043u, 2132450u}, + {9406539283792630443u, 3140304060734294211u, 3054158120114828415u, 12865588515043390517u, 3203577u}, + {2236752491132841113u, 2265850452755451631u, 5178387505386029400u, 3734032873839335475u, 2098311u}, + {8494398901002223394u, 10825615941673980932u, 14762118571412846202u, 10991461303503128708u, 2790646u}, + {1213667157844805495u, 8431617611298761156u, 16272106202813382035u, 16985012942466847528u, 1721433u}, + {9432935388674104789u, 5215332317752921054u, 624113430884404332u, 5652247185934430005u, 1310533u}, + {12565782135443338789u, 8026334411141221808u, 13694887390455934805u, 8094625604751326817u, 2596500u}, + {10579138379080492840u, 11952108082383889317u, 9634196112061083133u, 7686001947102373671u, 81467u}, + {11648300835367283428u, 11762961518257806602u, 2654013193728301423u, 8936644469288518907u, 169493u}, + {3815459807782685772u, 16620828965360108385u, 5913465279431734302u, 13694069470136237562u, 3875029u}, + {6744584773680202515u, 6988857401613116871u, 4154841818924337828u, 5980204393045362872u, 109772u}, + {12867125358484752279u, 3067453960134726495u, 17438711122631948530u, 17800250669338863829u, 1340170u}, + {8018953120172616636u, 919269771467890674u, 2362632232173779541u, 6654020442294884111u, 2068578u}, + {9078314855365005005u, 18147583725912275628u, 2907320481876007543u, 12287949522064275519u, 2531326u}, + {1904458026595897534u, 16302621898603477879u, 9559072068074727402u, 6603935792628518602u, 3037292u}, + {10339061649698629506u, 5893834102016404639u, 1390561215080136426u, 56028154805061224u, 3002882u}, + {14711600692188140844u, 16633255774656932071u, 10714210888249219073u, 16340409648365290776u, 3257735u}, + {7483557330778939968u, 323283799764290020u, 9205673060713049035u, 3446801539927988826u, 1552802u}, + {12966323924518462741u, 2150734724138067630u, 1778577113122868432u, 15593084456730380055u, 184100u}, + {17120744566951410948u, 3160608168194429682u, 3373644874316316740u, 219568843290838193u, 2809345u}, + {10441477895778431109u, 3077709165419839055u, 10615911456137205579u, 1565032743245811059u, 3665908u}, + {6647213973754538061u, 14823231156688841710u, 3529201332199831977u, 13974739717558888826u, 3734501u}, + {1953179896653671647u, 5591544778197197377u, 14358806170013007213u, 9796664593285023471u, 2745322u}, + {15952004064397754391u, 4976842661818690597u, 17461020606671913139u, 10066647833402572150u, 3770343u}, + {6643907547963804383u, 17462738431885069759u, 6845521035912244657u, 9797325757578021485u, 2066562u}, + {1425955146039895087u, 5158607813994133908u, 18164244683511948770u, 8180629476409635883u, 1170925u}, + {3299581583889376472u, 4893967287880447984u, 2501391113685462226u, 8452338264422706345u, 1731387u}, + {18042027529546333687u, 3723202616401342706u, 15983693062507404593u, 10192059220681724999u, 3623699u}, + {13842913471714027865u, 5540455992876196169u, 3008158220023452036u, 12821039602958461121u, 3252605u}, + {357545893972740301u, 13374192944813381584u, 1704862866142398021u, 9139256833607827595u, 830346u}, + {2328050233104839532u, 13534105286711656688u, 17597580143295186864u, 10751898700945147728u, 2517731u}, + {9868267555668565352u, 15746909024849760401u, 827355378769385011u, 12872695688906516132u, 1763147u}, + {12751128877565527986u, 16308145810609163650u, 13090025127289410427u, 14588158330007467535u, 463542u}, + {16347177623887082945u, 1677438806004276422u, 18126719031689627732u, 3683488151163898538u, 1086527u}, + {7192290603741528490u, 12474028723641485697u, 2814533577863520109u, 16521231923867160913u, 2683052u}, + {16373141170804317907u, 5499882535610850707u, 13827180283806299257u, 14749242773838985427u, 1372160u}, + {897011519099126245u, 6752693521337570192u, 3401505594235253805u, 5717861828093731016u, 2651213u}, + {2909627374884012727u, 5649717315432865761u, 10371519970218710115u, 15973634535795827405u, 3726474u}, + {16528688244621846128u, 9423200806454785457u, 8199750947615523722u, 8643595018662391647u, 3100757u}, + {14281294274133595824u, 4038867880312424352u, 14804710409399950218u, 1138062790026277466u, 2022459u}, + {2709059334155761090u, 695914086437635319u, 1439237307995858815u, 7459239970617210744u, 219355u}, + {14980890534190775663u, 15450107374672752387u, 5754248275723534672u, 12830298131756701137u, 779606u}, + {1748876551220584295u, 10538410922529119182u, 8371952110583069935u, 13272978508169366764u, 476742u}, + {4923387258724113137u, 6307253762228737122u, 4166784427963584960u, 16654098573697520163u, 148745u}, + {6979055011475834794u, 7855381572713281418u, 17573144703113357216u, 5767351400635577380u, 1211271u}, + {8704254286755618633u, 8188950062849579129u, 17174680895874886641u, 13641229285076637546u, 1943879u}, + {8829193624923450858u, 11111189715901017005u, 10374375281720078623u, 828491786481695030u, 3106985u}, + {16457521228413874992u, 2699999452441527042u, 13084880450594737179u, 4308711806202094481u, 924997u}, + {13283388894921099700u, 8580209834482433920u, 5870485077147133105u, 11978623797532698296u, 4936u}, + {15436516434969272432u, 14870404762556622783u, 16223447888912951549u, 16501280099792868971u, 2845163u}, + {17028739016830503413u, 6881484344399131112u, 14707632950996224747u, 4808285216713511564u, 668571u}, + {5660218595941472262u, 3107567050651677438u, 6400509233474005607u, 9451877781908948901u, 96420u}, + {9072671846420170139u, 18235845089706799903u, 16154987392052677058u, 16719140461314746008u, 1129586u}, + {12854324648591258230u, 10410663570149091657u, 16352245132355430209u, 14288240820080117066u, 3204750u}, + {8227681312874284623u, 12332107101976891613u, 11464523548439324359u, 4094342483482425921u, 3522492u}, + {8063322072929486195u, 18321878942403690227u, 6887516057370471447u, 2803167085961293357u, 637377u}, + {8386077338231705348u, 10940344652392962661u, 15525602341192977332u, 12838009271951808466u, 2310484u}, + {2913097528527992566u, 11869798989942168645u, 11211019978836467298u, 7176322729627275675u, 1002761u}, + {14028027031426863205u, 3653158417667915575u, 5816026929460260622u, 10538906412247898449u, 60311u}, + {13703774934474097226u, 2826539663663821504u, 284283239904566672u, 5261316916889475237u, 2587235u}, + {7846527142954422006u, 5096168060978878258u, 12261495390506568849u, 13162208182067745200u, 2004541u}, + {11919551442035136136u, 55962722696064044u, 6892320752469113901u, 13511747353066990032u, 2619556u}, + {13331071399523915817u, 15853854028585693036u, 4796015631985085414u, 13306919595609237875u, 2396279u}, + {9581829992682910458u, 12900059723294620724u, 4539277738133890307u, 8691114843300476566u, 192246u}, + {4061075583619999142u, 12707798548679332691u, 14027754629983306944u, 12613625278089698009u, 3347640u}, + {12246991494181454469u, 11433353380357255945u, 8512881849378807701u, 5538130217827061457u, 1906482u}, + {986790600894612092u, 692306408753393221u, 3892933897700813983u, 10051173962345247255u, 3877876u}, + {1495697520465502937u, 3205592525961357996u, 9734252238239110229u, 12321325182620503583u, 341347u}, + {3202277665301447576u, 17827331722796310523u, 17265605240063445956u, 3320946078815338772u, 3275126u}, + {12159583588777743801u, 11742182060143991602u, 14042443526761112330u, 7194117224206963811u, 1019916u}, + {12829202012477440861u, 8578448087231856897u, 4666068269930980127u, 6936343164263880631u, 660370u}, + {15503241130181536275u, 16368322550597029127u, 15947921396818761218u, 13559009362450750708u, 3627032u}, + {202414939185691249u, 11565812258980899491u, 16005030111229345461u, 3525671458430705192u, 2330879u}, + {9099955995846676585u, 3373643076322632662u, 7228461016072598813u, 12436903306429060496u, 3791230u}, + {1427938966693862481u, 12718868245804108409u, 14797759988856335780u, 7203637671726338833u, 472u}, + {1477337919251945955u, 3151573480024094330u, 11708177716470569229u, 8714066840462u, 0u}, + {9844124640641622714u, 5476023359929506940u, 1232988907990686200u, 8714u, 0u}, + {5221050680701069529u, 432908638119696886u, 160746160847213u, 0u, 0u}, + {607692829235207369u, 2967107373613356587u, 160746u, 0u, 0u}, + {3641795378077100995u, 2965243289979889u, 0u, 0u, 0u}, + {5349184802547498974u, 2965243u, 0u, 0u, 0u}, + {54699084086543535u, 0u, 0u, 0u, 0u}, + {54699085u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2742696u}, + {7043107377745172179u, 8993255840511020866u, 6991255793763263474u, 13597421490314438860u, 1640387u}, + {16436155266857670583u, 1754925583102856362u, 10351468879509172096u, 9181574255585109552u, 401096u}, + {8996942438750306988u, 3873150403559846802u, 16603558107575884810u, 4258796972680311085u, 3350086u}, + {8037220170642121263u, 14095773013592263660u, 11351205107612119190u, 494143747553281925u, 2560234u}, + {5790159296879570868u, 12696906762070444545u, 13379793695719558171u, 10351463929284648295u, 3176172u}, + {2827526400588069182u, 2676241154464950609u, 4795088117733788168u, 3661469744265942943u, 2946393u}, + {16254703329605467463u, 10324868891600797167u, 3328973799162074925u, 11799739189455292619u, 265123u}, + {8452214015228699691u, 4653123263559679814u, 16756678970639286531u, 6057728567114739910u, 3617571u}, + {16452069717101024219u, 12628169996798248273u, 8555316686834661273u, 7272491816255995703u, 445779u}, + {13349078469985146776u, 2250715757281066270u, 8592946579250884652u, 9015422433139917986u, 3688614u}, + {632311271708197567u, 15794323860450647250u, 3032980649520379115u, 2590058718787602277u, 3033670u}, + {2432032057859399776u, 18054423661824888413u, 4399788216945434712u, 4523532167035681206u, 1852556u}, + {15359517592978683449u, 1210939189104233791u, 2568002643259308351u, 5438493183782342439u, 2745713u}, + {4806761071789402880u, 5508712501120500019u, 16206657197985976839u, 2644722855814756153u, 2939555u}, + {13071582205671129828u, 15119175889856205829u, 15040129130334599220u, 15474550345536894440u, 3477292u}, + {136646501853618629u, 7531278264895206606u, 12816766659349529171u, 11809532559250361547u, 2033635u}, + {3651280896322940930u, 5754677334635986040u, 4629500181123344393u, 11422613814186484771u, 798285u}, + {10931449488602813354u, 7894049655534759026u, 11036010560271486057u, 9814558559673694339u, 1338396u}, + {18164131443036008721u, 6250724560920720324u, 13251076115287297557u, 10617155381871241720u, 1082177u}, + {1370986903933236680u, 7539862946443546007u, 5725680331497253561u, 10756544164429872627u, 2715516u}, + {3991134431659037035u, 2940781589530862225u, 3614574629770159734u, 13092516960301564047u, 1017655u}, + {3929039926715467156u, 16155019578161358038u, 947139352769244692u, 6576013491884290030u, 1994102u}, + {3263291417456716894u, 10501098398848233896u, 3336257141723492976u, 180899883902741728u, 1100400u}, + {7070221586039622613u, 10011192346628904764u, 9241599784519099421u, 1461450678118168594u, 2627641u}, + {15032072819318620216u, 4993581979680585161u, 663832842512944878u, 7038058044185046710u, 2287787u}, + {8417598366710359881u, 14964295974633797711u, 2729389514075423101u, 8040595166532218694u, 3609531u}, + {521105162362079800u, 9841702135463100862u, 1591415186896130762u, 1291563201268490990u, 1081345u}, + {8961775328572208109u, 6437155936213275808u, 6653639316353485789u, 15800560390068166640u, 2730066u}, + {5169143091521803731u, 16594914641918162298u, 14946535192845270459u, 16551549879292393674u, 3104971u}, + {11595796766190748255u, 606813392085357226u, 8911194296960550254u, 7911554372078984923u, 736854u}, + {13385229822315463520u, 7360901059958546453u, 469303385082766041u, 14425111372654830750u, 1417300u}, + {2187627229223252777u, 891841810060229032u, 2954938739113855870u, 6799558424366005904u, 3617229u}, + {1374953159293508904u, 9580725278528082698u, 892784932338523259u, 9290098141273334560u, 2790988u}, + {7312655520063282555u, 928438418528350072u, 5883979503880998704u, 11148354132479794759u, 2870215u}, + {8666418354787074217u, 9628504743792316627u, 3160152297541380878u, 17923229454096004521u, 2871258u}, + {17292922727146463370u, 15660703954793317413u, 15677102863998819800u, 773541319798099953u, 1700760u}, + {1047346027859214849u, 12827873370789908222u, 14840924216292581335u, 6084211384410290200u, 1005152u}, + {8883342724776087755u, 239177674135748139u, 11736110643387115924u, 15078578941710327311u, 174720u}, + {9266634438297682523u, 12943947869138720808u, 10490199080353141451u, 15063260184130076098u, 457066u}, + {12526398963868966452u, 4231017452693019200u, 903793698482556429u, 7358305986458703786u, 2714050u}, + {13693381170364369733u, 7495491441376843122u, 407831428677391659u, 4661751411538945299u, 2596045u}, + {10430817150015989488u, 511645597291998321u, 8557518713666124662u, 3218422720049413908u, 97546u}, + {8814506919314336535u, 16511440186026808518u, 17918212472072698241u, 3316448735060521847u, 3823031u}, + {8922745125458644838u, 11542056376085197302u, 16317804306616532534u, 8285088198083091339u, 3507370u}, + {16817810803563800585u, 5423657802707955362u, 2481110318682527799u, 10368935512470589716u, 3119199u}, + {17542952247209412442u, 10120854084552250867u, 2982198417180587093u, 3516303589857447200u, 2802276u}, + {15392288876125847163u, 1869322016139152189u, 5934782724593123832u, 2717823851115535729u, 1899315u}, + {1458074293528026159u, 6499978418112737970u, 2639337440059190633u, 10843675286127371908u, 2204282u}, + {8550981170169900789u, 16569761178270908499u, 18125616145751005171u, 5156751013456843379u, 2103809u}, + {15958011253203159180u, 13916067667874639260u, 9823790018087455731u, 14450327238945305031u, 252991u}, + {15031470136184033644u, 570017742789658104u, 2180192781971738401u, 17154374255707127860u, 1460878u}, + {10841353831039574068u, 17870809589137824730u, 974111830031303550u, 99006053781214854u, 3113659u}, + {8416795873812202306u, 11881273351301826839u, 10262620979211233467u, 9857269659963007758u, 809331u}, + {8007136426616573992u, 8606629713247932408u, 1511464496856711006u, 15219081873687983581u, 2101813u}, + {2173072355389376997u, 6672143621283919841u, 9198715917323135307u, 13513541706813401599u, 798796u}, + {18376965816882675809u, 10861005120695226263u, 14869107551238377463u, 12696871749567961337u, 938681u}, + {609910602197384236u, 4242337774726254235u, 3475732452631200957u, 7655420588891086721u, 3862728u}, + {1434544460555451372u, 7635182288578404523u, 14492779836205758684u, 17293019737562549241u, 1756023u}, + {4724494703614717619u, 4104061660453435331u, 9591060098943060574u, 7742555486219856557u, 3095097u}, + {4538098622181177865u, 4121702093812562410u, 5494977174543801239u, 9496639288953421314u, 2656280u}, + {8348529632780488685u, 6413717884854845958u, 13281098536214363867u, 8840026199471960688u, 1995679u}, + {1138591012247762754u, 10026438115349843352u, 13492464252182612917u, 6377882063943961171u, 2325181u}, + {388790515211865237u, 3475159787065507282u, 16233202442567387967u, 5807499548244168992u, 1840650u}, + {17814144456235862808u, 15395015069471220089u, 7861253255064868143u, 11923457021544882474u, 823045u}, + {9789680475350681038u, 11426829120153738798u, 8387240054755346516u, 231355294513387107u, 2600440u}, + {16544528489084737694u, 17697844423610517371u, 16928542863013726988u, 9919860034586519792u, 1114176u}, + {17603374206661428364u, 193895884478918070u, 17853279277221478116u, 13999726172802949031u, 376549u}, + {10885950645190590203u, 18238435249468750516u, 13916264606597888282u, 943694839527000598u, 146839u}, + {12744867666262968505u, 17408971480387348158u, 6949671054259747606u, 16215667360930519876u, 741358u}, + {3084879977827871668u, 12991386455705669783u, 12865762900619298445u, 4265073705746412750u, 3471162u}, + {8287680408115736544u, 18425241030728864100u, 6510050462053888711u, 4531602471668991532u, 2267474u}, + {11931471617816256071u, 3279583319617657167u, 9406539283792630442u, 3140304060734294211u, 1738249u}, + {11090030529427742609u, 11479518819837204746u, 2236752491132841112u, 2265850452755451631u, 920316u}, + {12664088451831070578u, 241041845403250454u, 8494398901002223393u, 10825615941673980932u, 47656u}, + {6159963873176729293u, 6293229245814448884u, 1213667157844805494u, 8431617611298761156u, 1473731u}, + {12166832295159426398u, 16969084727663289484u, 9432935388674104788u, 5215332317752921054u, 1514710u}, + {9539211224306583165u, 15398342377533952243u, 12565782135443338788u, 8026334411141221808u, 3393827u}, + {9883010846379477597u, 5631101589382345812u, 10579138379080492839u, 11952108082383889317u, 952671u}, + {17741790764556284017u, 1825823445425460001u, 11648300835367283427u, 11762961518257806602u, 2579443u}, + {13284560614942187193u, 1744163026019802940u, 3815459807782685771u, 16620828965360108385u, 3866718u}, + {883834508656604967u, 6628050528082761876u, 6744584773680202514u, 6988857401613116871u, 2224512u}, + {11420479385844250010u, 16556423610584622318u, 12867125358484752278u, 3067453960134726495u, 2958714u}, + {8734644564188716545u, 13278810929649741434u, 8018953120172616635u, 919269771467890674u, 3313735u}, + {8785473974502178034u, 3870015852097007053u, 9078314855365005004u, 18147583725912275628u, 954403u}, + {3762563452693847518u, 14168217694104699766u, 1904458026595897533u, 16302621898603477879u, 3099136u}, + {15939882729123047475u, 11796729982601296329u, 10339061649698629505u, 5893834102016404639u, 3253102u}, + {8147450670599128866u, 644024565261029096u, 14711600692188140843u, 16633255774656932071u, 1900249u}, + {5522915781570748981u, 15116555635676311894u, 7483557330778939967u, 323283799764290020u, 3310313u}, + {10826654828663789436u, 17195280354078664956u, 12966323924518462740u, 2150734724138067630u, 3368162u}, + {3228903852602349840u, 2514599147493970599u, 17120744566951410947u, 3160608168194429682u, 2780448u}, + {15299828246491144383u, 355825649972576265u, 10441477895778431108u, 3077709165419839055u, 2787721u}, + {12005341925066223062u, 17006528623822976337u, 6647213973754538060u, 14823231156688841710u, 2336999u}, + {4160666107756327160u, 12132459823690661487u, 1953179896653671646u, 5591544778197197377u, 263931u}, + {10533948846762432386u, 18313492443605580154u, 15952004064397754390u, 4976842661818690597u, 1344447u}, + {1762441378474989000u, 1669319196904418691u, 6643907547963804382u, 17462738431885069759u, 2304939u}, + {61841807379093039u, 5168152530966077543u, 1425955146039895086u, 5158607813994133908u, 3583748u}, + {2831589511602915106u, 4624737131921178090u, 3299581583889376471u, 4893967287880447984u, 2616468u}, + {14028403142010274052u, 7975929844514091916u, 18042027529546333686u, 3723202616401342706u, 3473721u}, + {18326368826267294952u, 7850830209216651142u, 13842913471714027864u, 5540455992876196169u, 2360202u}, + {2253388271920431919u, 10622761972620812209u, 357545893972740300u, 13374192944813381584u, 3216567u}, + {7465606607195160046u, 17394755710812199500u, 2328050233104839531u, 13534105286711656688u, 2079148u}, + {6147228641698127995u, 7835564966065416070u, 9868267555668565351u, 15746909024849760401u, 1253855u}, + {6265274705263198826u, 3432685381881666794u, 12751128877565527985u, 16308145810609163650u, 1090389u}, + {9639742690086297511u, 2818344642048370779u, 16347177623887082944u, 1677438806004276422u, 437202u}, + {17853786536947960883u, 11305400850614449001u, 7192290603741528489u, 12474028723641485697u, 1274229u}, + {17025223992164528160u, 76226846205148250u, 16373141170804317906u, 5499882535610850707u, 2782999u}, + {10391767462179125444u, 14844961252185492579u, 897011519099126244u, 6752693521337570192u, 1584289u}, + {16670569428792051418u, 5636795582215684761u, 2909627374884012726u, 5649717315432865761u, 3020239u}, + {4028955917013410696u, 5760742677533171279u, 16528688244621846127u, 9423200806454785457u, 197466u}, + {1152542225130903351u, 3926668673321376333u, 14281294274133595823u, 4038867880312424352u, 2569328u}, + {13128671370043668038u, 3260835067460234549u, 2709059334155761089u, 695914086437635319u, 1614499u}, + {9448384345836655940u, 11038294376499610628u, 14980890534190775662u, 15450107374672752387u, 975900u}, + {11900590293658044323u, 2110186780683960578u, 1748876551220584294u, 10538410922529119182u, 2073161u}, + {17480373212548634470u, 16521177412165121730u, 4923387258724113136u, 6307253762228737122u, 59838u}, + {12844283190309179876u, 9509414940828428190u, 6979055011475834793u, 7855381572713281418u, 2517622u}, + {4360470854884776790u, 6323247125205135469u, 8704254286755618632u, 8188950062849579129u, 776301u}, + {12772973875324699610u, 18058354376814758077u, 8829193624923450857u, 11111189715901017005u, 1836013u}, + {2088649526183053449u, 1561440626611123132u, 16457521228413874991u, 2699999452441527042u, 290357u}, + {2883145156496457007u, 2700689203546182101u, 13283388894921099699u, 8580209834482433920u, 1438757u}, + {4546079751737271345u, 1477853728382485258u, 15436516434969272431u, 14870404762556622783u, 1952263u}, + {17780253069163264728u, 17544046880109533364u, 17028739016830503412u, 6881484344399131112u, 492797u}, + {13349472253959071606u, 11932513204030000478u, 5660218595941472261u, 3107567050651677438u, 285893u}, + {13381823595882440391u, 8539039846888920483u, 9072671846420170138u, 18235845089706799903u, 1863202u}, + {7063355183058341959u, 16670424048149278897u, 12854324648591258229u, 10410663570149091657u, 556115u}, + {924340398028029106u, 12203985542420607580u, 8227681312874284622u, 12332107101976891613u, 1043547u}, + {196593814706658510u, 5452039668653788866u, 8063322072929486194u, 18321878942403690227u, 3233521u}, + {16358677754309956185u, 13579747780949921849u, 8386077338231705347u, 10940344652392962661u, 2838092u}, + {1551213454849076755u, 2942209115307635147u, 2913097528527992565u, 11869798989942168645u, 2725614u}, + {8206688058265064569u, 584888500763844212u, 14028027031426863204u, 3653158417667915575u, 883272u}, + {11132329444819553189u, 12706973911563834430u, 13703774934474097225u, 2826539663663821504u, 2826324u}, + {8152061853747912980u, 15643123675813963241u, 7846527142954422005u, 5096168060978878258u, 3033745u}, + {17677007365611713344u, 8285717650211049397u, 11919551442035136135u, 55962722696064044u, 64149u}, + {4769352663545400021u, 5377635109895839045u, 13331071399523915816u, 15853854028585693036u, 94888u}, + {11084533503212122651u, 13766785185103473874u, 9581829992682910457u, 12900059723294620724u, 1391139u}, + {711400061346203816u, 7764028452026111756u, 4061075583619999141u, 12707798548679332691u, 2615828u}, + {16648179074749664617u, 6589239064186888321u, 12246991494181454468u, 11433353380357255945u, 2373755u}, + {355266026784447993u, 1227609942980318285u, 986790600894612091u, 692306408753393221u, 1900519u}, + {9261005996111323714u, 14881964112229907803u, 1495697520465502936u, 3205592525961357996u, 1577839u}, + {6625448806815448851u, 1426819808512918638u, 3202277665301447575u, 17827331722796310523u, 3732464u}, + {17289341308190327186u, 6231500649051955542u, 12159583588777743800u, 11742182060143991602u, 194852u}, + {5662048181172793214u, 3798131927107222812u, 12829202012477440860u, 8578448087231856897u, 609793u}, + {277718172661963211u, 7248187287895338970u, 15503241130181536274u, 16368322550597029127u, 1983938u}, + {15635480826826832235u, 17396187875754019477u, 202414939185691248u, 11565812258980899491u, 3198057u}, + {4222242302335200378u, 3369476682089776166u, 9099955995846676584u, 3373643076322632662u, 1991229u}, + {11140006569890215727u, 8715677060478803468u, 1427938966693862480u, 12718868245804108409u, 2878390u}, + {12525746762658868509u, 16820428654595208936u, 1477337919251945954u, 3151573480024094330u, 3887071u}, + {14912028719253096819u, 9451532636892729159u, 9844124640641622713u, 5476023359929506940u, 30524u}, + {17991580104889018815u, 16386624562389820903u, 5221050680701069528u, 432908638119696886u, 690963u}, + {2166810193822886273u, 5253806718269208091u, 607692829235207368u, 2967107373613356587u, 160746u}, + {16328243746058300261u, 11879853271432541659u, 3641795378077100994u, 2965243289979889u, 0u}, + {1104154730624396245u, 17054967092059930480u, 5349184802547498973u, 2965243u, 0u}, + {13887532697596060761u, 9407501199807270656u, 54699084086543534u, 0u, 0u}, + {3898195486334353081u, 1596446432339882286u, 54699084u, 0u, 0u}, + {14495488943909630777u, 1009020005210787387u, 0u, 0u, 0u}, + {3888340996450460726u, 1009020005u, 0u, 0u, 0u}, + {166389727666921521u, 1u, 0u, 0u, 0u}, + {18613133802u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3150376u}, + {11054191020964991431u, 17227551829361163832u, 7043107377745172178u, 8993255840511020866u, 1384706u}, + {3499586284066135649u, 693294514393899922u, 16436155266857670582u, 1754925583102856362u, 2932654u}, + {15514624698853527079u, 2396892412412515923u, 8996942438750306987u, 3873150403559846802u, 2414636u}, + {9536348422101344362u, 15847764502453474171u, 8037220170642121262u, 14095773013592263660u, 800694u}, + {7872560272381714762u, 18386723660110270318u, 5790159296879570867u, 12696906762070444545u, 548073u}, + {4515731929693126529u, 10699662677617465670u, 2827526400588069181u, 2676241154464950609u, 1118514u}, + {14409589540925626143u, 15360598432875080858u, 16254703329605467462u, 10324868891600797167u, 2246317u}, + {5522007654622139130u, 14605152192559090393u, 8452214015228699690u, 4653123263559679814u, 980717u}, + {6785912418087631472u, 13456402971771388803u, 16452069717101024218u, 12628169996798248273u, 917795u}, + {13330076579929125710u, 14953722235606592093u, 13349078469985146775u, 2250715757281066270u, 743262u}, + {8085694289244476406u, 8300086076735077359u, 632311271708197566u, 15794323860450647250u, 2169767u}, + {2681331049265532371u, 1068146143208779393u, 2432032057859399775u, 18054423661824888413u, 3145144u}, + {3064043761590525680u, 17981791068048005233u, 15359517592978683448u, 1210939189104233791u, 1752903u}, + {4359039137956744542u, 18269590268470638941u, 4806761071789402879u, 5508712501120500019u, 3205917u}, + {8562327451755955125u, 3048670076200314621u, 13071582205671129827u, 15119175889856205829u, 2021412u}, + {14902593814438529505u, 2257795940118449402u, 136646501853618628u, 7531278264895206606u, 3367933u}, + {7397043927491898591u, 9378958740819033526u, 3651280896322940929u, 5754677334635986040u, 2156039u}, + {14709027423788072860u, 11395740927030724204u, 10931449488602813353u, 7894049655534759026u, 2914957u}, + {6984674821843530574u, 605915805213044952u, 18164131443036008720u, 6250724560920720324u, 2486789u}, + {11770851905153717792u, 11302450845089752533u, 1370986903933236679u, 7539862946443546007u, 3170089u}, + {10645611091427966463u, 12115334063702736571u, 3991134431659037034u, 2940781589530862225u, 765366u}, + {18097972434937483975u, 3880743573396340050u, 3929039926715467155u, 16155019578161358038u, 2859434u}, + {1458339136138375966u, 5339086649252128939u, 3263291417456716893u, 10501098398848233896u, 3645324u}, + {12868244037546112684u, 14150950676123806958u, 7070221586039622612u, 10011192346628904764u, 1171371u}, + {6305553694177993092u, 4931689302083536540u, 15032072819318620215u, 4993581979680585161u, 2622360u}, + {4220854046386518085u, 2315925100565613283u, 8417598366710359880u, 14964295974633797711u, 2269741u}, + {1347285904461502819u, 14865562393739268924u, 521105162362079799u, 9841702135463100862u, 1302672u}, + {12835379041492177409u, 16952248337579315703u, 8961775328572208108u, 6437155936213275808u, 1174625u}, + {50519723448421843u, 3206373153090267092u, 5169143091521803730u, 16594914641918162298u, 1645419u}, + {16829039954998540693u, 10029446093571389920u, 11595796766190748254u, 606813392085357226u, 597746u}, + {4747857243677405155u, 2975527085947689514u, 13385229822315463519u, 7360901059958546453u, 1471841u}, + {8140793912000432331u, 3141334106920550693u, 2187627229223252776u, 891841810060229032u, 3747158u}, + {10115767766525943043u, 16823624953260005784u, 1374953159293508903u, 9580725278528082698u, 3455747u}, + {15676866439035642535u, 8771177848167753888u, 7312655520063282554u, 928438418528350072u, 2431038u}, + {16114190785049803032u, 13026541587840765160u, 8666418354787074216u, 9628504743792316627u, 1312212u}, + {10929014825995898761u, 2761369134005708052u, 17292922727146463369u, 15660703954793317413u, 87908u}, + {645769829296871675u, 8747940876424215769u, 1047346027859214848u, 12827873370789908222u, 1247097u}, + {10549034037148693568u, 8727981634450242292u, 8883342724776087754u, 239177674135748139u, 2474070u}, + {5346601730328840159u, 1650546378596951440u, 9266634438297682522u, 12943947869138720808u, 2801415u}, + {17943724979998508222u, 16286971424626632389u, 12526398963868966451u, 4231017452693019200u, 81405u}, + {6893940917236593327u, 7407646693094730755u, 13693381170364369732u, 7495491441376843122u, 392613u}, + {16669594846911322650u, 6683797940949313188u, 10430817150015989487u, 511645597291998321u, 555716u}, + {18126750118032961653u, 17493208248944144411u, 8814506919314336534u, 16511440186026808518u, 696129u}, + {12644231221401972561u, 15798814440389979152u, 8922745125458644837u, 11542056376085197302u, 1048328u}, + {16700120469414555299u, 6471679300405496644u, 16817810803563800584u, 5423657802707955362u, 1777599u}, + {7358114105063709345u, 11856455127319415867u, 17542952247209412441u, 10120854084552250867u, 3679899u}, + {15279076180046265454u, 16516964831200997395u, 15392288876125847162u, 1869322016139152189u, 802036u}, + {12349073721068027468u, 17414814816892618567u, 1458074293528026158u, 6499978418112737970u, 3717303u}, + {10400527096840560965u, 1403960421322187729u, 8550981170169900788u, 16569761178270908499u, 485289u}, + {3608416041362045977u, 18313115049386820802u, 15958011253203159179u, 13916067667874639260u, 3556973u}, + {18263944849434433991u, 17717839944756197432u, 15031470136184033643u, 570017742789658104u, 28529u}, + {18071609776324965717u, 4968776835098756262u, 10841353831039574067u, 17870809589137824730u, 3460118u}, + {9022065356287651715u, 4105314689771724746u, 8416795873812202305u, 11881273351301826839u, 1722581u}, + {9414697727806124860u, 11712060376470758316u, 8007136426616573991u, 8606629713247932408u, 2322630u}, + {18359680985119562374u, 6378784481536081219u, 2173072355389376996u, 6672143621283919841u, 2838767u}, + {14632777984142728149u, 13202423358091240673u, 18376965816882675808u, 10861005120695226263u, 3415091u}, + {9056039145684484499u, 5708332275451921393u, 609910602197384235u, 4242337774726254235u, 3747811u}, + {8778472900492021703u, 11318937129645956925u, 1434544460555451371u, 7635182288578404523u, 3731628u}, + {11221387540320852617u, 17172828670494981965u, 4724494703614717618u, 4104061660453435331u, 781668u}, + {3436538356702165083u, 14566492172224426806u, 4538098622181177864u, 4121702093812562410u, 32093u}, + {1999540693370900644u, 9367069088702461004u, 8348529632780488684u, 6413717884854845958u, 565549u}, + {9022101458940478955u, 17177352714080447118u, 1138591012247762753u, 10026438115349843352u, 888789u}, + {6463175067909642455u, 16564924747800061330u, 388790515211865236u, 3475159787065507282u, 2534189u}, + {1167801429603127265u, 667811480491575665u, 17814144456235862807u, 15395015069471220089u, 2262147u}, + {4870107803936103823u, 2177318327367218146u, 9789680475350681037u, 11426829120153738798u, 2370818u}, + {9619289971879869586u, 8507077827759995720u, 16544528489084737693u, 17697844423610517371u, 2698616u}, + {5659677287273924284u, 7454798955865700u, 17603374206661428363u, 193895884478918070u, 426306u}, + {13001309574782922464u, 5801335340980582796u, 10885950645190590202u, 18238435249468750516u, 2335984u}, + {14266899815036899748u, 18244876968787193790u, 12744867666262968504u, 17408971480387348158u, 1139470u}, + {11127065377310426746u, 11700034718340996380u, 3084879977827871667u, 12991386455705669783u, 2740567u}, + {15844763170582622372u, 12603305268573325149u, 8287680408115736543u, 18425241030728864100u, 2005317u}, + {8733173237858937182u, 11205173926016050563u, 11931471617816256070u, 3279583319617657167u, 1212212u}, + {1308811018350451935u, 17350797452308354919u, 11090030529427742608u, 11479518819837204746u, 1348154u}, + {11812808041196070458u, 4098209256144225402u, 12664088451831070577u, 241041845403250454u, 1312891u}, + {2493468433668552143u, 483001010081714028u, 6159963873176729292u, 6293229245814448884u, 1927176u}, + {4702567594948801186u, 11976624074415677016u, 12166832295159426397u, 16969084727663289484u, 2714562u}, + {12713585007396602144u, 624511083050919160u, 9539211224306583164u, 15398342377533952243u, 575128u}, + {16009166974820979177u, 2072016140243558974u, 9883010846379477596u, 5631101589382345812u, 1321837u}, + {1403545146813952539u, 8877946794904780791u, 17741790764556284016u, 1825823445425460001u, 801267u}, + {5444765608602994805u, 5495476619426483621u, 13284560614942187192u, 1744163026019802940u, 3838589u}, + {5128384435124866471u, 1206671928132203666u, 883834508656604966u, 6628050528082761876u, 2994272u}, + {1706543163733554367u, 10484697937146273295u, 11420479385844250009u, 16556423610584622318u, 1095782u}, + {1315576022671461512u, 11372316071920046295u, 8734644564188716544u, 13278810929649741434u, 2762729u}, + {9158854310964879716u, 13525103181368089185u, 8785473974502178033u, 3870015852097007053u, 2435620u}, + {17157228146191298537u, 16753119017483607001u, 3762563452693847517u, 14168217694104699766u, 2783263u}, + {10638669291871500620u, 6929156045630604077u, 15939882729123047474u, 11796729982601296329u, 3662641u}, + {7166291148192979484u, 15408204402704198309u, 8147450670599128865u, 644024565261029096u, 3063873u}, + {1548127010225253362u, 15260568754234643695u, 5522915781570748980u, 15116555635676311894u, 2470515u}, + {13855616565718814470u, 14825454979210019206u, 10826654828663789435u, 17195280354078664956u, 3504192u}, + {12857235531142290243u, 13919578893184299232u, 3228903852602349839u, 2514599147493970599u, 3664347u}, + {2766829222508267434u, 13345242688383456935u, 15299828246491144382u, 355825649972576265u, 50764u}, + {17344046249133681773u, 9066408815557288363u, 12005341925066223061u, 17006528623822976337u, 1451964u}, + {1644515353365325234u, 5401819788281343413u, 4160666107756327159u, 12132459823690661487u, 588914u}, + {15375589428645850634u, 8255636202367354017u, 10533948846762432385u, 18313492443605580154u, 650224u}, + {3268230046566912138u, 3254510974518412233u, 1762441378474988999u, 1669319196904418691u, 2822360u}, + {11159602674292913644u, 9215989929832149325u, 61841807379093038u, 5168152530966077543u, 707502u}, + {7734297979569284151u, 6227536654453870292u, 2831589511602915105u, 4624737131921178090u, 2688523u}, + {18194422506240902339u, 2850539083192280678u, 14028403142010274051u, 7975929844514091916u, 3719358u}, + {14872273445792246307u, 3784820956116857244u, 18326368826267294951u, 7850830209216651142u, 1642330u}, + {6491750371602075697u, 16642152655661413116u, 2253388271920431918u, 10622761972620812209u, 1565346u}, + {1816283472780716932u, 14364764407674790427u, 7465606607195160045u, 17394755710812199500u, 2891827u}, + {14114455006936278300u, 10417285117296989387u, 6147228641698127994u, 7835564966065416070u, 2492497u}, + {5253022563353209217u, 11592722510858542141u, 6265274705263198825u, 3432685381881666794u, 439019u}, + {14928478282413453860u, 2668129566589234056u, 9639742690086297510u, 2818344642048370779u, 3492008u}, + {2562061068202321013u, 792657001343798621u, 17853786536947960882u, 11305400850614449001u, 226015u}, + {3686191269674130454u, 16036203580925636164u, 17025223992164528159u, 76226846205148250u, 59462u}, + {1028683793761248839u, 15886277554582899847u, 10391767462179125443u, 14844961252185492579u, 883800u}, + {15099315973132468830u, 11979240114829766680u, 16670569428792051417u, 5636795582215684761u, 3696736u}, + {1238441067953738200u, 8322853820059618663u, 4028955917013410695u, 5760742677533171279u, 1927635u}, + {3187689002153265703u, 17019595475188337037u, 1152542225130903350u, 3926668673321376333u, 988973u}, + {13665667012536991499u, 17404174071330746888u, 13128671370043668037u, 3260835067460234549u, 730887u}, + {10467729933429995533u, 14611494314342415891u, 9448384345836655939u, 11038294376499610628u, 1112204u}, + {4534218318415020144u, 2933766705659631472u, 11900590293658044322u, 2110186780683960578u, 1083572u}, + {7638462913176585795u, 8892053795722948146u, 17480373212548634469u, 16521177412165121730u, 3787666u}, + {13622545409978971972u, 5894691111888757008u, 12844283190309179875u, 9509414940828428190u, 2940163u}, + {7394777596128442378u, 3002064512497140872u, 4360470854884776789u, 6323247125205135469u, 2382852u}, + {6869090689003397374u, 11381589537831171841u, 12772973875324699609u, 18058354376814758077u, 2614615u}, + {12307577946331673078u, 13007379979704378832u, 2088649526183053448u, 1561440626611123132u, 1873405u}, + {3838433051469967431u, 4636818613430552725u, 2883145156496457006u, 2700689203546182101u, 1989611u}, + {11072601557918517342u, 15762112637950584403u, 4546079751737271344u, 1477853728382485258u, 1845937u}, + {1746823793631772919u, 11027510551542606111u, 17780253069163264727u, 17544046880109533364u, 2331586u}, + {4526941364304940765u, 12382011116229833192u, 13349472253959071605u, 11932513204030000478u, 1964777u}, + {8238999027672164729u, 14842791982728440827u, 13381823595882440390u, 8539039846888920483u, 1361748u}, + {15815620835386213009u, 9304095114444585230u, 7063355183058341958u, 16670424048149278897u, 1423131u}, + {3887296524674395109u, 3633607301354297305u, 924340398028029105u, 12203985542420607580u, 2586912u}, + {6702340696805576231u, 10199984306051941134u, 196593814706658509u, 5452039668653788866u, 1784602u}, + {9642444548234351593u, 14767844925410268364u, 16358677754309956184u, 13579747780949921849u, 3247475u}, + {2399948198304452240u, 15489505372888245802u, 1551213454849076754u, 2942209115307635147u, 456869u}, + {15917823151966398506u, 9979975775171600454u, 8206688058265064568u, 584888500763844212u, 1346436u}, + {7446464895702908367u, 15161046480046671707u, 11132329444819553188u, 12706973911563834430u, 359183u}, + {15657182487614350487u, 5126212137812283231u, 8152061853747912979u, 15643123675813963241u, 3857153u}, + {13070279655029018465u, 16347600581657032290u, 17677007365611713343u, 8285717650211049397u, 2459683u}, + {964922964295953486u, 17849389503951433070u, 4769352663545400020u, 5377635109895839045u, 205170u}, + {11452425494205676815u, 10062224090865492626u, 11084533503212122650u, 13766785185103473874u, 2920075u}, + {11279866175125426292u, 14572600103437556343u, 711400061346203815u, 7764028452026111756u, 1734615u}, + {9569122305340487829u, 2349210415213125599u, 16648179074749664616u, 6589239064186888321u, 142618u}, + {5514693976925047900u, 13063489044739376505u, 355266026784447992u, 1227609942980318285u, 2065391u}, + {15107641251473361166u, 2358708586887335367u, 9261005996111323713u, 14881964112229907803u, 3129306u}, + {15615665441406496882u, 18068823730215533026u, 6625448806815448850u, 1426819808512918638u, 1872827u}, + {16405953970884846189u, 8141912683455981153u, 17289341308190327185u, 6231500649051955542u, 2772144u}, + {7860531932204105408u, 13928485675515818709u, 5662048181172793213u, 3798131927107222812u, 2300020u}, + {16745827161460650957u, 7609033374457282480u, 277718172661963210u, 7248187287895338970u, 1642984u}, + {13622769694600784381u, 15201287275109275597u, 15635480826826832234u, 17396187875754019477u, 2972196u}, + {5069790057853186948u, 4507174935167917439u, 4222242302335200377u, 3369476682089776166u, 3727800u}, + {13332258237741112831u, 12257150005908481227u, 11140006569890215726u, 8715677060478803468u, 1681014u}, + {15345484759833669152u, 10487276507870350788u, 12525746762658868508u, 16820428654595208936u, 649860u}, + {6504784841437770180u, 17563241777792063134u, 14912028719253096818u, 9451532636892729159u, 1601947u}, + {16374714253111185874u, 13081925363169971699u, 17991580104889018814u, 16386624562389820903u, 3559432u}, + {1427316156548460083u, 46136316134452932u, 2166810193822886272u, 5253806718269208091u, 3383136u}, + {10907206258808345458u, 12260026051762718738u, 16328243746058300260u, 11879853271432541659u, 2676618u}, + {17315038733771406466u, 14757524619797112195u, 1104154730624396244u, 17054967092059930480u, 2169161u}, + {1461381243260869928u, 16346773015008965941u, 13887532697596060760u, 9407501199807270656u, 606034u}, + {9618200632893358255u, 6857878914481344716u, 3898195486334353080u, 1596446432339882286u, 11584u}, + {5607398402911202833u, 10642545735712032934u, 14495488943909630776u, 1009020005210787387u, 0u}, + {4793800066056446106u, 18223504686625068741u, 3888340996450460725u, 1009020005u, 0u}, + {3090339154658209894u, 10598370314473422389u, 166389727666921520u, 1u, 0u}, + {9275210434505010965u, 6944703601017220364u, 18613133801u, 0u, 0u}, + {6290206552917955353u, 11310322316932465153u, 18u, 0u, 0u}, + {12993780297012094218u, 343351715643u, 0u, 0u, 0u}, + {6488008466134974639u, 343u, 0u, 0u, 0u}, + {6333721225749u, 0u, 0u, 0u, 0u}, + {6334u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 313706u}, + {16649156382539289687u, 10016875999337845162u, 11054191020964991430u, 17227551829361163832u, 2427320u}, + {18418597199700814575u, 11671658268171848744u, 3499586284066135648u, 693294514393899922u, 1029548u}, + {6759133347952649082u, 15340524299564440167u, 15514624698853527078u, 2396892412412515923u, 3640285u}, + {12317397627707497248u, 5239126318673903850u, 9536348422101344361u, 15847764502453474171u, 652536u}, + {15925968063475177356u, 10686330058829665865u, 7872560272381714761u, 18386723660110270318u, 1904875u}, + {11905540613035016514u, 9457583882237826171u, 4515731929693126528u, 10699662677617465670u, 668459u}, + {2017302795007316722u, 9736478415325319556u, 14409589540925626142u, 15360598432875080858u, 2684386u}, + {3136244077423323653u, 17113389182776590786u, 5522007654622139129u, 14605152192559090393u, 2910566u}, + {722643712845721836u, 11252667249859700416u, 6785912418087631471u, 13456402971771388803u, 2049156u}, + {9644889289246743336u, 17246197791076792623u, 13330076579929125709u, 14953722235606592093u, 729817u}, + {7834808272873646083u, 10150902920133660030u, 8085694289244476405u, 8300086076735077359u, 3216818u}, + {5725687520311174466u, 11942524632027284240u, 2681331049265532370u, 1068146143208779393u, 2138597u}, + {16902148022999657890u, 12384197480592695549u, 3064043761590525679u, 17981791068048005233u, 2115222u}, + {14611573265905025321u, 267762600734739980u, 4359039137956744541u, 18269590268470638941u, 1206235u}, + {12534247025799600566u, 11832689018580462508u, 8562327451755955124u, 3048670076200314621u, 1301613u}, + {9753574196726710059u, 14993719977116509234u, 14902593814438529504u, 2257795940118449402u, 621872u}, + {9588586625631243443u, 4361340989952170455u, 7397043927491898590u, 9378958740819033526u, 576853u}, + {14456013083302980139u, 9341515578695251075u, 14709027423788072859u, 11395740927030724204u, 1596761u}, + {12175812160023813344u, 8841165451784085206u, 6984674821843530573u, 605915805213044952u, 3332088u}, + {14344522717149392146u, 18258091684325851286u, 11770851905153717791u, 11302450845089752533u, 523575u}, + {8909644400921464702u, 5479352975447841571u, 10645611091427966462u, 12115334063702736571u, 3344280u}, + {6160039667093684114u, 3899399644485816970u, 18097972434937483974u, 3880743573396340050u, 369967u}, + {13389129901298746389u, 14540585625360856380u, 1458339136138375965u, 5339086649252128939u, 1499573u}, + {16197798436666866191u, 7450633987613537714u, 12868244037546112683u, 14150950676123806958u, 1722412u}, + {4586219234520274030u, 5486221868050646658u, 6305553694177993091u, 4931689302083536540u, 546551u}, + {8982746255383101853u, 16039997140091215326u, 4220854046386518084u, 2315925100565613283u, 1176252u}, + {13575971883542692682u, 11654216176697002703u, 1347285904461502818u, 14865562393739268924u, 1014473u}, + {16236708725977450016u, 17057458730449817481u, 12835379041492177408u, 16952248337579315703u, 1942836u}, + {4372163050307162019u, 11111076664675097907u, 50519723448421842u, 3206373153090267092u, 728612u}, + {5181381187818811u, 9850959537889552322u, 16829039954998540692u, 10029446093571389920u, 1147396u}, + {16337412937846181739u, 15724373371801526641u, 4747857243677405154u, 2975527085947689514u, 2323313u}, + {2855045706666340501u, 8574664737791506675u, 8140793912000432330u, 3141334106920550693u, 1854286u}, + {3926633326454034135u, 10632751881384740440u, 10115767766525943042u, 16823624953260005784u, 2830253u}, + {16275571597319583867u, 9416479094598521368u, 15676866439035642534u, 8771177848167753888u, 3045234u}, + {10902669628993065361u, 24464929957260092u, 16114190785049803031u, 13026541587840765160u, 1256620u}, + {7342775705355945307u, 16309510042291434819u, 10929014825995898760u, 2761369134005708052u, 1570575u}, + {15703895694037350058u, 4136091931454565696u, 645769829296871674u, 8747940876424215769u, 488582u}, + {7882183373083450022u, 241648108750550104u, 10549034037148693567u, 8727981634450242292u, 3538798u}, + {6671090422153329128u, 3558512091354048685u, 5346601730328840158u, 1650546378596951440u, 105990u}, + {14281242244457710140u, 18199348114774190227u, 17943724979998508221u, 16286971424626632389u, 3131831u}, + {1144921590258435084u, 12983829028363232425u, 6893940917236593326u, 7407646693094730755u, 2954412u}, + {12949128693457798274u, 12467919652926009232u, 16669594846911322649u, 6683797940949313188u, 2996219u}, + {14196281620386862487u, 5669040875861113006u, 18126750118032961652u, 17493208248944144411u, 986696u}, + {12705133567305969844u, 14133327229014805364u, 12644231221401972560u, 15798814440389979152u, 3174187u}, + {1915568725539240394u, 13406511870384320839u, 16700120469414555298u, 6471679300405496644u, 2114720u}, + {7440774448535540092u, 10654181247446087074u, 7358114105063709344u, 11856455127319415867u, 855207u}, + {6703709172068162298u, 8932869180061316884u, 15279076180046265453u, 16516964831200997395u, 2652752u}, + {11464390316405088069u, 17646758321673475452u, 12349073721068027467u, 17414814816892618567u, 1890096u}, + {9409567801402015636u, 2852263533141000862u, 10400527096840560964u, 1403960421322187729u, 568456u}, + {17652624405212357786u, 356261307065029449u, 3608416041362045976u, 18313115049386820802u, 3454777u}, + {5108614924134978152u, 14626189471685710146u, 18263944849434433990u, 17717839944756197432u, 3732931u}, + {15773758363104018734u, 12612807023351151029u, 18071609776324965716u, 4968776835098756262u, 3799555u}, + {13839611410022844320u, 5458155244338390979u, 9022065356287651714u, 4105314689771724746u, 2099565u}, + {12481827410455468268u, 14845162843586658475u, 9414697727806124859u, 11712060376470758316u, 2044599u}, + {6991268405371293229u, 813310670715287839u, 18359680985119562373u, 6378784481536081219u, 861054u}, + {17333111466193083703u, 16884247685019778838u, 14632777984142728148u, 13202423358091240673u, 855562u}, + {4721323263038412110u, 11889369072886893846u, 9056039145684484498u, 5708332275451921393u, 319561u}, + {15852753297585431255u, 15010049293281654015u, 8778472900492021702u, 11318937129645956925u, 1253407u}, + {11359392841792382955u, 2003189028200333560u, 11221387540320852616u, 17172828670494981965u, 588622u}, + {8434245571886766867u, 11826423233203116086u, 3436538356702165082u, 14566492172224426806u, 3883582u}, + {16590108916595913196u, 13943874856997077378u, 1999540693370900643u, 9367069088702461004u, 1498656u}, + {4388407862234425273u, 11877604751147233120u, 9022101458940478954u, 17177352714080447118u, 3455119u}, + {10780668607186537649u, 9547387374393145904u, 6463175067909642454u, 16564924747800061330u, 1045882u}, + {4359746301607435043u, 816746685095890027u, 1167801429603127264u, 667811480491575665u, 845163u}, + {5299545537300301180u, 18242708917971622051u, 4870107803936103822u, 2177318327367218146u, 232113u}, + {2132595381583864113u, 13292987327943648827u, 9619289971879869585u, 8507077827759995720u, 404125u}, + {18238526581237358950u, 11319090134525959324u, 5659677287273924283u, 7454798955865700u, 1991019u}, + {2940242715494900583u, 18314096260065975200u, 13001309574782922463u, 5801335340980582796u, 775512u}, + {9205647227497377669u, 9392828845297611984u, 14266899815036899747u, 18244876968787193790u, 1447652u}, + {11887664217121001152u, 12677814469484931359u, 11127065377310426745u, 11700034718340996380u, 3539047u}, + {7026008272447431696u, 4395845419511953853u, 15844763170582622371u, 12603305268573325149u, 1964945u}, + {14570955001318103034u, 14912773572202147793u, 8733173237858937181u, 11205173926016050563u, 3088614u}, + {7540995068341068151u, 7955323919334591102u, 1308811018350451934u, 17350797452308354919u, 3414368u}, + {8339002630339077096u, 757254458126587371u, 11812808041196070457u, 4098209256144225402u, 2746037u}, + {9090451208418820987u, 6187406178537893386u, 2493468433668552142u, 483001010081714028u, 816592u}, + {12073948477566720303u, 11346580147968550876u, 4702567594948801185u, 11976624074415677016u, 2604813u}, + {6922686380423158051u, 10569924764152051068u, 12713585007396602143u, 624511083050919160u, 2949220u}, + {14606173211405658165u, 4615910757665305850u, 16009166974820979176u, 2072016140243558974u, 805710u}, + {2255973542488678551u, 1221080752835588630u, 1403545146813952538u, 8877946794904780791u, 1035384u}, + {8043588348890278379u, 810179119370508741u, 5444765608602994804u, 5495476619426483621u, 2913816u}, + {12275299465791112290u, 16840999939171877823u, 5128384435124866470u, 1206671928132203666u, 1970364u}, + {8463461802767775784u, 3201998950343796242u, 1706543163733554366u, 10484697937146273295u, 3213239u}, + {5022114313508168204u, 10867254929457486610u, 1315576022671461511u, 11372316071920046295u, 2728562u}, + {2125608326500377996u, 12365415244509247740u, 9158854310964879715u, 13525103181368089185u, 1938401u}, + {2064925508470627447u, 16016838071442605604u, 17157228146191298536u, 16753119017483607001u, 630301u}, + {12593683160528207933u, 13073030599885642279u, 10638669291871500619u, 6929156045630604077u, 3249184u}, + {6332316396226266696u, 2480920240186818589u, 7166291148192979483u, 15408204402704198309u, 3058339u}, + {11248469719358143169u, 7093297189268120998u, 1548127010225253361u, 15260568754234643695u, 2908274u}, + {2036037215397784881u, 11080985458780929881u, 13855616565718814469u, 14825454979210019206u, 675633u}, + {17427540971340470214u, 13610063368703786727u, 12857235531142290242u, 13919578893184299232u, 790805u}, + {3339614631646006397u, 9147947630485554068u, 2766829222508267433u, 13345242688383456935u, 3209756u}, + {4713817010626905827u, 13541554299103304175u, 17344046249133681772u, 9066408815557288363u, 3770737u}, + {4826749362726163610u, 724762479381850189u, 1644515353365325233u, 5401819788281343413u, 2226435u}, + {8834547972980780869u, 10763121783858818634u, 15375589428645850633u, 8255636202367354017u, 646143u}, + {13498782073113867139u, 9354460384836572736u, 3268230046566912137u, 3254510974518412233u, 3506065u}, + {10197205479943108226u, 10048150046745806436u, 11159602674292913643u, 9215989929832149325u, 1657938u}, + {5429599386948781872u, 10420760737818278938u, 7734297979569284150u, 6227536654453870292u, 2184283u}, + {3660646756303973923u, 17266559583054607820u, 18194422506240902338u, 2850539083192280678u, 2050555u}, + {8839504076991705881u, 16298363706660710844u, 14872273445792246306u, 3784820956116857244u, 3735403u}, + {8959319669426026661u, 9059737959344521944u, 6491750371602075696u, 16642152655661413116u, 1371688u}, + {3335024206255274695u, 6255823666423495644u, 1816283472780716931u, 14364764407674790427u, 2222157u}, + {17470441366293318718u, 3400243239073445095u, 14114455006936278299u, 10417285117296989387u, 3442746u}, + {12785367628588497063u, 6166301371966615511u, 5253022563353209216u, 11592722510858542141u, 108343u}, + {6846826193720038852u, 4383619335303499760u, 14928478282413453859u, 2668129566589234056u, 1272u}, + {1537262228134510882u, 3974542621395035852u, 2562061068202321012u, 792657001343798621u, 2136838u}, + {1609594046160274619u, 13699634534266524633u, 3686191269674130453u, 16036203580925636164u, 1821831u}, + {9666352906966938049u, 2093104342016538669u, 1028683793761248838u, 15886277554582899847u, 958407u}, + {14106682331596937625u, 7437029593645416005u, 15099315973132468829u, 11979240114829766680u, 1964059u}, + {1458853630286045696u, 8365296158069175373u, 1238441067953738199u, 8322853820059618663u, 759119u}, + {13164646358216480401u, 9987341571402767537u, 3187689002153265702u, 17019595475188337037u, 2075916u}, + {4053682667133650857u, 10370043610089350822u, 13665667012536991498u, 17404174071330746888u, 3028193u}, + {7038123624952460737u, 17670901956709899081u, 10467729933429995532u, 14611494314342415891u, 2789811u}, + {17576588012126983186u, 62722710657305468u, 4534218318415020143u, 2933766705659631472u, 1570452u}, + {3146992051523667593u, 10230140117355553233u, 7638462913176585794u, 8892053795722948146u, 3145595u}, + {5444557125244920644u, 10515124669927704672u, 13622545409978971971u, 5894691111888757008u, 2585993u}, + {4110103999964618174u, 12625554992220360614u, 7394777596128442377u, 3002064512497140872u, 3715955u}, + {16016886522783975995u, 8055176806801148978u, 6869090689003397373u, 11381589537831171841u, 2006481u}, + {17235590235469098178u, 11973574337130378633u, 12307577946331673077u, 13007379979704378832u, 1362440u}, + {13941065921345908407u, 16040887054406171691u, 3838433051469967430u, 4636818613430552725u, 2903338u}, + {3495713706629384482u, 14372986489842058647u, 11072601557918517341u, 15762112637950584403u, 146294u}, + {14420924713650765039u, 17308702704922981160u, 1746823793631772918u, 11027510551542606111u, 3261417u}, + {6391020154248804882u, 8217866708697501438u, 4526941364304940764u, 12382011116229833192u, 3848115u}, + {4320497787041453283u, 2324003394250269945u, 8238999027672164728u, 14842791982728440827u, 469756u}, + {3327015676804060326u, 10535228772263324009u, 15815620835386213008u, 9304095114444585230u, 1665746u}, + {14440115562318221857u, 17384780965908201186u, 3887296524674395108u, 3633607301354297305u, 2161007u}, + {13887964549210787134u, 5819692838637045834u, 6702340696805576230u, 10199984306051941134u, 3691477u}, + {3374868920128715174u, 5406911990289430884u, 9642444548234351592u, 14767844925410268364u, 3750268u}, + {17964134234308998776u, 13740943215146867338u, 2399948198304452239u, 15489505372888245802u, 1953070u}, + {4911150369003658557u, 4927829855431683493u, 15917823151966398505u, 9979975775171600454u, 1569476u}, + {2471514938198028660u, 15708310624668541409u, 7446464895702908366u, 15161046480046671707u, 548766u}, + {2879953519666433266u, 2842646487200421354u, 15657182487614350486u, 5126212137812283231u, 3392703u}, + {16764381721772892929u, 2425882432104394289u, 13070279655029018464u, 16347600581657032290u, 2773593u}, + {18374832797563253993u, 1468001340544654288u, 964922964295953485u, 17849389503951433070u, 2505510u}, + {8938239403916706760u, 2129070905936108821u, 11452425494205676814u, 10062224090865492626u, 919734u}, + {13727206684683010272u, 15040241659842606630u, 11279866175125426291u, 14572600103437556343u, 2350951u}, + {14314164100321943618u, 16285177399921439048u, 9569122305340487828u, 2349210415213125599u, 1141910u}, + {15622595531873375009u, 15967995542720506630u, 5514693976925047899u, 13063489044739376505u, 2865848u}, + {8957342369711857189u, 2674495062728998338u, 15107641251473361165u, 2358708586887335367u, 2950397u}, + {5433950419233584633u, 15445685138694542973u, 15615665441406496881u, 18068823730215533026u, 3873970u}, + {2772834239023529214u, 8123341365896403250u, 16405953970884846188u, 8141912683455981153u, 1158471u}, + {2713033526084029188u, 10241322633907374987u, 7860531932204105407u, 13928485675515818709u, 2330275u}, + {5353603055078807592u, 12704633306098475927u, 16745827161460650956u, 7609033374457282480u, 3750934u}, + {12900851613070710029u, 10747784047564418843u, 13622769694600784380u, 15201287275109275597u, 2146942u}, + {17037047354038661079u, 8877803361698631532u, 5069790057853186947u, 4507174935167917439u, 398933u}, + {6045164734771117459u, 17542758050394541059u, 13332258237741112830u, 12257150005908481227u, 2110148u}, + {372245321764079610u, 6125816003295910717u, 15345484759833669151u, 10487276507870350788u, 2886494u}, + {17427795460957919217u, 12994215307966449886u, 6504784841437770179u, 17563241777792063134u, 2141344u}, + {5706398433709070230u, 2463223024139496712u, 16374714253111185873u, 13081925363169971699u, 2501054u}, + {18210507843684348638u, 2689094060738576590u, 1427316156548460082u, 46136316134452932u, 554844u}, + {2981479341932503273u, 4465791792148669396u, 10907206258808345457u, 12260026051762718738u, 3132012u}, + {9060435417421064538u, 7534674760994394279u, 17315038733771406465u, 14757524619797112195u, 3347840u}, + {7342584060289529327u, 16746297848256578558u, 1461381243260869927u, 16346773015008965941u, 672610u}, + {15388813407108271728u, 16487713575758741848u, 9618200632893358254u, 6857878914481344716u, 2714810u}, + {11489306785032409565u, 2344261506181400199u, 5607398402911202832u, 10642545735712032934u, 3523168u}, + {14935279861444131825u, 16512359167755688489u, 4793800066056446105u, 18223504686625068741u, 320055u}, + {7820872463992623890u, 4826251939624014114u, 3090339154658209893u, 10598370314473422389u, 1473136u}, + {15045191074543337052u, 14299667588463455705u, 9275210434505010964u, 6944703601017220364u, 3758801u}, + {1414149717849350417u, 11037488393949630558u, 6290206552917955352u, 11310322316932465153u, 18u}, + {15748064479885093852u, 16982050616775565749u, 12993780297012094217u, 343351715643u, 0u}, + {3674160316375260496u, 16145020331663287992u, 6488008466134974638u, 343u, 0u}, + {12391275820066806916u, 9429586839940733762u, 6333721225748u, 0u, 0u}, + {17246645586927790494u, 13304266802155325338u, 6333u, 0u, 0u}, + {13755911689891259962u, 116836534485604u, 0u, 0u, 0u}, + {9859519161825981906u, 116836u, 0u, 0u, 0u}, + {2155253650115091u, 0u, 0u, 0u, 0u}, + {2155254u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 47186u}, + {9693960579239218824u, 15232635332337710908u, 16649156382539289686u, 10016875999337845162u, 3815612u}, + {2838063092473052992u, 815762077369459664u, 18418597199700814574u, 11671658268171848744u, 3486488u}, + {9320618847230857967u, 13584023805376906427u, 6759133347952649081u, 15340524299564440167u, 2763606u}, + {15565131170525357520u, 6859962084080095452u, 12317397627707497247u, 5239126318673903850u, 1182113u}, + {17709454513320907035u, 4657902036721020055u, 15925968063475177355u, 10686330058829665865u, 977899u}, + {2204582927297709076u, 17350567322628763503u, 11905540613035016513u, 9457583882237826171u, 471802u}, + {6765750676899964416u, 12848573441682316984u, 2017302795007316721u, 9736478415325319556u, 1937436u}, + {3668989371434436653u, 3947345598947939986u, 3136244077423323652u, 17113389182776590786u, 633313u}, + {3883232989956230611u, 16642054021083375634u, 722643712845721835u, 11252667249859700416u, 1324505u}, + {11005201526996328048u, 3853955972495726019u, 9644889289246743335u, 17246197791076792623u, 3406549u}, + {3291828334700722360u, 17718050592114360119u, 7834808272873646082u, 10150902920133660030u, 2874307u}, + {5965591868112109011u, 13285632020260992144u, 5725687520311174465u, 11942524632027284240u, 3379940u}, + {251563124839204483u, 9649472376928100707u, 16902148022999657889u, 12384197480592695549u, 2796689u}, + {254749886397629434u, 2163512682403650372u, 14611573265905025320u, 267762600734739980u, 826357u}, + {9610352335293358654u, 17856057046966043414u, 12534247025799600565u, 11832689018580462508u, 311188u}, + {8106948347345319201u, 10422100901583140937u, 9753574196726710058u, 14993719977116509234u, 2053768u}, + {6833992899870004278u, 1769013436767769703u, 9588586625631243442u, 4361340989952170455u, 2498324u}, + {2220817526946637765u, 14785959416745495464u, 14456013083302980138u, 9341515578695251075u, 2718039u}, + {5311640640975390063u, 14621297446480548630u, 12175812160023813343u, 8841165451784085206u, 1491883u}, + {7760619429925913466u, 11702944411893883434u, 14344522717149392145u, 18258091684325851286u, 161319u}, + {4422459214799430312u, 14946304410679469375u, 8909644400921464701u, 5479352975447841571u, 449378u}, + {228596760903606775u, 12251733535778735515u, 6160039667093684113u, 3899399644485816970u, 3090476u}, + {12938526721533014059u, 5628114338947184519u, 13389129901298746388u, 14540585625360856380u, 1555927u}, + {17712036077187186017u, 15084938972782475697u, 16197798436666866190u, 7450633987613537714u, 533683u}, + {1502787801529895712u, 9352212634946264343u, 4586219234520274029u, 5486221868050646658u, 2342487u}, + {16232611027962708389u, 16567102562580263400u, 8982746255383101852u, 16039997140091215326u, 2870074u}, + {13298353594465057488u, 1415536969865837083u, 13575971883542692681u, 11654216176697002703u, 2811690u}, + {9829889687442582276u, 5191492439672252989u, 16236708725977450015u, 17057458730449817481u, 770172u}, + {4687828229495214813u, 8845946917484943878u, 4372163050307162018u, 11111076664675097907u, 2771586u}, + {4963292291460981445u, 5418158235307662728u, 5181381187818810u, 9850959537889552322u, 857488u}, + {5982754443768591229u, 16315290869896203150u, 16337412937846181738u, 15724373371801526641u, 3896006u}, + {16216245505375593612u, 12481589652846781684u, 2855045706666340500u, 8574664737791506675u, 2183884u}, + {15216102122136500902u, 12815919803664053835u, 3926633326454034134u, 10632751881384740440u, 2655854u}, + {17898658173696642504u, 15953640762628434177u, 16275571597319583866u, 9416479094598521368u, 1326246u}, + {6362685239406301596u, 10425891871608568629u, 10902669628993065360u, 24464929957260092u, 1327811u}, + {4411631029970460836u, 15229204838661703162u, 7342775705355945306u, 16309510042291434819u, 1561742u}, + {11324990298289834954u, 4275570898262070943u, 15703895694037350057u, 4136091931454565696u, 1381020u}, + {13568693556989957958u, 11017869699754077474u, 7882183373083450021u, 241648108750550104u, 1501077u}, + {13263980556083488145u, 15003773617842558284u, 6671090422153329127u, 3558512091354048685u, 2213638u}, + {9999768280786938597u, 14919560877824556684u, 14281242244457710139u, 18199348114774190227u, 729781u}, + {17930006436231962159u, 4455591658796834442u, 1144921590258435083u, 12983829028363232425u, 106028u}, + {18069996239286899930u, 5995941707004536300u, 12949128693457798273u, 12467919652926009232u, 2631821u}, + {10372989304946159874u, 9161733372779805544u, 14196281620386862486u, 5669040875861113006u, 544204u}, + {1231033145955314955u, 1844327728424567237u, 12705133567305969843u, 14133327229014805364u, 205964u}, + {11467330887958458009u, 2987665127596792402u, 1915568725539240393u, 13406511870384320839u, 3345572u}, + {9965772073360574795u, 12016929419511401334u, 7440774448535540091u, 10654181247446087074u, 3783058u}, + {7763756856812101419u, 4856365912787521882u, 6703709172068162297u, 8932869180061316884u, 3507685u}, + {16173601578585591296u, 18437266159907589634u, 11464390316405088068u, 17646758321673475452u, 2277765u}, + {129921799743799406u, 16142641348769037583u, 9409567801402015635u, 2852263533141000862u, 3687964u}, + {974219759880607844u, 1579487922972947549u, 17652624405212357785u, 356261307065029449u, 3824820u}, + {14829790853671451569u, 6991966972667025121u, 5108614924134978151u, 14626189471685710146u, 147888u}, + {9768719806010252746u, 10932998114555231420u, 15773758363104018733u, 12612807023351151029u, 2918438u}, + {12189951972050643986u, 12843680694653613349u, 13839611410022844319u, 5458155244338390979u, 70390u}, + {2842416692591136502u, 7683146820143932218u, 12481827410455468267u, 14845162843586658475u, 1120909u}, + {1858209782464432533u, 10454643714967865416u, 6991268405371293228u, 813310670715287839u, 1234401u}, + {16892435144294585420u, 7902380560346550040u, 17333111466193083702u, 16884247685019778838u, 3898988u}, + {7917893171745686781u, 16731057388478258484u, 4721323263038412109u, 11889369072886893846u, 1196402u}, + {10036441730824959108u, 7573284177540815441u, 15852753297585431254u, 15010049293281654015u, 3124344u}, + {18158199541095962256u, 17245019095791331731u, 11359392841792382954u, 2003189028200333560u, 486688u}, + {2185518660468133051u, 6023113607793841244u, 8434245571886766866u, 11826423233203116086u, 1992720u}, + {5176064819630836950u, 5096137405686801697u, 16590108916595913195u, 13943874856997077378u, 3261243u}, + {7993101734656195089u, 12290251176104701444u, 4388407862234425272u, 11877604751147233120u, 1939906u}, + {17417258817491081250u, 8705209058646581855u, 10780668607186537648u, 9547387374393145904u, 1307176u}, + {18288820463647370761u, 5012474155977459289u, 4359746301607435042u, 816746685095890027u, 657982u}, + {14120472462006123789u, 9847065055182108252u, 5299545537300301179u, 18242708917971622051u, 1864286u}, + {7701737542331928841u, 10902874510550985510u, 2132595381583864112u, 13292987327943648827u, 327855u}, + {5771445628083632111u, 12638333365822618314u, 18238526581237358949u, 11319090134525959324u, 621647u}, + {10749016541389771996u, 16211267381441720905u, 2940242715494900582u, 18314096260065975200u, 1373771u}, + {7871289034673287261u, 16435022572152728524u, 9205647227497377668u, 9392828845297611984u, 3671949u}, + {7195761645311013532u, 17952215584662199801u, 11887664217121001151u, 12677814469484931359u, 18007u}, + {13342101902120161752u, 13506991713447818817u, 7026008272447431695u, 4395845419511953853u, 3735575u}, + {260156381921755449u, 12373252161901259290u, 14570955001318103033u, 14912773572202147793u, 1571473u}, + {9091349316968691436u, 1355489069023015129u, 7540995068341068150u, 7955323919334591102u, 1988346u}, + {4287393318167335506u, 11807405930687506739u, 8339002630339077095u, 757254458126587371u, 3388711u}, + {3888232224239306509u, 11226538058762606090u, 9090451208418820986u, 6187406178537893386u, 1818092u}, + {840505864442743896u, 14633704575411151727u, 12073948477566720302u, 11346580147968550876u, 2684269u}, + {1367424654308281124u, 138748712817125012u, 6922686380423158050u, 10569924764152051068u, 229023u}, + {11061579533629747119u, 9765179215495423161u, 14606173211405658164u, 4615910757665305850u, 3694920u}, + {7539592079264422629u, 5172748988069760065u, 2255973542488678550u, 1221080752835588630u, 951148u}, + {16014480978552531980u, 117249687221047595u, 8043588348890278378u, 810179119370508741u, 2796186u}, + {16265564084726747424u, 17104939900288816429u, 12275299465791112289u, 16840999939171877823u, 1705710u}, + {719458102400720720u, 15088293284861432383u, 8463461802767775783u, 3201998950343796242u, 3177570u}, + {3538800934132360780u, 9773910978305514076u, 5022114313508168203u, 10867254929457486610u, 2361753u}, + {11958119779556257415u, 11858901371800006242u, 2125608326500377995u, 12365415244509247740u, 1087031u}, + {2970984245106818897u, 534088058069435882u, 2064925508470627446u, 16016838071442605604u, 1659158u}, + {13702049839251513344u, 4102510835578064338u, 12593683160528207932u, 13073030599885642279u, 1678455u}, + {5557752278841107901u, 2766297283441433249u, 6332316396226266695u, 2480920240186818589u, 1715911u}, + {15626351446231067116u, 8074747427345035649u, 11248469719358143168u, 7093297189268120998u, 3045175u}, + {454251549610050998u, 1717405458140744933u, 2036037215397784880u, 11080985458780929881u, 3428013u}, + {2549033760149055784u, 5569800757748206913u, 17427540971340470213u, 13610063368703786727u, 3723734u}, + {12703152873407295568u, 16981477673883692768u, 3339614631646006396u, 9147947630485554068u, 3620379u}, + {7761270127767881729u, 16115852395273597727u, 4713817010626905826u, 13541554299103304175u, 226952u}, + {11992492764156146260u, 1181785842151107507u, 4826749362726163609u, 724762479381850189u, 1438751u}, + {9714935922749324876u, 7407299104437708337u, 8834547972980780868u, 10763121783858818634u, 3200063u}, + {17996174556451388562u, 11859691056100445800u, 13498782073113867138u, 9354460384836572736u, 1742555u}, + {1283777264825671274u, 10291781529341556458u, 10197205479943108225u, 10048150046745806436u, 2410571u}, + {6145578721832857923u, 1619811872477918303u, 5429599386948781871u, 10420760737818278938u, 2428320u}, + {151268601765546200u, 18230540837641113986u, 3660646756303973922u, 17266559583054607820u, 723566u}, + {8990297314954259783u, 17000208307562692716u, 8839504076991705880u, 16298363706660710844u, 2848128u}, + {17027863841505195291u, 11407174208182114877u, 8959319669426026660u, 9059737959344521944u, 3191380u}, + {4324366577972643853u, 3968585381547194741u, 3335024206255274694u, 6255823666423495644u, 733805u}, + {4083134951242384631u, 4277901005925866182u, 17470441366293318717u, 3400243239073445095u, 2244617u}, + {3234673581576716689u, 11650494811019196773u, 12785367628588497062u, 6166301371966615511u, 3261480u}, + {10885221892197257682u, 14180523487963262219u, 6846826193720038851u, 4383619335303499760u, 616637u}, + {13410722945213594140u, 9061861269703286063u, 1537262228134510881u, 3974542621395035852u, 471176u}, + {6858978466619296252u, 1845411714346698528u, 1609594046160274618u, 13699634534266524633u, 186163u}, + {17587769819462766326u, 13992129758625458970u, 9666352906966938048u, 2093104342016538669u, 818432u}, + {11197831739477553165u, 2227151869318525377u, 14106682331596937624u, 7437029593645416005u, 358613u}, + {14367288857603700737u, 10179323490114329161u, 1458853630286045695u, 8365296158069175373u, 2352371u}, + {7356041076078618328u, 6208447983096473282u, 13164646358216480400u, 9987341571402767537u, 3567440u}, + {8537333832080279476u, 4496630582795105030u, 4053682667133650856u, 10370043610089350822u, 910264u}, + {10327773115955366530u, 9361051012845992410u, 7038123624952460736u, 17670901956709899081u, 3400204u}, + {14138405659210517992u, 13622231632584866271u, 17576588012126983185u, 62722710657305468u, 3795757u}, + {16271262577242946165u, 3018102525350734098u, 3146992051523667592u, 10230140117355553233u, 3619800u}, + {1670183314141577675u, 7402141968480082115u, 5444557125244920643u, 10515124669927704672u, 838957u}, + {3012410622940790109u, 14974365630357082049u, 4110103999964618173u, 12625554992220360614u, 3078259u}, + {10900580724877741591u, 10319210125346638280u, 16016886522783975994u, 8055176806801148978u, 651265u}, + {12876749563979580641u, 267778149275006762u, 17235590235469098177u, 11973574337130378633u, 2390729u}, + {5489227641296364691u, 11291446273553746781u, 13941065921345908406u, 16040887054406171691u, 1817408u}, + {2977609626579672502u, 13175349187407383399u, 3495713706629384481u, 14372986489842058647u, 806653u}, + {3073445513938851805u, 8312560390488645216u, 14420924713650765038u, 17308702704922981160u, 178946u}, + {10453828899225684286u, 11686473067994058161u, 6391020154248804881u, 8217866708697501438u, 984476u}, + {13690658447313264212u, 8953786626728318692u, 4320497787041453282u, 2324003394250269945u, 803396u}, + {5976876803325239458u, 17770467592348702749u, 3327015676804060325u, 10535228772263324009u, 1024614u}, + {1180724387911386595u, 2478999901932694270u, 14440115562318221856u, 17384780965908201186u, 2986180u}, + {4828945536308766478u, 3381592783828105805u, 13887964549210787133u, 5819692838637045834u, 140536u}, + {12183876956225307171u, 10269953470154293599u, 3374868920128715173u, 5406911990289430884u, 2710524u}, + {38512663292365916u, 3316478533603731639u, 17964134234308998775u, 13740943215146867338u, 1513191u}, + {16868390899932708249u, 18185410511026568754u, 4911150369003658556u, 4927829855431683493u, 3892975u}, + {16207247711010908613u, 1019271984286156286u, 2471514938198028659u, 15708310624668541409u, 1756424u}, + {14332098912834160609u, 6553924278546028961u, 2879953519666433265u, 2842646487200421354u, 2601100u}, + {6392760217081708030u, 1775368686721123421u, 16764381721772892928u, 2425882432104394289u, 1455512u}, + {8551036275529134883u, 4182973062605160154u, 18374832797563253992u, 1468001340544654288u, 2135915u}, + {1117769286970557888u, 2712144357536327063u, 8938239403916706759u, 2129070905936108821u, 2833134u}, + {14699270436506123247u, 11147267815590084293u, 13727206684683010271u, 15040241659842606630u, 8735u}, + {12182821369612758116u, 18057379637235179881u, 14314164100321943617u, 16285177399921439048u, 2345522u}, + {6910160543243892167u, 13771328575508340843u, 15622595531873375008u, 15967995542720506630u, 453417u}, + {15356410538565500740u, 12217910230306248425u, 8957342369711857188u, 2674495062728998338u, 1374769u}, + {6067971346679267374u, 14687759919111942388u, 5433950419233584632u, 15445685138694542973u, 2867217u}, + {13380102691846303120u, 985368857429387499u, 2772834239023529213u, 8123341365896403250u, 495712u}, + {15478287740408584127u, 5274991921439636341u, 2713033526084029187u, 10241322633907374987u, 1219551u}, + {87314007649121235u, 8803421490881368141u, 5353603055078807591u, 12704633306098475927u, 607290u}, + {492837031371849598u, 6527746806963082423u, 12900851613070710028u, 10747784047564418843u, 797934u}, + {14497479583997498541u, 4835670449781812302u, 17037047354038661078u, 8877803361698631532u, 1776069u}, + {15549328126755432390u, 2033998032108101461u, 6045164734771117458u, 17542758050394541059u, 49900u}, + {2536351564906480749u, 9492200166517246025u, 372245321764079609u, 6125816003295910717u, 1292823u}, + {12067187204354027972u, 11848870733067286977u, 17427795460957919216u, 12994215307966449886u, 719087u}, + {11574963001885200727u, 4122767327240651914u, 5706398433709070229u, 2463223024139496712u, 1244831u}, + {750141028296522577u, 10520929983307536794u, 18210507843684348637u, 2689094060738576590u, 3809808u}, + {12488135722670604710u, 14930398519952458148u, 2981479341932503272u, 4465791792148669396u, 2205537u}, + {2919223604103209524u, 16677315426085182132u, 9060435417421064537u, 7534674760994394279u, 1568625u}, + {8374308033667419080u, 13315549815755970593u, 7342584060289529326u, 16746297848256578558u, 3175743u}, + {11180637723027171517u, 16662775368750042232u, 15388813407108271727u, 16487713575758741848u, 2082670u}, + {6702183076670807581u, 8053214187949391101u, 11489306785032409564u, 2344261506181400199u, 605534u}, + {3392222189368185972u, 9802206007729984365u, 14935279861444131824u, 16512359167755688489u, 3819141u}, + {3679835260366254212u, 16140151103471002936u, 7820872463992623889u, 4826251939624014114u, 1749033u}, + {4900877694986104061u, 3240247369589324550u, 15045191074543337051u, 14299667588463455705u, 687194u}, + {2650045792406818073u, 5050733195783461201u, 1414149717849350416u, 11037488393949630558u, 2630058u}, + {10109440601604888842u, 10455182744644029658u, 15748064479885093851u, 16982050616775565749u, 223305u}, + {1807867592136634948u, 15891433118822575651u, 3674160316375260495u, 16145020331663287992u, 3366426u}, + {12227454176344899217u, 18284999772488998339u, 12391275820066806915u, 9429586839940733762u, 2475748u}, + {4332156227366192110u, 1760472325423379946u, 17246645586927790493u, 13304266802155325338u, 6333u}, + {12355797603676206868u, 10968204347577709958u, 13755911689891259961u, 116836534485604u, 0u}, + {4450025369655573386u, 17306661975114812678u, 9859519161825981905u, 116836u, 0u}, + {6419363160718790643u, 18420713539965664642u, 2155253650115090u, 0u, 0u}, + {12196066363385447256u, 11992506702107365322u, 2155253u, 0u, 0u}, + {6574496522988937929u, 39757412497601434u, 0u, 0u, 0u}, + {9179126310283371107u, 39757412u, 0u, 0u, 0u}, + {733394813376155323u, 0u, 0u, 0u, 0u}, + {733394814u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1544066u}, + {3491509993308569407u, 3505252079773720074u, 9693960579239218823u, 15232635332337710908u, 1253800u}, + {15158702150640854474u, 5072466338259371261u, 2838063092473052991u, 815762077369459664u, 2016406u}, + {16645184832145666245u, 5538028956107681925u, 9320618847230857966u, 13584023805376906427u, 785539u}, + {4366226962259694686u, 11961399797119231732u, 15565131170525357519u, 6859962084080095452u, 2505375u}, + {4614389356244128854u, 12964075695168833708u, 17709454513320907034u, 4657902036721020055u, 3076139u}, + {8327584793807119973u, 13551241961057878211u, 2204582927297709075u, 17350567322628763503u, 1210061u}, + {2780485766891497573u, 12098089385508637345u, 6765750676899964415u, 12848573441682316984u, 3048533u}, + {17504710490947064945u, 9149670056807974566u, 3668989371434436652u, 3947345598947939986u, 3730056u}, + {3037920327560200972u, 2259275393540904963u, 3883232989956230610u, 16642054021083375634u, 1892121u}, + {16609932464910726963u, 15205528102435087147u, 11005201526996328047u, 3853955972495726019u, 3466197u}, + {10693785543178790612u, 2124651411834968101u, 3291828334700722359u, 17718050592114360119u, 1465554u}, + {1270203940319661962u, 5816466616965632996u, 5965591868112109010u, 13285632020260992144u, 3567695u}, + {11300282467881664259u, 15147131322065112338u, 251563124839204482u, 9649472376928100707u, 96757u}, + {4169571328093083210u, 2539105534267280264u, 254749886397629433u, 2163512682403650372u, 3135042u}, + {7178684310028642176u, 6062923419239679897u, 9610352335293358653u, 17856057046966043414u, 2483221u}, + {5897091031579377136u, 11864861916927603861u, 8106948347345319200u, 10422100901583140937u, 2148410u}, + {8122114205145049689u, 13348218090807597088u, 6833992899870004277u, 1769013436767769703u, 767216u}, + {13654166044390525082u, 8668509133242695101u, 2220817526946637764u, 14785959416745495464u, 3559622u}, + {2955954632941601789u, 10107657674468395933u, 5311640640975390062u, 14621297446480548630u, 1605387u}, + {8790097811146260065u, 11864754210433691726u, 7760619429925913465u, 11702944411893883434u, 1647035u}, + {1396131319364683211u, 3535793867739225199u, 4422459214799430311u, 14946304410679469375u, 105305u}, + {836210371572383058u, 6651239046405737457u, 228596760903606774u, 12251733535778735515u, 413189u}, + {5386992065803768348u, 9808912246349030036u, 12938526721533014058u, 5628114338947184519u, 1349930u}, + {18243732274116100544u, 6095631440660301383u, 17712036077187186016u, 15084938972782475697u, 3078212u}, + {5410614946778594554u, 3627718986757041100u, 1502787801529895711u, 9352212634946264343u, 3573179u}, + {4808879283015740228u, 5734403252190775542u, 16232611027962708388u, 16567102562580263400u, 2517662u}, + {15074865610852957478u, 17138845205980888887u, 13298353594465057487u, 1415536969865837083u, 181369u}, + {3215181748209241782u, 11879645628319542399u, 9829889687442582275u, 5191492439672252989u, 2977243u}, + {9533581914699679042u, 6055296991177826251u, 4687828229495214812u, 8845946917484943878u, 750196u}, + {6138272657284596947u, 17724868308011159377u, 4963292291460981444u, 5418158235307662728u, 1641190u}, + {17913436394067193u, 4719092793817240435u, 5982754443768591228u, 16315290869896203150u, 847080u}, + {11165721271584405755u, 12461331021080466157u, 16216245505375593611u, 12481589652846781684u, 3346154u}, + {10506627565587357070u, 9100427802032021861u, 15216102122136500901u, 12815919803664053835u, 1567348u}, + {1628505232878893293u, 10346538011587209320u, 17898658173696642503u, 15953640762628434177u, 2688730u}, + {6222787016095775008u, 13368602903635598881u, 6362685239406301595u, 10425891871608568629u, 1358098u}, + {7494396223279468403u, 39231570987132471u, 4411631029970460835u, 15229204838661703162u, 1310412u}, + {6622175540993423761u, 7200695754137047825u, 11324990298289834953u, 4275570898262070943u, 3529913u}, + {11604162864143297976u, 136730391774779407u, 13568693556989957957u, 11017869699754077474u, 856197u}, + {231443469630765282u, 11065256798596426487u, 13263980556083488144u, 15003773617842558284u, 197265u}, + {7220021227503664504u, 5584621324006734276u, 9999768280786938596u, 14919560877824556684u, 3256857u}, + {15281378499589268192u, 4808950561408847418u, 17930006436231962158u, 4455591658796834442u, 821901u}, + {9815468154035989570u, 26162763674275786u, 18069996239286899929u, 5995941707004536300u, 564811u}, + {15083284783641763683u, 10389861951857482239u, 10372989304946159873u, 9161733372779805544u, 2324956u}, + {1046514188172317047u, 12746975261617533349u, 1231033145955314954u, 1844327728424567237u, 1805401u}, + {17336570704377495943u, 14760970287609589612u, 11467330887958458008u, 2987665127596792402u, 3001549u}, + {5031603216852328857u, 9991217478536001002u, 9965772073360574794u, 12016929419511401334u, 1545373u}, + {18403959032577986226u, 10463429071374760616u, 7763756856812101418u, 4856365912787521882u, 3392451u}, + {14465575017249192113u, 10010704651571414703u, 16173601578585591295u, 18437266159907589634u, 94340u}, + {7128802682589112678u, 2285530921943211468u, 129921799743799405u, 16142641348769037583u, 3592961u}, + {10796433861495111306u, 6038444810961221594u, 974219759880607843u, 1579487922972947549u, 129039u}, + {14068486301533810771u, 14662723087985178753u, 14829790853671451568u, 6991966972667025121u, 2835265u}, + {13343936695945433855u, 4489807361977443856u, 9768719806010252745u, 10932998114555231420u, 944825u}, + {18128362433926322011u, 13173606977861702988u, 12189951972050643985u, 12843680694653613349u, 2441723u}, + {12680636848510486584u, 12059460390407640516u, 2842416692591136501u, 7683146820143932218u, 341121u}, + {14710576623532464057u, 9732187945063324180u, 1858209782464432532u, 10454643714967865416u, 2607658u}, + {17222971517518238375u, 3812477815900081436u, 16892435144294585419u, 7902380560346550040u, 742438u}, + {9081465457776348551u, 10669961781771068961u, 7917893171745686780u, 16731057388478258484u, 392307u}, + {9935217455940083149u, 12271990104083918155u, 10036441730824959107u, 7573284177540815441u, 1260608u}, + {3327385539637457872u, 8326620682385708290u, 18158199541095962255u, 17245019095791331731u, 2294892u}, + {2128753125735335227u, 17409526145623085964u, 2185518660468133050u, 6023113607793841244u, 2824662u}, + {16704028143376675540u, 12977491556413167170u, 5176064819630836949u, 5096137405686801697u, 2193351u}, + {9946891762250854030u, 17966360563007133343u, 7993101734656195088u, 12290251176104701444u, 3160328u}, + {16988121346925906564u, 11404628706040047804u, 17417258817491081249u, 8705209058646581855u, 2195518u}, + {14617701698647398653u, 12212909260280933675u, 18288820463647370760u, 5012474155977459289u, 2560466u}, + {16053577051913949771u, 838040760569874828u, 14120472462006123788u, 9847065055182108252u, 1202261u}, + {3112131835772018091u, 3190567966653705171u, 7701737542331928840u, 10902874510550985510u, 1531674u}, + {15683072709948397667u, 15839672082642710008u, 5771445628083632110u, 12638333365822618314u, 3814565u}, + {15827955608743309984u, 12288928979573264841u, 10749016541389771995u, 16211267381441720905u, 319358u}, + {778216663435051869u, 15267811570028005148u, 7871289034673287260u, 16435022572152728524u, 535306u}, + {2735549361651364459u, 16388965146434404326u, 7195761645311013531u, 17952215584662199801u, 1746737u}, + {3594551553084988511u, 11058104016047104068u, 13342101902120161751u, 13506991713447818817u, 2786593u}, + {8793831561912584315u, 1171911165863493889u, 260156381921755448u, 12373252161901259290u, 3168709u}, + {5115196565987732287u, 2412804463648649992u, 9091349316968691435u, 1355489069023015129u, 3362008u}, + {2763911530149577976u, 71085397697815685u, 4287393318167335505u, 11807405930687506739u, 3123097u}, + {14456762420116067273u, 13452748565002599777u, 3888232224239306508u, 11226538058762606090u, 325964u}, + {3473807645155228677u, 909268289257813287u, 840505864442743895u, 14633704575411151727u, 3615332u}, + {15534069430202589752u, 3992394122456623897u, 1367424654308281123u, 138748712817125012u, 2027676u}, + {11750868057785972853u, 18062254366669224674u, 11061579533629747118u, 9765179215495423161u, 3071534u}, + {5513773172982866293u, 13418508419173679804u, 7539592079264422628u, 5172748988069760065u, 2449868u}, + {5937066507828000126u, 14401843061015577190u, 16014480978552531979u, 117249687221047595u, 1479400u}, + {14486153860429536638u, 15231511626430815804u, 16265564084726747423u, 17104939900288816429u, 1531767u}, + {18415001447502500144u, 11222435358730766191u, 719458102400720719u, 15088293284861432383u, 2501025u}, + {4936277583447785163u, 16414725411745409071u, 3538800934132360779u, 9773910978305514076u, 2247331u}, + {7995061774761215788u, 16390513770193050158u, 11958119779556257414u, 11858901371800006242u, 1609221u}, + {1137307266080717301u, 7099787708526793308u, 2970984245106818896u, 534088058069435882u, 3647558u}, + {11117878553590733514u, 4248813777173273666u, 13702049839251513343u, 4102510835578064338u, 1523776u}, + {15195641541913897527u, 11270248718091313141u, 5557752278841107900u, 2766297283441433249u, 232935u}, + {17878765979630344639u, 6653586457663804068u, 15626351446231067115u, 8074747427345035649u, 3256986u}, + {15233290062057140988u, 9478998076210953482u, 454251549610050997u, 1717405458140744933u, 1158254u}, + {10682706261290781589u, 4718133868474186559u, 2549033760149055783u, 5569800757748206913u, 2598999u}, + {3378859113687296926u, 3256029912781427291u, 12703152873407295567u, 16981477673883692768u, 2548358u}, + {13143093737763085855u, 14735220486512897174u, 7761270127767881728u, 16115852395273597727u, 1564738u}, + {6806689602301491056u, 13870053166838689704u, 11992492764156146259u, 1181785842151107507u, 3112989u}, + {8764058889124636622u, 13833758588265944409u, 9714935922749324875u, 7407299104437708337u, 2290140u}, + {8576749489612682478u, 7160865705701573768u, 17996174556451388561u, 11859691056100445800u, 3231094u}, + {5189278819097876290u, 10846947927436530574u, 1283777264825671273u, 10291781529341556458u, 1872677u}, + {16443117435152141483u, 8846968319359760663u, 6145578721832857922u, 1619811872477918303u, 3904599u}, + {4227080404498025085u, 13380746375313008113u, 151268601765546199u, 18230540837641113986u, 3614388u}, + {10704405063104756109u, 15496676266558640734u, 8990297314954259782u, 17000208307562692716u, 1196652u}, + {9694264555392470473u, 12520435174633466129u, 17027863841505195290u, 11407174208182114877u, 293694u}, + {1816331087029685360u, 16114060806134628409u, 4324366577972643852u, 3968585381547194741u, 1436728u}, + {8428140741519719452u, 11522782239802170276u, 4083134951242384630u, 4277901005925866182u, 2668339u}, + {10219737730036645343u, 8642785239040191649u, 3234673581576716688u, 11650494811019196773u, 3102718u}, + {13009423730211941454u, 7253061734181005588u, 10885221892197257681u, 14180523487963262219u, 2963233u}, + {426151455724944859u, 15824554777022613988u, 13410722945213594139u, 9061861269703286063u, 2383719u}, + {108292792102484096u, 17878710012837738239u, 6858978466619296251u, 1845411714346698528u, 702374u}, + {8601379684324597817u, 3315138975551343541u, 17587769819462766325u, 13992129758625458970u, 3546644u}, + {4666216170483899289u, 16954688572015427027u, 11197831739477553164u, 2227151869318525377u, 1040982u}, + {3673905850905659437u, 14071216757856367821u, 14367288857603700736u, 10179323490114329161u, 623139u}, + {4281971814666628802u, 1211126456466863187u, 7356041076078618327u, 6208447983096473282u, 1575332u}, + {2522217473862407442u, 5754377531831148304u, 8537333832080279475u, 4496630582795105030u, 3557342u}, + {18312747222428248087u, 16303562743945007166u, 10327773115955366529u, 9361051012845992410u, 181406u}, + {6764951709182064129u, 14056201790058773145u, 14138405659210517991u, 13622231632584866271u, 3455415u}, + {13994235330253804396u, 6100267572861915980u, 16271262577242946164u, 3018102525350734098u, 2833420u}, + {13878002310840923763u, 17871354197893362687u, 1670183314141577674u, 7402141968480082115u, 3168237u}, + {16000293778491292933u, 11275546249230197397u, 3012410622940790108u, 14974365630357082049u, 811751u}, + {6087539284501660232u, 4998159116211716394u, 10900580724877741590u, 10319210125346638280u, 2797532u}, + {9993231891208907230u, 13837431455266334446u, 12876749563979580640u, 267778149275006762u, 2735529u}, + {8382129349548215775u, 1542669049600096707u, 5489227641296364690u, 11291446273553746781u, 3299610u}, + {5516119613907047514u, 14979585296753961911u, 2977609626579672501u, 13175349187407383399u, 1406051u}, + {10647943380813449565u, 2907493561845860151u, 3073445513938851804u, 8312560390488645216u, 712474u}, + {17532424112347612693u, 5372116226072386606u, 10453828899225684285u, 11686473067994058161u, 1010745u}, + {2720915096716552204u, 11977787865941658494u, 13690658447313264211u, 8953786626728318692u, 2401478u}, + {15965090867940909875u, 1767243307208887572u, 5976876803325239457u, 17770467592348702749u, 1574353u}, + {9445635322637490872u, 7235178439029485563u, 1180724387911386594u, 2478999901932694270u, 3629012u}, + {8784659385441617853u, 298623020743601112u, 4828945536308766477u, 3381592783828105805u, 2047793u}, + {16851442944114390247u, 9363824900894580774u, 12183876956225307170u, 10269953470154293599u, 99161u}, + {2527534040988106475u, 6463768094179847511u, 38512663292365915u, 3316478533603731639u, 1458079u}, + {10879139225205765006u, 6764376103577753041u, 16868390899932708248u, 18185410511026568754u, 567344u}, + {1505177902433141259u, 7910103618104134260u, 16207247711010908612u, 1019271984286156286u, 3726447u}, + {17827379516609790882u, 8233586534983171714u, 14332098912834160608u, 6553924278546028961u, 2492929u}, + {13658040202392662726u, 2053237141024669218u, 6392760217081708029u, 1775368686721123421u, 196924u}, + {12201358372563990094u, 1115432354699780858u, 8551036275529134882u, 4182973062605160154u, 2494390u}, + {17432686608531432282u, 13141010120416301380u, 1117769286970557887u, 2712144357536327063u, 2732099u}, + {3076533310437682955u, 18031099079455942252u, 14699270436506123246u, 11147267815590084293u, 2330011u}, + {15974700552047774490u, 5963772425143157560u, 12182821369612758115u, 18057379637235179881u, 451467u}, + {1790377686543288661u, 6426878162853982158u, 6910160543243892166u, 13771328575508340843u, 2177990u}, + {4734889278235389514u, 13694823957905830050u, 15356410538565500739u, 12217910230306248425u, 3256310u}, + {4940127239235159513u, 1254247620377406056u, 6067971346679267373u, 14687759919111942388u, 2635702u}, + {3103493952278613044u, 8385308655597079418u, 13380102691846303119u, 985368857429387499u, 801635u}, + {15674995821493830130u, 15541051011237155763u, 15478287740408584126u, 5274991921439636341u, 671935u}, + {3049240077997597800u, 14428093997440117339u, 87314007649121234u, 8803421490881368141u, 2307363u}, + {12056940001640482681u, 1408180516870697591u, 492837031371849597u, 6527746806963082423u, 423470u}, + {17116795653091423947u, 8448008991283598490u, 14497479583997498540u, 4835670449781812302u, 888254u}, + {6535578620280622934u, 3484892416787575833u, 15549328126755432389u, 2033998032108101461u, 2854452u}, + {6213170825550943975u, 15254451580615560737u, 2536351564906480748u, 9492200166517246025u, 1703569u}, + {5663846414049160160u, 676877684958449268u, 12067187204354027971u, 11848870733067286977u, 839414u}, + {1287432585512013122u, 1314507364864117891u, 11574963001885200726u, 4122767327240651914u, 28257u}, + {17631769928639780226u, 13069627788091010666u, 750141028296522576u, 10520929983307536794u, 784775u}, + {4105580169528682595u, 11143015500950440272u, 12488135722670604709u, 14930398519952458148u, 1735330u}, + {15431793173864878523u, 2625199639248403524u, 2919223604103209523u, 16677315426085182132u, 3087401u}, + {16199380579055243385u, 6190740060462280094u, 8374308033667419079u, 13315549815755970593u, 947112u}, + {657285509703155795u, 16003702286386994438u, 11180637723027171516u, 16662775368750042232u, 2971865u}, + {4571935609895582618u, 10140246585327919918u, 6702183076670807580u, 8053214187949391101u, 128652u}, + {16744449868919279259u, 9991016847126731634u, 3392222189368185971u, 9802206007729984365u, 3865594u}, + {10623414147704413797u, 14825918928000665168u, 3679835260366254211u, 16140151103471002936u, 3779161u}, + {5864500637313506171u, 9593546609696871271u, 4900877694986104060u, 3240247369589324550u, 363295u}, + {18236992627519070814u, 3098764875834319937u, 2650045792406818072u, 5050733195783461201u, 370342u}, + {13919421988590745908u, 11376233249084909530u, 10109440601604888841u, 10455182744644029658u, 2101315u}, + {8526949797469687808u, 8234272554414658530u, 1807867592136634947u, 15891433118822575651u, 2950573u}, + {3772915267147399152u, 10446414254052827845u, 12227454176344899216u, 18284999772488998339u, 1685395u}, + {17891246297378127299u, 13845206726448170012u, 4332156227366192109u, 1760472325423379946u, 837549u}, + {2858533969077768263u, 17879436406746524723u, 12355797603676206867u, 10968204347577709958u, 696025u}, + {14683406164556521420u, 6143898332277122492u, 4450025369655573385u, 17306661975114812678u, 2495131u}, + {13665554554234091254u, 1589773042706453882u, 6419363160718790642u, 18420713539965664642u, 1677590u}, + {7950007068383239002u, 15134135955573371859u, 12196066363385447255u, 11992506702107365322u, 2155253u}, + {11096776499754033643u, 2916171537601982289u, 6574496522988937928u, 39757412497601434u, 0u}, + {12154593641719839759u, 11207416616133166218u, 9179126310283371106u, 39757412u, 0u}, + {12589633261743469429u, 3983554065613025059u, 733394813376155322u, 0u, 0u}, + {3783895972321119332u, 6938840960881362188u, 733394813u, 0u, 0u}, + {11280737333392521778u, 13528746427335915784u, 0u, 0u, 0u}, + {6196552509048235153u, 13528746427u, 0u, 0u, 0u}, + {9753650024953902562u, 13u, 0u, 0u, 0u}, + {249561322984u, 0u, 0u, 0u, 0u}, + {250u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2520096u}, + {14963224324489997650u, 11389384593919078847u, 3491509993308569406u, 3505252079773720074u, 1541451u}, + {2150130054507271957u, 8558766222609150583u, 15158702150640854473u, 5072466338259371261u, 3342151u}, + {16867228019297918990u, 13157031475575789394u, 16645184832145666244u, 5538028956107681925u, 3897532u}, + {16756010898447423213u, 14313449214631935868u, 4366226962259694685u, 11961399797119231732u, 3565201u}, + {16468343996428969880u, 11619903921274525778u, 4614389356244128853u, 12964075695168833708u, 239298u}, + {17421992076028196646u, 1029307467665349535u, 8327584793807119972u, 13551241961057878211u, 3494989u}, + {713661140445009190u, 9993577688815081172u, 2780485766891497572u, 12098089385508637345u, 3817107u}, + {8911506143382986336u, 5909873502785962737u, 17504710490947064944u, 9149670056807974566u, 1381814u}, + {7725748796886738781u, 5241177181355879934u, 3037920327560200971u, 2259275393540904963u, 74580u}, + {14191797396146604536u, 6819017129188920896u, 16609932464910726962u, 15205528102435087147u, 1896333u}, + {8082586438004890858u, 16609399708276230958u, 10693785543178790611u, 2124651411834968101u, 2811287u}, + {8771990215588977469u, 7956001396154068295u, 1270203940319661961u, 5816466616965632996u, 815134u}, + {11236234845003952833u, 6850357080173821364u, 11300282467881664258u, 15147131322065112338u, 926436u}, + {3228642794689798719u, 5156847854869912149u, 4169571328093083209u, 2539105534267280264u, 546737u}, + {8910748224524211486u, 17819719048616251099u, 7178684310028642175u, 6062923419239679897u, 2570453u}, + {11042549713965935253u, 13086402406659882352u, 5897091031579377135u, 11864861916927603861u, 952102u}, + {9590859228896611829u, 15189916504625425251u, 8122114205145049688u, 13348218090807597088u, 1170821u}, + {7440841085850424834u, 2166925612298891872u, 13654166044390525081u, 8668509133242695101u, 1062220u}, + {14806075191001333758u, 1349390712799872791u, 2955954632941601788u, 10107657674468395933u, 2564614u}, + {635172898126604777u, 18162618099463630960u, 8790097811146260064u, 11864754210433691726u, 269519u}, + {7340410748711222717u, 13997369941531684028u, 1396131319364683210u, 3535793867739225199u, 1189391u}, + {5143274482816113298u, 12818976172418430765u, 836210371572383057u, 6651239046405737457u, 492198u}, + {4757298662990189780u, 12614947880990965u, 5386992065803768347u, 9808912246349030036u, 2319842u}, + {18326186581611486296u, 1487111482462219172u, 18243732274116100543u, 6095631440660301383u, 1346540u}, + {3589185742865976949u, 17058584359052834618u, 5410614946778594553u, 3627718986757041100u, 2268873u}, + {7443447069830788370u, 16469644953357341706u, 4808879283015740227u, 5734403252190775542u, 3317410u}, + {3260038669695118684u, 9248552947342934648u, 15074865610852957477u, 17138845205980888887u, 3371879u}, + {16478633945712194314u, 15057979299746860754u, 3215181748209241781u, 11879645628319542399u, 133307u}, + {18267420819183949134u, 14107582095377503273u, 9533581914699679041u, 6055296991177826251u, 3835786u}, + {16222274116537733080u, 3909143131100059106u, 6138272657284596946u, 17724868308011159377u, 1916282u}, + {13606676791440815271u, 992928654413570212u, 17913436394067192u, 4719092793817240435u, 3655108u}, + {2683053335046956766u, 10097330810525471373u, 11165721271584405754u, 12461331021080466157u, 1147679u}, + {544784245870775740u, 8719334872089033464u, 10506627565587357069u, 9100427802032021861u, 2293199u}, + {17860891863182057957u, 10144273889656468846u, 1628505232878893292u, 10346538011587209320u, 2057165u}, + {12955120304882629778u, 9869684199642673606u, 6222787016095775007u, 13368602903635598881u, 2126747u}, + {11712667301647333050u, 11926379635504385298u, 7494396223279468402u, 39231570987132471u, 3631749u}, + {13867262577266153886u, 8683031534007069301u, 6622175540993423760u, 7200695754137047825u, 3505919u}, + {16428302919004761321u, 15330480708510465235u, 11604162864143297975u, 136730391774779407u, 2192523u}, + {16414024219315546785u, 13093741994702691568u, 231443469630765281u, 11065256798596426487u, 1961678u}, + {5847068617528413306u, 15115288688849558804u, 7220021227503664503u, 5584621324006734276u, 2881232u}, + {9342895507318156621u, 6490455760899253929u, 15281378499589268191u, 4808950561408847418u, 1418286u}, + {9251732974427051992u, 5196080629613649262u, 9815468154035989569u, 26162763674275786u, 735545u}, + {10209083075950703676u, 13233016562531765238u, 15083284783641763682u, 10389861951857482239u, 3514913u}, + {6052808062563118438u, 8281762315383401556u, 1046514188172317046u, 12746975261617533349u, 3318802u}, + {8654559827205954427u, 11174202705391720737u, 17336570704377495942u, 14760970287609589612u, 2562484u}, + {3911664279053078871u, 4307787690009944773u, 5031603216852328856u, 9991217478536001002u, 817376u}, + {5994008967297030077u, 11180710749620438989u, 18403959032577986225u, 10463429071374760616u, 3618886u}, + {5532166397295158923u, 17655373174764668267u, 14465575017249192112u, 10010704651571414703u, 2805129u}, + {11540327573144823602u, 7422231668005243183u, 7128802682589112677u, 2285530921943211468u, 3125999u}, + {7438460055861835045u, 3347890532008437999u, 10796433861495111305u, 6038444810961221594u, 1899061u}, + {17178131957961743799u, 4939116190252224819u, 14068486301533810770u, 14662723087985178753u, 1205444u}, + {6820302362678979166u, 12252181357377424741u, 13343936695945433854u, 4489807361977443856u, 3205165u}, + {11188964507961062043u, 18278424740519322061u, 18128362433926322010u, 13173606977861702988u, 1400907u}, + {1103436667525303789u, 7008678282203960970u, 12680636848510486583u, 12059460390407640516u, 239215u}, + {8140493447788539174u, 1638208843953013739u, 14710576623532464056u, 9732187945063324180u, 3549836u}, + {18229429833659724183u, 8586224302092155942u, 17222971517518238374u, 3812477815900081436u, 294787u}, + {4764282926977300820u, 13173167156239170472u, 9081465457776348550u, 10669961781771068961u, 1203416u}, + {892771209770276608u, 1086019272201853952u, 9935217455940083148u, 12271990104083918155u, 2168261u}, + {800563901267730685u, 6859784152735499991u, 3327385539637457871u, 8326620682385708290u, 2366053u}, + {11598561061761846662u, 2428655516711388638u, 2128753125735335226u, 17409526145623085964u, 386226u}, + {309682733622888150u, 11736890448633819222u, 16704028143376675539u, 12977491556413167170u, 1302107u}, + {14010516807499617018u, 786939054705287679u, 9946891762250854029u, 17966360563007133343u, 1058660u}, + {11012804196672894594u, 811569616057899195u, 16988121346925906563u, 11404628706040047804u, 1906887u}, + {2079176420364759115u, 7564185157533017843u, 14617701698647398652u, 12212909260280933675u, 2461530u}, + {5458597346919974974u, 5123677842727599396u, 16053577051913949770u, 838040760569874828u, 1086036u}, + {10645201696524484068u, 6196265656020829478u, 3112131835772018090u, 3190567966653705171u, 3201594u}, + {15697406630836735019u, 7948430675952387179u, 15683072709948397666u, 15839672082642710008u, 2121674u}, + {11416228514506732429u, 311158543285630822u, 15827955608743309983u, 12288928979573264841u, 3450973u}, + {3000909954753848868u, 1176712768811958718u, 778216663435051868u, 15267811570028005148u, 1728830u}, + {4533187267081688317u, 8600748603831512115u, 2735549361651364458u, 16388965146434404326u, 1804769u}, + {3400397599705217499u, 7070432954170676363u, 3594551553084988510u, 11058104016047104068u, 1029431u}, + {1650129642873998234u, 6307383310244388816u, 8793831561912584314u, 1171911165863493889u, 1892142u}, + {18358123260498433959u, 7737259728605307370u, 5115196565987732286u, 2412804463648649992u, 3853547u}, + {3090420130982272599u, 18102782217632167566u, 2763911530149577975u, 71085397697815685u, 2712461u}, + {14560191857171083507u, 13385476812278851867u, 14456762420116067272u, 13452748565002599777u, 2416532u}, + {12602915233476787774u, 12061357435333306567u, 3473807645155228676u, 909268289257813287u, 1584369u}, + {18143949618332935867u, 18237958892617252591u, 15534069430202589751u, 3992394122456623897u, 2594271u}, + {7163296031649987885u, 17069249692931290532u, 11750868057785972852u, 18062254366669224674u, 856298u}, + {13438521612961682289u, 11494091060468826864u, 5513773172982866292u, 13418508419173679804u, 3381726u}, + {9882434666227645667u, 4277479210201382418u, 5937066507828000125u, 14401843061015577190u, 1483149u}, + {9607296051469423088u, 4021281542576823239u, 14486153860429536637u, 15231511626430815804u, 2900689u}, + {13425809650469839804u, 16162466880312551937u, 18415001447502500143u, 11222435358730766191u, 3125297u}, + {8346178327434844325u, 3754230291009494723u, 4936277583447785162u, 16414725411745409071u, 1812781u}, + {7342867918073078480u, 9007785569808861075u, 7995061774761215787u, 16390513770193050158u, 2067762u}, + {230430591545871092u, 14680889001796450910u, 1137307266080717300u, 7099787708526793308u, 3766156u}, + {10158473170184582126u, 4692596477881595087u, 11117878553590733513u, 4248813777173273666u, 1586407u}, + {7382838251157310884u, 6319049526880856250u, 15195641541913897526u, 11270248718091313141u, 1316644u}, + {9399401685980977795u, 12483964033960731940u, 17878765979630344638u, 6653586457663804068u, 2138765u}, + {767078273127119160u, 10363572052043058205u, 15233290062057140987u, 9478998076210953482u, 1864299u}, + {11468947560145123042u, 17713988551791969060u, 10682706261290781588u, 4718133868474186559u, 728485u}, + {9084610695673868367u, 686866230399018487u, 3378859113687296925u, 3256029912781427291u, 1922903u}, + {2455299848502328669u, 16901385595581526110u, 13143093737763085854u, 14735220486512897174u, 1897088u}, + {4641908539183754976u, 2790239140906134899u, 6806689602301491055u, 13870053166838689704u, 3835805u}, + {10551908080765004373u, 8139345416357914332u, 8764058889124636621u, 13833758588265944409u, 1472557u}, + {1121348879658933032u, 8370478660838535452u, 8576749489612682477u, 7160865705701573768u, 2076725u}, + {1649140618411437576u, 6940645850048690747u, 5189278819097876289u, 10846947927436530574u, 3032613u}, + {3225537958267426217u, 6662934470020762032u, 16443117435152141482u, 8846968319359760663u, 2715464u}, + {12836646777410151078u, 9411131748456617032u, 4227080404498025084u, 13380746375313008113u, 232753u}, + {15218157897703452661u, 7734794693298486001u, 10704405063104756108u, 15496676266558640734u, 2952900u}, + {14635713780320535937u, 5281388650291270217u, 9694264555392470472u, 12520435174633466129u, 2451236u}, + {8671191807627342224u, 8895841836966106347u, 1816331087029685359u, 16114060806134628409u, 3557526u}, + {697384536380306856u, 7809653406461972748u, 8428140741519719451u, 11522782239802170276u, 3682576u}, + {15385276606221819872u, 4306874296112585745u, 10219737730036645342u, 8642785239040191649u, 2564264u}, + {2243823318582472044u, 9505764207281473512u, 13009423730211941453u, 7253061734181005588u, 2382083u}, + {11796140468076538419u, 2437082545452561427u, 426151455724944858u, 15824554777022613988u, 456811u}, + {8768348776682149012u, 16564738660752319653u, 108292792102484095u, 17878710012837738239u, 26543u}, + {6986366474568131461u, 121839414559272868u, 8601379684324597816u, 3315138975551343541u, 1146759u}, + {15016632599297165030u, 3936187943941014220u, 4666216170483899288u, 16954688572015427027u, 1083438u}, + {3303837482698787603u, 16699664899914867690u, 3673905850905659436u, 14071216757856367821u, 3155296u}, + {5883973787801388405u, 13297873167929455668u, 4281971814666628801u, 1211126456466863187u, 3351681u}, + {14886458500059134318u, 3586905369782015633u, 2522217473862407441u, 5754377531831148304u, 1005407u}, + {8651330862616710523u, 5102540913754620624u, 18312747222428248086u, 16303562743945007166u, 269475u}, + {9422060007462648586u, 18026784433318864602u, 6764951709182064128u, 14056201790058773145u, 2571167u}, + {4986416913205086633u, 2562356071631853926u, 13994235330253804395u, 6100267572861915980u, 58052u}, + {13652651452885911793u, 17164174925158542282u, 13878002310840923762u, 17871354197893362687u, 1873586u}, + {15007330244968471608u, 5623991146071014423u, 16000293778491292932u, 11275546249230197397u, 1419498u}, + {7463899004850198726u, 2896241610454369459u, 6087539284501660231u, 4998159116211716394u, 128662u}, + {15410180732058766289u, 11444448699724409754u, 9993231891208907229u, 13837431455266334446u, 1597006u}, + {9261087711795740879u, 1276011123678681474u, 8382129349548215774u, 1542669049600096707u, 3451196u}, + {15328714285769511135u, 1115025658555961766u, 5516119613907047513u, 14979585296753961911u, 1365541u}, + {7125274909668851658u, 9211997498872791051u, 10647943380813449564u, 2907493561845860151u, 2160504u}, + {17809149250697883319u, 14555171065384166755u, 17532424112347612692u, 5372116226072386606u, 879681u}, + {1178775353658319038u, 11685892924135550671u, 2720915096716552203u, 11977787865941658494u, 2052451u}, + {8872442636068082475u, 4158950597131511317u, 15965090867940909874u, 1767243307208887572u, 1594809u}, + {777519148192623790u, 14015063786189101696u, 9445635322637490871u, 7235178439029485563u, 563386u}, + {4759902213636253737u, 1700064768335267291u, 8784659385441617852u, 298623020743601112u, 3707715u}, + {14595946315881665349u, 4781357032295120577u, 16851442944114390246u, 9363824900894580774u, 2745320u}, + {864262754313457791u, 4113752138089899324u, 2527534040988106474u, 6463768094179847511u, 3416313u}, + {11717736565508395327u, 15414394094182263199u, 10879139225205765005u, 6764376103577753041u, 3026326u}, + {1951648397690962651u, 7360618304626221262u, 1505177902433141258u, 7910103618104134260u, 1031120u}, + {11580870912047404804u, 1726912946215693860u, 17827379516609790881u, 8233586534983171714u, 1931208u}, + {13689725541252266512u, 3569436734295110235u, 13658040202392662725u, 2053237141024669218u, 1873959u}, + {18300286291953268689u, 12209776626367144347u, 12201358372563990093u, 1115432354699780858u, 1438086u}, + {10716653309414535517u, 6339589541202254215u, 17432686608531432281u, 13141010120416301380u, 905339u}, + {2134866328770398121u, 4516241556358680171u, 3076533310437682954u, 18031099079455942252u, 2984250u}, + {659669349928542956u, 3403981119532262826u, 15974700552047774489u, 5963772425143157560u, 745513u}, + {15189603543185481713u, 13200275656044167529u, 1790377686543288660u, 6426878162853982158u, 210394u}, + {56911190582793378u, 16019699549664923915u, 4734889278235389513u, 13694823957905830050u, 1586649u}, + {8384141602689175680u, 17943171164074281059u, 4940127239235159512u, 1254247620377406056u, 1443493u}, + {13621365722994392862u, 321006864112955218u, 3103493952278613043u, 8385308655597079418u, 2638313u}, + {16304703775166674663u, 8706240791520124192u, 15674995821493830129u, 15541051011237155763u, 898542u}, + {15885989508942689067u, 11663697150181090484u, 3049240077997597799u, 14428093997440117339u, 2118868u}, + {12074149959701031660u, 14499499292283500970u, 12056940001640482680u, 1408180516870697591u, 936235u}, + {3624801935308207634u, 15391002120449532598u, 17116795653091423946u, 8448008991283598490u, 1416396u}, + {17064595767702521467u, 11059124913206412349u, 6535578620280622933u, 3484892416787575833u, 2726727u}, + {7894031736609437814u, 4189321500415139449u, 6213170825550943974u, 15254451580615560737u, 1537362u}, + {6167205082452575041u, 6195597956737981145u, 5663846414049160159u, 676877684958449268u, 947087u}, + {7135131420141039163u, 1767307274735145288u, 1287432585512013121u, 1314507364864117891u, 1474692u}, + {4543177621977861254u, 14278638223373505857u, 17631769928639780225u, 13069627788091010666u, 2501580u}, + {16913170929078625355u, 3457232728918042383u, 4105580169528682594u, 11143015500950440272u, 1687357u}, + {11300958575141676776u, 7665063744243187884u, 15431793173864878522u, 2625199639248403524u, 3569441u}, + {14122117369634058654u, 3816435857921876799u, 16199380579055243384u, 6190740060462280094u, 374939u}, + {11707328538378237465u, 4292123334774082280u, 657285509703155794u, 16003702286386994438u, 2828868u}, + {15006589384887660371u, 6902391818213759869u, 4571935609895582617u, 10140246585327919918u, 2551608u}, + {7514028806633014668u, 2359179064933838103u, 16744449868919279258u, 9991016847126731634u, 2933425u}, + {1316487592784093586u, 5766758452645896626u, 10623414147704413796u, 14825918928000665168u, 535953u}, + {16570810885058932117u, 17860190228046444546u, 5864500637313506170u, 9593546609696871271u, 15630u}, + {14240154511563228086u, 17350774806361648705u, 18236992627519070813u, 3098764875834319937u, 3425590u}, + {2734534748849016061u, 10330140635243459609u, 13919421988590745907u, 11376233249084909530u, 1068309u}, + {5675765515999334478u, 523782229561575093u, 8526949797469687807u, 8234272554414658530u, 3801251u}, + {5321402015758102567u, 1562508269730049146u, 3772915267147399151u, 10446414254052827845u, 550160u}, + {15841747306588348236u, 2796150661406838904u, 17891246297378127298u, 13845206726448170012u, 496189u}, + {2395554854148184037u, 13089954847163284877u, 2858533969077768262u, 17879436406746524723u, 1030145u}, + {15162723299945295059u, 15803542410279793803u, 14683406164556521419u, 6143898332277122492u, 244269u}, + {17895523702890258955u, 15296301315385865968u, 13665554554234091253u, 1589773042706453882u, 110654u}, + {9620843901732566630u, 9354653637460668449u, 7950007068383239001u, 15134135955573371859u, 1835975u}, + {7018882256051449234u, 9842126478754130139u, 11096776499754033642u, 2916171537601982289u, 2086522u}, + {10870410009040504977u, 15144015006933936003u, 12154593641719839758u, 11207416616133166218u, 1105148u}, + {10360926436841196830u, 4658237019430707470u, 12589633261743469428u, 3983554065613025059u, 1155322u}, + {2981206617418536144u, 11089880088956586909u, 3783895972321119331u, 6938840960881362188u, 2926063u}, + {14966027586934365539u, 3973297103941439736u, 11280737333392521777u, 13528746427335915784u, 0u}, + {11935096409705087177u, 14197144052036709039u, 6196552509048235152u, 13528746427u, 0u}, + {11562094221045896822u, 14394200723298427545u, 9753650024953902561u, 13u, 0u}, + {17510849428582451348u, 3284877568029259648u, 249561322983u, 0u, 0u}, + {13186658265229079375u, 10354581413377094956u, 249u, 0u, 0u}, + {1022822903734616835u, 4603593855767u, 0u, 0u, 0u}, + {10954705351568313214u, 4603u, 0u, 0u, 0u}, + {84921317676637u, 0u, 0u, 0u, 0u}, + {84922u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 232276u}, + {9544922693039852821u, 1552364644447806992u, 14963224324489997649u, 11389384593919078847u, 3034146u}, + {9776328400126259048u, 6025462508257812598u, 2150130054507271956u, 8558766222609150583u, 2306605u}, + {5483302470212491724u, 8259178512808727109u, 16867228019297918989u, 13157031475575789394u, 2496136u}, + {8984133506774760269u, 10278778692544647157u, 16756010898447423212u, 14313449214631935868u, 1010003u}, + {711310979918671876u, 12366333246139599659u, 16468343996428969879u, 11619903921274525778u, 1111369u}, + {3486462577459687906u, 4430361749226089078u, 17421992076028196645u, 1029307467665349535u, 2690432u}, + {16282967376193909194u, 8785892692841624351u, 713661140445009189u, 9993577688815081172u, 62384u}, + {18155917721994058177u, 5760074152230293081u, 8911506143382986335u, 5909873502785962737u, 2874784u}, + {14926920430885836099u, 9951000745102574766u, 7725748796886738780u, 5241177181355879934u, 2472159u}, + {871232617085010102u, 429175095381131753u, 14191797396146604535u, 6819017129188920896u, 1959862u}, + {3720251557601928204u, 11808711682540450296u, 8082586438004890857u, 16609399708276230958u, 1608199u}, + {1304449704976415327u, 9930744344590383691u, 8771990215588977468u, 7956001396154068295u, 264851u}, + {14716406502706588006u, 15733693700005017641u, 11236234845003952832u, 6850357080173821364u, 2209532u}, + {14920922136569364893u, 9597391742173090430u, 3228642794689798718u, 5156847854869912149u, 1165155u}, + {12791646436553066722u, 3870074933336855957u, 8910748224524211485u, 17819719048616251099u, 2384045u}, + {17817713452448379684u, 6678772620050949251u, 11042549713965935252u, 13086402406659882352u, 3134523u}, + {17410952088431076483u, 12453610396562511882u, 9590859228896611828u, 15189916504625425251u, 281772u}, + {9264565441563240549u, 16772655501891978160u, 7440841085850424833u, 2166925612298891872u, 2838117u}, + {4541602272163400480u, 11624369585326071969u, 14806075191001333757u, 1349390712799872791u, 222500u}, + {4962671798184348120u, 9200756580052450441u, 635172898126604776u, 18162618099463630960u, 986444u}, + {5977262349995137412u, 11137011450820458079u, 7340410748711222716u, 13997369941531684028u, 3511840u}, + {6358233769885502626u, 12906283022838949243u, 5143274482816113297u, 12818976172418430765u, 683857u}, + {12280936604627242613u, 1616770966225356924u, 4757298662990189779u, 12614947880990965u, 2491475u}, + {452801687520674807u, 9678579003117800038u, 18326186581611486295u, 1487111482462219172u, 2872711u}, + {10811973281346338795u, 10150237243359397359u, 3589185742865976948u, 17058584359052834618u, 2196241u}, + {12723698385604186871u, 17431371316734367513u, 7443447069830788369u, 16469644953357341706u, 1365059u}, + {16738697647313281259u, 13820322241698389553u, 3260038669695118683u, 9248552947342934648u, 3794693u}, + {11632880175137960754u, 9460592539220848u, 16478633945712194313u, 15057979299746860754u, 3054807u}, + {13471095542199409412u, 6883250715963709074u, 18267420819183949133u, 14107582095377503273u, 977573u}, + {7692936046682662883u, 6715806306466504330u, 16222274116537733079u, 3909143131100059106u, 3045520u}, + {16029376669205164190u, 4593709580809643883u, 13606676791440815270u, 992928654413570212u, 502400u}, + {18323506465437095041u, 2404943756018318555u, 2683053335046956765u, 10097330810525471373u, 19840u}, + {14401493444780146220u, 4355877144002481833u, 544784245870775739u, 8719334872089033464u, 3047189u}, + {2079667217826273479u, 11592870097196467918u, 17860891863182057956u, 10144273889656468846u, 3786652u}, + {7616453694539322207u, 2975430389678679132u, 12955120304882629777u, 9869684199642673606u, 1999085u}, + {1650601016741369829u, 10680569507326631918u, 11712667301647333049u, 11926379635504385298u, 1958082u}, + {10639869144833147929u, 17599337721152748404u, 13867262577266153885u, 8683031534007069301u, 2942024u}, + {2612618350544432823u, 13933217717550008016u, 16428302919004761320u, 15330480708510465235u, 2781925u}, + {10242335059498393447u, 1209440128772621914u, 16414024219315546784u, 13093741994702691568u, 2995191u}, + {10535138501816158940u, 18052514427675119816u, 5847068617528413305u, 15115288688849558804u, 285811u}, + {1799442558715500074u, 1440531811509035401u, 9342895507318156620u, 6490455760899253929u, 430095u}, + {5643764103445170958u, 13662105147423385804u, 9251732974427051991u, 5196080629613649262u, 2519515u}, + {10089708104016215972u, 4112207656429587959u, 10209083075950703675u, 13233016562531765238u, 3642734u}, + {7320423471154220666u, 16531768888978224051u, 6052808062563118437u, 8281762315383401556u, 285992u}, + {17165555189095180926u, 9787054469368948472u, 8654559827205954426u, 11174202705391720737u, 3056888u}, + {17218036130489784097u, 10077905401685801049u, 3911664279053078870u, 4307787690009944773u, 638794u}, + {15616310378583196795u, 12447975473049448607u, 5994008967297030076u, 11180710749620438989u, 68447u}, + {16212878781301512743u, 6288774203306884991u, 5532166397295158922u, 17655373174764668267u, 16234u}, + {7751752773480450152u, 18330623633835243415u, 11540327573144823601u, 7422231668005243183u, 1802009u}, + {13935503222399667535u, 1347948488724911905u, 7438460055861835044u, 3347890532008437999u, 2125025u}, + {3410470084774101080u, 4378848043236993754u, 17178131957961743798u, 4939116190252224819u, 129582u}, + {18064661426381246776u, 4711163668892065003u, 6820302362678979165u, 12252181357377424741u, 2594140u}, + {13765107632437692971u, 11812897585094156893u, 11188964507961062042u, 18278424740519322061u, 1034960u}, + {2805597435717025667u, 12849344823641577559u, 1103436667525303788u, 7008678282203960970u, 2869979u}, + {6004792822095989395u, 2508955177331242894u, 8140493447788539173u, 1638208843953013739u, 616402u}, + {12101260354821714805u, 8192064550432325633u, 18229429833659724182u, 8586224302092155942u, 3181322u}, + {16655635499901791269u, 4343309622859857268u, 4764282926977300819u, 13173167156239170472u, 279472u}, + {3962894049740082573u, 8788301948211063135u, 892771209770276607u, 1086019272201853952u, 775894u}, + {3488522491728493974u, 4930901454728243751u, 800563901267730684u, 6859784152735499991u, 2751429u}, + {17898034145510537427u, 13428063192283209933u, 11598561061761846661u, 2428655516711388638u, 3445606u}, + {17733519418549352617u, 8501145218542683003u, 309682733622888149u, 11736890448633819222u, 3597551u}, + {9773208897871294825u, 13587782355614051963u, 14010516807499617017u, 786939054705287679u, 1026527u}, + {11262553553644895881u, 12548390161903866842u, 11012804196672894593u, 811569616057899195u, 3805299u}, + {10062568927712370603u, 6189787591201968698u, 2079176420364759114u, 7564185157533017843u, 411382u}, + {4069141496733943873u, 10836274068495337828u, 5458597346919974973u, 5123677842727599396u, 3868984u}, + {9137455149808994351u, 18156754128817155007u, 10645201696524484067u, 6196265656020829478u, 1197790u}, + {17470119716219336388u, 5528540037827429817u, 15697406630836735018u, 7948430675952387179u, 1242938u}, + {15834131303745073842u, 17793065440709560719u, 11416228514506732428u, 311158543285630822u, 1289727u}, + {13604115737339198992u, 16468391516278758297u, 3000909954753848867u, 1176712768811958718u, 1403766u}, + {1383821498263665501u, 6618331174715481688u, 4533187267081688316u, 8600748603831512115u, 476438u}, + {2629292500830563829u, 2456919709973393804u, 3400397599705217498u, 7070432954170676363u, 2080184u}, + {14938873665711301709u, 1185351067612788814u, 1650129642873998233u, 6307383310244388816u, 1468940u}, + {14056597526694697359u, 13563919123655673072u, 18358123260498433958u, 7737259728605307370u, 885040u}, + {6503505890488764516u, 17075452203037850789u, 3090420130982272598u, 18102782217632167566u, 2971901u}, + {9670531246967497697u, 7649073603589481855u, 14560191857171083506u, 13385476812278851867u, 1503746u}, + {2369010555103966218u, 17149287799035221774u, 12602915233476787773u, 12061357435333306567u, 400482u}, + {14378505889570988636u, 10613737041508415916u, 18143949618332935866u, 18237958892617252591u, 3450879u}, + {13521342631127412574u, 9928826195606392509u, 7163296031649987884u, 17069249692931290532u, 2002174u}, + {8278595286415432801u, 11064226871326654865u, 13438521612961682288u, 11494091060468826864u, 1413862u}, + {2456195215760162974u, 17020766200542348065u, 9882434666227645666u, 4277479210201382418u, 3150359u}, + {5260173800970004408u, 4203014247801534231u, 9607296051469423087u, 4021281542576823239u, 1169085u}, + {10439731290848729301u, 6239889198015204958u, 13425809650469839803u, 16162466880312551937u, 392231u}, + {2233492196171701620u, 14752199389251032795u, 8346178327434844324u, 3754230291009494723u, 31784u}, + {18293516768143841707u, 5827034935293705838u, 7342867918073078479u, 9007785569808861075u, 2883837u}, + {15807292712340517172u, 10689193695074089005u, 230430591545871091u, 14680889001796450910u, 479914u}, + {4545609151326610423u, 4311676207835441515u, 10158473170184582125u, 4692596477881595087u, 2712611u}, + {6676866223513441883u, 12340213849602489240u, 7382838251157310883u, 6319049526880856250u, 975796u}, + {13550819266076963760u, 8751686202239322029u, 9399401685980977794u, 12483964033960731940u, 3216616u}, + {7724052217580104689u, 14970376394173478076u, 767078273127119159u, 10363572052043058205u, 3245993u}, + {15515763568163615693u, 1395021145146373731u, 11468947560145123041u, 17713988551791969060u, 2078842u}, + {17599222802772363255u, 13461289261258710457u, 9084610695673868366u, 686866230399018487u, 2163449u}, + {1564565947319935726u, 4516963882638074136u, 2455299848502328668u, 16901385595581526110u, 2821666u}, + {5735508154757405484u, 13747032484475650754u, 4641908539183754975u, 2790239140906134899u, 3734799u}, + {13975459956404978154u, 8501349940827382324u, 10551908080765004372u, 8139345416357914332u, 639557u}, + {5538855176230992922u, 8104205795007902112u, 1121348879658933031u, 8370478660838535452u, 1253165u}, + {15340020180809590741u, 7527778744508757145u, 1649140618411437575u, 6940645850048690747u, 1823401u}, + {4220712329086266262u, 3073533472564764369u, 3225537958267426216u, 6662934470020762032u, 2365974u}, + {13561469251504093117u, 17632653695487708463u, 12836646777410151077u, 9411131748456617032u, 1335310u}, + {7000082777278187558u, 14723935631415452844u, 15218157897703452660u, 7734794693298486001u, 1148402u}, + {3699882871838773088u, 11785137588012493342u, 14635713780320535936u, 5281388650291270217u, 1775802u}, + {17489624836796702747u, 17073279211700674415u, 8671191807627342223u, 8895841836966106347u, 1487159u}, + {8466510980990509049u, 17519656463116747489u, 697384536380306855u, 7809653406461972748u, 3007373u}, + {3373143314032886446u, 12225260726612371432u, 15385276606221819871u, 4306874296112585745u, 3589760u}, + {11919781468460351465u, 5191362991232067452u, 2243823318582472043u, 9505764207281473512u, 3208259u}, + {7483852863273925645u, 3705628791001340868u, 11796140468076538418u, 2437082545452561427u, 3445032u}, + {17995993093598852422u, 18305461239317890046u, 8768348776682149011u, 16564738660752319653u, 2698677u}, + {10937539105207650401u, 14836752635322622885u, 6986366474568131460u, 121839414559272868u, 2443676u}, + {7918887463743107761u, 13658677755770711393u, 15016632599297165029u, 3936187943941014220u, 2946898u}, + {6704454107412203926u, 10706638530521821917u, 3303837482698787602u, 16699664899914867690u, 2129148u}, + {137169940296326113u, 8293547863858740262u, 5883973787801388404u, 13297873167929455668u, 3040279u}, + {14670173851142483687u, 3475073583697560585u, 14886458500059134317u, 3586905369782015633u, 3171797u}, + {15267496022405125145u, 18134139593813207329u, 8651330862616710522u, 5102540913754620624u, 671442u}, + {20207630190249667u, 5151778258160381509u, 9422060007462648585u, 18026784433318864602u, 2186850u}, + {18135786958391099935u, 5893716603552555542u, 4986416913205086632u, 2562356071631853926u, 784287u}, + {3608077311535880310u, 13512662839260132585u, 13652651452885911792u, 17164174925158542282u, 189670u}, + {4813776910211516553u, 17528078228329262844u, 15007330244968471607u, 5623991146071014423u, 755572u}, + {7266470521045224144u, 11689000889890228640u, 7463899004850198725u, 2896241610454369459u, 3217307u}, + {6960539758537718747u, 15487212310393831153u, 15410180732058766288u, 11444448699724409754u, 2766451u}, + {1976503720366122831u, 116056008726501173u, 9261087711795740878u, 1276011123678681474u, 1851912u}, + {14327278376995330765u, 8035525938998529052u, 15328714285769511134u, 1115025658555961766u, 3289635u}, + {4206703483242323876u, 10368611402927652380u, 7125274909668851657u, 9211997498872791051u, 3881154u}, + {17582003733547931211u, 5562436697037979488u, 17809149250697883318u, 14555171065384166755u, 681024u}, + {7750439385118271058u, 17712938908806295558u, 1178775353658319037u, 11685892924135550671u, 2800913u}, + {5588816958844505806u, 14206071920973144793u, 8872442636068082474u, 4158950597131511317u, 1945630u}, + {1107077827844377621u, 15179051428825912061u, 777519148192623789u, 14015063786189101696u, 2316945u}, + {5330319167274646076u, 16042883290468329336u, 4759902213636253736u, 1700064768335267291u, 1385384u}, + {7662122117625816156u, 11381735114129476261u, 14595946315881665348u, 4781357032295120577u, 350700u}, + {7368292585130470229u, 17791644493866757949u, 864262754313457790u, 4113752138089899324u, 3584728u}, + {4374730606852877363u, 944645643848710131u, 11717736565508395326u, 15414394094182263199u, 582417u}, + {6552547712071731083u, 5676875952862450466u, 1951648397690962650u, 7360618304626221262u, 3772388u}, + {4786671581008727391u, 14659608520907460701u, 11580870912047404803u, 1726912946215693860u, 2093303u}, + {12393776996761528386u, 5850601296391321502u, 13689725541252266511u, 3569436734295110235u, 1737067u}, + {8423179408044820809u, 3023344307481600921u, 18300286291953268688u, 12209776626367144347u, 3826087u}, + {4574016170585317995u, 9913946417056847145u, 10716653309414535516u, 6339589541202254215u, 2638445u}, + {12713768312563911172u, 3424137697711869376u, 2134866328770398120u, 4516241556358680171u, 936436u}, + {4459480617623405400u, 10950269004253621229u, 659669349928542955u, 3403981119532262826u, 744627u}, + {4973813262587865560u, 4527138753669974667u, 15189603543185481712u, 13200275656044167529u, 1242152u}, + {3354091697728302240u, 2926610779273970281u, 56911190582793377u, 16019699549664923915u, 45007u}, + {16817860143035544330u, 16253245594200871017u, 8384141602689175679u, 17943171164074281059u, 1776816u}, + {9161562935686482905u, 10094447950175204910u, 13621365722994392861u, 321006864112955218u, 3216259u}, + {9805768185799430870u, 8691889123723754805u, 16304703775166674662u, 8706240791520124192u, 3384039u}, + {5816610619930989147u, 11959387924577436841u, 15885989508942689066u, 11663697150181090484u, 863181u}, + {13546870389229220u, 736260222700362536u, 12074149959701031659u, 14499499292283500970u, 2316646u}, + {5802471605081383156u, 1822460008790171025u, 3624801935308207633u, 15391002120449532598u, 1860112u}, + {6085636086824265296u, 214518535267945765u, 17064595767702521466u, 11059124913206412349u, 541073u}, + {16616501906925412905u, 17984832769271435666u, 7894031736609437813u, 4189321500415139449u, 3832788u}, + {9408822078478203445u, 3002331670334957991u, 6167205082452575040u, 6195597956737981145u, 2055919u}, + {17484768054598707187u, 18322476183306789289u, 7135131420141039162u, 1767307274735145288u, 609029u}, + {806720278886655134u, 5369123995131172802u, 4543177621977861253u, 14278638223373505857u, 3823211u}, + {13562682619575037460u, 16354539841192104059u, 16913170929078625354u, 3457232728918042383u, 1461438u}, + {6515762995115322584u, 16723818378047060073u, 11300958575141676775u, 7665063744243187884u, 3764402u}, + {10365331920799721279u, 17835910247072062412u, 14122117369634058653u, 3816435857921876799u, 2207722u}, + {15480284726567000931u, 8291425370168146883u, 11707328538378237464u, 4292123334774082280u, 3085660u}, + {7864949151720838506u, 7941745836249651584u, 15006589384887660370u, 6902391818213759869u, 2891353u}, + {7499653971257751456u, 16057865673427458420u, 7514028806633014667u, 2359179064933838103u, 116602u}, + {7297857584985541712u, 12750972934980726962u, 1316487592784093585u, 5766758452645896626u, 3359102u}, + {2502064169170092569u, 3128820767853595668u, 16570810885058932116u, 17860190228046444546u, 3087386u}, + {17220846440392434580u, 404213692348170958u, 14240154511563228085u, 17350774806361648705u, 1404295u}, + {13878576118488691683u, 2340686787797576510u, 2734534748849016060u, 10330140635243459609u, 1050541u}, + {1842588278962235467u, 8797102832465774906u, 5675765515999334477u, 523782229561575093u, 2672493u}, + {15965193504746609177u, 8882376104689638104u, 5321402015758102566u, 1562508269730049146u, 3142131u}, + {17142978246114881913u, 1702177708609014522u, 15841747306588348235u, 2796150661406838904u, 2576624u}, + {1465402172128276280u, 8260851240791302218u, 2395554854148184036u, 13089954847163284877u, 1243000u}, + {11680170398992723749u, 6118845301469942394u, 15162723299945295058u, 15803542410279793803u, 1089155u}, + {2698872486074812589u, 6624048455990420643u, 17895523702890258954u, 15296301315385865968u, 3210539u}, + {10262489289630051912u, 16303196005095748671u, 9620843901732566629u, 9354653637460668449u, 2292745u}, + {13644362985561529068u, 2498001522600869417u, 7018882256051449233u, 9842126478754130139u, 646198u}, + {5110149098937839008u, 10323686104639295353u, 10870410009040504976u, 15144015006933936003u, 2523534u}, + {17673482411138243579u, 17305652992909694743u, 10360926436841196829u, 4658237019430707470u, 3527354u}, + {2605674763301028855u, 17619145177481394553u, 2981206617418536143u, 11089880088956586909u, 549117u}, + {16100207125399815462u, 9481911270787608709u, 14966027586934365538u, 3973297103941439736u, 97471u}, + {10063063213057479222u, 5877256080083627532u, 11935096409705087176u, 14197144052036709039u, 2967434u}, + {5070707355536033821u, 8173163927588983361u, 11562094221045896821u, 14394200723298427545u, 2292319u}, + {9610706462255299125u, 10628386846379821812u, 17510849428582451347u, 3284877568029259648u, 2729233u}, + {7597564937115157671u, 2972430191811303686u, 13186658265229079374u, 10354581413377094956u, 249u}, + {11400071427547842235u, 17136671328216805451u, 1022822903734616834u, 4603593855767u, 0u}, + {6334168226776726517u, 16240260889917215192u, 10954705351568313213u, 4603u, 0u}, + {12411880097987385448u, 11702645096643506866u, 84921317676636u, 0u, 0u}, + {1526479927321040816u, 5860099614191631495u, 84921u, 0u, 0u}, + {450355693842276464u, 1566521813583103u, 0u, 0u, 0u}, + {15007959284185833419u, 1566521u, 0u, 0u, 0u}, + {28897226981050845u, 0u, 0u, 0u, 0u}, + {28897227u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2122606u}, + {5167430634414177797u, 4533736276077900105u, 9544922693039852820u, 1552364644447806992u, 2422227u}, + {5735036825602442819u, 7378409938596983348u, 9776328400126259047u, 6025462508257812598u, 2418464u}, + {16817670273079738766u, 7619261607880732773u, 5483302470212491723u, 8259178512808727109u, 2526209u}, + {406918755034733307u, 9226534049352988u, 8984133506774760268u, 10278778692544647157u, 2411518u}, + {3256086373953821803u, 17116110104693699211u, 711310979918671875u, 12366333246139599659u, 1889141u}, + {3653470841558579379u, 5780658328870040771u, 3486462577459687905u, 4430361749226089078u, 3627947u}, + {8707367374406657761u, 10361513739189263914u, 16282967376193909193u, 8785892692841624351u, 3660495u}, + {14935929829689629570u, 12996489906426900452u, 18155917721994058176u, 5760074152230293081u, 382331u}, + {322622131803784188u, 15226145633195117205u, 14926920430885836098u, 9951000745102574766u, 3734378u}, + {10688219812163048781u, 15174150056158624850u, 871232617085010101u, 429175095381131753u, 3432793u}, + {4192187921159104002u, 4496385711233228609u, 3720251557601928203u, 11808711682540450296u, 3190479u}, + {15560987399488672923u, 264414951519407696u, 1304449704976415326u, 9930744344590383691u, 1362744u}, + {1357407957869529856u, 9922600409132193446u, 14716406502706588005u, 15733693700005017641u, 744398u}, + {10241843157365713516u, 1071190429452522086u, 14920922136569364892u, 9597391742173090430u, 2765932u}, + {4394248906716635201u, 9941259623610919462u, 12791646436553066721u, 3870074933336855957u, 2681989u}, + {11971275297308800239u, 16165051865373067085u, 17817713452448379683u, 6678772620050949251u, 3236572u}, + {14627101877709353885u, 9555194501941188743u, 17410952088431076482u, 12453610396562511882u, 2997476u}, + {15308110698404485407u, 13386116887303877799u, 9264565441563240548u, 16772655501891978160u, 1252087u}, + {9153611612717713548u, 96952041953838074u, 4541602272163400479u, 11624369585326071969u, 2680263u}, + {10845037307911842015u, 8141384000245701023u, 4962671798184348119u, 9200756580052450441u, 2176100u}, + {2769760611043566469u, 5630174577895451309u, 5977262349995137411u, 11137011450820458079u, 432254u}, + {14858079306438907492u, 5248926934962707497u, 6358233769885502625u, 12906283022838949243u, 1707829u}, + {1909055200806503364u, 14772490917421615481u, 12280936604627242612u, 1616770966225356924u, 1239319u}, + {10768390913020325753u, 5195899214167719485u, 452801687520674806u, 9678579003117800038u, 3370463u}, + {5964425561747867229u, 2528317056725003567u, 10811973281346338794u, 10150237243359397359u, 3550282u}, + {11890329381016804969u, 9506557784432967257u, 12723698385604186870u, 17431371316734367513u, 3107419u}, + {15440912237348745683u, 1210658753152959381u, 16738697647313281258u, 13820322241698389553u, 512859u}, + {11880093181526325772u, 7398280878670570196u, 11632880175137960753u, 9460592539220848u, 2048019u}, + {13294287263635907403u, 16143793244663735094u, 13471095542199409411u, 6883250715963709074u, 783339u}, + {12539815469328868972u, 68337436857632101u, 7692936046682662882u, 6715806306466504330u, 2931745u}, + {10216497028596194850u, 4259021233563645u, 16029376669205164189u, 4593709580809643883u, 1466012u}, + {11150272244301722040u, 18176731499095109635u, 18323506465437095040u, 2404943756018318555u, 1757573u}, + {15038187236529574863u, 8365344038109748554u, 14401493444780146219u, 4355877144002481833u, 3450747u}, + {6129864470819708792u, 14261103677392278006u, 2079667217826273478u, 11592870097196467918u, 1142154u}, + {6482278955901996848u, 5951753260804495963u, 7616453694539322206u, 2975430389678679132u, 869833u}, + {4111473395048651834u, 1306146918343162750u, 1650601016741369828u, 10680569507326631918u, 937009u}, + {944943139256959821u, 804728512410163356u, 10639869144833147928u, 17599337721152748404u, 1414995u}, + {9286215446279340815u, 1880673450596456748u, 2612618350544432822u, 13933217717550008016u, 3063880u}, + {7467700891529419540u, 15236936045025217151u, 10242335059498393446u, 1209440128772621914u, 2066268u}, + {7791255360364476845u, 16286126355973517274u, 10535138501816158939u, 18052514427675119816u, 3872635u}, + {13403879329195489881u, 15209122003376098573u, 1799442558715500073u, 1440531811509035401u, 2342954u}, + {1971130190260790809u, 3688225663044616373u, 5643764103445170957u, 13662105147423385804u, 266973u}, + {17195820867428087349u, 10733660639436112882u, 10089708104016215971u, 4112207656429587959u, 1657737u}, + {11663999408572318292u, 1720025839242072660u, 7320423471154220665u, 16531768888978224051u, 3213535u}, + {4161454797957856095u, 13882909667445899150u, 17165555189095180925u, 9787054469368948472u, 3355596u}, + {14607703587426269674u, 16831168151247970433u, 17218036130489784096u, 10077905401685801049u, 2931102u}, + {4666626063143541018u, 3640165974949801478u, 15616310378583196794u, 12447975473049448607u, 1071382u}, + {8387820238555325638u, 9502801438155598552u, 16212878781301512742u, 6288774203306884991u, 1517598u}, + {17503937043022132849u, 14036328386444385664u, 7751752773480450151u, 18330623633835243415u, 2759933u}, + {13393035125256536224u, 9139462220871633060u, 13935503222399667534u, 1347948488724911905u, 3002828u}, + {14505072811714013624u, 16971992970393207212u, 3410470084774101079u, 4378848043236993754u, 1486444u}, + {4711824625858450786u, 3988370682275943641u, 18064661426381246775u, 4711163668892065003u, 3659711u}, + {11038337321970803783u, 13886539952054461885u, 13765107632437692970u, 11812897585094156893u, 1251878u}, + {534702887228848572u, 820814196503295561u, 2805597435717025666u, 12849344823641577559u, 3198232u}, + {9440814748705528890u, 17637979821651391346u, 6004792822095989394u, 2508955177331242894u, 2686459u}, + {12035042818926104502u, 7417074290386233966u, 12101260354821714804u, 8192064550432325633u, 1076286u}, + {3604367148693079115u, 10887640024720048754u, 16655635499901791268u, 4343309622859857268u, 3758553u}, + {10614248021221081095u, 7620710141968350902u, 3962894049740082572u, 8788301948211063135u, 1679703u}, + {10433694322503520965u, 6357417632230897285u, 3488522491728493973u, 4930901454728243751u, 1374264u}, + {2369072057311871041u, 8131582550403529928u, 17898034145510537426u, 13428063192283209933u, 3816755u}, + {5575994584764014822u, 990303022871534109u, 17733519418549352616u, 8501145218542683003u, 2220157u}, + {4369823475989067443u, 6368813212432488684u, 9773208897871294824u, 13587782355614051963u, 562093u}, + {15260322202461717641u, 14902284109858761755u, 11262553553644895880u, 12548390161903866842u, 3517807u}, + {1744782702481225750u, 12400077436975284190u, 10062568927712370602u, 6189787591201968698u, 1498094u}, + {17242199984746509669u, 13515033510634382127u, 4069141496733943872u, 10836274068495337828u, 3810863u}, + {801070077827797976u, 12379987160404332813u, 9137455149808994350u, 18156754128817155007u, 2827755u}, + {9243499003413509272u, 6163000797262970951u, 17470119716219336387u, 5528540037827429817u, 3626510u}, + {17049935500169798974u, 9695040882075408272u, 15834131303745073841u, 17793065440709560719u, 2128292u}, + {10701617090368542964u, 15822858859601432574u, 13604115737339198991u, 16468391516278758297u, 3311701u}, + {7631391433790304305u, 1770953836730897095u, 1383821498263665500u, 6618331174715481688u, 377384u}, + {4314820489198491195u, 16871104583739088760u, 2629292500830563828u, 2456919709973393804u, 1758010u}, + {9890229070557873483u, 16323775682646781091u, 14938873665711301708u, 1185351067612788814u, 926529u}, + {4504923412508942616u, 2653404697671121537u, 14056597526694697358u, 13563919123655673072u, 3787118u}, + {7041834722929706296u, 17207224663743473174u, 6503505890488764515u, 17075452203037850789u, 594610u}, + {11929670956094399302u, 3771283716654586628u, 9670531246967497696u, 7649073603589481855u, 3883504u}, + {7608577793220079357u, 878935708000137464u, 2369010555103966217u, 17149287799035221774u, 1153087u}, + {17359253768236540572u, 7511840197001479794u, 14378505889570988635u, 10613737041508415916u, 3086496u}, + {12594515751169558999u, 17616770961044830895u, 13521342631127412573u, 9928826195606392509u, 2136690u}, + {13315527786260746910u, 10230153969967656765u, 8278595286415432800u, 11064226871326654865u, 822584u}, + {13913240332156228406u, 3740389932806350494u, 2456195215760162973u, 17020766200542348065u, 1283358u}, + {14674057863776761773u, 611237683222959163u, 5260173800970004407u, 4203014247801534231u, 2327571u}, + {10756975822298099913u, 10371222144745372163u, 10439731290848729300u, 6239889198015204958u, 2843331u}, + {11393011437475130779u, 15056995554454823095u, 2233492196171701619u, 14752199389251032795u, 3384196u}, + {763336150171192118u, 12350053021595331935u, 18293516768143841706u, 5827034935293705838u, 1337351u}, + {15448916748090680943u, 8933185764778981661u, 15807292712340517171u, 10689193695074089005u, 3267685u}, + {7655159680894953172u, 11394528200736057415u, 4545609151326610422u, 4311676207835441515u, 995583u}, + {10369534200919573443u, 11701646182159438731u, 6676866223513441882u, 12340213849602489240u, 1773609u}, + {17013711482384338135u, 2403950664212302929u, 13550819266076963759u, 8751686202239322029u, 2951980u}, + {9479519428452089687u, 6496860310156355271u, 7724052217580104688u, 14970376394173478076u, 1405497u}, + {1766442642230843846u, 11865852193923649702u, 15515763568163615692u, 1395021145146373731u, 3175453u}, + {12470224008978310644u, 16734970278901157240u, 17599222802772363254u, 13461289261258710457u, 2677602u}, + {10507754054212209029u, 2653015877610730483u, 1564565947319935725u, 4516963882638074136u, 3040624u}, + {1715569400795863028u, 15434908108063344899u, 5735508154757405483u, 13747032484475650754u, 3827853u}, + {1172946166437446970u, 8046615786366357934u, 13975459956404978153u, 8501349940827382324u, 1829876u}, + {7027984848806955698u, 2864284860825325220u, 5538855176230992921u, 8104205795007902112u, 1831703u}, + {10064036583329794378u, 14738865156921747508u, 15340020180809590740u, 7527778744508757145u, 2554083u}, + {12897794420439063599u, 296289920950333193u, 4220712329086266261u, 3073533472564764369u, 2743072u}, + {7641171659886689481u, 1927120230290050331u, 13561469251504093116u, 17632653695487708463u, 1311149u}, + {6938842753873154933u, 4518387332557096976u, 7000082777278187557u, 14723935631415452844u, 2154838u}, + {1215839666232298269u, 6412228236880602856u, 3699882871838773087u, 11785137588012493342u, 3669320u}, + {9711069271500637446u, 9294275406081495900u, 17489624836796702746u, 17073279211700674415u, 523729u}, + {16805737594823322566u, 16001569310920030821u, 8466510980990509048u, 17519656463116747489u, 2576461u}, + {4254325175946357977u, 6097358910648485053u, 3373143314032886445u, 12225260726612371432u, 174351u}, + {10887003848694429619u, 11737397866891758144u, 11919781468460351464u, 5191362991232067452u, 1663789u}, + {8647409800250204096u, 15091662817106626357u, 7483852863273925644u, 3705628791001340868u, 153542u}, + {14911028994079685168u, 987739854742572433u, 17995993093598852421u, 18305461239317890046u, 3520721u}, + {3171359847291341492u, 12065029007535768538u, 10937539105207650400u, 14836752635322622885u, 2157154u}, + {5077346073582041491u, 611302679426969917u, 7918887463743107760u, 13658677755770711393u, 2283037u}, + {18224893149039553124u, 5418559886478479441u, 6704454107412203925u, 10706638530521821917u, 375380u}, + {12284680678351566525u, 1846981676198022417u, 137169940296326112u, 8293547863858740262u, 884116u}, + {4261581899182969514u, 17751715031044934290u, 14670173851142483686u, 3475073583697560585u, 2584927u}, + {12315991153208045814u, 395918021693677299u, 15267496022405125144u, 18134139593813207329u, 1934708u}, + {16935317396810059773u, 12723340231651940539u, 20207630190249666u, 5151778258160381509u, 3092767u}, + {9147576798914694314u, 2174077228042252055u, 18135786958391099934u, 5893716603552555542u, 2054170u}, + {474281866396737572u, 1356339767320287459u, 3608077311535880309u, 13512662839260132585u, 980274u}, + {9672071876109821747u, 5786865605597585550u, 4813776910211516552u, 17528078228329262844u, 849507u}, + {11485251262631062989u, 4977386232221631424u, 7266470521045224143u, 11689000889890228640u, 3625961u}, + {1691371055131188415u, 17449062975060056901u, 6960539758537718746u, 15487212310393831153u, 2385158u}, + {7602581576586899798u, 5164757091457661751u, 1976503720366122830u, 116056008726501173u, 2012984u}, + {17379315543194651252u, 1175299291900909271u, 14327278376995330764u, 8035525938998529052u, 3489800u}, + {17548468949500344834u, 14831691292787236879u, 4206703483242323875u, 10368611402927652380u, 759047u}, + {5547014746556869934u, 2925882124740867219u, 17582003733547931210u, 5562436697037979488u, 3189092u}, + {15280315061567156429u, 11839521935051157008u, 7750439385118271057u, 17712938908806295558u, 581451u}, + {14885409480013491877u, 10885339591029296301u, 5588816958844505805u, 14206071920973144793u, 2545526u}, + {9073567611090836285u, 10226637866241823765u, 1107077827844377620u, 15179051428825912061u, 2498945u}, + {14106653554083397342u, 10657276497241317090u, 5330319167274646075u, 16042883290468329336u, 3723846u}, + {7220341974918084177u, 11275255539776262108u, 7662122117625816155u, 11381735114129476261u, 3549480u}, + {12723801923587041296u, 937958120756535179u, 7368292585130470228u, 17791644493866757949u, 428092u}, + {10502871478010637130u, 12965990695987916041u, 4374730606852877362u, 944645643848710131u, 3056562u}, + {13073527051594931432u, 14090975836208271341u, 6552547712071731082u, 5676875952862450466u, 1730220u}, + {8770605368162072485u, 14155744716959292152u, 4786671581008727390u, 14659608520907460701u, 755481u}, + {15724521608756548803u, 346070931113823855u, 12393776996761528385u, 5850601296391321502u, 3739573u}, + {11621528748797098658u, 12918695844581951954u, 8423179408044820808u, 3023344307481600921u, 2279862u}, + {12935392096152244657u, 16859553317534850141u, 4574016170585317994u, 9913946417056847145u, 2029126u}, + {1769604675875367363u, 441278785839696258u, 12713768312563911171u, 3424137697711869376u, 3771522u}, + {8642627251370766838u, 1707777781180558023u, 4459480617623405399u, 10950269004253621229u, 3229183u}, + {9661965503495992027u, 16350860265490375001u, 4973813262587865559u, 4527138753669974667u, 2401888u}, + {7369495388630895772u, 2110424841228797689u, 3354091697728302239u, 2926610779273970281u, 2183959u}, + {1203471364569201608u, 12378883867683419649u, 16817860143035544329u, 16253245594200871017u, 346119u}, + {14237689402445086537u, 6205430577580920693u, 9161562935686482904u, 10094447950175204910u, 2438253u}, + {12030103283722129728u, 10982155310970965491u, 9805768185799430869u, 8691889123723754805u, 3788468u}, + {9008083843489661878u, 14632605942429971059u, 5816610619930989146u, 11959387924577436841u, 850246u}, + {5112587200465782058u, 5867768703396284497u, 13546870389229219u, 736260222700362536u, 1139505u}, + {15829543955071291235u, 7176828919761161770u, 5802471605081383155u, 1822460008790171025u, 3816573u}, + {9184229131671064370u, 16376463097355137985u, 6085636086824265295u, 214518535267945765u, 2303488u}, + {13587314473080450308u, 4625153320122535617u, 16616501906925412904u, 17984832769271435666u, 2600475u}, + {13547358534671975581u, 1139838340465162533u, 9408822078478203444u, 3002331670334957991u, 1075924u}, + {2770495052414438368u, 7875878777903832807u, 17484768054598707186u, 18322476183306789289u, 1998294u}, + {9995176266950952353u, 13344453512181539451u, 806720278886655133u, 5369123995131172802u, 3768881u}, + {15613203681403907211u, 1503481616100413509u, 13562682619575037459u, 16354539841192104059u, 350010u}, + {2232537822147032500u, 14210658909038544265u, 6515762995115322583u, 16723818378047060073u, 2042881u}, + {1951260748325798975u, 10127175571172383353u, 10365331920799721278u, 17835910247072062412u, 260319u}, + {2487253771068804323u, 13377459535734161797u, 15480284726567000930u, 8291425370168146883u, 835404u}, + {16820226564285458160u, 889171483851421386u, 7864949151720838505u, 7941745836249651584u, 3311142u}, + {16344350258598515021u, 14791355734143256134u, 7499653971257751455u, 16057865673427458420u, 3731627u}, + {499514344708455011u, 10191403445268922095u, 7297857584985541711u, 12750972934980726962u, 1644963u}, + {14716749537554447349u, 2743186378451299215u, 2502064169170092568u, 3128820767853595668u, 2381218u}, + {11511672926594140389u, 13962810320025038936u, 17220846440392434579u, 404213692348170958u, 1888885u}, + {3734071260159837277u, 7040555303112128856u, 13878576118488691682u, 2340686787797576510u, 329400u}, + {6777848957083451085u, 16536366835100664172u, 1842588278962235466u, 8797102832465774906u, 1045823u}, + {1114806332270763194u, 7679967103220400822u, 15965193504746609176u, 8882376104689638104u, 2431488u}, + {4630463144802263926u, 15342374135068460596u, 17142978246114881912u, 1702177708609014522u, 2509143u}, + {15484243982406160584u, 14107916258430793357u, 1465402172128276279u, 8260851240791302218u, 3578268u}, + {16728683650585972888u, 2302131077245378005u, 11680170398992723748u, 6118845301469942394u, 3621636u}, + {13979649056956596426u, 6400918148491129726u, 2698872486074812588u, 6624048455990420643u, 985526u}, + {14231689593264546124u, 3663662320315998279u, 10262489289630051911u, 16303196005095748671u, 2604433u}, + {7640261388187523383u, 2489179575969013024u, 13644362985561529067u, 2498001522600869417u, 1054395u}, + {15020341945036377755u, 13226427272161270690u, 5110149098937839007u, 10323686104639295353u, 641328u}, + {2853450449368519180u, 5108512614066148225u, 17673482411138243578u, 17305652992909694743u, 2010773u}, + {16098006650440526483u, 17609515614389640387u, 2605674763301028854u, 17619145177481394553u, 2296689u}, + {1239048686255472796u, 2148043785739058917u, 16100207125399815461u, 9481911270787608709u, 2200440u}, + {15669373454949903003u, 15913634320410468348u, 10063063213057479221u, 5877256080083627532u, 1661854u}, + {1311845016624687383u, 14963451991672245619u, 5070707355536033820u, 8173163927588983361u, 1947255u}, + {11193167666876775713u, 13455949366692916084u, 9610706462255299124u, 10628386846379821812u, 979513u}, + {13611453792150524794u, 15861400512752513889u, 7597564937115157670u, 2972430191811303686u, 3199564u}, + {12831790737758895094u, 5574964495173779187u, 11400071427547842234u, 17136671328216805451u, 1480056u}, + {15159131471055962661u, 11754681967504339588u, 6334168226776726516u, 16240260889917215192u, 1589161u}, + {14428107094246490133u, 3056721501624514254u, 12411880097987385447u, 11702645096643506866u, 1270386u}, + {6161237585725549432u, 13715577002787198477u, 1526479927321040815u, 5860099614191631495u, 84921u}, + {9803585840741465312u, 10327256778320242496u, 450355693842276463u, 1566521813583103u, 0u}, + {16478193739155166480u, 6017713667036637855u, 15007959284185833418u, 1566521u, 0u}, + {8552019755328114156u, 12781405016701063593u, 28897226981050844u, 0u, 0u}, + {8106006584661791527u, 18097193855346158840u, 28897226u, 0u, 0u}, + {13878888560324972320u, 533059750559339426u, 0u, 0u, 0u}, + {10317991255636490852u, 533059750u, 0u, 0u, 0u}, + {9833216794563586413u, 0u, 0u, 0u, 0u}, + {9833216795u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3586836u}, + {1804775132957189530u, 9333927358585237072u, 5167430634414177796u, 4533736276077900105u, 1546904u}, + {4977526866216358914u, 3276689625123732899u, 5735036825602442818u, 7378409938596983348u, 2884749u}, + {3694598375701189380u, 2405782491260842026u, 16817670273079738765u, 7619261607880732773u, 500171u}, + {1243107086675489139u, 9559267123445024817u, 406918755034733306u, 9226534049352988u, 2084938u}, + {15940537862719368904u, 12566136829564719810u, 3256086373953821802u, 17116110104693699211u, 870115u}, + {11929806364094603470u, 8261083219461988236u, 3653470841558579378u, 5780658328870040771u, 3105035u}, + {100848730715657957u, 1213727035742753074u, 8707367374406657760u, 10361513739189263914u, 1416129u}, + {3039868507691451825u, 17650151094464602190u, 14935929829689629569u, 12996489906426900452u, 1192258u}, + {12253673549499787572u, 9803847722209249200u, 322622131803784187u, 15226145633195117205u, 2279822u}, + {7630133847011879689u, 5515176175049860084u, 10688219812163048780u, 15174150056158624850u, 1562057u}, + {8720831749116441736u, 16613716429553078776u, 4192187921159104001u, 4496385711233228609u, 2615213u}, + {8295979400996265432u, 2932410170996161134u, 15560987399488672922u, 264414951519407696u, 2748996u}, + {13125243547863096284u, 14167243963334419252u, 1357407957869529855u, 9922600409132193446u, 3381849u}, + {2546702381070292000u, 4569272079581994075u, 10241843157365713515u, 1071190429452522086u, 3760514u}, + {17157133581569024772u, 12874958065204065544u, 4394248906716635200u, 9941259623610919462u, 1309217u}, + {13253392534401988509u, 13325480487498486253u, 11971275297308800238u, 16165051865373067085u, 2363131u}, + {8126417911680723925u, 12049198042556195707u, 14627101877709353884u, 9555194501941188743u, 3006600u}, + {6792564501072462131u, 15303827896808244351u, 15308110698404485406u, 13386116887303877799u, 1349530u}, + {16387435736854750072u, 2908576921002807639u, 9153611612717713547u, 96952041953838074u, 3845311u}, + {9890332365950557430u, 9017210250318138873u, 10845037307911842014u, 8141384000245701023u, 524875u}, + {8565579323119538168u, 15169000825808954183u, 2769760611043566468u, 5630174577895451309u, 3294899u}, + {17566463223021678218u, 10182506009130750784u, 14858079306438907491u, 5248926934962707497u, 37087u}, + {11004697096016118620u, 6066051588849611890u, 1909055200806503363u, 14772490917421615481u, 420260u}, + {5469824763711774158u, 4190532450383528862u, 10768390913020325752u, 5195899214167719485u, 341592u}, + {12214229100437859579u, 9674237472240093610u, 5964425561747867228u, 2528317056725003567u, 3632780u}, + {18253578820888490410u, 9806458500368831764u, 11890329381016804968u, 9506557784432967257u, 3129942u}, + {15367766236433486102u, 3638764753245252849u, 15440912237348745682u, 1210658753152959381u, 2624110u}, + {16671544860701179806u, 12607603185860532846u, 11880093181526325771u, 7398280878670570196u, 156785u}, + {17336130525348695685u, 14253641752295792755u, 13294287263635907402u, 16143793244663735094u, 3704579u}, + {13300877903367855622u, 3818039403079294231u, 12539815469328868971u, 68337436857632101u, 230882u}, + {6135473699680100838u, 13360577899352249964u, 10216497028596194849u, 4259021233563645u, 987589u}, + {4826421104337028637u, 9747531726724024410u, 11150272244301722039u, 18176731499095109635u, 361208u}, + {11001755528572594629u, 11745799144982396796u, 15038187236529574862u, 8365344038109748554u, 3564729u}, + {12745844163223059278u, 540001696724739389u, 6129864470819708791u, 14261103677392278006u, 2332690u}, + {1136367796602569736u, 1467680642013052113u, 6482278955901996847u, 5951753260804495963u, 493866u}, + {4741826489284947354u, 609700882701469130u, 4111473395048651833u, 1306146918343162750u, 655670u}, + {5920769878578087328u, 1245364651470564441u, 944943139256959820u, 804728512410163356u, 389012u}, + {15494133301641127082u, 14861888465332012185u, 9286215446279340814u, 1880673450596456748u, 1777208u}, + {13603497291457385804u, 4466702556969870988u, 7467700891529419539u, 15236936045025217151u, 60178u}, + {11293712045123807447u, 3714892450002592191u, 7791255360364476844u, 16286126355973517274u, 269405u}, + {1933401763472940180u, 6316078622429849078u, 13403879329195489880u, 15209122003376098573u, 720363u}, + {16097527126408281717u, 10182831031908407343u, 1971130190260790808u, 3688225663044616373u, 3747909u}, + {4059328222303314138u, 8353517305981358830u, 17195820867428087348u, 10733660639436112882u, 3399037u}, + {3983953319793668036u, 14247758435720558320u, 11663999408572318291u, 1720025839242072660u, 2594041u}, + {7924947636492849258u, 12511883207491744329u, 4161454797957856094u, 13882909667445899150u, 2263203u}, + {15224476437592577179u, 16329723093044364411u, 14607703587426269673u, 16831168151247970433u, 2021292u}, + {7263738623998839508u, 10181875076303919964u, 4666626063143541017u, 3640165974949801478u, 3429148u}, + {593579559428493461u, 9510199603641789238u, 8387820238555325637u, 9502801438155598552u, 3098386u}, + {4400769599737499045u, 3587812134146029336u, 17503937043022132848u, 14036328386444385664u, 3263739u}, + {4847004348574651129u, 13461693302486947907u, 13393035125256536223u, 9139462220871633060u, 2084832u}, + {14563023895311583983u, 6729309071452485276u, 14505072811714013623u, 16971992970393207212u, 1366257u}, + {15202348965971684399u, 12741321220217924048u, 4711824625858450785u, 3988370682275943641u, 2790839u}, + {2469164003190753343u, 13771900566832520012u, 11038337321970803782u, 13886539952054461885u, 1527676u}, + {12263321306760097606u, 12676901341585610384u, 534702887228848571u, 820814196503295561u, 3031802u}, + {17325486934077382456u, 16431416248598696340u, 9440814748705528889u, 17637979821651391346u, 3642902u}, + {6597569014629479606u, 17666987987953944248u, 12035042818926104501u, 7417074290386233966u, 376398u}, + {3429452053789175107u, 16806995394023907168u, 3604367148693079114u, 10887640024720048754u, 2963274u}, + {4559347443831385322u, 13404004185775120780u, 10614248021221081094u, 7620710141968350902u, 886300u}, + {7635601675621929979u, 7446794278251269558u, 10433694322503520964u, 6357417632230897285u, 3313973u}, + {4595824593171210422u, 4219844198970187513u, 2369072057311871040u, 8131582550403529928u, 2903184u}, + {3720785483886989629u, 669812202008729654u, 5575994584764014821u, 990303022871534109u, 1504056u}, + {997770924544561323u, 4680870551192391853u, 4369823475989067442u, 6368813212432488684u, 3166940u}, + {16721978465989635293u, 3900479663659362092u, 15260322202461717640u, 14902284109858761755u, 334544u}, + {9315846245701046910u, 263784459657806330u, 1744782702481225749u, 12400077436975284190u, 2182684u}, + {16254168103814488626u, 7537426199351445168u, 17242199984746509668u, 13515033510634382127u, 3151698u}, + {5696593951166778098u, 11627521220762580017u, 801070077827797975u, 12379987160404332813u, 2065692u}, + {11839625368715890125u, 17574975586816897829u, 9243499003413509271u, 6163000797262970951u, 2131719u}, + {4344072565395562641u, 11315029014313144131u, 17049935500169798973u, 9695040882075408272u, 2290147u}, + {613063579448545716u, 10855734706088812101u, 10701617090368542963u, 15822858859601432574u, 2253599u}, + {11753725886243842381u, 13545678291809697905u, 7631391433790304304u, 1770953836730897095u, 521912u}, + {1389974002070691849u, 8387433788146033651u, 4314820489198491194u, 16871104583739088760u, 2101152u}, + {16303120017722834608u, 4816899893422319834u, 9890229070557873482u, 16323775682646781091u, 3216356u}, + {9029168752940089735u, 7396053696184327940u, 4504923412508942615u, 2653404697671121537u, 3118018u}, + {581658684877682119u, 14154382547341735078u, 7041834722929706295u, 17207224663743473174u, 1316699u}, + {17625669276074181324u, 4610933829698676796u, 11929670956094399301u, 3771283716654586628u, 772200u}, + {13001242735748391330u, 12730344335464535348u, 7608577793220079356u, 878935708000137464u, 967673u}, + {14384277333021562324u, 9365099638682027640u, 17359253768236540571u, 7511840197001479794u, 1882067u}, + {6836298287987945115u, 16435075489015308254u, 12594515751169558998u, 17616770961044830895u, 3796507u}, + {11557556888754032436u, 6156038409808830936u, 13315527786260746909u, 10230153969967656765u, 3548194u}, + {4725973644550351564u, 16209884754597613271u, 13913240332156228405u, 3740389932806350494u, 1885261u}, + {12716279099051741253u, 6162627863267930359u, 14674057863776761772u, 611237683222959163u, 3631329u}, + {13917035822937121754u, 13350355177299790433u, 10756975822298099912u, 10371222144745372163u, 3741364u}, + {9141794959114413660u, 14056996454393516912u, 11393011437475130778u, 15056995554454823095u, 1528965u}, + {14336129187307420067u, 17622642031273070765u, 763336150171192117u, 12350053021595331935u, 3800220u}, + {13358510730835951709u, 4541023882861045905u, 15448916748090680942u, 8933185764778981661u, 511111u}, + {13142273052098898135u, 14998729109391083632u, 7655159680894953171u, 11394528200736057415u, 1535010u}, + {4347771563160102785u, 8191468032112243946u, 10369534200919573442u, 11701646182159438731u, 1412176u}, + {16265421203027187128u, 17242190029951395194u, 17013711482384338134u, 2403950664212302929u, 633003u}, + {18232412292919745225u, 16493303363984081719u, 9479519428452089686u, 6496860310156355271u, 2624136u}, + {3382334635394442426u, 18401727356941648991u, 1766442642230843845u, 11865852193923649702u, 954556u}, + {1925707249673537042u, 13972593547956327702u, 12470224008978310643u, 16734970278901157240u, 3195278u}, + {6818346752747068287u, 1016696943727857986u, 10507754054212209028u, 2653015877610730483u, 790545u}, + {764226514592733173u, 1675021105094294961u, 1715569400795863027u, 15434908108063344899u, 2614165u}, + {9454535142029172503u, 13789753794296101917u, 1172946166437446969u, 8046615786366357934u, 2929443u}, + {9615229829646929378u, 3945155750006642130u, 7027984848806955697u, 2864284860825325220u, 2120481u}, + {13343300666203259952u, 3319335780361998938u, 10064036583329794377u, 14738865156921747508u, 436908u}, + {12091460492477576302u, 16712479944639741920u, 12897794420439063598u, 296289920950333193u, 2906897u}, + {8133520109901354872u, 15632979538552175286u, 7641171659886689480u, 1927120230290050331u, 2754768u}, + {1635396657390562620u, 5631727967258749855u, 6938842753873154932u, 4518387332557096976u, 3857589u}, + {16820567053435713577u, 9684683274554420487u, 1215839666232298268u, 6412228236880602856u, 3843679u}, + {12302581803224737800u, 42430989042101100u, 9711069271500637445u, 9294275406081495900u, 259310u}, + {13061297950431672673u, 17628948350314752163u, 16805737594823322565u, 16001569310920030821u, 2413488u}, + {15225828699749994846u, 14096961790876403671u, 4254325175946357976u, 6097358910648485053u, 3473113u}, + {162798121039769827u, 8281410315476932259u, 10887003848694429618u, 11737397866891758144u, 1714430u}, + {5044850452233929682u, 11387182540573434159u, 8647409800250204095u, 15091662817106626357u, 2764234u}, + {3505049890056778597u, 7260854508619109269u, 14911028994079685167u, 987739854742572433u, 1702783u}, + {10111973045273308082u, 5895006512687730007u, 3171359847291341491u, 12065029007535768538u, 1888784u}, + {9156212155714111172u, 13612007465875736031u, 5077346073582041490u, 611302679426969917u, 771970u}, + {3899238515853192298u, 6833885637558274775u, 18224893149039553123u, 5418559886478479441u, 2468827u}, + {5662055269779158800u, 14907955580236040256u, 12284680678351566524u, 1846981676198022417u, 1384900u}, + {12278569609965246072u, 7075374068451979032u, 4261581899182969513u, 17751715031044934290u, 1931508u}, + {6637423495301716947u, 15481204939105160079u, 12315991153208045813u, 395918021693677299u, 2233656u}, + {13235705029347898682u, 15199639970288920825u, 16935317396810059772u, 12723340231651940539u, 669462u}, + {6107885081219681285u, 3157666958581246383u, 9147576798914694313u, 2174077228042252055u, 3214826u}, + {2994724995965263581u, 18105697886974121254u, 474281866396737571u, 1356339767320287459u, 1206613u}, + {9795175764037563726u, 8195516579034557906u, 9672071876109821746u, 5786865605597585550u, 293398u}, + {15597106738730538500u, 9506308832842147995u, 11485251262631062988u, 4977386232221631424u, 603099u}, + {7282675904263587445u, 4566423547147940789u, 1691371055131188414u, 17449062975060056901u, 2638292u}, + {14011949443957606694u, 7865019884070500001u, 7602581576586899797u, 5164757091457661751u, 1213102u}, + {3990119319973623339u, 8191017075872908817u, 17379315543194651251u, 1175299291900909271u, 3246346u}, + {3266310098058250339u, 9028260150448636229u, 17548468949500344833u, 14831691292787236879u, 2362387u}, + {2054320421103121376u, 17090848791890057567u, 5547014746556869933u, 2925882124740867219u, 1196770u}, + {14042142663600729383u, 8558237009669884127u, 15280315061567156428u, 11839521935051157008u, 251691u}, + {16005549182255056842u, 3188583399859475451u, 14885409480013491876u, 10885339591029296301u, 3605899u}, + {6307768727003437058u, 12024385353859240049u, 9073567611090836284u, 10226637866241823765u, 3513366u}, + {79224510906470225u, 6347735309605163828u, 14106653554083397341u, 10657276497241317090u, 1857827u}, + {13621756804110582486u, 4537546586541268638u, 7220341974918084176u, 11275255539776262108u, 65561u}, + {3142973940881212823u, 14763252473683472136u, 12723801923587041295u, 937958120756535179u, 3669014u}, + {16286077386220783546u, 18342795634153038564u, 10502871478010637129u, 12965990695987916041u, 2154580u}, + {5209700036579587314u, 7625475699734252711u, 13073527051594931431u, 14090975836208271341u, 1759458u}, + {2087213513380617617u, 17707386311775939470u, 8770605368162072484u, 14155744716959292152u, 3135542u}, + {2942561123032259479u, 2120624213404374410u, 15724521608756548802u, 346070931113823855u, 1105155u}, + {17026348509218780154u, 13702318275420913932u, 11621528748797098657u, 12918695844581951954u, 3801966u}, + {6792685243912355157u, 529030811238069017u, 12935392096152244656u, 16859553317534850141u, 484270u}, + {918543250177778908u, 14359307733984200855u, 1769604675875367362u, 441278785839696258u, 2735069u}, + {7246606380601889311u, 501211959687027828u, 8642627251370766837u, 1707777781180558023u, 3569411u}, + {9066983573110500699u, 14638495313248976514u, 9661965503495992026u, 16350860265490375001u, 1125109u}, + {1743358441624700079u, 9677020764327385918u, 7369495388630895771u, 2110424841228797689u, 3091889u}, + {140704054798592091u, 2737341490183673516u, 1203471364569201607u, 12378883867683419649u, 459565u}, + {14695960444006191942u, 388876386404278832u, 14237689402445086536u, 6205430577580920693u, 1593832u}, + {7951238242006612415u, 17200035928419932103u, 12030103283722129727u, 10982155310970965491u, 266407u}, + {4028224790039462105u, 15693969215760641991u, 9008083843489661877u, 14632605942429971059u, 1686128u}, + {5758037073524565434u, 1516794412286996512u, 5112587200465782057u, 5867768703396284497u, 2337925u}, + {9742261539679856987u, 8783380464746146658u, 15829543955071291234u, 7176828919761161770u, 1051093u}, + {16309010864667852775u, 12841386600070756958u, 9184229131671064369u, 16376463097355137985u, 730063u}, + {12191008054689154917u, 10902023122519329064u, 13587314473080450307u, 4625153320122535617u, 3197010u}, + {12542761966656483389u, 15629998926281032548u, 13547358534671975580u, 1139838340465162533u, 1170994u}, + {2384914990228411912u, 12368286835475202029u, 2770495052414438367u, 7875878777903832807u, 748024u}, + {11676929140957789135u, 15149709980524252341u, 9995176266950952352u, 13344453512181539451u, 3378901u}, + {4755775853907071567u, 4291543232899726385u, 15613203681403907210u, 1503481616100413509u, 830113u}, + {440399362105692840u, 5524104080074581765u, 2232537822147032499u, 14210658909038544265u, 2120287u}, + {9691386982180174598u, 7908536289253639504u, 1951260748325798974u, 10127175571172383353u, 2537284u}, + {6707013318223769539u, 12071049902595015254u, 2487253771068804322u, 13377459535734161797u, 1327082u}, + {16858396589789281585u, 2417808596599640213u, 16820226564285458159u, 889171483851421386u, 1059751u}, + {5591615246794724381u, 8806944004485524097u, 16344350258598515020u, 14791355734143256134u, 1695837u}, + {12061984192562837432u, 7213345377845633625u, 499514344708455010u, 10191403445268922095u, 270931u}, + {15096377823663196919u, 1693338543688696242u, 14716749537554447348u, 2743186378451299215u, 3019214u}, + {5803371415446641514u, 11808579402202861173u, 11511672926594140388u, 13962810320025038936u, 2763017u}, + {15472137034955355875u, 7533349904731063995u, 3734071260159837276u, 7040555303112128856u, 1906992u}, + {13979776079979741374u, 4349169009095227577u, 6777848957083451084u, 16536366835100664172u, 2269350u}, + {10774214783556045622u, 12304469648988587264u, 1114806332270763193u, 7679967103220400822u, 3586768u}, + {4763578585939863392u, 17638882819704198955u, 4630463144802263925u, 15342374135068460596u, 3072922u}, + {13201258241673595210u, 3877164228040058426u, 15484243982406160583u, 14107916258430793357u, 3705025u}, + {4091686077461852873u, 12494752591343611599u, 16728683650585972887u, 2302131077245378005u, 3244468u}, + {13368938332974983282u, 937175315944520292u, 13979649056956596425u, 6400918148491129726u, 3295032u}, + {2862322630640295061u, 660766671748820629u, 14231689593264546123u, 3663662320315998279u, 2126195u}, + {18096262229511121901u, 2562343270672193083u, 7640261388187523382u, 2489179575969013024u, 2162309u}, + {68588757251361306u, 15439594042135996361u, 15020341945036377754u, 13226427272161270690u, 3495523u}, + {8668790469703677987u, 10194118714411090080u, 2853450449368519179u, 5108512614066148225u, 1488754u}, + {15653363367177375604u, 3519022713546071484u, 16098006650440526482u, 17609515614389640387u, 3164436u}, + {11145643131547011335u, 12584750473738563876u, 1239048686255472795u, 2148043785739058917u, 3304845u}, + {13742545209927935713u, 16995667617416414672u, 15669373454949903002u, 15913634320410468348u, 2576607u}, + {17656936852481398866u, 11163289989246500942u, 1311845016624687382u, 14963451991672245619u, 2885976u}, + {14583405844775766687u, 14019502301178504490u, 11193167666876775712u, 13455949366692916084u, 473244u}, + {5424597335318467007u, 9106248507661955527u, 13611453792150524793u, 15861400512752513889u, 1438180u}, + {16027503012694514725u, 9310246931835927227u, 12831790737758895093u, 5574964495173779187u, 503836u}, + {10252383881407199167u, 5701086187573407044u, 15159131471055962660u, 11754681967504339588u, 1642704u}, + {1850144172389099105u, 14125666074872110215u, 14428107094246490132u, 3056721501624514254u, 1335419u}, + {16526821248594662782u, 10359408512866859557u, 6161237585725549431u, 13715577002787198477u, 1247961u}, + {851273370724365701u, 2406921566343368405u, 9803585840741465311u, 10327256778320242496u, 2002161u}, + {8687741548543047371u, 5664907725216447705u, 16478193739155166479u, 6017713667036637855u, 1475104u}, + {3415153338911772788u, 3113470671621474529u, 8552019755328114155u, 12781405016701063593u, 582094u}, + {14960395058532845786u, 17327013927955209423u, 8106006584661791526u, 18097193855346158840u, 1553476u}, + {2267344208123655334u, 669580339542892854u, 13878888560324972319u, 533059750559339426u, 0u}, + {9043970332562082175u, 17262181515298693565u, 10317991255636490851u, 533059750u, 0u}, + {16186183790403832804u, 12424746399312161894u, 9833216794563586412u, 0u, 0u}, + {12957061048258428539u, 10396334318008976124u, 9833216794u, 0u, 0u}, + {12359599449361215081u, 15370136967231106602u, 9u, 0u, 0u}, + {11382953517892260937u, 181390833630u, 0u, 0u, 0u}, + {7209607959391845142u, 181u, 0u, 0u, 0u}, + {3346070285301u, 0u, 0u, 0u, 0u}, + {3347u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2086966u}, + {4436691644854928897u, 3495335110159693819u, 1804775132957189529u, 9333927358585237072u, 1848450u}, + {15289228084471392014u, 11137057211487083482u, 4977526866216358913u, 3276689625123732899u, 1511480u}, + {16420810387939564146u, 16707005401538244125u, 3694598375701189379u, 2405782491260842026u, 2583909u}, + {5382223302897409265u, 4893273720298418166u, 1243107086675489138u, 9559267123445024817u, 1524142u}, + {17244089377698955896u, 1529496331393367423u, 15940537862719368903u, 12566136829564719810u, 2521718u}, + {5172160083244117051u, 2739032900893755659u, 11929806364094603469u, 8261083219461988236u, 3296274u}, + {10995969172684036469u, 17899019459149000957u, 100848730715657956u, 1213727035742753074u, 3691608u}, + {15514640847250974464u, 4021146507584999860u, 3039868507691451824u, 17650151094464602190u, 217649u}, + {4212085063758774076u, 15832431072341570897u, 12253673549499787571u, 9803847722209249200u, 2103299u}, + {9957824304867915284u, 16485635954953341313u, 7630133847011879688u, 5515176175049860084u, 2193872u}, + {6888249203260237717u, 14598256394921005663u, 8720831749116441735u, 16613716429553078776u, 2716273u}, + {7402934573602843872u, 8093826980359408845u, 8295979400996265431u, 2932410170996161134u, 2382834u}, + {10204253845630616630u, 14737182782198279169u, 13125243547863096283u, 14167243963334419252u, 1606985u}, + {14094271141361117892u, 15270725272596189521u, 2546702381070291999u, 4569272079581994075u, 2640375u}, + {14857175648664735139u, 14980659888664543936u, 17157133581569024771u, 12874958065204065544u, 3625744u}, + {1344593520566546144u, 2978543004427746305u, 13253392534401988508u, 13325480487498486253u, 844584u}, + {2682984202834829305u, 16164469734507616414u, 8126417911680723924u, 12049198042556195707u, 1497172u}, + {8644644219281165767u, 1417426949074020241u, 6792564501072462130u, 15303827896808244351u, 1424270u}, + {16273593981945684580u, 18037603887754839058u, 16387435736854750071u, 2908576921002807639u, 542697u}, + {7346170317464801839u, 12855195196302516772u, 9890332365950557429u, 9017210250318138873u, 2000682u}, + {5858615753741867520u, 4285901570631428640u, 8565579323119538167u, 15169000825808954183u, 1213506u}, + {10441785686887916213u, 2735147281478474718u, 17566463223021678217u, 10182506009130750784u, 716315u}, + {11763546518342293759u, 9061959358042893844u, 11004697096016118619u, 6066051588849611890u, 606719u}, + {16299399412050460277u, 457584832806290077u, 5469824763711774157u, 4190532450383528862u, 1003964u}, + {6139825474073051167u, 3186245838796546874u, 12214229100437859578u, 9674237472240093610u, 359180u}, + {72059666213089666u, 10983180688667861972u, 18253578820888490409u, 9806458500368831764u, 1945332u}, + {12115872642059065491u, 7285438742296557168u, 15367766236433486101u, 3638764753245252849u, 3772038u}, + {17492799788122194963u, 10590412525715910733u, 16671544860701179805u, 12607603185860532846u, 3160217u}, + {4839832064656638233u, 1925930351804442375u, 17336130525348695684u, 14253641752295792755u, 3851330u}, + {7810732905869156459u, 8981244577074748570u, 13300877903367855621u, 3818039403079294231u, 1622129u}, + {7901995352792892029u, 3584068477587779398u, 6135473699680100837u, 13360577899352249964u, 1071003u}, + {12167919953825531940u, 11921264236406665475u, 4826421104337028636u, 9747531726724024410u, 22297u}, + {8087501294238292220u, 5290703817513105315u, 11001755528572594628u, 11745799144982396796u, 1929800u}, + {2490678267668376458u, 3604600124326391065u, 12745844163223059277u, 540001696724739389u, 1438127u}, + {17660154119416683533u, 9286917624252163553u, 1136367796602569735u, 1467680642013052113u, 1801951u}, + {13893569982999247886u, 16146158377397038436u, 4741826489284947353u, 609700882701469130u, 1105103u}, + {3585538890916964267u, 15407115445278297345u, 5920769878578087327u, 1245364651470564441u, 977088u}, + {15481074332667283039u, 5845664579489822276u, 15494133301641127081u, 14861888465332012185u, 3859180u}, + {7402896305201716054u, 6019802018451630315u, 13603497291457385803u, 4466702556969870988u, 2165973u}, + {17160347451964716669u, 10630657527741469106u, 11293712045123807446u, 3714892450002592191u, 2551558u}, + {11101876056023318811u, 9649243726880332584u, 1933401763472940179u, 6316078622429849078u, 1231126u}, + {17623102717304447190u, 9240521670874698051u, 16097527126408281716u, 10182831031908407343u, 3626330u}, + {55786568817094775u, 16038235424446243646u, 4059328222303314137u, 8353517305981358830u, 2841282u}, + {611845112373958982u, 7153832001284233300u, 3983953319793668035u, 14247758435720558320u, 2489297u}, + {1376420264167397056u, 11892608292969077486u, 7924947636492849257u, 12511883207491744329u, 2423562u}, + {15161662555801689949u, 16350478096031486398u, 15224476437592577178u, 16329723093044364411u, 1179303u}, + {3999068740563952566u, 3416531115442630627u, 7263738623998839507u, 10181875076303919964u, 3830203u}, + {3852222703779574990u, 7620477244353311410u, 593579559428493460u, 9510199603641789238u, 3089435u}, + {12169447266398086147u, 13694298854082626915u, 4400769599737499044u, 3587812134146029336u, 3197356u}, + {7261712283000801490u, 10843297895166842887u, 4847004348574651128u, 13461693302486947907u, 1515325u}, + {10371119735072749528u, 16950381836651441051u, 14563023895311583982u, 6729309071452485276u, 3208407u}, + {13113688749258137913u, 2333524025853643604u, 15202348965971684398u, 12741321220217924048u, 482475u}, + {9546600695781462486u, 4013634572004320276u, 2469164003190753342u, 13771900566832520012u, 3622448u}, + {15063017751487481162u, 2030193722362256315u, 12263321306760097605u, 12676901341585610384u, 123859u}, + {14423154346280770210u, 18011527331137337051u, 17325486934077382455u, 16431416248598696340u, 698087u}, + {3503688308361513841u, 891947446767421364u, 6597569014629479605u, 17666987987953944248u, 952795u}, + {2727580813658851347u, 7489449907992704354u, 3429452053789175106u, 16806995394023907168u, 70022u}, + {14058189320923013051u, 3322823565148541582u, 4559347443831385321u, 13404004185775120780u, 1347776u}, + {15040465984179661354u, 15474745918595664618u, 7635601675621929978u, 7446794278251269558u, 2195712u}, + {16675256511302206579u, 12265468483882371164u, 4595824593171210421u, 4219844198970187513u, 1154342u}, + {7731120109143127822u, 10919059132817339488u, 3720785483886989628u, 669812202008729654u, 3750501u}, + {11080137481040428447u, 15195504482406610443u, 997770924544561322u, 4680870551192391853u, 507926u}, + {17629340428451001279u, 5865068986070507496u, 16721978465989635292u, 3900479663659362092u, 2581034u}, + {8195515490200300100u, 14471497811510512434u, 9315846245701046909u, 263784459657806330u, 2354693u}, + {9098022471466203122u, 5636203386017223023u, 16254168103814488625u, 7537426199351445168u, 1422938u}, + {447224329713818664u, 18023535943774402749u, 5696593951166778097u, 11627521220762580017u, 3522585u}, + {14757181516991283550u, 13100311879084574755u, 11839625368715890124u, 17574975586816897829u, 107701u}, + {2581737306043990614u, 9809138151626029516u, 4344072565395562640u, 11315029014313144131u, 2553057u}, + {5005405283737965743u, 4108999856015923241u, 613063579448545715u, 10855734706088812101u, 3843941u}, + {16595444947485042648u, 13758301655362548113u, 11753725886243842380u, 13545678291809697905u, 1558696u}, + {14277364674990794623u, 6124839908495538054u, 1389974002070691848u, 8387433788146033651u, 3312166u}, + {10742701491529497315u, 18326758339811592168u, 16303120017722834607u, 4816899893422319834u, 2503374u}, + {10523802719828813821u, 18296198276742638565u, 9029168752940089734u, 7396053696184327940u, 1685615u}, + {5744692225741875958u, 7276248378797867847u, 581658684877682118u, 14154382547341735078u, 3865473u}, + {8547555484954822341u, 6602585080122252298u, 17625669276074181323u, 4610933829698676796u, 2613349u}, + {13000231217905739749u, 6973050099896950165u, 13001242735748391329u, 12730344335464535348u, 3776818u}, + {14142739521488909343u, 8591399596817108634u, 14384277333021562323u, 9365099638682027640u, 322227u}, + {5350585751027120990u, 11308980760669656548u, 6836298287987945114u, 16435075489015308254u, 1688260u}, + {12241620117191349668u, 451763319324809851u, 11557556888754032435u, 6156038409808830936u, 3739613u}, + {17938109705763769053u, 207185325938651022u, 4725973644550351563u, 16209884754597613271u, 2045475u}, + {2567879137399312281u, 1095904445109859375u, 12716279099051741252u, 6162627863267930359u, 1067954u}, + {8479047668489161541u, 13889151657634695520u, 13917035822937121753u, 13350355177299790433u, 312554u}, + {702732413315827780u, 12857935972495048160u, 9141794959114413659u, 14056996454393516912u, 2200338u}, + {1764870546583863082u, 14868363118093758896u, 14336129187307420066u, 17622642031273070765u, 75647u}, + {8921087161945151599u, 14527518184188932892u, 13358510730835951708u, 4541023882861045905u, 582734u}, + {12896457546859604299u, 2093426773484086688u, 13142273052098898134u, 14998729109391083632u, 2654121u}, + {769300076267388894u, 6151207414555206574u, 4347771563160102784u, 8191468032112243946u, 1107244u}, + {910706864357697112u, 17635212483329334805u, 16265421203027187127u, 17242190029951395194u, 3478766u}, + {13464109472795361189u, 5136752812764351683u, 18232412292919745224u, 16493303363984081719u, 1465888u}, + {18039037451623721773u, 15994545635169467021u, 3382334635394442425u, 18401727356941648991u, 3549563u}, + {6693975997963605414u, 11504415425351016937u, 1925707249673537041u, 13972593547956327702u, 427751u}, + {9606256371338226075u, 5012329554749871847u, 6818346752747068286u, 1016696943727857986u, 959326u}, + {11958613475835357541u, 2861317237838180964u, 764226514592733172u, 1675021105094294961u, 1450301u}, + {4767410271016276737u, 7264113910643859928u, 9454535142029172502u, 13789753794296101917u, 2929821u}, + {17914664864249310274u, 14636564480862939212u, 9615229829646929377u, 3945155750006642130u, 254053u}, + {3950761553634856870u, 2714302360345381393u, 13343300666203259951u, 3319335780361998938u, 3641603u}, + {10008432725611885044u, 14651284553808834189u, 12091460492477576301u, 16712479944639741920u, 3715518u}, + {1114962782337836093u, 2381349771663064580u, 8133520109901354871u, 15632979538552175286u, 609084u}, + {11964738911627924020u, 12993579408060274739u, 1635396657390562619u, 5631727967258749855u, 1570232u}, + {11510174236566605304u, 6577298971592873001u, 16820567053435713576u, 9684683274554420487u, 2300188u}, + {4806028695306845107u, 12961130574859644784u, 12302581803224737799u, 42430989042101100u, 2542205u}, + {9285265442820630329u, 14196907167937147932u, 13061297950431672672u, 17628948350314752163u, 2479079u}, + {10161720949894522428u, 3983520975143647376u, 15225828699749994845u, 14096961790876403671u, 3623652u}, + {5023750578299253536u, 13933462086399679774u, 162798121039769826u, 8281410315476932259u, 112902u}, + {7023817069088722468u, 13753074872487445111u, 5044850452233929681u, 11387182540573434159u, 2986711u}, + {17026532335104730616u, 515436003628359443u, 3505049890056778596u, 7260854508619109269u, 3162693u}, + {15320854228118868487u, 6469610870155877229u, 10111973045273308081u, 5895006512687730007u, 3533403u}, + {12505258208004719927u, 14298332562344712128u, 9156212155714111171u, 13612007465875736031u, 3278182u}, + {13503398005554141715u, 12301031610117525052u, 3899238515853192297u, 6833885637558274775u, 3474391u}, + {4772094122242305006u, 10981383523741266590u, 5662055269779158799u, 14907955580236040256u, 744296u}, + {4411533795591857195u, 10678220101113869256u, 12278569609965246071u, 7075374068451979032u, 3300301u}, + {15291286095448817570u, 10245506856080261038u, 6637423495301716946u, 15481204939105160079u, 3661633u}, + {11985402415113294561u, 13154783796837380740u, 13235705029347898681u, 15199639970288920825u, 3208718u}, + {17299315357390471107u, 10134185369758006017u, 6107885081219681284u, 3157666958581246383u, 1043099u}, + {6855350844498817386u, 3191809810760891907u, 2994724995965263580u, 18105697886974121254u, 2873593u}, + {12692805029051512689u, 18140370442509440800u, 9795175764037563725u, 8195516579034557906u, 3619284u}, + {10017098553551155424u, 9532490140630121162u, 15597106738730538499u, 9506308832842147995u, 1452566u}, + {14969669368632033289u, 6193393151889227798u, 7282675904263587444u, 4566423547147940789u, 582332u}, + {11436419784886499505u, 5247136881927757370u, 14011949443957606693u, 7865019884070500001u, 2629675u}, + {10225464008233773453u, 1027762362008968584u, 3990119319973623338u, 8191017075872908817u, 1141713u}, + {17469457571428819442u, 12962263974159485036u, 3266310098058250338u, 9028260150448636229u, 715519u}, + {17472824109466264998u, 4318974313913137577u, 2054320421103121375u, 17090848791890057567u, 3005457u}, + {12586040118017302381u, 11048032450647749294u, 14042142663600729382u, 8558237009669884127u, 978452u}, + {3516069521339000506u, 8889019757158946439u, 16005549182255056841u, 3188583399859475451u, 3405736u}, + {5233149580216311252u, 15416816064220688514u, 6307768727003437057u, 12024385353859240049u, 361420u}, + {5829102695104854429u, 5307751065949726572u, 79224510906470224u, 6347735309605163828u, 3793393u}, + {11977807622861547907u, 17862470761663781724u, 13621756804110582485u, 4537546586541268638u, 3442520u}, + {7686432350418283481u, 3599155561938058561u, 3142973940881212822u, 14763252473683472136u, 2177443u}, + {7819092567301592292u, 2368038165812233080u, 16286077386220783545u, 18342795634153038564u, 3221615u}, + {5372208833639235635u, 3082901203660999417u, 5209700036579587313u, 7625475699734252711u, 2888085u}, + {10694474075110362264u, 3780107702557922132u, 2087213513380617616u, 17707386311775939470u, 1678018u}, + {6384012970318514933u, 16385787941534421020u, 2942561123032259478u, 2120624213404374410u, 616662u}, + {6407505706242662186u, 17149678067089559511u, 17026348509218780153u, 13702318275420913932u, 1335067u}, + {14395207889288469668u, 11625540585016893616u, 6792685243912355156u, 529030811238069017u, 1075882u}, + {5612583049577566896u, 9628108739787644397u, 918543250177778907u, 14359307733984200855u, 3733254u}, + {14079414202879457718u, 14804774088988850455u, 7246606380601889310u, 501211959687027828u, 585671u}, + {15037531199452479415u, 6786674001199481004u, 9066983573110500698u, 14638495313248976514u, 1154846u}, + {8193072917332202841u, 16461193696415269833u, 1743358441624700078u, 9677020764327385918u, 3860329u}, + {2757332114571940268u, 14000573143151682994u, 140704054798592090u, 2737341490183673516u, 1549781u}, + {13308874017389432164u, 7586870662989220123u, 14695960444006191941u, 388876386404278832u, 2728316u}, + {18059534145317619065u, 3194469699581797601u, 7951238242006612414u, 17200035928419932103u, 3115525u}, + {12511338036229165627u, 5478595592412785293u, 4028224790039462104u, 15693969215760641991u, 194339u}, + {12530688739001267133u, 7325518328129058215u, 5758037073524565433u, 1516794412286996512u, 3491759u}, + {16189111255281560769u, 12284054511171353706u, 9742261539679856986u, 8783380464746146658u, 820462u}, + {5311464783685685045u, 17420533008174653029u, 16309010864667852774u, 12841386600070756958u, 1156107u}, + {10042454204641683390u, 3721791010284411877u, 12191008054689154916u, 10902023122519329064u, 3553939u}, + {13506902681551157716u, 17337126747259386591u, 12542761966656483388u, 15629998926281032548u, 2517422u}, + {9188057585060224851u, 12146579404657134670u, 2384914990228411911u, 12368286835475202029u, 954923u}, + {17916659884041529276u, 11437694544312623238u, 11676929140957789134u, 15149709980524252341u, 2176274u}, + {15473346286482908226u, 5982595181054661072u, 4755775853907071566u, 4291543232899726385u, 2587282u}, + {6542450657993928882u, 257559312804343380u, 440399362105692839u, 5524104080074581765u, 2941361u}, + {12625182234890189154u, 3726365804098462224u, 9691386982180174597u, 7908536289253639504u, 2029176u}, + {17878077009615476354u, 6903755161162257990u, 6707013318223769538u, 12071049902595015254u, 2163416u}, + {15323598864680908184u, 3678533458701761426u, 16858396589789281584u, 2417808596599640213u, 862891u}, + {1479864860384542956u, 12792726408389217443u, 5591615246794724380u, 8806944004485524097u, 411236u}, + {16926182853456537690u, 11701410766209768257u, 12061984192562837431u, 7213345377845633625u, 1952316u}, + {5607476126351967592u, 4472551961014934367u, 15096377823663196918u, 1693338543688696242u, 3425622u}, + {15724438503011367499u, 3168221326262907588u, 5803371415446641513u, 11808579402202861173u, 2133716u}, + {6997625175068448707u, 11944222094434265399u, 15472137034955355874u, 7533349904731063995u, 1393924u}, + {1258591969483518463u, 7242470982094379874u, 13979776079979741373u, 4349169009095227577u, 2964136u}, + {1191818494886703644u, 6644477027137314861u, 10774214783556045621u, 12304469648988587264u, 3080753u}, + {4721913966982591540u, 589753722535088576u, 4763578585939863391u, 17638882819704198955u, 3150243u}, + {18108073663154365390u, 3826011131420115710u, 13201258241673595209u, 3877164228040058426u, 1560645u}, + {11751122570087962057u, 17414846956876585343u, 4091686077461852872u, 12494752591343611599u, 23125u}, + {8032166890771493474u, 12886284028422760686u, 13368938332974983281u, 937175315944520292u, 663983u}, + {13731437204722570086u, 15782377556709896404u, 2862322630640295060u, 660766671748820629u, 2186157u}, + {10068599281499414349u, 16480249524080508682u, 18096262229511121900u, 2562343270672193083u, 1044570u}, + {6250359188435401986u, 8455765179709131637u, 68588757251361305u, 15439594042135996361u, 1843032u}, + {13613748875765135037u, 4892173806485038938u, 8668790469703677986u, 10194118714411090080u, 3266603u}, + {7905040104385738203u, 2509702299402545261u, 15653363367177375603u, 3519022713546071484u, 2533190u}, + {12486760691075505403u, 12531212432063884009u, 11145643131547011334u, 12584750473738563876u, 3368237u}, + {4024112240557703599u, 9812893502321967712u, 13742545209927935712u, 16995667617416414672u, 3600662u}, + {1211912130143346108u, 3121733950117510721u, 17656936852481398865u, 11163289989246500942u, 2186242u}, + {15140994288621419495u, 6880810583769912132u, 14583405844775766686u, 14019502301178504490u, 1463220u}, + {10796865818466532895u, 8949822435067960099u, 5424597335318467006u, 9106248507661955527u, 803247u}, + {7416189153424231159u, 14182710383666016258u, 16027503012694514724u, 9310246931835927227u, 462751u}, + {8427573048570709107u, 1664615974011115496u, 10252383881407199166u, 5701086187573407044u, 128892u}, + {16018323343997346281u, 7640069953757196878u, 1850144172389099104u, 14125666074872110215u, 2990910u}, + {14903997858926207653u, 1813711628870279927u, 16526821248594662781u, 10359408512866859557u, 1573229u}, + {4117870365380251735u, 11986109852717690929u, 851273370724365700u, 2406921566343368405u, 2407763u}, + {17545094104410614494u, 9138352997653518297u, 8687741548543047370u, 5664907725216447705u, 812833u}, + {7900206747775122276u, 511039346690877413u, 3415153338911772787u, 3113470671621474529u, 1799307u}, + {4001440080699916194u, 9533695027430196627u, 14960395058532845785u, 17327013927955209423u, 1141772u}, + {13683366553609002450u, 10541638820124444900u, 2267344208123655333u, 669580339542892854u, 2190985u}, + {10005348199927692849u, 14224866489681808123u, 9043970332562082174u, 17262181515298693565u, 1671851u}, + {8383536854579900196u, 7149188234564492796u, 16186183790403832803u, 12424746399312161894u, 1086412u}, + {15657213792676115531u, 16408182937845027527u, 12957061048258428538u, 10396334318008976124u, 1185544u}, + {8254860859075841863u, 561463307525263528u, 12359599449361215080u, 15370136967231106602u, 9u}, + {14519088864083972760u, 3550758722225498948u, 11382953517892260936u, 181390833630u, 0u}, + {3948282160261821717u, 11914881423116179257u, 7209607959391845141u, 181u, 0u}, + {3334260967208187453u, 15139014816111327163u, 3346070285300u, 0u, 0u}, + {5670011940228982540u, 1296534956382912764u, 3346u, 0u, 0u}, + {10009570430271881468u, 61724102205588u, 0u, 0u, 0u}, + {1885360334748570495u, 61724u, 0u, 0u, 0u}, + {1138608716565984u, 0u, 0u, 0u, 0u}, + {1138609u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1982496u}, + {12511843883232364819u, 2558087034304555333u, 4436691644854928896u, 3495335110159693819u, 2178581u}, + {6901338498900127530u, 1357944818906150733u, 15289228084471392013u, 11137057211487083482u, 3344827u}, + {1235056100664979097u, 12380293161284682889u, 16420810387939564145u, 16707005401538244125u, 3546149u}, + {9710821956022057656u, 17013489053555056305u, 5382223302897409264u, 4893273720298418166u, 882912u}, + {12716627858180047117u, 17330815539107658238u, 17244089377698955895u, 1529496331393367423u, 45771u}, + {6884237500351611286u, 3263488017810086028u, 5172160083244117050u, 2739032900893755659u, 1557789u}, + {906016933365846472u, 13881964033547910756u, 10995969172684036468u, 17899019459149000957u, 3143038u}, + {5279909804883591311u, 5666402753064943963u, 15514640847250974463u, 4021146507584999860u, 2809058u}, + {14726668504197229024u, 14940325556634221418u, 4212085063758774075u, 15832431072341570897u, 3063115u}, + {14949309480546521123u, 13608883777066589394u, 9957824304867915283u, 16485635954953341313u, 2310564u}, + {923292649297340774u, 15518291644983516925u, 6888249203260237716u, 14598256394921005663u, 1267239u}, + {6654763515609447333u, 5613881184974605739u, 7402934573602843871u, 8093826980359408845u, 2029279u}, + {4614666631542837336u, 13881315393036440074u, 10204253845630616629u, 14737182782198279169u, 3608925u}, + {14481052006205182763u, 17386951579182697136u, 14094271141361117891u, 15270725272596189521u, 3509449u}, + {9886825287507624113u, 6548254208507308009u, 14857175648664735138u, 14980659888664543936u, 1310889u}, + {2092716292495394869u, 5605598403448031977u, 1344593520566546143u, 2978543004427746305u, 1277660u}, + {4826083395750513829u, 10444509293057149856u, 2682984202834829304u, 16164469734507616414u, 2620118u}, + {2637619364547698219u, 6646844024305171213u, 8644644219281165766u, 1417426949074020241u, 1257966u}, + {1773829707840237067u, 14607676288730429810u, 16273593981945684579u, 18037603887754839058u, 1569027u}, + {8184453515326107972u, 16337831490624965042u, 7346170317464801838u, 12855195196302516772u, 1870439u}, + {864352196163978409u, 10552544339110773640u, 5858615753741867519u, 4285901570631428640u, 3741381u}, + {15919236872003123456u, 7157530309730903947u, 10441785686887916212u, 2735147281478474718u, 2968551u}, + {16491493312792383960u, 2691024978368799423u, 11763546518342293758u, 9061959358042893844u, 1368223u}, + {3600675756746195517u, 4646888865171476505u, 16299399412050460276u, 457584832806290077u, 851733u}, + {6162197598799946161u, 3664039074862930440u, 6139825474073051166u, 3186245838796546874u, 1649418u}, + {14547061209556777484u, 10013485897269506043u, 72059666213089665u, 10983180688667861972u, 413175u}, + {3802071625001349596u, 8835422575197540120u, 12115872642059065490u, 7285438742296557168u, 3794913u}, + {6107470075384621637u, 9056840484896435106u, 17492799788122194962u, 10590412525715910733u, 2842393u}, + {7905371990698833585u, 9207576062067810656u, 4839832064656638232u, 1925930351804442375u, 2499244u}, + {477626647236721854u, 12708063384891515278u, 7810732905869156458u, 8981244577074748570u, 2886491u}, + {3312246859167639919u, 17712314161623633851u, 7901995352792892028u, 3584068477587779398u, 1721779u}, + {2370343362898495492u, 15639138944291709270u, 12167919953825531939u, 11921264236406665475u, 1653378u}, + {3438786360317663520u, 12984440092647208957u, 8087501294238292219u, 5290703817513105315u, 93264u}, + {11936999604104162786u, 2729447467619165873u, 2490678267668376457u, 3604600124326391065u, 3444813u}, + {9624025608638620029u, 1797916064390965500u, 17660154119416683532u, 9286917624252163553u, 284999u}, + {4118484359976772907u, 8132869224689913675u, 13893569982999247885u, 16146158377397038436u, 3190151u}, + {11685199740396806182u, 7779551233956269793u, 3585538890916964266u, 15407115445278297345u, 487861u}, + {14944877370540182533u, 3677531875161331365u, 15481074332667283038u, 5845664579489822276u, 2115371u}, + {9410404420066477640u, 7226903618929933574u, 7402896305201716053u, 6019802018451630315u, 2070349u}, + {16765038653753296774u, 15943027219922424391u, 17160347451964716668u, 10630657527741469106u, 3555300u}, + {16277167456434549882u, 9788004088718377297u, 11101876056023318810u, 9649243726880332584u, 929683u}, + {3848886032096132975u, 13817035633003641716u, 17623102717304447189u, 9240521670874698051u, 2246984u}, + {3494312500304109689u, 13905087609646919579u, 55786568817094774u, 16038235424446243646u, 1091259u}, + {9159896849331685963u, 11647086323510163694u, 611845112373958981u, 7153832001284233300u, 168337u}, + {15319757948698676516u, 2247559665962923482u, 1376420264167397055u, 11892608292969077486u, 3548693u}, + {389944004299961232u, 80085416392181188u, 15161662555801689948u, 16350478096031486398u, 1616772u}, + {12215514280017594164u, 2891511417008106831u, 3999068740563952565u, 3416531115442630627u, 2950649u}, + {13487047088018622746u, 11203274750214892018u, 3852222703779574989u, 7620477244353311410u, 181928u}, + {233917456595095063u, 16050156321171982270u, 12169447266398086146u, 13694298854082626915u, 1878856u}, + {14981697004919792293u, 3040117923620635967u, 7261712283000801489u, 10843297895166842887u, 913290u}, + {15939711720577873666u, 17162982048484033632u, 10371119735072749527u, 16950381836651441051u, 1500590u}, + {17037563367849495064u, 17843479905835360944u, 13113688749258137912u, 2333524025853643604u, 2735816u}, + {5770829553060884185u, 2898169307429560867u, 9546600695781462485u, 4013634572004320276u, 682022u}, + {10612858190348798001u, 13142798478696752253u, 15063017751487481161u, 2030193722362256315u, 3750603u}, + {11372036935916883176u, 7257763905979127761u, 14423154346280770209u, 18011527331137337051u, 1477567u}, + {9728735230394136363u, 12007025883397159518u, 3503688308361513840u, 891947446767421364u, 3660143u}, + {5795507120358518770u, 2284376028633309966u, 2727580813658851346u, 7489449907992704354u, 443126u}, + {11378273129634810725u, 13271304640066196256u, 14058189320923013050u, 3322823565148541582u, 2950157u}, + {13452714615853947811u, 16209304445591064672u, 15040465984179661353u, 15474745918595664618u, 849878u}, + {3273404559270897665u, 9064479344331472323u, 16675256511302206578u, 12265468483882371164u, 2079631u}, + {15393411899635506913u, 18237564239977661558u, 7731120109143127821u, 10919059132817339488u, 3437448u}, + {1307398797624639615u, 11199843228441377096u, 11080137481040428446u, 15195504482406610443u, 1539776u}, + {3760039248096958148u, 9526418664578893555u, 17629340428451001278u, 5865068986070507496u, 3251468u}, + {17337436339003423897u, 2662459570350250031u, 8195515490200300099u, 14471497811510512434u, 851697u}, + {735811695496258703u, 2315698646066134693u, 9098022471466203121u, 5636203386017223023u, 495341u}, + {3392305562685027758u, 16585186931776875013u, 447224329713818663u, 18023535943774402749u, 3138079u}, + {3197627777972651577u, 17325995017071270263u, 14757181516991283549u, 13100311879084574755u, 504444u}, + {12564788532231988961u, 13540797326691542816u, 2581737306043990613u, 9809138151626029516u, 93078u}, + {11274513632083873619u, 6850936977605318428u, 5005405283737965742u, 4108999856015923241u, 3651527u}, + {5875261951948373744u, 18350203229918170392u, 16595444947485042647u, 13758301655362548113u, 3903236u}, + {12209013136382502802u, 10193945115013221587u, 14277364674990794622u, 6124839908495538054u, 1308060u}, + {1529587853006456514u, 12416969152708729179u, 10742701491529497314u, 18326758339811592168u, 3557645u}, + {3955998918380443401u, 9448826716494585351u, 10523802719828813820u, 18296198276742638565u, 3821214u}, + {5543151689607459944u, 1828301898436696523u, 5744692225741875957u, 7276248378797867847u, 2458104u}, + {5990717590170421787u, 10846798651050922309u, 8547555484954822340u, 6602585080122252298u, 3009803u}, + {4697816178341264605u, 13011209431005569680u, 13000231217905739748u, 6973050099896950165u, 896955u}, + {11125680865811634913u, 1097080788336719864u, 14142739521488909342u, 8591399596817108634u, 3686075u}, + {10860536079787201296u, 4313532881481091548u, 5350585751027120989u, 11308980760669656548u, 1052638u}, + {7349059404215080180u, 7307188553694457345u, 12241620117191349667u, 451763319324809851u, 3419039u}, + {11670318201780797520u, 14562407038649943340u, 17938109705763769052u, 207185325938651022u, 815349u}, + {1643237966004725021u, 13398953944618496666u, 2567879137399312280u, 1095904445109859375u, 2932420u}, + {16816595450997741145u, 1865257297807354223u, 8479047668489161540u, 13889151657634695520u, 1717605u}, + {1070170589653658023u, 3892350438984882072u, 702732413315827779u, 12857935972495048160u, 1328079u}, + {10849465071808413496u, 13723037678582974800u, 1764870546583863081u, 14868363118093758896u, 2382088u}, + {18332062890262053251u, 845582990095700502u, 8921087161945151598u, 14527518184188932892u, 203642u}, + {2699881234479631813u, 16539863962647185716u, 12896457546859604298u, 2093426773484086688u, 1426372u}, + {1121973847496123465u, 17063417919114988991u, 769300076267388893u, 6151207414555206574u, 2881784u}, + {10115978384430956594u, 10061407286698681256u, 910706864357697111u, 17635212483329334805u, 1120177u}, + {8487186545543278105u, 4697273442307817618u, 13464109472795361188u, 5136752812764351683u, 3784806u}, + {8600537100774436739u, 18230335214862385915u, 18039037451623721772u, 15994545635169467021u, 2561859u}, + {4408692650344811502u, 12275098314233735353u, 6693975997963605413u, 11504415425351016937u, 2187679u}, + {11168976277753967314u, 17066489131717799319u, 9606256371338226074u, 5012329554749871847u, 2768568u}, + {14657175271729030221u, 15205574307889461454u, 11958613475835357540u, 2861317237838180964u, 3163404u}, + {5781719881192315702u, 9864425702051346085u, 4767410271016276736u, 7264113910643859928u, 481000u}, + {15407875957278529747u, 2151930470076811459u, 17914664864249310273u, 14636564480862939212u, 2611375u}, + {14262419306222146891u, 15210979760837565976u, 3950761553634856869u, 2714302360345381393u, 1278977u}, + {2900600732291367777u, 17666418572637440494u, 10008432725611885043u, 14651284553808834189u, 186979u}, + {16332200259801252245u, 16652169030214106134u, 1114962782337836092u, 2381349771663064580u, 1258351u}, + {18388706611795653558u, 4483784206878918450u, 11964738911627924019u, 12993579408060274739u, 1087341u}, + {10692520079867364210u, 16641374867843252477u, 11510174236566605303u, 6577298971592873001u, 3405546u}, + {14707456188763582654u, 17709979195138839252u, 4806028695306845106u, 12961130574859644784u, 84629u}, + {16863121288562347388u, 17475077969791200601u, 9285265442820630328u, 14196907167937147932u, 1103354u}, + {7990628259323895992u, 10793408827174227110u, 10161720949894522427u, 3983520975143647376u, 1428243u}, + {8669606801391211358u, 5608434649934751660u, 5023750578299253535u, 13933462086399679774u, 3368182u}, + {2233536134545960707u, 15158820599301476419u, 7023817069088722467u, 13753074872487445111u, 598091u}, + {7945127837803492185u, 12322468203331189485u, 17026532335104730615u, 515436003628359443u, 3062058u}, + {9902070205229791656u, 6433799166228204875u, 15320854228118868486u, 6469610870155877229u, 1676661u}, + {646261968955069551u, 764598474355687865u, 12505258208004719926u, 14298332562344712128u, 2777759u}, + {13569548774259974950u, 14162042790994560705u, 13503398005554141714u, 12301031610117525052u, 1551993u}, + {13699805969454207769u, 17034785175733861032u, 4772094122242305005u, 10981383523741266590u, 742471u}, + {14922681198620889228u, 14601745726238905561u, 4411533795591857194u, 10678220101113869256u, 722539u}, + {9990585880627372172u, 17276882459006216968u, 15291286095448817569u, 10245506856080261038u, 2184758u}, + {10460207199947703057u, 14531286616604038136u, 11985402415113294560u, 13154783796837380740u, 2500289u}, + {8338509035280364908u, 750435404394774448u, 17299315357390471106u, 10134185369758006017u, 1153356u}, + {5356777173510302230u, 18125603120460787097u, 6855350844498817385u, 3191809810760891907u, 2922702u}, + {13312698675671399793u, 16064590757758035774u, 12692805029051512688u, 18140370442509440800u, 1132325u}, + {5565522563564437265u, 18165628401450731519u, 10017098553551155423u, 9532490140630121162u, 3713265u}, + {6506948763864862630u, 668086762854091286u, 14969669368632033288u, 6193393151889227798u, 3197860u}, + {10092972625178125012u, 7041841931769802466u, 11436419784886499504u, 5247136881927757370u, 1027609u}, + {3711066434887278236u, 590261285095641599u, 10225464008233773452u, 1027762362008968584u, 3466988u}, + {9395214216064241689u, 7445469752319546164u, 17469457571428819441u, 12962263974159485036u, 3663316u}, + {243651467309565394u, 14177903953866050036u, 17472824109466264997u, 4318974313913137577u, 1258789u}, + {18095522567795327206u, 18214798657061119367u, 12586040118017302380u, 11048032450647749294u, 1405976u}, + {5920371977215369418u, 3835493900750435851u, 3516069521339000505u, 8889019757158946439u, 3716023u}, + {17405235799480173892u, 7899918079414256664u, 5233149580216311251u, 15416816064220688514u, 2577511u}, + {2799967105684232131u, 8039384212432615992u, 5829102695104854428u, 5307751065949726572u, 3482730u}, + {757544177533652241u, 2024523898236022441u, 11977807622861547906u, 17862470761663781724u, 3704363u}, + {2858026537354830615u, 16432293546647720450u, 7686432350418283480u, 3599155561938058561u, 3371606u}, + {12435502146421808819u, 11672848642982342769u, 7819092567301592291u, 2368038165812233080u, 3061909u}, + {14380675292080780692u, 6553742182942109959u, 5372208833639235634u, 3082901203660999417u, 1795049u}, + {17335651664028416690u, 6502935694126590809u, 10694474075110362263u, 3780107702557922132u, 1556594u}, + {2007711046921421018u, 15057494996182332331u, 6384012970318514932u, 16385787941534421020u, 3904660u}, + {16948184507002026143u, 4199737255540544819u, 6407505706242662185u, 17149678067089559511u, 1315567u}, + {7754934247272660417u, 11832064710906006537u, 14395207889288469667u, 11625540585016893616u, 2409570u}, + {16161524993293801033u, 1833367358295831086u, 5612583049577566895u, 9628108739787644397u, 1787161u}, + {2260163242345027541u, 15793712368913999453u, 14079414202879457717u, 14804774088988850455u, 718834u}, + {1105252703657071082u, 13296510930313891908u, 15037531199452479414u, 6786674001199481004u, 1738098u}, + {867339417926585974u, 18395693940267180227u, 8193072917332202840u, 16461193696415269833u, 1160090u}, + {6203587551868971923u, 15520979949124421002u, 2757332114571940267u, 14000573143151682994u, 1128832u}, + {14062676310427508901u, 13994769298463790231u, 13308874017389432163u, 7586870662989220123u, 1297549u}, + {3889249387482813846u, 4617630956868511948u, 18059534145317619064u, 3194469699581797601u, 120262u}, + {13900270619885909633u, 17306988974196433936u, 12511338036229165626u, 5478595592412785293u, 2585894u}, + {1807618306628052855u, 6145547157030215441u, 12530688739001267132u, 7325518328129058215u, 1857429u}, + {1776719869084728527u, 4595069123724361202u, 16189111255281560768u, 12284054511171353706u, 2962736u}, + {4384084225758063886u, 327490217223975432u, 5311464783685685044u, 17420533008174653029u, 2539944u}, + {14521730433964551334u, 13472180568380435049u, 10042454204641683389u, 3721791010284411877u, 2347524u}, + {18285779441204315063u, 7501581827641382183u, 13506902681551157715u, 17337126747259386591u, 2217388u}, + {3890819873709376313u, 4204671512216675998u, 9188057585060224850u, 12146579404657134670u, 2851163u}, + {6980453937726841247u, 3096745284010766971u, 17916659884041529275u, 11437694544312623238u, 98384u}, + {10302505889617707789u, 8844641697566517329u, 15473346286482908225u, 5982595181054661072u, 2243568u}, + {13496609915126913535u, 1710300676983905895u, 6542450657993928881u, 257559312804343380u, 2787945u}, + {15054896816166712710u, 7001072138098668320u, 12625182234890189153u, 3726365804098462224u, 3159567u}, + {7799352474029107208u, 11247767341799548345u, 17878077009615476353u, 6903755161162257990u, 194948u}, + {11917844435631612606u, 16893758467763758680u, 15323598864680908183u, 3678533458701761426u, 2088838u}, + {733876276135197267u, 15255470776634499241u, 1479864860384542955u, 12792726408389217443u, 1522248u}, + {10158654004120182385u, 7250565287577963791u, 16926182853456537689u, 11701410766209768257u, 270027u}, + {2197737701956036427u, 575913131062672560u, 5607476126351967591u, 4472551961014934367u, 3780872u}, + {12838625447938673203u, 14292985472533344496u, 15724438503011367498u, 3168221326262907588u, 2966327u}, + {11350325618429984281u, 5885836182072218110u, 6997625175068448706u, 11944222094434265399u, 1990138u}, + {16780220916361691292u, 9452193166969928078u, 1258591969483518462u, 7242470982094379874u, 822821u}, + {7491201202423103588u, 2149640085026898999u, 1191818494886703643u, 6644477027137314861u, 720613u}, + {10540634688015042771u, 10551750616865322733u, 4721913966982591539u, 589753722535088576u, 377229u}, + {10217127610096429756u, 7855837045515702235u, 18108073663154365389u, 3826011131420115710u, 2654495u}, + {5765753795481358728u, 10343965058479217555u, 11751122570087962056u, 17414846956876585343u, 3254356u}, + {6736094883031500566u, 6209703118174634122u, 8032166890771493473u, 12886284028422760686u, 95651u}, + {18444357108655996631u, 16565912301723141848u, 13731437204722570085u, 15782377556709896404u, 2771116u}, + {10560122153002314700u, 7940656398265889303u, 10068599281499414348u, 16480249524080508682u, 1356698u}, + {6266618536535118005u, 15872994359674523669u, 6250359188435401985u, 8455765179709131637u, 3486523u}, + {1881853992338831963u, 6192292809945735243u, 13613748875765135036u, 4892173806485038938u, 3238734u}, + {1201635871152737964u, 11210004254880971172u, 7905040104385738202u, 2509702299402545261u, 3537137u}, + {6698646825852875608u, 115687844331070022u, 12486760691075505402u, 12531212432063884009u, 708022u}, + {14675463498460584934u, 9398873954259366704u, 4024112240557703598u, 9812893502321967712u, 1260786u}, + {12283428638941621986u, 2875674121776364623u, 1211912130143346107u, 3121733950117510721u, 1915739u}, + {7773706165886145452u, 14254301398131939545u, 15140994288621419494u, 6880810583769912132u, 795846u}, + {3312224638137110618u, 1373112592129996481u, 10796865818466532894u, 8949822435067960099u, 3221270u}, + {17414561105616632648u, 966092845107941081u, 7416189153424231158u, 14182710383666016258u, 395262u}, + {13623710202516116407u, 6768581863495163201u, 8427573048570709106u, 1664615974011115496u, 106522u}, + {12403745404735070764u, 2598531490561257241u, 16018323343997346280u, 7640069953757196878u, 665254u}, + {3984416913263401613u, 2884165999823378057u, 14903997858926207652u, 1813711628870279927u, 1330817u}, + {4584079233973645535u, 6763669091638037881u, 4117870365380251734u, 11986109852717690929u, 3203608u}, + {5522058982085385957u, 3816193171655448424u, 17545094104410614493u, 9138352997653518297u, 359748u}, + {2267838147151380978u, 12311459064444907755u, 7900206747775122275u, 511039346690877413u, 1197643u}, + {13932855518845365229u, 12912165450890829874u, 4001440080699916193u, 9533695027430196627u, 1150885u}, + {4921953516171707104u, 11567104394606873524u, 13683366553609002449u, 10541638820124444900u, 1600307u}, + {9087135089159873328u, 12497260360103396284u, 10005348199927692848u, 14224866489681808123u, 839520u}, + {12955990650387758768u, 5272277513007825557u, 8383536854579900195u, 7149188234564492796u, 2770629u}, + {11732004488505094981u, 2585944925095323463u, 15657213792676115530u, 16408182937845027527u, 3093236u}, + {7722558066384807585u, 6544181281742034802u, 8254860859075841862u, 561463307525263528u, 1080766u}, + {8812358258303115837u, 305448684294757963u, 14519088864083972759u, 3550758722225498948u, 1375766u}, + {18107566215762086005u, 4531406212799166314u, 3948282160261821716u, 11914881423116179257u, 375137u}, + {13504756466283525842u, 6508389471989647068u, 3334260967208187452u, 15139014816111327163u, 3879050u}, + {4002530786941312137u, 4942429874284404575u, 5670011940228982539u, 1296534956382912764u, 3346u}, + {5556380661485988175u, 2725339295884964243u, 10009570430271881467u, 61724102205588u, 0u}, + {13356937694402061675u, 7406583114056784828u, 1885360334748570494u, 61724u, 0u}, + {15648617910059072899u, 2075562681147754256u, 1138608716565983u, 0u, 0u}, + {6567645663946930780u, 13218309302402671991u, 1138608u, 0u, 0u}, + {10128415775026933749u, 21003623594587587u, 0u, 0u, 0u}, + {10968205056921928210u, 21003623u, 0u, 0u, 0u}, + {387448469069884691u, 0u, 0u, 0u, 0u}, + {387448470u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1955426u}, + {7640156172174381424u, 12074505523253806975u, 12511843883232364818u, 2558087034304555333u, 3301836u}, + {1590566217304393086u, 3043088583310615356u, 6901338498900127529u, 1357944818906150733u, 3168287u}, + {15343607330713875342u, 3858282790293201746u, 1235056100664979096u, 12380293161284682889u, 428089u}, + {13177118234216213203u, 8789233526748502708u, 9710821956022057655u, 17013489053555056305u, 2005392u}, + {11261525132619951836u, 5791674199595149473u, 12716627858180047116u, 17330815539107658238u, 1132789u}, + {5578487283736404195u, 7668136420737987155u, 6884237500351611285u, 3263488017810086028u, 2542778u}, + {16627444478109300460u, 14899385408241086318u, 906016933365846471u, 13881964033547910756u, 2488808u}, + {10026214163643771038u, 9717977498606067045u, 5279909804883591310u, 5666402753064943963u, 1322921u}, + {13090793720080100322u, 15629345080253294289u, 14726668504197229023u, 14940325556634221418u, 3364067u}, + {16375508558050264612u, 905588737840771031u, 14949309480546521122u, 13608883777066589394u, 1404525u}, + {12509774746771869451u, 15918068565955195676u, 923292649297340773u, 15518291644983516925u, 3547858u}, + {13818537385160453069u, 17603779923724125607u, 6654763515609447332u, 5613881184974605739u, 2507615u}, + {15688275956862186322u, 4611851982940854918u, 4614666631542837335u, 13881315393036440074u, 1142283u}, + {256549769100358180u, 15187037771057708010u, 14481052006205182762u, 17386951579182697136u, 3419071u}, + {5636975128234086768u, 14824392262210401816u, 9886825287507624112u, 6548254208507308009u, 3098848u}, + {12057930465257767418u, 11756466846816851344u, 2092716292495394868u, 5605598403448031977u, 3697983u}, + {8352230315415923696u, 12914804386202790324u, 4826083395750513828u, 10444509293057149856u, 951136u}, + {4359640119720108479u, 16512431404944754u, 2637619364547698218u, 6646844024305171213u, 2821218u}, + {6246224308148832681u, 16159381639914710830u, 1773829707840237066u, 14607676288730429810u, 2863119u}, + {5391899735240872342u, 13207892569235275682u, 8184453515326107971u, 16337831490624965042u, 1742074u}, + {17183405418877255196u, 455922121228395404u, 864352196163978408u, 10552544339110773640u, 1291745u}, + {13753266906343195761u, 13713519247438232722u, 15919236872003123455u, 7157530309730903947u, 1349506u}, + {12216028108990346172u, 13039865842048243632u, 16491493312792383959u, 2691024978368799423u, 1908350u}, + {904681173065771625u, 12801286426423769933u, 3600675756746195516u, 4646888865171476505u, 3315456u}, + {4011902033925330549u, 4723132625845800945u, 6162197598799946160u, 3664039074862930440u, 3769658u}, + {17347792452058731668u, 8454866811515625083u, 14547061209556777483u, 10013485897269506043u, 2406717u}, + {14721214773273207590u, 8484449397549765434u, 3802071625001349595u, 8835422575197540120u, 2691056u}, + {3734245437526923089u, 7749865516259327691u, 6107470075384621636u, 9056840484896435106u, 3049948u}, + {2944012016440920881u, 8851803337011606042u, 7905371990698833584u, 9207576062067810656u, 1405496u}, + {6811079105535212964u, 6903064132807950290u, 477626647236721853u, 12708063384891515278u, 3155224u}, + {15181821827242885241u, 12052313894122013706u, 3312246859167639918u, 17712314161623633851u, 143170u}, + {13723244422533280252u, 14225181875175911409u, 2370343362898495491u, 15639138944291709270u, 762907u}, + {17506341194065939525u, 13400423319680462836u, 3438786360317663519u, 12984440092647208957u, 3432393u}, + {17469270676298741803u, 4995050675939476741u, 11936999604104162785u, 2729447467619165873u, 3715225u}, + {6275028746108864039u, 4980273239111072408u, 9624025608638620028u, 1797916064390965500u, 3383724u}, + {1913118474987312880u, 9308414704854830758u, 4118484359976772906u, 8132869224689913675u, 3761567u}, + {2377336798878871505u, 15411023510299777557u, 11685199740396806181u, 7779551233956269793u, 140652u}, + {10778669660647407197u, 15304359332420089317u, 14944877370540182532u, 3677531875161331365u, 1146230u}, + {8440502356407708565u, 5619417864313932906u, 9410404420066477639u, 7226903618929933574u, 991987u}, + {12990854368851138581u, 893491943363115450u, 16765038653753296773u, 15943027219922424391u, 3265014u}, + {9619874815574729039u, 3393518620732995145u, 16277167456434549881u, 9788004088718377297u, 2929252u}, + {5248118344372680751u, 6687364301307187605u, 3848886032096132974u, 13817035633003641716u, 3796309u}, + {17121768851591386238u, 11681620834807713511u, 3494312500304109688u, 13905087609646919579u, 2483564u}, + {994421322816408290u, 5941853739230880595u, 9159896849331685962u, 11647086323510163694u, 746703u}, + {11465675956524017407u, 11672085712050502482u, 15319757948698676515u, 2247559665962923482u, 435189u}, + {1595788328356483381u, 11279236053014272665u, 389944004299961231u, 80085416392181188u, 499148u}, + {12912246716529547903u, 4095186917076883356u, 12215514280017594163u, 2891511417008106831u, 1861991u}, + {248895216083966867u, 16075451190514039775u, 13487047088018622745u, 11203274750214892018u, 2893217u}, + {12011234648622660253u, 1846847173197128231u, 233917456595095062u, 16050156321171982270u, 742622u}, + {3534153694083135827u, 17059936561093405440u, 14981697004919792292u, 3040117923620635967u, 719621u}, + {6015846277894209081u, 6429486119287055129u, 15939711720577873665u, 17162982048484033632u, 2453233u}, + {9199921232085293271u, 1045196676163285898u, 17037563367849495063u, 17843479905835360944u, 860072u}, + {10149780114115848993u, 14229180103713050368u, 5770829553060884184u, 2898169307429560867u, 1535033u}, + {6863473289253073859u, 6401634558171025337u, 10612858190348798000u, 13142798478696752253u, 2819169u}, + {3016174169753486454u, 6249552361076141354u, 11372036935916883175u, 7257763905979127761u, 2464677u}, + {11241570578418201349u, 2059296064365365315u, 9728735230394136362u, 12007025883397159518u, 2742522u}, + {16794436512191714970u, 360624293286887616u, 5795507120358518769u, 2284376028633309966u, 688866u}, + {700141613319552264u, 16889335665517503030u, 11378273129634810724u, 13271304640066196256u, 3708154u}, + {17020732063701726445u, 8045965152710561681u, 13452714615853947810u, 16209304445591064672u, 3105159u}, + {10563261215570968736u, 13808481211951837007u, 3273404559270897664u, 9064479344331472323u, 379088u}, + {9480024678321818325u, 8471736589417309939u, 15393411899635506912u, 18237564239977661558u, 1675967u}, + {4192181445143738997u, 1194658968645806207u, 1307398797624639614u, 11199843228441377096u, 803190u}, + {2827377607552392789u, 2142983901211760036u, 3760039248096958147u, 9526418664578893555u, 3707222u}, + {15179393678336761355u, 17515704786670982118u, 17337436339003423896u, 2662459570350250031u, 534275u}, + {4922764362500749240u, 12528629995133287528u, 735811695496258702u, 2315698646066134693u, 647285u}, + {10569621474808919425u, 9968058806604227232u, 3392305562685027757u, 16585186931776875013u, 1744071u}, + {7308989017512372213u, 16813767112287460468u, 3197627777972651576u, 17325995017071270263u, 3579343u}, + {15580997010177340465u, 10230564132519131848u, 12564788532231988960u, 13540797326691542816u, 296287u}, + {4969708854706237504u, 17075108536862402589u, 11274513632083873618u, 6850936977605318428u, 2579010u}, + {1392607526257613888u, 16472791691211679628u, 5875261951948373743u, 18350203229918170392u, 1833621u}, + {7278817439941422627u, 248835359959992653u, 12209013136382502801u, 10193945115013221587u, 1250246u}, + {13726999931916010171u, 1926865148665544514u, 1529587853006456513u, 12416969152708729179u, 503172u}, + {6098498363755348714u, 14148619668343455224u, 3955998918380443400u, 9448826716494585351u, 1456194u}, + {12729148157832640187u, 6371119511321876792u, 5543151689607459943u, 1828301898436696523u, 2068633u}, + {14985274099345332309u, 14251046141594185557u, 5990717590170421786u, 10846798651050922309u, 2214076u}, + {10451698920939553850u, 6631194732776776563u, 4697816178341264604u, 13011209431005569680u, 879118u}, + {16951385246903731509u, 5619676847927563188u, 11125680865811634912u, 1097080788336719864u, 3368336u}, + {6581872458362129576u, 13927150700571712587u, 10860536079787201295u, 4313532881481091548u, 1592235u}, + {13938207735271921925u, 5205431808130141637u, 7349059404215080179u, 7307188553694457345u, 367167u}, + {15458202815338769769u, 9196898215749567426u, 11670318201780797519u, 14562407038649943340u, 3702498u}, + {10922785322972730929u, 6745089740233914647u, 1643237966004725020u, 13398953944618496666u, 3459550u}, + {4038166850196975686u, 14724967291583699243u, 16816595450997741144u, 1865257297807354223u, 67240u}, + {8564706601805245453u, 2769169009394308513u, 1070170589653658022u, 3892350438984882072u, 1739863u}, + {8226549563942256348u, 1829121997105067795u, 10849465071808413495u, 13723037678582974800u, 2870395u}, + {8152509682448010546u, 10292091811993051267u, 18332062890262053250u, 845582990095700502u, 2096572u}, + {14044367568395136901u, 13593282383277783575u, 2699881234479631812u, 16539863962647185716u, 3134738u}, + {11893270980693716996u, 14069468150730726556u, 1121973847496123464u, 17063417919114988991u, 2461231u}, + {13965296728915330702u, 13511230199504143553u, 10115978384430956593u, 10061407286698681256u, 733453u}, + {588939342998542149u, 12759684038388019350u, 8487186545543278104u, 4697273442307817618u, 3893452u}, + {15289108158340416526u, 4763593197746639023u, 8600537100774436738u, 18230335214862385915u, 1371912u}, + {13586525511941296777u, 16479384987953965851u, 4408692650344811501u, 12275098314233735353u, 3301229u}, + {9663412102110150591u, 13262680930533954516u, 11168976277753967313u, 17066489131717799319u, 77084u}, + {4448543982733604565u, 6013474792651364290u, 14657175271729030220u, 15205574307889461454u, 3501588u}, + {17356461850360950821u, 14761675130967145585u, 5781719881192315701u, 9864425702051346085u, 3375134u}, + {14025912237342641169u, 7077539144210885799u, 15407875957278529746u, 2151930470076811459u, 370115u}, + {1579644127885034611u, 13324727596288442951u, 14262419306222146890u, 15210979760837565976u, 667219u}, + {12106496145107239314u, 5147102225089213024u, 2900600732291367776u, 17666418572637440494u, 372141u}, + {1347878514000512837u, 16461014355529813453u, 16332200259801252244u, 16652169030214106134u, 878928u}, + {6880014789456716867u, 13559536690601512961u, 18388706611795653557u, 4483784206878918450u, 3693239u}, + {5539269796602092524u, 15401458564154031887u, 10692520079867364209u, 16641374867843252477u, 3028645u}, + {13876121675274387615u, 7450163301352625880u, 14707456188763582653u, 17709979195138839252u, 2013374u}, + {639827988403884088u, 6574907124319371567u, 16863121288562347387u, 17475077969791200601u, 3080614u}, + {2056482856497423942u, 10115873243442669726u, 7990628259323895991u, 10793408827174227110u, 3252601u}, + {14765803987949195764u, 2313273496969665918u, 8669606801391211357u, 5608434649934751660u, 1448811u}, + {16914787113889781636u, 9420249213386083668u, 2233536134545960706u, 15158820599301476419u, 33589u}, + {11883473198363570524u, 5310806449514320455u, 7945127837803492184u, 12322468203331189485u, 1120701u}, + {4347714137187001473u, 8013276698976679897u, 9902070205229791655u, 6433799166228204875u, 2386466u}, + {4946640396798785667u, 10803781182097399762u, 646261968955069550u, 764598474355687865u, 2100878u}, + {13454994073587503367u, 16688174614366387985u, 13569548774259974949u, 14162042790994560705u, 1582554u}, + {6251757141427934709u, 15040789893188836913u, 13699805969454207768u, 17034785175733861032u, 2499721u}, + {8822609315428260121u, 17307459450380448761u, 14922681198620889227u, 14601745726238905561u, 2987924u}, + {9737377896378123141u, 17455843051280933917u, 9990585880627372171u, 17276882459006216968u, 2586375u}, + {6972678548712610325u, 4111861525517526777u, 10460207199947703056u, 14531286616604038136u, 1618684u}, + {14740796018625824523u, 1191193632731220361u, 8338509035280364907u, 750435404394774448u, 2122164u}, + {1436324474808985318u, 9418606086982382200u, 5356777173510302229u, 18125603120460787097u, 3675709u}, + {5027858585692095883u, 10723521871901724768u, 13312698675671399792u, 16064590757758035774u, 385688u}, + {2801101789428316939u, 718543193692854734u, 5565522563564437264u, 18165628401450731519u, 1060805u}, + {7810283227550141366u, 14879218442992677903u, 6506948763864862629u, 668086762854091286u, 2832766u}, + {6474053056337858525u, 6475694491587960563u, 10092972625178125011u, 7041841931769802466u, 748128u}, + {5444326359803619542u, 7920375853273594475u, 3711066434887278235u, 590261285095641599u, 1275974u}, + {6260660454444442911u, 15844099656438345588u, 9395214216064241688u, 7445469752319546164u, 2960713u}, + {12153139793643042443u, 14048502395324104796u, 243651467309565393u, 14177903953866050036u, 3051213u}, + {9339312565629303043u, 12387352005062486162u, 18095522567795327205u, 18214798657061119367u, 891290u}, + {9794181343302625762u, 11209948348994742953u, 5920371977215369417u, 3835493900750435851u, 2474167u}, + {4865098414741827171u, 7936006706598706121u, 17405235799480173891u, 7899918079414256664u, 2222141u}, + {8285117087232960449u, 612251336005426277u, 2799967105684232130u, 8039384212432615992u, 374660u}, + {4996633954868017001u, 357500889133282387u, 757544177533652240u, 2024523898236022441u, 171418u}, + {10850242993379209266u, 4221196190647544444u, 2858026537354830614u, 16432293546647720450u, 3880142u}, + {2403667948561226069u, 16673727265399226263u, 12435502146421808818u, 11672848642982342769u, 3716575u}, + {8950157589483892694u, 2282908594808947753u, 14380675292080780691u, 6553742182942109959u, 962350u}, + {8311186325190891142u, 4309270744001944689u, 17335651664028416689u, 6502935694126590809u, 3768439u}, + {823856704661739220u, 2511546659632363901u, 2007711046921421017u, 15057494996182332331u, 1105712u}, + {1064806223590796391u, 12118673100056614552u, 16948184507002026142u, 4199737255540544819u, 792513u}, + {13705084806360806460u, 7554542594544191501u, 7754934247272660416u, 11832064710906006537u, 1730793u}, + {17511829100409708500u, 13247322955703336719u, 16161524993293801032u, 1833367358295831086u, 710113u}, + {1911873976635180420u, 6821431391719201556u, 2260163242345027540u, 15793712368913999453u, 2055301u}, + {4661519161584625286u, 332444350825749432u, 1105252703657071081u, 13296510930313891908u, 1138816u}, + {12647742822372333324u, 13378879390277528074u, 867339417926585973u, 18395693940267180227u, 1550258u}, + {16119099276151252789u, 13153237870583656045u, 6203587551868971922u, 15520979949124421002u, 845463u}, + {10650629052886120601u, 4881659333081193848u, 14062676310427508900u, 13994769298463790231u, 322275u}, + {3859445957348309973u, 12277315304374814180u, 3889249387482813845u, 4617630956868511948u, 713752u}, + {1784902902147885956u, 3037528052320078351u, 13900270619885909632u, 17306988974196433936u, 1119528u}, + {8696672614406939677u, 15621864586809562293u, 1807618306628052854u, 6145547157030215441u, 3005446u}, + {16015427592828498995u, 12273446848415321803u, 1776719869084728526u, 4595069123724361202u, 2128280u}, + {13365566501442979576u, 11236034277057096021u, 4384084225758063885u, 327490217223975432u, 3765872u}, + {10398770635779843269u, 9042439538473815456u, 14521730433964551333u, 13472180568380435049u, 411565u}, + {13368044945019834013u, 13160445082943790810u, 18285779441204315062u, 7501581827641382183u, 1373199u}, + {1626887622305743008u, 15287564547367834250u, 3890819873709376312u, 4204671512216675998u, 3812398u}, + {12895604820373853462u, 1053688514528488002u, 6980453937726841246u, 3096745284010766971u, 2906487u}, + {17624345181098516588u, 173979619234652759u, 10302505889617707788u, 8844641697566517329u, 2871835u}, + {17134135598088116105u, 8271579293767307318u, 13496609915126913534u, 1710300676983905895u, 622631u}, + {16106973055166375559u, 3378532068950487160u, 15054896816166712709u, 7001072138098668320u, 367689u}, + {14935704602344095258u, 17944310348560129585u, 7799352474029107207u, 11247767341799548345u, 1749981u}, + {9063280009545176180u, 13760626623033932663u, 11917844435631612605u, 16893758467763758680u, 2781977u}, + {5090670771460956495u, 15889435007703443458u, 733876276135197266u, 15255470776634499241u, 2428931u}, + {8762653282403689271u, 10285060720422461366u, 10158654004120182384u, 7250565287577963791u, 3876563u}, + {358605709679746947u, 2217748158204536979u, 2197737701956036426u, 575913131062672560u, 1386795u}, + {1995145882644615213u, 18244141751771804840u, 12838625447938673202u, 14292985472533344496u, 2665568u}, + {8111224774621744539u, 15394282877627684301u, 11350325618429984280u, 5885836182072218110u, 685668u}, + {3271040659016594166u, 1799713214203693916u, 16780220916361691291u, 9452193166969928078u, 3250972u}, + {12913950367253727680u, 8188520229210249264u, 7491201202423103587u, 2149640085026898999u, 1699047u}, + {5914736583952999318u, 37232971767127809u, 10540634688015042770u, 10551750616865322733u, 84529u}, + {9189418246204423717u, 13335031792913758344u, 10217127610096429755u, 7855837045515702235u, 2153719u}, + {5463128852052155772u, 17050258765004479449u, 5765753795481358727u, 10343965058479217555u, 691180u}, + {16856628117637794658u, 8141206485734042365u, 6736094883031500565u, 6209703118174634122u, 3508655u}, + {9384263024442540517u, 8697518035044141368u, 18444357108655996630u, 16565912301723141848u, 776345u}, + {14979701703550660994u, 11518724723452662499u, 10560122153002314699u, 7940656398265889303u, 1101748u}, + {17990435447593429974u, 1075508555581884774u, 6266618536535118004u, 15872994359674523669u, 3653615u}, + {14282397925846528995u, 14815143677809613137u, 1881853992338831962u, 6192292809945735243u, 2226798u}, + {4842169706642233140u, 948762880362484992u, 1201635871152737963u, 11210004254880971172u, 2365200u}, + {8696695952595459724u, 11630360666148950588u, 6698646825852875607u, 115687844331070022u, 1701478u}, + {16871647072514550527u, 15935462030113812414u, 14675463498460584933u, 9398873954259366704u, 3546856u}, + {4044082339588650541u, 15354349123940565184u, 12283428638941621985u, 2875674121776364623u, 3195977u}, + {16638657385300332088u, 17358667778263322370u, 7773706165886145451u, 14254301398131939545u, 217832u}, + {239995440558063773u, 5406437496230597793u, 3312224638137110617u, 1373112592129996481u, 1590748u}, + {6601672973825274792u, 2622813436485426747u, 17414561105616632647u, 966092845107941081u, 3644308u}, + {4848804218041570418u, 4201467160318351668u, 13623710202516116406u, 6768581863495163201u, 241674u}, + {13045949218890900613u, 13001570816114284211u, 12403745404735070763u, 2598531490561257241u, 100952u}, + {5908807708305987551u, 10352835401873723448u, 3984416913263401612u, 2884165999823378057u, 3377986u}, + {7586350567395040522u, 13467955683717090388u, 4584079233973645534u, 6763669091638037881u, 3751246u}, + {12676722143728128371u, 12135843727778457974u, 5522058982085385956u, 3816193171655448424u, 3343033u}, + {13395320561339589496u, 14529120281179215176u, 2267838147151380977u, 12311459064444907755u, 751141u}, + {6395110312893176201u, 14828126601976022014u, 13932855518845365228u, 12912165450890829874u, 2053985u}, + {2548557268243746556u, 6098378719274413303u, 4921953516171707103u, 11567104394606873524u, 1696591u}, + {8031163231117365783u, 8778222280069375858u, 9087135089159873327u, 12497260360103396284u, 654486u}, + {12569671371775091259u, 3753172473533087322u, 12955990650387758767u, 5272277513007825557u, 3465605u}, + {16196755346257015681u, 8599498710369769481u, 11732004488505094980u, 2585944925095323463u, 3198278u}, + {14765555690467492050u, 9565263188459668104u, 7722558066384807584u, 6544181281742034802u, 933406u}, + {13414828991410550874u, 8383062938837817511u, 8812358258303115836u, 305448684294757963u, 3460523u}, + {12931854252239880365u, 12746433275823104675u, 18107566215762086004u, 4531406212799166314u, 1258000u}, + {7001430790918502958u, 5998833740491021880u, 13504756466283525841u, 6508389471989647068u, 2304660u}, + {12463308440540529524u, 15989133970062875999u, 4002530786941312136u, 4942429874284404575u, 3209689u}, + {11779137431753754720u, 10890081865698633514u, 5556380661485988174u, 2725339295884964243u, 3074175u}, + {4099812973608845544u, 12204433442033119139u, 13356937694402061674u, 7406583114056784828u, 3141478u}, + {8330073314408319230u, 4835181063338223423u, 15648617910059072898u, 2075562681147754256u, 1722233u}, + {17640623118459204528u, 5446435171500509950u, 6567645663946930779u, 13218309302402671991u, 1138608u}, + {2510905851521339680u, 10854276042379333749u, 10128415775026933748u, 21003623594587587u, 0u}, + {13400954315941092617u, 4359414629222597179u, 10968205056921928209u, 21003623u, 0u}, + {10341945920311514726u, 10393503933766694729u, 387448469069884690u, 0u, 0u}, + {9036207120626983591u, 1289145001494033098u, 387448469u, 0u, 0u}, + {14567559861634791566u, 7147162750682733925u, 0u, 0u, 0u}, + {12594217999481771347u, 7147162750u, 0u, 0u, 0u}, + {2714673599027518317u, 7u, 0u, 0u, 0u}, + {131841882115u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2216506u}, + {757448694386359614u, 5561559341074478386u, 7640156172174381423u, 12074505523253806975u, 903662u}, + {6730086238522810126u, 17311437278346528863u, 1590566217304393085u, 3043088583310615356u, 2126679u}, + {8252611085241484692u, 5158502962549517789u, 15343607330713875341u, 3858282790293201746u, 3809054u}, + {1099082937839649733u, 5930987954812305217u, 13177118234216213202u, 8789233526748502708u, 1467287u}, + {2733727211039373778u, 17351546163482632671u, 11261525132619951835u, 5791674199595149473u, 1628008u}, + {5733282869848722944u, 6358774418435098718u, 5578487283736404194u, 7668136420737987155u, 3009801u}, + {2171506409011106236u, 14063372121769156091u, 16627444478109300459u, 14899385408241086318u, 3375115u}, + {8256576023854107993u, 11990527306770682648u, 10026214163643771037u, 9717977498606067045u, 3518494u}, + {16576144325326075896u, 4178796674621798710u, 13090793720080100321u, 15629345080253294289u, 2217063u}, + {11868389406076319877u, 6620445565125103582u, 16375508558050264611u, 905588737840771031u, 3545226u}, + {18283132349223140788u, 177268845290448886u, 12509774746771869450u, 15918068565955195676u, 1177821u}, + {16925329653006163891u, 15849428525676507721u, 13818537385160453068u, 17603779923724125607u, 8996u}, + {13400301832124141164u, 11520769330824214809u, 15688275956862186321u, 4611851982940854918u, 2978467u}, + {2697109255762658494u, 15151265741178423353u, 256549769100358179u, 15187037771057708010u, 2850664u}, + {5936459625578055238u, 10957534284580923853u, 5636975128234086767u, 14824392262210401816u, 600594u}, + {786820879062320674u, 18030332578162715637u, 12057930465257767417u, 11756466846816851344u, 894198u}, + {2205968297748499177u, 10556547929903312280u, 8352230315415923695u, 12914804386202790324u, 895140u}, + {14014555650223864994u, 5940056711638379126u, 4359640119720108478u, 16512431404944754u, 1001834u}, + {2972372991844099917u, 12310273180732504729u, 6246224308148832680u, 16159381639914710830u, 1157540u}, + {17174286360758610504u, 4368414059242394259u, 5391899735240872341u, 13207892569235275682u, 1278087u}, + {14074317120799178048u, 12629362726091856981u, 17183405418877255195u, 455922121228395404u, 1223868u}, + {7896166685991274016u, 5361728191676819195u, 13753266906343195760u, 13713519247438232722u, 3767543u}, + {799945186028149869u, 2138846854085418418u, 12216028108990346171u, 13039865842048243632u, 2552877u}, + {1433879031346515031u, 7283040103320318881u, 904681173065771624u, 12801286426423769933u, 2135282u}, + {7766307719390953155u, 17198341196042555976u, 4011902033925330548u, 4723132625845800945u, 1307998u}, + {17592469312890313824u, 5763367107374083550u, 17347792452058731667u, 8454866811515625083u, 2911673u}, + {11682199040459064876u, 9338510771508366570u, 14721214773273207589u, 8484449397549765434u, 2152301u}, + {8097493360061721633u, 12429585673335299967u, 3734245437526923088u, 7749865516259327691u, 3294720u}, + {6388981690471508255u, 7338743174841372148u, 2944012016440920880u, 8851803337011606042u, 3122106u}, + {2147392051050400835u, 16480894635170620071u, 6811079105535212963u, 6903064132807950290u, 1013495u}, + {5081562205043328529u, 17007535075857962842u, 15181821827242885240u, 12052313894122013706u, 1617404u}, + {8056958625607468019u, 14593484148964059828u, 13723244422533280251u, 14225181875175911409u, 3782153u}, + {9777549794456903437u, 5995412516948442211u, 17506341194065939524u, 13400423319680462836u, 1250989u}, + {214283937531906113u, 1084898846682550342u, 17469270676298741802u, 4995050675939476741u, 449903u}, + {10986813587473776430u, 13067563302051648870u, 6275028746108864038u, 4980273239111072408u, 703922u}, + {14696861135578444417u, 11857674057870202448u, 1913118474987312879u, 9308414704854830758u, 3402008u}, + {872968713726703908u, 4643441270104469638u, 2377336798878871504u, 15411023510299777557u, 1525981u}, + {10822041957403794263u, 17978048319484465060u, 10778669660647407196u, 15304359332420089317u, 3848002u}, + {3168101760817311800u, 11219390560347240460u, 8440502356407708564u, 5619417864313932906u, 1561295u}, + {7508034027245685135u, 16247526576875222700u, 12990854368851138580u, 893491943363115450u, 369263u}, + {11626592242701635833u, 4797679168720858366u, 9619874815574729038u, 3393518620732995145u, 3147745u}, + {14260890344058313760u, 18431988122094300892u, 5248118344372680750u, 6687364301307187605u, 449434u}, + {1475677485310590515u, 4853639693342671124u, 17121768851591386237u, 11681620834807713511u, 1796036u}, + {3800811201247641519u, 314672478916184846u, 994421322816408289u, 5941853739230880595u, 3838784u}, + {5386166189589445127u, 17480306479089402047u, 11465675956524017406u, 11672085712050502482u, 2073611u}, + {16204567996357328337u, 17794023281400610455u, 1595788328356483380u, 11279236053014272665u, 3250527u}, + {11394534775048329888u, 17548338439200731076u, 12912246716529547902u, 4095186917076883356u, 358205u}, + {6660726823484141620u, 3826734242299645768u, 248895216083966866u, 16075451190514039775u, 2461535u}, + {8421288869298632439u, 9404855277842825277u, 12011234648622660252u, 1846847173197128231u, 2946014u}, + {12883268585515705520u, 3546717344590246335u, 3534153694083135826u, 17059936561093405440u, 886890u}, + {8837747126075027244u, 674020161913232980u, 6015846277894209080u, 6429486119287055129u, 1972725u}, + {13341159109119284011u, 9256302132031514133u, 9199921232085293270u, 1045196676163285898u, 1834149u}, + {15393281196074755157u, 2859529088498624432u, 10149780114115848992u, 14229180103713050368u, 3283304u}, + {13213397187581234611u, 14129731955785327585u, 6863473289253073858u, 6401634558171025337u, 2851412u}, + {6125277114231924578u, 15911134374295055179u, 3016174169753486453u, 6249552361076141354u, 2259663u}, + {10838913889741495557u, 9812078583888945387u, 11241570578418201348u, 2059296064365365315u, 18232u}, + {422287801454940626u, 2546871497506794805u, 16794436512191714969u, 360624293286887616u, 1510221u}, + {16014976598555000131u, 14908551590250047671u, 700141613319552263u, 16889335665517503030u, 2578894u}, + {2200390054462253275u, 8403569359464365505u, 17020732063701726444u, 8045965152710561681u, 2465516u}, + {7943368719361989014u, 6624303945680565578u, 10563261215570968735u, 13808481211951837007u, 2222510u}, + {10402718325823139699u, 12903434896381493204u, 9480024678321818324u, 8471736589417309939u, 2262592u}, + {12524461245220571594u, 125137190676258381u, 4192181445143738996u, 1194658968645806207u, 2890140u}, + {4516293287213934557u, 11083972403953417154u, 2827377607552392788u, 2142983901211760036u, 309509u}, + {17997806442467226642u, 12173856229930893166u, 15179393678336761354u, 17515704786670982118u, 3397142u}, + {16514046802237560819u, 16100738714791969015u, 4922764362500749239u, 12528629995133287528u, 1307050u}, + {10467177105805230322u, 3124127439895663821u, 10569621474808919424u, 9968058806604227232u, 1319891u}, + {5885196352928213129u, 1708124822459665375u, 7308989017512372212u, 16813767112287460468u, 3818742u}, + {18224981140816634998u, 8666222297186528133u, 15580997010177340464u, 10230564132519131848u, 3768488u}, + {4471304340449823471u, 9153373292589136892u, 4969708854706237503u, 17075108536862402589u, 2366826u}, + {12839661050424537896u, 4082817561392859098u, 1392607526257613887u, 16472791691211679628u, 1770641u}, + {7339132954953725009u, 1474928445089404755u, 7278817439941422626u, 248835359959992653u, 2893069u}, + {11190144768059216720u, 17976321442816235989u, 13726999931916010170u, 1926865148665544514u, 1373209u}, + {14099332707559905831u, 4241406350393056740u, 6098498363755348713u, 14148619668343455224u, 1629080u}, + {5795759882016414215u, 16360992437354393721u, 12729148157832640186u, 6371119511321876792u, 3019509u}, + {16828070196961081867u, 2848752138780572143u, 14985274099345332308u, 14251046141594185557u, 102786u}, + {5509140776348046269u, 16625291094710120830u, 10451698920939553849u, 6631194732776776563u, 3862042u}, + {5347529854770271520u, 7287991482170563797u, 16951385246903731508u, 5619676847927563188u, 1086102u}, + {14995982592919199064u, 16418115568883575609u, 6581872458362129575u, 13927150700571712587u, 937023u}, + {5098017635942871676u, 2926680280049872760u, 13938207735271921924u, 5205431808130141637u, 2471101u}, + {17482235994856113150u, 3897619420449566860u, 15458202815338769768u, 9196898215749567426u, 2370797u}, + {10216587477924808774u, 3196463180184359929u, 10922785322972730928u, 6745089740233914647u, 1367076u}, + {7071517015595494927u, 3727591427160367428u, 4038166850196975685u, 14724967291583699243u, 1679452u}, + {15645886162337264720u, 10916865880196074660u, 8564706601805245452u, 2769169009394308513u, 1500652u}, + {12371460413341530257u, 8574448278889038275u, 8226549563942256347u, 1829121997105067795u, 3247915u}, + {5855298868162007975u, 3415918399062192547u, 8152509682448010545u, 10292091811993051267u, 2518314u}, + {4904534782620924661u, 7070880522337306573u, 14044367568395136900u, 13593282383277783575u, 988646u}, + {16855730646086526471u, 2172522420118795662u, 11893270980693716995u, 14069468150730726556u, 1976506u}, + {8049356586574908164u, 16780712125531826904u, 13965296728915330701u, 13511230199504143553u, 297607u}, + {14081741944610660443u, 13821188721510360647u, 588939342998542148u, 12759684038388019350u, 422404u}, + {8722863904235441899u, 7787698336398463482u, 15289108158340416525u, 4763593197746639023u, 2724250u}, + {10099470087165634720u, 13608821530599457478u, 13586525511941296776u, 16479384987953965851u, 221373u}, + {13653592979816487103u, 7412106172349656071u, 9663412102110150590u, 13262680930533954516u, 1772371u}, + {5859446361594697102u, 9498793407162179433u, 4448543982733604564u, 6013474792651364290u, 3357012u}, + {15987568948156275103u, 7085886493555542458u, 17356461850360950820u, 14761675130967145585u, 861665u}, + {13916614410340047709u, 538652681670716358u, 14025912237342641168u, 7077539144210885799u, 3584930u}, + {2748831805286084179u, 2019926445603288426u, 1579644127885034610u, 13324727596288442951u, 1681220u}, + {8787622350118165785u, 6547667125510137069u, 12106496145107239313u, 5147102225089213024u, 1728376u}, + {12365898805378763383u, 12878807496842274152u, 1347878514000512836u, 16461014355529813453u, 688956u}, + {8469108148305152807u, 11936571187913072017u, 6880014789456716866u, 13559536690601512961u, 2883491u}, + {8033716155737253622u, 14733132969400337108u, 5539269796602092523u, 15401458564154031887u, 1530411u}, + {3226003578919166257u, 3708908484065463815u, 13876121675274387614u, 7450163301352625880u, 957679u}, + {17770813001903699913u, 4626080348578405277u, 639827988403884087u, 6574907124319371567u, 1507587u}, + {16036739199117972322u, 8808376211903678658u, 2056482856497423941u, 10115873243442669726u, 402807u}, + {15698132035992227076u, 16361489987502519676u, 14765803987949195763u, 2313273496969665918u, 2860233u}, + {12247606169777790997u, 14824698202635316505u, 16914787113889781635u, 9420249213386083668u, 2743144u}, + {3917614316840588377u, 1413883678685826505u, 11883473198363570523u, 5310806449514320455u, 806850u}, + {2337419282639712815u, 14092379123818083631u, 4347714137187001472u, 8013276698976679897u, 3642901u}, + {4680191897145527160u, 12900525354247054396u, 4946640396798785666u, 10803781182097399762u, 2324008u}, + {11464121877361810173u, 16479153600133237395u, 13454994073587503366u, 16688174614366387985u, 2862853u}, + {11982733776161219003u, 16577740161378470084u, 6251757141427934708u, 15040789893188836913u, 739256u}, + {13467578929046027319u, 2502353460290539057u, 8822609315428260120u, 17307459450380448761u, 970647u}, + {17802264747684438196u, 13763852297494424995u, 9737377896378123140u, 17455843051280933917u, 248209u}, + {6607174585233575383u, 3172200187570442633u, 6972678548712610324u, 4111861525517526777u, 2074736u}, + {10493965051813829494u, 11429742309988764497u, 14740796018625824522u, 1191193632731220361u, 2771159u}, + {14929210623394122617u, 9512532177231032970u, 1436324474808985317u, 9418606086982382200u, 3198285u}, + {9531834853729230960u, 9687740734031721687u, 5027858585692095882u, 10723521871901724768u, 3796054u}, + {5261409703005094438u, 3396333252184754613u, 2801101789428316938u, 718543193692854734u, 1916548u}, + {6036920817728706788u, 13297168894830877937u, 7810283227550141365u, 14879218442992677903u, 3391851u}, + {3662435777491795928u, 10819525815489596387u, 6474053056337858524u, 6475694491587960563u, 3583185u}, + {8065555858391102444u, 13369198309667053808u, 5444326359803619541u, 7920375853273594475u, 3441613u}, + {12131112243201616092u, 3731032363845403821u, 6260660454444442910u, 15844099656438345588u, 3758340u}, + {8150788863384913156u, 11434327912869903836u, 12153139793643042442u, 14048502395324104796u, 3550947u}, + {8187506125805872732u, 10389973842768454437u, 9339312565629303042u, 12387352005062486162u, 2223767u}, + {5577214676682228113u, 2562540273181363399u, 9794181343302625761u, 11209948348994742953u, 524285u}, + {14862396031827050330u, 15709187654303492273u, 4865098414741827170u, 7936006706598706121u, 1940211u}, + {14751533359732014272u, 13350386878352668857u, 8285117087232960448u, 612251336005426277u, 3755162u}, + {6743231088749170965u, 5805373955343804329u, 4996633954868017000u, 357500889133282387u, 2269004u}, + {16321261990044215418u, 15028824641570297511u, 10850242993379209265u, 4221196190647544444u, 1540816u}, + {9694379244417233652u, 10219844229690866767u, 2403667948561226068u, 16673727265399226263u, 2662972u}, + {15309847491319790676u, 4056887435483518361u, 8950157589483892693u, 2282908594808947753u, 3137285u}, + {13341533455368872165u, 2994801252754266649u, 8311186325190891141u, 4309270744001944689u, 3338717u}, + {9069380862725014846u, 1128950277272511919u, 823856704661739219u, 2511546659632363901u, 704585u}, + {15908801169704029082u, 14482151299539050981u, 1064806223590796390u, 12118673100056614552u, 3282574u}, + {6424986901916109758u, 7442895375501997421u, 13705084806360806459u, 7554542594544191501u, 3295066u}, + {2672781166194101344u, 13988132299441937551u, 17511829100409708499u, 13247322955703336719u, 2603036u}, + {4949760514309968077u, 809384464849608954u, 1911873976635180419u, 6821431391719201556u, 2396844u}, + {2260497559922854974u, 17408926176201596417u, 4661519161584625285u, 332444350825749432u, 2614255u}, + {16355481876409833824u, 2051511807780050731u, 12647742822372333323u, 13378879390277528074u, 2100953u}, + {10812675841497066212u, 17109695934013882715u, 16119099276151252788u, 13153237870583656045u, 2916532u}, + {4833716851635615128u, 6702847681895353399u, 10650629052886120600u, 4881659333081193848u, 1492096u}, + {6283619640442853785u, 3402146740594691126u, 3859445957348309972u, 12277315304374814180u, 602225u}, + {10556067362026735135u, 11273071899191406983u, 1784902902147885955u, 3037528052320078351u, 3112976u}, + {7712358934197492742u, 3172917966338314347u, 8696672614406939676u, 15621864586809562293u, 1282386u}, + {13678430946475559576u, 5053839350716983380u, 16015427592828498994u, 12273446848415321803u, 3637888u}, + {14857680996802794217u, 10042916055515431422u, 13365566501442979575u, 11236034277057096021u, 1910379u}, + {17480850100733518712u, 8186689656358553464u, 10398770635779843268u, 9042439538473815456u, 2491657u}, + {417766381997202110u, 13323027287209343359u, 13368044945019834012u, 13160445082943790810u, 615534u}, + {11919411184011182961u, 12758514865113680652u, 1626887622305743007u, 15287564547367834250u, 2433068u}, + {14632748628932637076u, 9670115574291549699u, 12895604820373853461u, 1053688514528488002u, 1618954u}, + {18027530226265228322u, 4410648190753643924u, 17624345181098516587u, 173979619234652759u, 3090712u}, + {6086089501571911625u, 14968090340179617461u, 17134135598088116104u, 8271579293767307318u, 3463090u}, + {7262209638031159082u, 17612970293585854291u, 16106973055166375558u, 3378532068950487160u, 106763u}, + {7763803432137325100u, 1684243940325100875u, 14935704602344095257u, 17944310348560129585u, 3777563u}, + {12319923578271668528u, 13329918781378650720u, 9063280009545176179u, 13760626623033932663u, 1992997u}, + {13653959445054708908u, 9946174863061808092u, 5090670771460956494u, 15889435007703443458u, 2866758u}, + {9034632565205097490u, 3443348026341994507u, 8762653282403689270u, 10285060720422461366u, 3036868u}, + {7755259344776663532u, 2481392079823797432u, 358605709679746946u, 2217748158204536979u, 735656u}, + {16447363619949472915u, 513375583277363662u, 1995145882644615212u, 18244141751771804840u, 2494496u}, + {15041728039011382566u, 9359561176024368332u, 8111224774621744538u, 15394282877627684301u, 3812648u}, + {90437096324472782u, 11168035959925678495u, 3271040659016594165u, 1799713214203693916u, 2494321u}, + {10100781217761734966u, 4628358141549010335u, 12913950367253727679u, 8188520229210249264u, 2018403u}, + {6651583638150021702u, 10978820857488385243u, 5914736583952999317u, 37232971767127809u, 237272u}, + {17459310733363010322u, 10626739333578767594u, 9189418246204423716u, 13335031792913758344u, 2421379u}, + {5410155160898135803u, 16790695825473384680u, 5463128852052155771u, 17050258765004479449u, 3835687u}, + {14297110482937117236u, 441349934862731063u, 16856628117637794657u, 8141206485734042365u, 2743397u}, + {17910458997683460634u, 17335558862966400572u, 9384263024442540516u, 8697518035044141368u, 3337568u}, + {17673146010666881236u, 7603198432906168378u, 14979701703550660993u, 11518724723452662499u, 3615935u}, + {3310625555133032803u, 16783968165758953390u, 17990435447593429973u, 1075508555581884774u, 2349298u}, + {11441735239425783246u, 17489037929824594823u, 14282397925846528994u, 14815143677809613137u, 651288u}, + {2115041835000393280u, 8162014911550055895u, 4842169706642233139u, 948762880362484992u, 1576865u}, + {15430293949643237592u, 4595926069236773133u, 8696695952595459723u, 11630360666148950588u, 581877u}, + {5428091352407100512u, 10927719170514128907u, 16871647072514550526u, 15935462030113812414u, 329683u}, + {6197841764585644807u, 858880378106147746u, 4044082339588650540u, 15354349123940565184u, 3515265u}, + {8509957682125074472u, 12784769144258952715u, 16638657385300332087u, 17358667778263322370u, 114813u}, + {13109261233671380389u, 2299935175507696506u, 239995440558063772u, 5406437496230597793u, 1558001u}, + {3666282318085130333u, 8188633584952804171u, 6601672973825274791u, 2622813436485426747u, 1199491u}, + {10205956218117550734u, 6203950664900612988u, 4848804218041570417u, 4201467160318351668u, 1691566u}, + {12848168399378079440u, 16732045449732648693u, 13045949218890900612u, 13001570816114284211u, 2634581u}, + {15178266536954416272u, 14668768336519406970u, 5908807708305987550u, 10352835401873723448u, 3536840u}, + {15094909779545861236u, 14342685866654464619u, 7586350567395040521u, 13467955683717090388u, 1635406u}, + {6673612523556045326u, 11859756087808692389u, 12676722143728128370u, 12135843727778457974u, 2468938u}, + {4416388519364974108u, 11504645507455058769u, 13395320561339589495u, 14529120281179215176u, 3053103u}, + {2352056405626094073u, 14444942087295761496u, 6395110312893176200u, 14828126601976022014u, 2468772u}, + {5769713436571941500u, 2049485964935147786u, 2548557268243746555u, 6098378719274413303u, 3212133u}, + {18177366312664372618u, 3838580227782839577u, 8031163231117365782u, 8778222280069375858u, 334887u}, + {16042677501589757917u, 5580468106138838294u, 12569671371775091258u, 3753172473533087322u, 1336009u}, + {2742000018850960790u, 18233180847379879162u, 16196755346257015680u, 8599498710369769481u, 2908956u}, + {6280912597105064149u, 6866743536125861821u, 14765555690467492049u, 9565263188459668104u, 1321752u}, + {16618233097158518909u, 9458365577645107164u, 13414828991410550873u, 8383062938837817511u, 3485532u}, + {15190794517834932296u, 15981396523614178512u, 12931854252239880364u, 12746433275823104675u, 978678u}, + {6848077494116217682u, 3221176590451590898u, 7001430790918502957u, 5998833740491021880u, 3491439u}, + {17071982658909649573u, 14786655875020161521u, 12463308440540529523u, 15989133970062875999u, 508770u}, + {7855788610885996717u, 3340023335066818409u, 11779137431753754719u, 10890081865698633514u, 1447412u}, + {7029239732148900382u, 1552574184353763594u, 4099812973608845543u, 12204433442033119139u, 396940u}, + {15226047822590788223u, 1146812073649417072u, 8330073314408319229u, 4835181063338223423u, 2283092u}, + {14446188666641432882u, 3625204856611671784u, 17640623118459204527u, 5446435171500509950u, 2473983u}, + {10496370496633311227u, 7163479008832454321u, 2510905851521339679u, 10854276042379333749u, 1949340u}, + {10140964176611799504u, 8250621788793968623u, 13400954315941092616u, 4359414629222597179u, 932977u}, + {31176760066220322u, 11753682267331666267u, 10341945920311514725u, 10393503933766694729u, 3478440u}, + {17963246260045830459u, 13081608718998386964u, 9036207120626983590u, 1289145001494033098u, 729719u}, + {13486328205703058191u, 3059038746048492252u, 14567559861634791565u, 7147162750682733925u, 0u}, + {7420315194700892382u, 7684256234441371309u, 12594217999481771346u, 7147162750u, 0u}, + {18163225833518063804u, 10316809182081615217u, 2714673599027518316u, 7u, 0u}, + {857664136164642518u, 18343066520143317698u, 131841882114u, 0u, 0u}, + {11317334305649468237u, 15529983915534635656u, 131u, 0u, 0u}, + {8963224109754498253u, 2432053457571u, 0u, 0u, 0u}, + {986118140002381699u, 2432u, 0u, 0u, 0u}, + {44863467705402u, 0u, 0u, 0u, 0u}, + {44864u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 711486u}, + {8159427590630727611u, 12838631643846944267u, 757448694386359613u, 5561559341074478386u, 954895u}, + {2760459538635063512u, 14905126187741272544u, 6730086238522810125u, 17311437278346528863u, 2299255u}, + {2511183902861343198u, 5282557461612856023u, 8252611085241484691u, 5158502962549517789u, 1207001u}, + {4367125710390453034u, 8167944734353277878u, 1099082937839649732u, 5930987954812305217u, 3129202u}, + {15845748256849706942u, 1323895455369873868u, 2733727211039373777u, 17351546163482632671u, 959851u}, + {11216818934517112697u, 3985846451062287858u, 5733282869848722943u, 6358774418435098718u, 658180u}, + {2962850263246680267u, 13673857699745269315u, 2171506409011106235u, 14063372121769156091u, 1570287u}, + {8254820632479397647u, 14739080662595589422u, 8256576023854107992u, 11990527306770682648u, 3876771u}, + {5276853444993798369u, 1109677481296716990u, 16576144325326075895u, 4178796674621798710u, 3426323u}, + {3873751291323231680u, 7634139712364186313u, 11868389406076319876u, 6620445565125103582u, 1797263u}, + {6326218078383007186u, 16193535462143418019u, 18283132349223140787u, 177268845290448886u, 3730492u}, + {15584596319451487660u, 6285855618545334876u, 16925329653006163890u, 15849428525676507721u, 3448406u}, + {8817113283385034201u, 12402302437735538397u, 13400301832124141163u, 11520769330824214809u, 1039261u}, + {17335688662633466542u, 18210561622639227504u, 2697109255762658493u, 15151265741178423353u, 259123u}, + {12565633720843274996u, 8726417304675180247u, 5936459625578055237u, 10957534284580923853u, 863787u}, + {17615724888135692499u, 5830933851542087078u, 786820879062320673u, 18030332578162715637u, 1959109u}, + {13251251495062920642u, 4085820429751202540u, 2205968297748499176u, 10556547929903312280u, 1698619u}, + {14001839877857282428u, 6462317252480445783u, 14014555650223864993u, 5940056711638379126u, 3278746u}, + {16852951726976103517u, 17272549513598058931u, 2972372991844099916u, 12310273180732504729u, 2437200u}, + {5228357203229820011u, 18340770866692573023u, 17174286360758610503u, 4368414059242394259u, 1045375u}, + {10364911444427899352u, 18299152559713543824u, 14074317120799178047u, 12629362726091856981u, 1597367u}, + {5774512401949060226u, 13603472022223024079u, 7896166685991274015u, 5361728191676819195u, 2665870u}, + {11046643781209418528u, 7702435326803004611u, 799945186028149868u, 2138846854085418418u, 283145u}, + {10100068815461814988u, 14553051016471701292u, 1433879031346515030u, 7283040103320318881u, 2636444u}, + {4637001085715618696u, 8841140572337865210u, 7766307719390953154u, 17198341196042555976u, 3839006u}, + {703641944637079520u, 5922568956733422156u, 17592469312890313823u, 5763367107374083550u, 2335433u}, + {13975306658929859417u, 12860167393372085808u, 11682199040459064875u, 9338510771508366570u, 1934189u}, + {12219143063310160667u, 16063630968398444939u, 8097493360061721632u, 12429585673335299967u, 3302814u}, + {11955584744432270009u, 796078258575674638u, 6388981690471508254u, 7338743174841372148u, 2806088u}, + {4334089058491621891u, 12736435464989562745u, 2147392051050400834u, 16480894635170620071u, 105323u}, + {6815874061346089699u, 8958953800601000093u, 5081562205043328528u, 17007535075857962842u, 2051860u}, + {6268311611855443123u, 7572192177859780469u, 8056958625607468018u, 14593484148964059828u, 793213u}, + {16911273498708337581u, 14742604556461068709u, 9777549794456903436u, 5995412516948442211u, 218734u}, + {15103901960272247172u, 16955935712469483889u, 214283937531906112u, 1084898846682550342u, 1362776u}, + {3077620282503441642u, 15394188687264237901u, 10986813587473776429u, 13067563302051648870u, 2180798u}, + {6676298984665186446u, 12058124479422404180u, 14696861135578444416u, 11857674057870202448u, 1721455u}, + {10175379064171683112u, 4722161071985764863u, 872968713726703907u, 4643441270104469638u, 1935702u}, + {17500693498458979103u, 11885994025982337259u, 10822041957403794262u, 17978048319484465060u, 2735630u}, + {13897343338127040849u, 17113201323284459738u, 3168101760817311799u, 11219390560347240460u, 1873930u}, + {2779702283900213452u, 15580807000070849488u, 7508034027245685134u, 16247526576875222700u, 2270208u}, + {1320410564878202505u, 3388135303650535470u, 11626592242701635832u, 4797679168720858366u, 3106328u}, + {7000295253082113931u, 17704241525055657143u, 14260890344058313759u, 18431988122094300892u, 1397584u}, + {3796408245663025923u, 7501876426376300282u, 1475677485310590514u, 4853639693342671124u, 1433429u}, + {7055286254020436798u, 12552816064676821972u, 3800811201247641518u, 314672478916184846u, 2296813u}, + {2608577772137944592u, 6281898179558250348u, 5386166189589445126u, 17480306479089402047u, 3678434u}, + {6644688034808880815u, 12007778601813221510u, 16204567996357328336u, 17794023281400610455u, 2078582u}, + {16110988531926893091u, 10951998136839755371u, 11394534775048329887u, 17548338439200731076u, 416428u}, + {10263121067133204362u, 3057508568051223389u, 6660726823484141619u, 3826734242299645768u, 2025726u}, + {10621827038703215246u, 5829535693352855600u, 8421288869298632438u, 9404855277842825277u, 861682u}, + {12263391633901169622u, 10762920000030169539u, 12883268585515705519u, 3546717344590246335u, 1382456u}, + {7118683017949021119u, 16411124016546895249u, 8837747126075027243u, 674020161913232980u, 1785144u}, + {14458665759524364113u, 16416358691654383972u, 13341159109119284010u, 9256302132031514133u, 2671632u}, + {8609428474282932104u, 7837821057227465950u, 15393281196074755156u, 2859529088498624432u, 349304u}, + {6790530987829019173u, 16820919853618547671u, 13213397187581234610u, 14129731955785327585u, 3169322u}, + {7555190604888614733u, 1393002243091770049u, 6125277114231924577u, 15911134374295055179u, 663845u}, + {6744355152349703775u, 11705421316779341507u, 10838913889741495556u, 9812078583888945387u, 1347430u}, + {10314879817732300781u, 14485287865350607077u, 422287801454940625u, 2546871497506794805u, 3506701u}, + {8349167065798736914u, 3764282473580402254u, 16014976598555000130u, 14908551590250047671u, 2433407u}, + {611472348863097956u, 13366456489253158721u, 2200390054462253274u, 8403569359464365505u, 3635486u}, + {12610235588552791017u, 17395039313799283227u, 7943368719361989013u, 6624303945680565578u, 277857u}, + {3251859849708226231u, 17642334210610959677u, 10402718325823139698u, 12903434896381493204u, 2877450u}, + {6496055405773352215u, 4951559215953916318u, 12524461245220571593u, 125137190676258381u, 3207098u}, + {17537488385080000570u, 13222256797829977927u, 4516293287213934556u, 11083972403953417154u, 3696068u}, + {15093671581102623478u, 6207521756672721559u, 17997806442467226641u, 12173856229930893166u, 1729044u}, + {10728341089466046883u, 2483133953290619334u, 16514046802237560818u, 16100738714791969015u, 1390537u}, + {3314920761865326708u, 1957770106497917216u, 10467177105805230321u, 3124127439895663821u, 2753882u}, + {8774407804206124019u, 1648903707713720150u, 5885196352928213128u, 1708124822459665375u, 1046852u}, + {10593492709190075596u, 5125347414724941250u, 18224981140816634997u, 8666222297186528133u, 111610u}, + {2760750981178749167u, 1786605630125511173u, 4471304340449823470u, 9153373292589136892u, 2579983u}, + {8307199977607155899u, 13106894786384532506u, 12839661050424537895u, 4082817561392859098u, 1831031u}, + {12819072089797444092u, 4818868774477000074u, 7339132954953725008u, 1474928445089404755u, 1842088u}, + {17090043798216236896u, 8238670380771674928u, 11190144768059216719u, 17976321442816235989u, 3364598u}, + {45907027113735158u, 15125585472068991125u, 14099332707559905830u, 4241406350393056740u, 212427u}, + {10150956177130254140u, 8514304703187275982u, 5795759882016414214u, 16360992437354393721u, 2087412u}, + {5465377990731624814u, 4870110559847474079u, 16828070196961081866u, 2848752138780572143u, 2821336u}, + {17323130743105648293u, 1249585584369688116u, 5509140776348046268u, 16625291094710120830u, 551559u}, + {16980053578547788303u, 14245820044749361198u, 5347529854770271519u, 7287991482170563797u, 3309078u}, + {9476354797238866541u, 3525450227315839876u, 14995982592919199063u, 16418115568883575609u, 2405655u}, + {1659824538212078297u, 16113542462077916297u, 5098017635942871675u, 2926680280049872760u, 352872u}, + {17778399518985739105u, 13063125786772664989u, 17482235994856113149u, 3897619420449566860u, 1405616u}, + {1719898231711309618u, 3377521468867955476u, 10216587477924808773u, 3196463180184359929u, 2854386u}, + {15742287660923231335u, 9176333820521773826u, 7071517015595494926u, 3727591427160367428u, 1960735u}, + {10825803263389742588u, 6933000948261334383u, 15645886162337264719u, 10916865880196074660u, 3884272u}, + {3070404465346029980u, 8218675864750592951u, 12371460413341530256u, 8574448278889038275u, 1583557u}, + {11507376299318146888u, 12585506020181988023u, 5855298868162007974u, 3415918399062192547u, 500701u}, + {12236325520417360027u, 11681300752802688222u, 4904534782620924660u, 7070880522337306573u, 585176u}, + {7398412894596828430u, 8992287545702404457u, 16855730646086526470u, 2172522420118795662u, 3434227u}, + {16758410275427019563u, 10262306949858298351u, 8049356586574908163u, 16780712125531826904u, 3154391u}, + {7321112795755469216u, 798528626023381828u, 14081741944610660442u, 13821188721510360647u, 296972u}, + {10191439538076831407u, 13370702336477362453u, 8722863904235441898u, 7787698336398463482u, 3360693u}, + {10983492869923015059u, 12326627554950067178u, 10099470087165634719u, 13608821530599457478u, 3373580u}, + {8898316989894532768u, 3828652126612534392u, 13653592979816487102u, 7412106172349656071u, 3211872u}, + {12658928932215428624u, 16682377017089820902u, 5859446361594697101u, 9498793407162179433u, 1314176u}, + {9457355384391584005u, 7751526358613187676u, 15987568948156275102u, 7085886493555542458u, 1856670u}, + {6760135439916467465u, 2781745955636834605u, 13916614410340047708u, 538652681670716358u, 125432u}, + {6070806012351311074u, 6196837392064718145u, 2748831805286084178u, 2019926445603288426u, 3387246u}, + {12377441815872582650u, 921798011553040442u, 8787622350118165784u, 6547667125510137069u, 2849053u}, + {2805700680755940402u, 17745222809223472991u, 12365898805378763382u, 12878807496842274152u, 2551570u}, + {13509110269964681309u, 6459661193247651019u, 8469108148305152806u, 11936571187913072017u, 1809738u}, + {14456593716939967865u, 17632150729949922419u, 8033716155737253621u, 14733132969400337108u, 1841581u}, + {984351094987442521u, 5253117788963813428u, 3226003578919166256u, 3708908484065463815u, 780318u}, + {17556295609914694243u, 16027717455922892051u, 17770813001903699912u, 4626080348578405277u, 940531u}, + {5762595572661155063u, 10900193632968661628u, 16036739199117972321u, 8808376211903678658u, 239399u}, + {17498174056187352434u, 5551337217873434386u, 15698132035992227075u, 16361489987502519676u, 2867249u}, + {7633058804890195730u, 12891101918729678334u, 12247606169777790996u, 14824698202635316505u, 2428037u}, + {14150023342146449662u, 7581703101675404347u, 3917614316840588376u, 1413883678685826505u, 2230653u}, + {9619282178187041945u, 17486244696187944585u, 2337419282639712814u, 14092379123818083631u, 120130u}, + {8707328531529449865u, 5185744837671218367u, 4680191897145527159u, 12900525354247054396u, 2711706u}, + {11087940583887024526u, 12575791648125192293u, 11464121877361810172u, 16479153600133237395u, 243594u}, + {12802327964535734464u, 18393310435744696933u, 11982733776161219002u, 16577740161378470084u, 2840352u}, + {3670272330074596366u, 15062638310808594696u, 13467578929046027318u, 2502353460290539057u, 46178u}, + {7655197060666546164u, 16973007842388342507u, 17802264747684438195u, 13763852297494424995u, 90316u}, + {1128451592653619064u, 12236467123090501364u, 6607174585233575382u, 3172200187570442633u, 2420072u}, + {3709102253507276758u, 6433581328541437359u, 10493965051813829493u, 11429742309988764497u, 50402u}, + {15652244438062408387u, 16554328705899422293u, 14929210623394122616u, 9512532177231032970u, 1735977u}, + {15601028725291862636u, 473244742511433306u, 9531834853729230959u, 9687740734031721687u, 521844u}, + {11286816469719145513u, 9986551009846693225u, 5261409703005094437u, 3396333252184754613u, 2090970u}, + {9928942761255273709u, 6103130466579016775u, 6036920817728706787u, 13297168894830877937u, 590169u}, + {1243315411990657926u, 3921391207758228409u, 3662435777491795927u, 10819525815489596387u, 2089442u}, + {9358954592468932371u, 6575431783085543920u, 8065555858391102443u, 13369198309667053808u, 3040919u}, + {9831333934436946216u, 11603449085781366100u, 12131112243201616091u, 3731032363845403821u, 2668658u}, + {5836662359891885695u, 3919691013750761366u, 8150788863384913155u, 11434327912869903836u, 741610u}, + {8172232699014060636u, 5187156018473047539u, 8187506125805872731u, 10389973842768454437u, 2196836u}, + {2476625980839613695u, 18146913264820058828u, 5577214676682228112u, 2562540273181363399u, 34269u}, + {12979494156910397063u, 6720454362281163548u, 14862396031827050329u, 15709187654303492273u, 1069672u}, + {2601264160545760721u, 15906183389903602458u, 14751533359732014271u, 13350386878352668857u, 2209952u}, + {14611318778769644635u, 10567167460087980648u, 6743231088749170964u, 5805373955343804329u, 2214216u}, + {7769418720616191797u, 1405183027778257694u, 16321261990044215417u, 15028824641570297511u, 3237615u}, + {2047415606385255702u, 9373909146690427435u, 9694379244417233651u, 10219844229690866767u, 1174308u}, + {13946036824070252586u, 4450305996991278271u, 15309847491319790675u, 4056887435483518361u, 2192251u}, + {4732910342133565165u, 1210835191203772626u, 13341533455368872164u, 2994801252754266649u, 2606767u}, + {18193799113970287761u, 6165818673825030705u, 9069380862725014845u, 1128950277272511919u, 3828995u}, + {9174189512019947179u, 1008901673916926782u, 15908801169704029081u, 14482151299539050981u, 1136416u}, + {570571638432081226u, 3116504971898152962u, 6424986901916109757u, 7442895375501997421u, 485671u}, + {336440315169624790u, 4437162648687867894u, 2672781166194101343u, 13988132299441937551u, 908069u}, + {16362820229085971198u, 12652109369384408671u, 4949760514309968076u, 809384464849608954u, 2333529u}, + {835388399623147470u, 5523803074465353109u, 2260497559922854973u, 17408926176201596417u, 1837677u}, + {8748833623124426283u, 16765186057798588440u, 16355481876409833823u, 2051511807780050731u, 1737225u}, + {12558992441668026749u, 5525071384467217697u, 10812675841497066211u, 17109695934013882715u, 80850u}, + {14984093083279345486u, 4722389565271552808u, 4833716851635615127u, 6702847681895353399u, 836994u}, + {2871449859862192413u, 3072511372563739091u, 6283619640442853784u, 3402146740594691126u, 1739452u}, + {17586507523225017848u, 16059283669775170009u, 10556067362026735134u, 11273071899191406983u, 129227u}, + {7486706893843503821u, 14570975689151485059u, 7712358934197492741u, 3172917966338314347u, 531680u}, + {10835783995142450890u, 9117369183218496939u, 13678430946475559575u, 5053839350716983380u, 1458820u}, + {10045435314688778507u, 11731088382462284949u, 14857680996802794216u, 10042916055515431422u, 2395085u}, + {4110388324231904449u, 17619701433474372654u, 17480850100733518711u, 8186689656358553464u, 3492756u}, + {18235060126409052615u, 13084815543747667946u, 417766381997202109u, 13323027287209343359u, 234226u}, + {1957666082613267668u, 14222685201631756840u, 11919411184011182960u, 12758514865113680652u, 780515u}, + {18380168890861484389u, 16792005326537635041u, 14632748628932637075u, 9670115574291549699u, 820467u}, + {12964231871722930828u, 2786760914967936325u, 18027530226265228321u, 4410648190753643924u, 2828053u}, + {3746863801926352690u, 2597018835118648036u, 6086089501571911624u, 14968090340179617461u, 1676032u}, + {1715073268853110357u, 4967730170165936947u, 7262209638031159081u, 17612970293585854291u, 1459296u}, + {15985962343283546350u, 15783740984539318566u, 7763803432137325099u, 1684243940325100875u, 3866345u}, + {13754587286193060667u, 16204310268846705261u, 12319923578271668527u, 13329918781378650720u, 120719u}, + {8943635237958717956u, 4906629383866017633u, 13653959445054708907u, 9946174863061808092u, 3070520u}, + {2265061269953821367u, 4705076336109242561u, 9034632565205097489u, 3443348026341994507u, 1704034u}, + {3346782467828248017u, 13840302561561116042u, 7755259344776663531u, 2481392079823797432u, 486396u}, + {12742567091483391715u, 16385619625054943279u, 16447363619949472914u, 513375583277363662u, 3476578u}, + {17216974608179074384u, 10856430467005630814u, 15041728039011382565u, 9359561176024368332u, 3857942u}, + {17573056079558273223u, 11108456427605607717u, 90437096324472781u, 11168035959925678495u, 903797u}, + {14681332802130646725u, 10283490436552208260u, 10100781217761734965u, 4628358141549010335u, 1413071u}, + {16851526403081253125u, 9076309087806175659u, 6651583638150021701u, 10978820857488385243u, 1857943u}, + {14633271027210175676u, 11961226677964380099u, 17459310733363010321u, 10626739333578767594u, 69194u}, + {226738593690385677u, 11024303489050785377u, 5410155160898135802u, 16790695825473384680u, 488127u}, + {12813500998986025760u, 6182640158878850301u, 14297110482937117235u, 441349934862731063u, 2262529u}, + {15242245305603619415u, 10320902900471580839u, 17910458997683460633u, 17335558862966400572u, 2013962u}, + {4529054784375399033u, 17150558837713961880u, 17673146010666881235u, 7603198432906168378u, 3610737u}, + {13344196840837673864u, 3189131332091018674u, 3310625555133032802u, 16783968165758953390u, 2770145u}, + {4158863954432901021u, 11067901861834812566u, 11441735239425783245u, 17489037929824594823u, 1057464u}, + {2254828874678107469u, 10879424752450905703u, 2115041835000393279u, 8162014911550055895u, 3051901u}, + {2251295675647914430u, 9200266670678396030u, 15430293949643237591u, 4595926069236773133u, 2549093u}, + {12352088551657933685u, 4312478492139768266u, 5428091352407100511u, 10927719170514128907u, 3591248u}, + {3341384979046051957u, 1036731204936435926u, 6197841764585644806u, 858880378106147746u, 1657474u}, + {3123131579657490876u, 14933091015680002090u, 8509957682125074471u, 12784769144258952715u, 3585985u}, + {12009989330251224558u, 5145831264477641929u, 13109261233671380388u, 2299935175507696506u, 2500466u}, + {2529624328951365259u, 10473555480475613556u, 3666282318085130332u, 8188633584952804171u, 379339u}, + {12747969072094266829u, 16882981344146107561u, 10205956218117550733u, 6203950664900612988u, 796001u}, + {14978046240760960125u, 4256158192088718096u, 12848168399378079439u, 16732045449732648693u, 2226774u}, + {11308703272685202380u, 13894830509404784826u, 15178266536954416271u, 14668768336519406970u, 174808u}, + {11807780261971464658u, 7153282839569754051u, 15094909779545861235u, 14342685866654464619u, 2293665u}, + {15861228421428881149u, 5559143617964100443u, 6673612523556045325u, 11859756087808692389u, 2574332u}, + {2757594545621288365u, 6490364071025062522u, 4416388519364974107u, 11504645507455058769u, 1811879u}, + {2501723121225394787u, 9012721939705863605u, 2352056405626094072u, 14444942087295761496u, 1727856u}, + {863549443519392396u, 15439739298249211419u, 5769713436571941499u, 2049485964935147786u, 1058601u}, + {14140881368821682805u, 13698491862170075371u, 18177366312664372617u, 3838580227782839577u, 1736532u}, + {3661406199022026454u, 6817725533519682582u, 16042677501589757916u, 5580468106138838294u, 141464u}, + {3336843455751398608u, 13384083204819258648u, 2742000018850960789u, 18233180847379879162u, 1153162u}, + {16806841367827491235u, 7227627165279288013u, 6280912597105064148u, 6866743536125861821u, 1020275u}, + {12664408453217328056u, 9806054588013983513u, 16618233097158518908u, 9458365577645107164u, 3071991u}, + {7199866806977040348u, 10087137665072299472u, 15190794517834932295u, 15981396523614178512u, 2745332u}, + {10060358671668260125u, 552130964250120077u, 6848077494116217681u, 3221176590451590898u, 804971u}, + {14033841599880110188u, 9351699118398676481u, 17071982658909649572u, 14786655875020161521u, 1375527u}, + {514029624140946556u, 5822803689524554366u, 7855788610885996716u, 3340023335066818409u, 2133965u}, + {13109244457585089329u, 6091090918194401810u, 7029239732148900381u, 1552574184353763594u, 3575057u}, + {6510509786224805637u, 12854083768025562802u, 15226047822590788222u, 1146812073649417072u, 1210249u}, + {5343606528455067688u, 11672898925228477923u, 14446188666641432881u, 3625204856611671784u, 1614225u}, + {15824847893876490028u, 10658481237096288046u, 10496370496633311226u, 7163479008832454321u, 1954603u}, + {17238314966950699039u, 14048596284065821558u, 10140964176611799503u, 8250621788793968623u, 449642u}, + {7898835434960647644u, 4616169015561009304u, 31176760066220321u, 11753682267331666267u, 2124179u}, + {14492964437196807279u, 7953358297776468350u, 17963246260045830458u, 13081608718998386964u, 1768322u}, + {9067101823986371234u, 17776409951697202920u, 13486328205703058190u, 3059038746048492252u, 2501865u}, + {12431775725860554040u, 15264733533352602870u, 7420315194700892381u, 7684256234441371309u, 681596u}, + {13071703869573310596u, 2092626351549199706u, 18163225833518063803u, 10316809182081615217u, 2192128u}, + {9739216690523229137u, 8729420676746861923u, 857664136164642517u, 18343066520143317698u, 2038364u}, + {782323234618514023u, 17676416701443831987u, 11317334305649468236u, 15529983915534635656u, 131u}, + {1563654403091377874u, 17915276202256919438u, 8963224109754498252u, 2432053457571u, 0u}, + {12632847700624246608u, 11897836129447755047u, 986118140002381698u, 2432u, 0u}, + {7429241850005841035u, 11656715448122412305u, 44863467705401u, 0u, 0u}, + {3945580018759825506u, 8627641845795414844u, 44863u, 0u, 0u}, + {7555112184934606424u, 827584907020677u, 0u, 0u, 0u}, + {16731578305736887594u, 827584u, 0u, 0u, 0u}, + {15266246979075152u, 0u, 0u, 0u, 0u}, + {15266247u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 671116u}, + {2890824976687550536u, 18437611016931681722u, 8159427590630727610u, 12838631643846944267u, 3321009u}, + {76633274902748420u, 1877734422283051405u, 2760459538635063511u, 14905126187741272544u, 1211763u}, + {10057070661541096382u, 6368766856652062851u, 2511183902861343197u, 5282557461612856023u, 1378921u}, + {5871301785266442734u, 4896602277354327920u, 4367125710390453033u, 8167944734353277878u, 1456016u}, + {4636256201961155274u, 14641608316387269761u, 15845748256849706941u, 1323895455369873868u, 1229419u}, + {18132331297546332349u, 6738626855105424311u, 11216818934517112696u, 3985846451062287858u, 2980061u}, + {15255622483896334259u, 15088883994580591738u, 2962850263246680266u, 13673857699745269315u, 2132163u}, + {12255062749118244467u, 1896373894590116051u, 8254820632479397646u, 14739080662595589422u, 1561986u}, + {13451400378449205993u, 16072928762083843634u, 5276853444993798368u, 1109677481296716990u, 3691293u}, + {3609258414981045205u, 5773956644151624822u, 3873751291323231679u, 7634139712364186313u, 2853316u}, + {5383367744534934307u, 5095942257332088960u, 6326218078383007185u, 16193535462143418019u, 913165u}, + {10141123828068754708u, 6312367526284894071u, 15584596319451487659u, 6285855618545334876u, 455162u}, + {7207320432757666952u, 11827741423397057795u, 8817113283385034200u, 12402302437735538397u, 2821523u}, + {1023086593961812681u, 16572577761611053995u, 17335688662633466541u, 18210561622639227504u, 403779u}, + {11164966726969987897u, 13683891228475084577u, 12565633720843274995u, 8726417304675180247u, 3595557u}, + {11157313957758937033u, 5008385827513829285u, 17615724888135692498u, 5830933851542087078u, 2742769u}, + {2199232737774894245u, 16791558500288382275u, 13251251495062920641u, 4085820429751202540u, 2666670u}, + {5503820204219516911u, 13034410368140435875u, 14001839877857282427u, 6462317252480445783u, 2753035u}, + {5253952123069936786u, 11272560251483298129u, 16852951726976103516u, 17272549513598058931u, 2067680u}, + {7867440448068636672u, 7263001359026529371u, 5228357203229820010u, 18340770866692573023u, 3717797u}, + {15449648648212653741u, 2655549196395892243u, 10364911444427899351u, 18299152559713543824u, 3070695u}, + {16884746167574476596u, 16801310276956391829u, 5774512401949060225u, 13603472022223024079u, 3487355u}, + {8458653663534410091u, 12406556396561598994u, 11046643781209418527u, 7702435326803004611u, 3766226u}, + {10552694930450213578u, 10311821427014057275u, 10100068815461814987u, 14553051016471701292u, 2716690u}, + {9163635199757070076u, 15681641692529825165u, 4637001085715618695u, 8841140572337865210u, 750606u}, + {9215016058334646129u, 10873256055165932617u, 703641944637079519u, 5922568956733422156u, 1838571u}, + {2324586257019916296u, 17375965765315492665u, 13975306658929859416u, 12860167393372085808u, 3623679u}, + {10481250961219830184u, 140043418738943580u, 12219143063310160666u, 16063630968398444939u, 186738u}, + {2085852093599296555u, 17256977374671313927u, 11955584744432270008u, 796078258575674638u, 2943550u}, + {12383678988100343258u, 17463418557172458069u, 4334089058491621890u, 12736435464989562745u, 1290858u}, + {1303148056037769590u, 4490621124446206949u, 6815874061346089698u, 8958953800601000093u, 333110u}, + {618166720581660364u, 8642265402760033399u, 6268311611855443122u, 7572192177859780469u, 2323194u}, + {8392922474790445841u, 5256242750653734867u, 16911273498708337580u, 14742604556461068709u, 1214366u}, + {14031670600902639114u, 2569598619519532087u, 15103901960272247171u, 16955935712469483889u, 2489390u}, + {11979615319749618980u, 5803597209514068587u, 3077620282503441641u, 15394188687264237901u, 1328487u}, + {711539833221132130u, 1825982862360240620u, 6676298984665186445u, 12058124479422404180u, 2082614u}, + {9776072719420014574u, 2260967782752260251u, 10175379064171683111u, 4722161071985764863u, 3716027u}, + {2480576979876137122u, 4087005850848901195u, 17500693498458979102u, 11885994025982337259u, 1927252u}, + {8310459701472247113u, 1926551354940277132u, 13897343338127040848u, 17113201323284459738u, 887239u}, + {11554674734040629321u, 1399876186015540530u, 2779702283900213451u, 15580807000070849488u, 77432u}, + {12053562761794158519u, 13887576877843838750u, 1320410564878202504u, 3388135303650535470u, 2717606u}, + {14275501936679093321u, 17415872882609810446u, 7000295253082113930u, 17704241525055657143u, 427535u}, + {12345352403042231576u, 2297504692479880495u, 3796408245663025922u, 7501876426376300282u, 802022u}, + {9503333690767543723u, 6377881817593766706u, 7055286254020436797u, 12552816064676821972u, 698632u}, + {5671454463337875277u, 1905027382651299541u, 2608577772137944591u, 6281898179558250348u, 2505482u}, + {3746370602484020583u, 12342877889081477401u, 6644688034808880814u, 12007778601813221510u, 3865258u}, + {5562773454175548331u, 16073323680427477603u, 16110988531926893090u, 10951998136839755371u, 1685371u}, + {10514379140098599038u, 14285763716853106272u, 10263121067133204361u, 3057508568051223389u, 3519763u}, + {16938015876965270362u, 15387460658968294041u, 10621827038703215245u, 5829535693352855600u, 1427812u}, + {11339160343297136456u, 7992588999169318097u, 12263391633901169621u, 10762920000030169539u, 2930065u}, + {10157379713644854596u, 10190337179769206800u, 7118683017949021118u, 16411124016546895249u, 3213837u}, + {2729833132383548u, 1121749727046083839u, 14458665759524364112u, 16416358691654383972u, 3014130u}, + {6576126704909627333u, 9912102331043691968u, 8609428474282932103u, 7837821057227465950u, 1707642u}, + {4727805475042417033u, 15450145310394756179u, 6790530987829019172u, 16820919853618547671u, 1296052u}, + {637218779540062040u, 6531571875120698434u, 7555190604888614732u, 1393002243091770049u, 1739661u}, + {16811531449808607213u, 17832842561787102084u, 6744355152349703774u, 11705421316779341507u, 92778u}, + {11091476556128996459u, 3318455903004113878u, 10314879817732300780u, 14485287865350607077u, 937161u}, + {1796283554349215368u, 11344814533437329565u, 8349167065798736913u, 3764282473580402254u, 1940808u}, + {6106107762882246042u, 18335617670574126911u, 611472348863097955u, 13366456489253158721u, 1580720u}, + {3581344739163183075u, 12283122629564337390u, 12610235588552791016u, 17395039313799283227u, 3267853u}, + {16937801260611682424u, 432757234051439147u, 3251859849708226230u, 17642334210610959677u, 2799562u}, + {1090905246622547432u, 8016891038451968889u, 6496055405773352214u, 4951559215953916318u, 1936227u}, + {18204521962850657070u, 9257288486780006259u, 17537488385080000569u, 13222256797829977927u, 572928u}, + {17485428235471316989u, 5169585094252067042u, 15093671581102623477u, 6207521756672721559u, 1798461u}, + {11370367088175668811u, 13880843561772226640u, 10728341089466046882u, 2483133953290619334u, 662180u}, + {9047233976520113897u, 14914648342734101111u, 3314920761865326707u, 1957770106497917216u, 3449749u}, + {6515375682761302335u, 15024362217267444895u, 8774407804206124018u, 1648903707713720150u, 501890u}, + {11458560757707836814u, 12138663351060019160u, 10593492709190075595u, 5125347414724941250u, 3102085u}, + {14174087824592380526u, 15995565728671909624u, 2760750981178749166u, 1786605630125511173u, 3494940u}, + {13303902668171811298u, 13890165394908183438u, 8307199977607155898u, 13106894786384532506u, 3418899u}, + {16919812005513558798u, 418603454759094195u, 12819072089797444091u, 4818868774477000074u, 1306716u}, + {2044868286199766362u, 6220282149954848283u, 17090043798216236895u, 8238670380771674928u, 3553381u}, + {13049174131226162807u, 7324340227560477312u, 45907027113735157u, 15125585472068991125u, 623882u}, + {10473162867878091589u, 11930161473748568816u, 10150956177130254139u, 8514304703187275982u, 2290472u}, + {3591288590050379829u, 11554824359201512951u, 5465377990731624813u, 4870110559847474079u, 1333920u}, + {3033421392574874269u, 11613590409676209387u, 17323130743105648292u, 1249585584369688116u, 2736202u}, + {1951059495148838374u, 17557128823080254870u, 16980053578547788302u, 14245820044749361198u, 3615039u}, + {8130921433136314115u, 17156782721060425184u, 9476354797238866540u, 3525450227315839876u, 2423137u}, + {107877157769785250u, 4699559462162527509u, 1659824538212078296u, 16113542462077916297u, 1122217u}, + {13483882020456306687u, 11375778722911727913u, 17778399518985739104u, 13063125786772664989u, 3408305u}, + {14485033541868523548u, 9294454879418139506u, 1719898231711309617u, 3377521468867955476u, 1356303u}, + {10004538573131964725u, 15229004745697298642u, 15742287660923231334u, 9176333820521773826u, 838734u}, + {7236633840033964292u, 7662239854645180148u, 10825803263389742587u, 6933000948261334383u, 222811u}, + {14669091513980166753u, 2333113410489164921u, 3070404465346029979u, 8218675864750592951u, 2574148u}, + {6019546134041266751u, 12346927540129553034u, 11507376299318146887u, 12585506020181988023u, 432082u}, + {8306446855645653712u, 8721130794001414334u, 12236325520417360026u, 11681300752802688222u, 3097884u}, + {10855902365537115889u, 8481552502679949995u, 7398412894596828429u, 8992287545702404457u, 1633274u}, + {10702840675155663058u, 17420512694506925866u, 16758410275427019562u, 10262306949858298351u, 319573u}, + {1502681412147627227u, 531876206782889061u, 7321112795755469215u, 798528626023381828u, 2170976u}, + {17065425407895116030u, 4276034948305404622u, 10191439538076831406u, 13370702336477362453u, 259068u}, + {15459463856337610300u, 483091860474102739u, 10983492869923015058u, 12326627554950067178u, 520397u}, + {18208178749083923419u, 5876076364907806248u, 8898316989894532767u, 3828652126612534392u, 2009720u}, + {12605611948194166192u, 9611907678141259952u, 12658928932215428623u, 16682377017089820902u, 2242335u}, + {1897620117242975676u, 15039556942632171378u, 9457355384391584004u, 7751526358613187676u, 2361250u}, + {7877093570545844653u, 2013432984829318040u, 6760135439916467464u, 2781745955636834605u, 3899978u}, + {10981181324555536621u, 14696283263900210788u, 6070806012351311073u, 6196837392064718145u, 3095770u}, + {15756725420262172830u, 12907639028108335371u, 12377441815872582649u, 921798011553040442u, 1032956u}, + {5138345797917093883u, 15491222559987117453u, 2805700680755940401u, 17745222809223472991u, 2522684u}, + {731841907079017719u, 7397361341205803656u, 13509110269964681308u, 6459661193247651019u, 2715806u}, + {8081614945215037529u, 18108274882914168787u, 14456593716939967864u, 17632150729949922419u, 3522085u}, + {13720268309977941440u, 8523368440083606286u, 984351094987442520u, 5253117788963813428u, 1676804u}, + {1014832106776889229u, 7187013683414505804u, 17556295609914694242u, 16027717455922892051u, 1056930u}, + {16901025201870523924u, 15301366469097328631u, 5762595572661155062u, 10900193632968661628u, 157343u}, + {13757849575350814987u, 15880199111868102479u, 17498174056187352433u, 5551337217873434386u, 3515535u}, + {2732877455985640911u, 9308027278788976509u, 7633058804890195729u, 12891101918729678334u, 848698u}, + {4737645647017615186u, 8602966740703969830u, 14150023342146449661u, 7581703101675404347u, 2618724u}, + {16156321477367968222u, 14584485763460103752u, 9619282178187041944u, 17486244696187944585u, 3776040u}, + {8320641081944826344u, 6983117252436381173u, 8707328531529449864u, 5185744837671218367u, 2047531u}, + {4796771894580195615u, 5421425631435632941u, 11087940583887024525u, 12575791648125192293u, 1009606u}, + {12791026302233390586u, 10905094350413688146u, 12802327964535734463u, 18393310435744696933u, 141008u}, + {2865406003334303582u, 13597387245615788332u, 3670272330074596365u, 15062638310808594696u, 2139848u}, + {530922311091730849u, 1072194673874681671u, 7655197060666546163u, 16973007842388342507u, 3183961u}, + {7636072635416450725u, 7112044244926624975u, 1128451592653619063u, 12236467123090501364u, 1108892u}, + {172993555112576737u, 4941698996441114902u, 3709102253507276757u, 6433581328541437359u, 2880707u}, + {10348372365337208825u, 12309111901854474776u, 15652244438062408386u, 16554328705899422293u, 2217148u}, + {8401675999539204806u, 373202769385684523u, 15601028725291862635u, 473244742511433306u, 2309515u}, + {7380757382882022981u, 16992937191934052775u, 11286816469719145512u, 9986551009846693225u, 2726365u}, + {499700297371869201u, 11075140193545701317u, 9928942761255273708u, 6103130466579016775u, 1641543u}, + {13898263481613932427u, 14494505481373029732u, 1243315411990657925u, 3921391207758228409u, 986121u}, + {16785733802163033549u, 6325739875610394528u, 9358954592468932370u, 6575431783085543920u, 117985u}, + {16192303450151817196u, 10561558810205646113u, 9831333934436946215u, 11603449085781366100u, 1549375u}, + {17197182915444687027u, 77546709999780128u, 5836662359891885694u, 3919691013750761366u, 3852541u}, + {16510560256126541744u, 9195016550492443585u, 8172232699014060635u, 5187156018473047539u, 3277389u}, + {12115730637014942591u, 9811860868699269643u, 2476625980839613694u, 18146913264820058828u, 1035310u}, + {16649855507808669843u, 8570193167328550681u, 12979494156910397062u, 6720454362281163548u, 2900929u}, + {16904396046390368492u, 11896918689732910141u, 2601264160545760720u, 15906183389903602458u, 2534795u}, + {10695585097144620855u, 7357379993633350219u, 14611318778769644634u, 10567167460087980648u, 1956374u}, + {4908334669166442468u, 12060340091369544667u, 7769418720616191796u, 1405183027778257694u, 348133u}, + {5833831425389614593u, 15073516164988450137u, 2047415606385255701u, 9373909146690427435u, 2970321u}, + {12722127787942121236u, 4435298949197624063u, 13946036824070252585u, 4450305996991278271u, 3139507u}, + {13967990304867086505u, 7518537106526362551u, 4732910342133565164u, 1210835191203772626u, 2218450u}, + {6094845410607654605u, 16841729403927886581u, 18193799113970287760u, 6165818673825030705u, 5169u}, + {10160884368413615594u, 15452341383759614300u, 9174189512019947178u, 1008901673916926782u, 977323u}, + {11747365292414351453u, 12295477647119077328u, 570571638432081225u, 3116504971898152962u, 2257819u}, + {1515463199054313340u, 8406961233471100832u, 336440315169624789u, 4437162648687867894u, 2278473u}, + {13037998742648767073u, 232948831430442792u, 16362820229085971197u, 12652109369384408671u, 2570964u}, + {8344087038118141039u, 14687244449757329323u, 835388399623147469u, 5523803074465353109u, 2592557u}, + {8517249184141567141u, 2074421333032342961u, 8748833623124426282u, 16765186057798588440u, 2639719u}, + {1527381876977893931u, 11469561708902912113u, 12558992441668026748u, 5525071384467217697u, 2095001u}, + {5727835950945780801u, 6764542000153001526u, 14984093083279345485u, 4722389565271552808u, 2498675u}, + {18115376619458604543u, 14478923457003136859u, 2871449859862192412u, 3072511372563739091u, 3388012u}, + {4569330449028375949u, 9501529398416521171u, 17586507523225017847u, 16059283669775170009u, 831674u}, + {2285605662708823937u, 5168034940804817846u, 7486706893843503820u, 14570975689151485059u, 2066073u}, + {5297983815426136217u, 3769434473862239744u, 10835783995142450889u, 9117369183218496939u, 3131075u}, + {8474484998199842677u, 18180179642049519172u, 10045435314688778506u, 11731088382462284949u, 2040928u}, + {2617004541397919038u, 10600924321487334653u, 4110388324231904448u, 17619701433474372654u, 2298021u}, + {16584096286781566905u, 9631817788700440765u, 18235060126409052614u, 13084815543747667946u, 1482059u}, + {10007123093202962694u, 7877151796204338951u, 1957666082613267667u, 14222685201631756840u, 140182u}, + {6380450884903786563u, 14252804855680205311u, 18380168890861484388u, 16792005326537635041u, 2633111u}, + {5048974781491582428u, 1040032241282008540u, 12964231871722930827u, 2786760914967936325u, 159673u}, + {2900882958262251008u, 17332485377747985836u, 3746863801926352689u, 2597018835118648036u, 3676192u}, + {13524298821068066041u, 7641276294253766518u, 1715073268853110356u, 4967730170165936947u, 169563u}, + {13819398517081826053u, 18265605097327416250u, 15985962343283546349u, 15783740984539318566u, 3437419u}, + {10891211431455507593u, 18124314725136128546u, 13754587286193060666u, 16204310268846705261u, 363911u}, + {12186492360109087680u, 193263936346911230u, 8943635237958717955u, 4906629383866017633u, 1156449u}, + {14352423974155676211u, 5689762201884919671u, 2265061269953821366u, 4705076336109242561u, 284305u}, + {9913708668301560770u, 98653598824330505u, 3346782467828248016u, 13840302561561116042u, 1547469u}, + {5024187267823698180u, 11187521430897271054u, 12742567091483391714u, 16385619625054943279u, 2590774u}, + {3663645237254255145u, 2820277001585160125u, 17216974608179074383u, 10856430467005630814u, 628129u}, + {14743925837490289364u, 4534498037194700942u, 17573056079558273222u, 11108456427605607717u, 2781633u}, + {5278956675455211643u, 2853370822735253141u, 14681332802130646724u, 10283490436552208260u, 3746451u}, + {3285693126363002448u, 17704032781164954565u, 16851526403081253124u, 9076309087806175659u, 3888147u}, + {11241375098540771206u, 14251587398844965539u, 14633271027210175675u, 11961226677964380099u, 3878689u}, + {8585000831394633412u, 4020040713864069281u, 226738593690385676u, 11024303489050785377u, 3130344u}, + {10675441318083711105u, 2433600956830598214u, 12813500998986025759u, 6182640158878850301u, 903517u}, + {16088848901294332760u, 7245012731002931101u, 15242245305603619414u, 10320902900471580839u, 46157u}, + {11386001569378529786u, 6029868574112698432u, 4529054784375399032u, 17150558837713961880u, 1008155u}, + {11531028446183893274u, 5759457050544771157u, 13344196840837673863u, 3189131332091018674u, 2335912u}, + {16270660288441562335u, 7732117310765209025u, 4158863954432901020u, 11067901861834812566u, 3837297u}, + {2222750644481765472u, 3888243609325123980u, 2254828874678107468u, 10879424752450905703u, 2653705u}, + {13488361021159485368u, 8987585684205887633u, 2251295675647914429u, 9200266670678396030u, 3311177u}, + {10900424011816041753u, 2336144027398380493u, 12352088551657933684u, 4312478492139768266u, 1513811u}, + {4233081161695997526u, 11366336865274648687u, 3341384979046051956u, 1036731204936435926u, 930736u}, + {11664785614288744161u, 12498037834825103391u, 3123131579657490875u, 14933091015680002090u, 1612321u}, + {3607114108323070221u, 17770074920051856902u, 12009989330251224557u, 5145831264477641929u, 1366330u}, + {3302360440491287188u, 3711638051822992568u, 2529624328951365258u, 10473555480475613556u, 1165752u}, + {16026251306753156269u, 4499652784166867229u, 12747969072094266828u, 16882981344146107561u, 258047u}, + {7879604315670116229u, 14263425325395471615u, 14978046240760960124u, 4256158192088718096u, 3240271u}, + {17136556539035608881u, 8281625847401153015u, 11308703272685202379u, 13894830509404784826u, 1061489u}, + {5815820848361005700u, 2139807176055049319u, 11807780261971464657u, 7153282839569754051u, 580529u}, + {2469931802632805238u, 11241469766085471532u, 15861228421428881148u, 5559143617964100443u, 280841u}, + {7458152259684773473u, 357157236920407608u, 2757594545621288364u, 6490364071025062522u, 299385u}, + {13994157983749103882u, 10960658281235930282u, 2501723121225394786u, 9012721939705863605u, 1052444u}, + {9315258271452621010u, 6757576029466519455u, 863549443519392395u, 15439739298249211419u, 409231u}, + {8589520060405646541u, 9939951220186900917u, 14140881368821682804u, 13698491862170075371u, 2402141u}, + {15360100073527042905u, 7224845079234191375u, 3661406199022026453u, 6817725533519682582u, 2896354u}, + {1762217458274829466u, 3885075952372258418u, 3336843455751398607u, 13384083204819258648u, 1185453u}, + {8596749165834395837u, 17283185128890467463u, 16806841367827491234u, 7227627165279288013u, 337284u}, + {17684764406406836260u, 3943835427792997703u, 12664408453217328055u, 9806054588013983513u, 3856078u}, + {13301788508790944101u, 13994892289776129205u, 7199866806977040347u, 10087137665072299472u, 2587329u}, + {13964664394383745541u, 17502789568914099796u, 10060358671668260124u, 552130964250120077u, 3050375u}, + {11230346299000161523u, 9550812018055614900u, 14033841599880110187u, 9351699118398676481u, 3154820u}, + {7674807506703475577u, 1853370267418346083u, 514029624140946555u, 5822803689524554366u, 2073700u}, + {17278715781739044373u, 5762932763439897130u, 13109244457585089328u, 6091090918194401810u, 1508777u}, + {7369008125502939012u, 14754879128838920073u, 6510509786224805636u, 12854083768025562802u, 3882868u}, + {9443871307245871507u, 6883023964884229499u, 5343606528455067687u, 11672898925228477923u, 3578675u}, + {16864758302708095713u, 1334475381234244401u, 15824847893876490027u, 10658481237096288046u, 3763430u}, + {3343034989475882806u, 10277168912051607688u, 17238314966950699038u, 14048596284065821558u, 243023u}, + {2380481342984056992u, 15678040057948501229u, 7898835434960647643u, 4616169015561009304u, 1464917u}, + {4227967420570917390u, 4175827453489719025u, 14492964437196807278u, 7953358297776468350u, 2723614u}, + {2459394024705868934u, 3480584470584884609u, 9067101823986371233u, 17776409951697202920u, 3284112u}, + {8347280989042178762u, 248607234530569940u, 12431775725860554039u, 15264733533352602870u, 160251u}, + {8059799021632168452u, 13453716170693763975u, 13071703869573310595u, 2092626351549199706u, 566593u}, + {7235749372051122589u, 13020171286158608995u, 9739216690523229136u, 8729420676746861923u, 1209219u}, + {1735301510724623979u, 14856261851229455933u, 782323234618514022u, 17676416701443831987u, 2439068u}, + {5738403648111670868u, 3807740438891609698u, 1563654403091377873u, 17915276202256919438u, 451738u}, + {12409077557351478472u, 14993517442288375397u, 12632847700624246607u, 11897836129447755047u, 3005560u}, + {4328759112052689288u, 7728225056999716702u, 7429241850005841034u, 11656715448122412305u, 2861651u}, + {613262416887602778u, 16936873836253512920u, 3945580018759825505u, 8627641845795414844u, 44863u}, + {18254623300830465309u, 18095590708314413783u, 7555112184934606423u, 827584907020677u, 0u}, + {18046801395846954772u, 836937189988346602u, 16731578305736887593u, 827584u, 0u}, + {16997737476690744323u, 5561017026082392588u, 15266246979075151u, 0u, 0u}, + {12172759318655059175u, 18060748744986551404u, 15266246u, 0u, 0u}, + {9335988314792887517u, 281612550989040892u, 0u, 0u, 0u}, + {18244584222493396995u, 281612550u, 0u, 0u, 0u}, + {5194834656039319013u, 0u, 0u, 0u, 0u}, + {5194834657u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3411146u}, + {9723994830070269767u, 8029656959681469760u, 2890824976687550535u, 18437611016931681722u, 229686u}, + {3461018863244295655u, 10086607780572384537u, 76633274902748419u, 1877734422283051405u, 1501543u}, + {12369904178486372599u, 4903984040861168900u, 10057070661541096381u, 6368766856652062851u, 3726591u}, + {540659102414143285u, 1839879974362973574u, 5871301785266442733u, 4896602277354327920u, 754427u}, + {16967724975511558063u, 17717676453236981143u, 4636256201961155273u, 14641608316387269761u, 2020443u}, + {13332702594810295265u, 3051719728272154616u, 18132331297546332348u, 6738626855105424311u, 1563790u}, + {763172068322347629u, 3225360889373641788u, 15255622483896334258u, 15088883994580591738u, 1240134u}, + {11437374389685816674u, 18008780925734578119u, 12255062749118244466u, 1896373894590116051u, 221464u}, + {14381361620642659372u, 16873688140271415166u, 13451400378449205992u, 16072928762083843634u, 506816u}, + {12013782951321701116u, 5580188651001229507u, 3609258414981045204u, 5773956644151624822u, 2814083u}, + {5474151946605438578u, 4714847669352366146u, 5383367744534934306u, 5095942257332088960u, 2350379u}, + {9179431639690934571u, 15355724446617854386u, 10141123828068754707u, 6312367526284894071u, 558147u}, + {8030826676902615323u, 8396136576428430424u, 7207320432757666951u, 11827741423397057795u, 3869990u}, + {5086944251424452727u, 9184986418422114989u, 1023086593961812680u, 16572577761611053995u, 3523979u}, + {13276228207989246075u, 11359911280866807682u, 11164966726969987896u, 13683891228475084577u, 1973889u}, + {4060760627606082840u, 8479723141708940706u, 11157313957758937032u, 5008385827513829285u, 115960u}, + {8992668537133962730u, 1461892522831045343u, 2199232737774894244u, 16791558500288382275u, 3471801u}, + {2942841243746473783u, 6051507890400124688u, 5503820204219516910u, 13034410368140435875u, 1711715u}, + {16235198757108165881u, 6318894372675363691u, 5253952123069936785u, 11272560251483298129u, 3103092u}, + {10009175809641099416u, 6181230952053418291u, 7867440448068636671u, 7263001359026529371u, 3332610u}, + {11498618603827460181u, 5783614445566461721u, 15449648648212653740u, 2655549196395892243u, 644605u}, + {578627315446755205u, 17354019982396008055u, 16884746167574476595u, 16801310276956391829u, 685769u}, + {1276618416521254757u, 17941154309092046532u, 8458653663534410090u, 12406556396561598994u, 411209u}, + {17350610872010237912u, 13571171828332192624u, 10552694930450213577u, 10311821427014057275u, 2447249u}, + {14444696400957409124u, 6650134649873422426u, 9163635199757070075u, 15681641692529825165u, 3502891u}, + {6599990515843244925u, 14307405593597889951u, 9215016058334646128u, 10873256055165932617u, 546741u}, + {7879805043712865545u, 10584190132367166100u, 2324586257019916295u, 17375965765315492665u, 3685518u}, + {1947223333544397461u, 8406313050066551311u, 10481250961219830183u, 140043418738943580u, 1908868u}, + {13211396643187127022u, 14891083820743771438u, 2085852093599296554u, 17256977374671313927u, 1381316u}, + {11195357583999037769u, 2232216202441987512u, 12383678988100343257u, 17463418557172458069u, 1249558u}, + {13867879546551133458u, 7785802682048244348u, 1303148056037769589u, 4490621124446206949u, 3654396u}, + {13217991089412973294u, 11863280958896389920u, 618166720581660363u, 8642265402760033399u, 3691490u}, + {9058467602786769246u, 17778835204390728397u, 8392922474790445840u, 5256242750653734867u, 2579470u}, + {9575470750092056399u, 9412437014289685307u, 14031670600902639113u, 2569598619519532087u, 2113635u}, + {4456134725598274325u, 7713400251756823298u, 11979615319749618979u, 5803597209514068587u, 1330479u}, + {1421012062076410684u, 11069392972022791650u, 711539833221132129u, 1825982862360240620u, 1473559u}, + {9100179110434845225u, 3613089118813616544u, 9776072719420014573u, 2260967782752260251u, 2807031u}, + {5717083997034055316u, 9982959616382827089u, 2480576979876137121u, 4087005850848901195u, 2876058u}, + {9734319423105176779u, 5837263520986129496u, 8310459701472247112u, 1926551354940277132u, 1668690u}, + {7354955203855749980u, 13746607103877610650u, 11554674734040629320u, 1399876186015540530u, 2847051u}, + {12801545025644028630u, 7556562182606803374u, 12053562761794158518u, 13887576877843838750u, 2710110u}, + {17066319293071559388u, 905710754980035722u, 14275501936679093320u, 17415872882609810446u, 3454228u}, + {11404413726784571524u, 11313573051474373625u, 12345352403042231575u, 2297504692479880495u, 1995666u}, + {13741132429398333115u, 4425580352109423367u, 9503333690767543722u, 6377881817593766706u, 1709241u}, + {48588571610586725u, 998070574160089529u, 5671454463337875276u, 1905027382651299541u, 1140001u}, + {12396767947107556643u, 18124571468099355986u, 3746370602484020582u, 12342877889081477401u, 242872u}, + {5609648723999321975u, 1545693840299979170u, 5562773454175548330u, 16073323680427477603u, 995302u}, + {1844951298609150266u, 10820573966183133583u, 10514379140098599037u, 14285763716853106272u, 2124663u}, + {15339084834957429421u, 8719294788037404448u, 16938015876965270361u, 15387460658968294041u, 3591617u}, + {13624476533529694252u, 15586668075671482688u, 11339160343297136455u, 7992588999169318097u, 1638035u}, + {11886391248624791910u, 16488809753918948192u, 10157379713644854595u, 10190337179769206800u, 2216424u}, + {16423660443389603583u, 17177547943094719851u, 2729833132383547u, 1121749727046083839u, 2179894u}, + {5747164501175980383u, 2028828916272388138u, 6576126704909627332u, 9912102331043691968u, 1616555u}, + {18412347136758744718u, 8863691888911193773u, 4727805475042417032u, 15450145310394756179u, 2514720u}, + {15073447567899247057u, 9047844192307397008u, 637218779540062039u, 6531571875120698434u, 1876582u}, + {15118276454626650893u, 4131236427558050239u, 16811531449808607212u, 17832842561787102084u, 206354u}, + {7126352070185109949u, 17977576598832807317u, 11091476556128996458u, 3318455903004113878u, 1722378u}, + {9702184974977113929u, 7804553167508487924u, 1796283554349215367u, 11344814533437329565u, 1788325u}, + {12001577806000107135u, 12388715397673024807u, 6106107762882246041u, 18335617670574126911u, 1806911u}, + {13534260570030654037u, 1873389230327361279u, 3581344739163183074u, 12283122629564337390u, 22316u}, + {7836838008906935774u, 11321825867486212722u, 16937801260611682423u, 432757234051439147u, 1002784u}, + {3630850249517783571u, 11951414524995697442u, 1090905246622547431u, 8016891038451968889u, 1838614u}, + {16188022648673700457u, 9817062779497477416u, 18204521962850657069u, 9257288486780006259u, 2900019u}, + {8077811684765077130u, 4291437214128887575u, 17485428235471316988u, 5169585094252067042u, 2482037u}, + {4460837537034766773u, 13288531429174396286u, 11370367088175668810u, 13880843561772226640u, 3837206u}, + {13995354030744040339u, 2105714037792133423u, 9047233976520113896u, 14914648342734101111u, 1972307u}, + {10365005015080838034u, 17887960174274891375u, 6515375682761302334u, 15024362217267444895u, 1788258u}, + {14374725071348379660u, 8880009931471416648u, 11458560757707836813u, 12138663351060019160u, 3840105u}, + {8039967228253872575u, 6088204983481508414u, 14174087824592380525u, 15995565728671909624u, 2987374u}, + {14089889908352116741u, 695247699857309664u, 13303902668171811297u, 13890165394908183438u, 3161288u}, + {13203282762715252082u, 16352345633204148160u, 16919812005513558797u, 418603454759094195u, 1264671u}, + {14154357336449815384u, 411341988650379037u, 2044868286199766361u, 6220282149954848283u, 2522029u}, + {3458477588870831713u, 136614982154500515u, 13049174131226162806u, 7324340227560477312u, 2204099u}, + {6953352368283030436u, 14555535158143311118u, 10473162867878091588u, 11930161473748568816u, 1388283u}, + {2344046038676258065u, 15917110566398418065u, 3591288590050379828u, 11554824359201512951u, 667747u}, + {2637000455355243832u, 17938873423090655151u, 3033421392574874268u, 11613590409676209387u, 2555110u}, + {17353004725795809313u, 11961492744216719547u, 1951059495148838373u, 17557128823080254870u, 383554u}, + {7282468712190049526u, 7858366796514224743u, 8130921433136314114u, 17156782721060425184u, 857378u}, + {10403734168911634804u, 12771304909652526679u, 107877157769785249u, 4699559462162527509u, 3400950u}, + {295763428092594462u, 3255352150563842096u, 13483882020456306686u, 11375778722911727913u, 3853408u}, + {14718058831904816115u, 11953603462921242321u, 14485033541868523547u, 9294454879418139506u, 1347251u}, + {8820751662979362964u, 13218433200613911806u, 10004538573131964724u, 15229004745697298642u, 1308354u}, + {16717947067022515325u, 17136538632585942193u, 7236633840033964291u, 7662239854645180148u, 1478331u}, + {9457987207881870766u, 8641255437721171235u, 14669091513980166752u, 2333113410489164921u, 1359533u}, + {2929619872438354459u, 18292513363907715517u, 6019546134041266750u, 12346927540129553034u, 117197u}, + {13715403861520221011u, 13866021413117744474u, 8306446855645653711u, 8721130794001414334u, 2754632u}, + {799408594509026907u, 8861477313782105218u, 10855902365537115888u, 8481552502679949995u, 2961635u}, + {6616255070234723125u, 4132962913489774059u, 10702840675155663057u, 17420512694506925866u, 1489316u}, + {6415117257354830542u, 3338244726243026520u, 1502681412147627226u, 531876206782889061u, 1335569u}, + {14908739289739243427u, 17247304790720977483u, 17065425407895116029u, 4276034948305404622u, 2750962u}, + {11189535442778580281u, 9085129442342322383u, 15459463856337610299u, 483091860474102739u, 2136488u}, + {7100941307359952555u, 9265671370884869011u, 18208178749083923418u, 5876076364907806248u, 1531309u}, + {3638628595121727607u, 8922617990949653283u, 12605611948194166191u, 9611907678141259952u, 2796015u}, + {9621590962163912686u, 3062094279024614848u, 1897620117242975675u, 15039556942632171378u, 3679670u}, + {12405183342880241257u, 13652841913594150209u, 7877093570545844652u, 2013432984829318040u, 3718362u}, + {17379976863772295506u, 5381881205260593846u, 10981181324555536620u, 14696283263900210788u, 505763u}, + {4260805757521364370u, 15720148472643758463u, 15756725420262172829u, 12907639028108335371u, 3843357u}, + {11153679462656909365u, 12951092991128970043u, 5138345797917093882u, 15491222559987117453u, 2574261u}, + {2584292545429578807u, 12285198528524147615u, 731841907079017718u, 7397361341205803656u, 1182798u}, + {625825109025934258u, 13766061747601954552u, 8081614945215037528u, 18108274882914168787u, 1115228u}, + {13539983199835167885u, 4672547153554910690u, 13720268309977941439u, 8523368440083606286u, 2890042u}, + {6797997127955967103u, 12723102475844203629u, 1014832106776889228u, 7187013683414505804u, 1363738u}, + {14455826952864686912u, 19387909679452688u, 16901025201870523923u, 15301366469097328631u, 1492318u}, + {10287600134671528316u, 1166509874373019331u, 13757849575350814986u, 15880199111868102479u, 682919u}, + {8643398204663834840u, 6976394692075623312u, 2732877455985640910u, 9308027278788976509u, 1524011u}, + {5970599223695743265u, 11840955251116196808u, 4737645647017615185u, 8602966740703969830u, 1564057u}, + {5903646542046486582u, 269275565246935261u, 16156321477367968221u, 14584485763460103752u, 3555544u}, + {8290127888044714744u, 14025862266472503277u, 8320641081944826343u, 6983117252436381173u, 927322u}, + {15432287200302464257u, 15177109300089390043u, 4796771894580195614u, 5421425631435632941u, 1322599u}, + {3838971607287908636u, 10202385290463844947u, 12791026302233390585u, 10905094350413688146u, 2740839u}, + {8665185131131830600u, 12296343292228268203u, 2865406003334303581u, 13597387245615788332u, 3436289u}, + {14016194668340774995u, 18350357579271241434u, 530922311091730848u, 1072194673874681671u, 2732191u}, + {10070998354637934035u, 12203282704704588703u, 7636072635416450724u, 7112044244926624975u, 2265039u}, + {3123314744109012114u, 14051753962367672480u, 172993555112576736u, 4941698996441114902u, 3215793u}, + {14361928354828572262u, 12748230806021314252u, 10348372365337208824u, 12309111901854474776u, 700112u}, + {12891544815418735164u, 9926744777820073330u, 8401675999539204805u, 373202769385684523u, 3220221u}, + {12649923272645359594u, 14076631995465446276u, 7380757382882022980u, 16992937191934052775u, 2728302u}, + {2589091817884735557u, 12255741772588607227u, 499700297371869200u, 11075140193545701317u, 592466u}, + {7016468418770675960u, 16067814486435751834u, 13898263481613932426u, 14494505481373029732u, 3075295u}, + {5651461879623923593u, 11439911754637797840u, 16785733802163033548u, 6325739875610394528u, 2230750u}, + {15042880322530789167u, 11224157487625655622u, 16192303450151817195u, 10561558810205646113u, 297565u}, + {7247015746423966072u, 14701878742437557683u, 17197182915444687026u, 77546709999780128u, 2369096u}, + {9679008153802175598u, 11055828257990388190u, 16510560256126541743u, 9195016550492443585u, 652043u}, + {10154031793956020787u, 10229267671140948613u, 12115730637014942590u, 9811860868699269643u, 3653602u}, + {18338934910476631214u, 2534586150838334067u, 16649855507808669842u, 8570193167328550681u, 402004u}, + {7064067379910651052u, 9745012056678260600u, 16904396046390368491u, 11896918689732910141u, 406868u}, + {563309706582461855u, 18048039016290736849u, 10695585097144620854u, 7357379993633350219u, 1448596u}, + {1710747227483110266u, 10557819371756299149u, 4908334669166442467u, 12060340091369544667u, 730698u}, + {7090234475579389990u, 7285553148577940998u, 5833831425389614592u, 15073516164988450137u, 2156787u}, + {15537993111623726826u, 16877624480266076270u, 12722127787942121235u, 4435298949197624063u, 1330713u}, + {17810010556038147093u, 3237498989927255940u, 13967990304867086504u, 7518537106526362551u, 2835730u}, + {18343529762273698067u, 14815351242735920951u, 6094845410607654604u, 16841729403927886581u, 1735604u}, + {1608226550488125843u, 9164322621937633174u, 10160884368413615593u, 15452341383759614300u, 2476678u}, + {1572432748253357722u, 17113921831939563356u, 11747365292414351452u, 12295477647119077328u, 2617281u}, + {14103183916936182523u, 3200226698126580563u, 1515463199054313339u, 8406961233471100832u, 909431u}, + {13935407527042844273u, 212126252193769357u, 13037998742648767072u, 232948831430442792u, 3228367u}, + {14766686768765767806u, 15153839696304105336u, 8344087038118141038u, 14687244449757329323u, 3079605u}, + {13158673371133478608u, 17301789474767562459u, 8517249184141567140u, 2074421333032342961u, 672436u}, + {11104138821883446312u, 7820846401109757351u, 1527381876977893930u, 11469561708902912113u, 3425306u}, + {11351405692007757423u, 3182507447452574538u, 5727835950945780800u, 6764542000153001526u, 3654013u}, + {1912573969072122067u, 11372781937139437340u, 18115376619458604542u, 14478923457003136859u, 3360190u}, + {17121237711153727543u, 5230672540832061874u, 4569330449028375948u, 9501529398416521171u, 2815985u}, + {11384802476705895254u, 17460995159483701864u, 2285605662708823936u, 5168034940804817846u, 1216452u}, + {5603958677203868204u, 5272765397458821827u, 5297983815426136216u, 3769434473862239744u, 1174513u}, + {2989733823023825436u, 9271028246211277999u, 8474484998199842676u, 18180179642049519172u, 458508u}, + {10584668242209140808u, 15009973179397265063u, 2617004541397919037u, 10600924321487334653u, 2610638u}, + {2876793194691390502u, 18187331455967435071u, 16584096286781566904u, 9631817788700440765u, 1240004u}, + {14097875443358219351u, 14349334261204633398u, 10007123093202962693u, 7877151796204338951u, 3114849u}, + {9874738500792007136u, 14430291206381764207u, 6380450884903786562u, 14252804855680205311u, 1692760u}, + {6641273826448159011u, 2949222992530116639u, 5048974781491582427u, 1040032241282008540u, 2095915u}, + {4047635338287570418u, 12694778236465461400u, 2900882958262251007u, 17332485377747985836u, 171917u}, + {14285482539554246450u, 10146504953540651086u, 13524298821068066040u, 7641276294253766518u, 1899186u}, + {16659339257807876931u, 8189135860747012912u, 13819398517081826052u, 18265605097327416250u, 2052319u}, + {14338262523883600728u, 6293153160943238847u, 10891211431455507592u, 18124314725136128546u, 2664358u}, + {3384816382660993246u, 10920900019669860010u, 12186492360109087679u, 193263936346911230u, 3755127u}, + {18422172017864006896u, 10040014406986441652u, 14352423974155676210u, 5689762201884919671u, 1441772u}, + {18331261940207079728u, 9430982366918392112u, 9913708668301560769u, 98653598824330505u, 1008002u}, + {7821491226525070409u, 17090498156581426712u, 5024187267823698179u, 11187521430897271054u, 543772u}, + {10212344643340134514u, 1093402640774919421u, 3663645237254255144u, 2820277001585160125u, 3628131u}, + {68280651847924623u, 6730034108360011769u, 14743925837490289363u, 4534498037194700942u, 2337792u}, + {5438645457199419397u, 2199899435571926405u, 5278956675455211642u, 2853370822735253141u, 2706290u}, + {12111007152655513724u, 14796054803699088636u, 3285693126363002447u, 17704032781164954565u, 3048850u}, + {14302853256216020190u, 423446629874791973u, 11241375098540771205u, 14251587398844965539u, 3083093u}, + {13316545273478702086u, 10423252256128635175u, 8585000831394633411u, 4020040713864069281u, 3019522u}, + {9627654564192810283u, 8415137898483499789u, 10675441318083711104u, 2433600956830598214u, 2127927u}, + {15772520129927110620u, 17949726815718866529u, 16088848901294332759u, 7245012731002931101u, 2661080u}, + {8360724989436224388u, 16359946114845365233u, 11386001569378529785u, 6029868574112698432u, 3627042u}, + {13931320866511783879u, 2593410222829157878u, 11531028446183893273u, 5759457050544771157u, 1190169u}, + {13697280481425080508u, 8186831947092832227u, 16270660288441562334u, 7732117310765209025u, 3750858u}, + {17688935958212196254u, 14637970713979884275u, 2222750644481765471u, 3888243609325123980u, 2842996u}, + {10007851334870344271u, 18219467786700659047u, 13488361021159485367u, 8987585684205887633u, 1642621u}, + {9424924548366143193u, 2566245955194104486u, 10900424011816041752u, 2336144027398380493u, 2889106u}, + {620078124984122419u, 13537452603636580960u, 4233081161695997525u, 11366336865274648687u, 1738738u}, + {15584821751404672511u, 15489883105636250830u, 11664785614288744160u, 12498037834825103391u, 2380191u}, + {11250739729596127000u, 13531463622842271272u, 3607114108323070220u, 17770074920051856902u, 1989551u}, + {16243571963912050016u, 14912718849848099300u, 3302360440491287187u, 3711638051822992568u, 1739166u}, + {16598144879526069680u, 5843241783628784668u, 16026251306753156268u, 4499652784166867229u, 3690586u}, + {8269421483856706331u, 3543648097962672751u, 7879604315670116228u, 14263425325395471615u, 3635336u}, + {10828454514208870316u, 17286541347612554398u, 17136556539035608880u, 8281625847401153015u, 2717929u}, + {5411476014929933483u, 5285467087383761464u, 5815820848361005699u, 2139807176055049319u, 26297u}, + {10714710577673602519u, 5050970054022587349u, 2469931802632805237u, 11241469766085471532u, 3736532u}, + {2467945720384254955u, 17958118254680573234u, 7458152259684773472u, 357157236920407608u, 428476u}, + {17245634695429221110u, 9070062197833962106u, 13994157983749103881u, 10960658281235930282u, 3047680u}, + {15900644673286931130u, 5455839897713234499u, 9315258271452621009u, 6757576029466519455u, 3689585u}, + {2324283921570176811u, 1995864831145378156u, 8589520060405646540u, 9939951220186900917u, 1034636u}, + {18228294117151128581u, 5955871262792783889u, 15360100073527042904u, 7224845079234191375u, 3579139u}, + {12004869838920354558u, 12801510750194455735u, 1762217458274829465u, 3885075952372258418u, 3329593u}, + {7500245285778954903u, 15177065358720654951u, 8596749165834395836u, 17283185128890467463u, 2858246u}, + {2894708669451354262u, 9642707496599102910u, 17684764406406836259u, 3943835427792997703u, 852131u}, + {2855821581726120530u, 15697940201906572867u, 13301788508790944100u, 13994892289776129205u, 3515623u}, + {3235285071468702717u, 5295441683037672842u, 13964664394383745540u, 17502789568914099796u, 2125556u}, + {7103815947768428712u, 5356665383198148197u, 11230346299000161522u, 9550812018055614900u, 2815153u}, + {14411984355169591356u, 17595107526924605279u, 7674807506703475576u, 1853370267418346083u, 3815461u}, + {15383625322747173433u, 14637803558993363899u, 17278715781739044372u, 5762932763439897130u, 2988600u}, + {7566410439736173281u, 17740382323507560857u, 7369008125502939011u, 14754879128838920073u, 2035726u}, + {1083403426051724853u, 542408726119780559u, 9443871307245871506u, 6883023964884229499u, 2029555u}, + {3984793326202627751u, 10658048557583548990u, 16864758302708095712u, 1334475381234244401u, 2438943u}, + {12063919125282139128u, 17150468061623520812u, 3343034989475882805u, 10277168912051607688u, 2252004u}, + {4740831759538323895u, 3063348186234131252u, 2380481342984056991u, 15678040057948501229u, 3715809u}, + {16818468352021138670u, 15515574133888018737u, 4227967420570917389u, 4175827453489719025u, 1182862u}, + {1379966131966612819u, 5255087456392451243u, 2459394024705868933u, 3480584470584884609u, 1758275u}, + {13298111613670397744u, 3562905188468641962u, 8347280989042178761u, 248607234530569940u, 2764915u}, + {15461068793091685532u, 13799419705611169068u, 8059799021632168451u, 13453716170693763975u, 2699899u}, + {5366729494208533470u, 10290423869364204158u, 7235749372051122588u, 13020171286158608995u, 672068u}, + {5355864831470125162u, 1887461935688253515u, 1735301510724623978u, 14856261851229455933u, 3293022u}, + {6900597190886802386u, 199625833206199391u, 5738403648111670867u, 3807740438891609698u, 300209u}, + {13142678246821307699u, 2985368284953984783u, 12409077557351478471u, 14993517442288375397u, 979169u}, + {11124408178042619538u, 2778634667674972457u, 4328759112052689287u, 7728225056999716702u, 181020u}, + {3082124087983032194u, 2522497051212251436u, 613262416887602777u, 16936873836253512920u, 495187u}, + {13357880265209739439u, 5105021483259292176u, 18254623300830465308u, 18095590708314413783u, 2401705u}, + {7423258188121964064u, 17445475397060004897u, 18046801395846954771u, 836937189988346602u, 682087u}, + {8388311865488266196u, 9436473914694364215u, 16997737476690744322u, 5561017026082392588u, 2512651u}, + {8596625302574035285u, 17260551772673418975u, 12172759318655059174u, 18060748744986551404u, 3547496u}, + {127961364440389647u, 12869227393934662555u, 9335988314792887516u, 281612550989040892u, 0u}, + {16704396762662708717u, 28942732959948795u, 18244584222493396994u, 281612550u, 0u}, + {8219203230041567975u, 7964894462657826326u, 5194834656039319012u, 0u, 0u}, + {2987445008974636329u, 725307759560009207u, 5194834656u, 0u, 0u}, + {10655084776998494581u, 3594065036646546892u, 5u, 0u, 0u}, + {3584294101388385140u, 95827785405u, 0u, 0u, 0u}, + {15269945517571305139u, 95u, 0u, 0u, 0u}, + {1767710632520u, 0u, 0u, 0u, 0u}, + {1768u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1694826u}, + {6520483079085988544u, 13818947702025853917u, 9723994830070269766u, 8029656959681469760u, 3827353u}, + {11671450904825323256u, 17601106490346634239u, 3461018863244295654u, 10086607780572384537u, 220507u}, + {5901579165798765412u, 8293391221002534280u, 12369904178486372598u, 4903984040861168900u, 2083843u}, + {16218568798923525757u, 3604870224555805723u, 540659102414143284u, 1839879974362973574u, 3445915u}, + {4641869538083308031u, 14582909502627652829u, 16967724975511558062u, 17717676453236981143u, 1371557u}, + {9412530507698429275u, 5325430074147925844u, 13332702594810295264u, 3051719728272154616u, 2972164u}, + {17667928229927239558u, 15289869829139710723u, 763172068322347628u, 3225360889373641788u, 3601720u}, + {4991357273108543526u, 6791747262133216493u, 11437374389685816673u, 18008780925734578119u, 661966u}, + {8237483240729299850u, 17804603197861342541u, 14381361620642659371u, 16873688140271415166u, 1721382u}, + {15185729494700143639u, 12127255167882059279u, 12013782951321701115u, 5580188651001229507u, 1686154u}, + {5895308161771698293u, 15122911067001769501u, 5474151946605438577u, 4714847669352366146u, 404240u}, + {4753865208161272047u, 13326000853950014528u, 9179431639690934570u, 15355724446617854386u, 2030475u}, + {12568343461178903180u, 16344625923247726825u, 8030826676902615322u, 8396136576428430424u, 1825361u}, + {16773255039635850860u, 15253910089303010499u, 5086944251424452726u, 9184986418422114989u, 2540774u}, + {13278910929666196444u, 12933600625787163619u, 13276228207989246074u, 11359911280866807682u, 2655462u}, + {6651197661655153115u, 15549366715780155631u, 4060760627606082839u, 8479723141708940706u, 1124352u}, + {4428044684881342985u, 5230394386554759187u, 8992668537133962729u, 1461892522831045343u, 3834150u}, + {17869860139078377843u, 3374083209300813499u, 2942841243746473782u, 6051507890400124688u, 2704200u}, + {10033813872956417634u, 2539836087346527344u, 16235198757108165880u, 6318894372675363691u, 3053951u}, + {7055614280260961128u, 10868880492776587180u, 10009175809641099415u, 6181230952053418291u, 1030367u}, + {14051739937694508037u, 1427630852496523806u, 11498618603827460180u, 5783614445566461721u, 3263308u}, + {1078589072141489116u, 17620473161155982837u, 578627315446755204u, 17354019982396008055u, 3841923u}, + {9570347712348027252u, 1525397662054829339u, 1276618416521254756u, 17941154309092046532u, 1319698u}, + {9031729467879397569u, 3156436325716358763u, 17350610872010237911u, 13571171828332192624u, 1129521u}, + {7511076989564967896u, 3038379286651224773u, 14444696400957409123u, 6650134649873422426u, 2168511u}, + {4134794397124731988u, 14185759347848796193u, 6599990515843244924u, 14307405593597889951u, 3457596u}, + {14636201058428623548u, 11490025247617538344u, 7879805043712865544u, 10584190132367166100u, 2582143u}, + {15884771284295558572u, 2617839296476282791u, 1947223333544397460u, 8406313050066551311u, 2559771u}, + {11029378081588543039u, 4026972416804154943u, 13211396643187127021u, 14891083820743771438u, 3821182u}, + {6015993840895279071u, 13697294472599484003u, 11195357583999037768u, 2232216202441987512u, 194209u}, + {3159444459209798833u, 17877024955979576788u, 13867879546551133457u, 7785802682048244348u, 2484749u}, + {13471050154735552371u, 5247810365790776236u, 13217991089412973293u, 11863280958896389920u, 2855087u}, + {2054841791635616685u, 4729019952003681509u, 9058467602786769245u, 17778835204390728397u, 2436732u}, + {12000406374763851174u, 13517969394516375886u, 9575470750092056398u, 9412437014289685307u, 175515u}, + {8921463153718397775u, 8099270816369458344u, 4456134725598274324u, 7713400251756823298u, 2416745u}, + {6181713060312353472u, 16894535644389831612u, 1421012062076410683u, 11069392972022791650u, 553453u}, + {16401325341321406755u, 1847896166564708252u, 9100179110434845224u, 3613089118813616544u, 2114825u}, + {10902053434079780911u, 15252054443032930004u, 5717083997034055315u, 9982959616382827089u, 32439u}, + {15224724567724218444u, 12802083254192966491u, 9734319423105176778u, 5837263520986129496u, 3017564u}, + {14531445883740212654u, 14965022562797874257u, 7354955203855749979u, 13746607103877610650u, 3392056u}, + {3741938596612862547u, 1118867262038555441u, 12801545025644028629u, 7556562182606803374u, 2223678u}, + {9399980006213533009u, 3210400891591660128u, 17066319293071559387u, 905710754980035722u, 28774u}, + {5186860230412114600u, 16063813655301984457u, 11404413726784571523u, 11313573051474373625u, 1629941u}, + {8258289323565539810u, 6270115085484493004u, 13741132429398333114u, 4425580352109423367u, 3324264u}, + {5362581478346363376u, 17873282214860306175u, 48588571610586724u, 998070574160089529u, 2066238u}, + {11128950791671138189u, 5896282539927968424u, 12396767947107556642u, 18124571468099355986u, 1760980u}, + {4751431036387180186u, 10015049076594555656u, 5609648723999321974u, 1545693840299979170u, 646990u}, + {11151429421539143922u, 17876336335341059814u, 1844951298609150265u, 10820573966183133583u, 17667u}, + {8059355454028320465u, 6686272268540841714u, 15339084834957429420u, 8719294788037404448u, 1204969u}, + {2518366959622077170u, 8694729900456186321u, 13624476533529694251u, 15586668075671482688u, 3235167u}, + {11965172429963804445u, 4936186594385742079u, 11886391248624791909u, 16488809753918948192u, 1509239u}, + {15752610376918433030u, 17862206696150802100u, 16423660443389603582u, 17177547943094719851u, 608035u}, + {1029753126688132741u, 3441825956511016418u, 5747164501175980382u, 2028828916272388138u, 32950u}, + {4306315998623294647u, 4438039256738315630u, 18412347136758744717u, 8863691888911193773u, 2203366u}, + {7622189601155226530u, 16288341854478105224u, 15073447567899247056u, 9047844192307397008u, 1298525u}, + {3507644113593435741u, 8487612302568862791u, 15118276454626650892u, 4131236427558050239u, 1910130u}, + {7317430959961543217u, 4920418040643256451u, 7126352070185109948u, 17977576598832807317u, 1210674u}, + {14945697323946490142u, 7662142261060443519u, 9702184974977113928u, 7804553167508487924u, 3624857u}, + {8412902969280950503u, 15524058626189795152u, 12001577806000107134u, 12388715397673024807u, 3900383u}, + {13190378595475918658u, 5874050115792740462u, 13534260570030654036u, 1873389230327361279u, 476160u}, + {233060272994809435u, 2357860250831434684u, 7836838008906935773u, 11321825867486212722u, 3356229u}, + {8256140402054361206u, 1633532036277188125u, 3630850249517783570u, 11951414524995697442u, 934039u}, + {2842638492308067216u, 18374813321117406543u, 16188022648673700456u, 9817062779497477416u, 2170527u}, + {11386019006752213107u, 15254756833779669313u, 8077811684765077129u, 4291437214128887575u, 1622732u}, + {15828613359999692542u, 3709015291235274457u, 4460837537034766772u, 13288531429174396286u, 869736u}, + {7160027745900136211u, 13823262546747662462u, 13995354030744040338u, 2105714037792133423u, 958264u}, + {11798816099433658122u, 9296684761182741488u, 10365005015080838033u, 17887960174274891375u, 917552u}, + {17330631361600153369u, 7275870783393909570u, 14374725071348379659u, 8880009931471416648u, 1917253u}, + {16878820466516429369u, 8572814317998226207u, 8039967228253872574u, 6088204983481508414u, 2533203u}, + {1934739969660131787u, 1662847921768730665u, 14089889908352116740u, 695247699857309664u, 3649933u}, + {11782475138204395108u, 3688725537815995746u, 13203282762715252081u, 16352345633204148160u, 2767643u}, + {6368807209586092771u, 11167600740221911827u, 14154357336449815383u, 411341988650379037u, 3499663u}, + {11105358218663828647u, 6906986779910789808u, 3458477588870831712u, 136614982154500515u, 3900892u}, + {1572390736067489480u, 16324127120050755602u, 6953352368283030435u, 14555535158143311118u, 3493292u}, + {15226864934109428265u, 10777515314243552921u, 2344046038676258064u, 15917110566398418065u, 3718276u}, + {12378213194078827811u, 14026368510978357837u, 2637000455355243831u, 17938873423090655151u, 3902570u}, + {16133362058591842428u, 4203270820570457767u, 17353004725795809312u, 11961492744216719547u, 221667u}, + {784983187721112014u, 13231193119334013314u, 7282468712190049525u, 7858366796514224743u, 927576u}, + {14445121729416633034u, 1519917074661017968u, 10403734168911634803u, 12771304909652526679u, 691743u}, + {9945782852418700640u, 6943462845485625346u, 295763428092594461u, 3255352150563842096u, 3474892u}, + {540182104081763977u, 5921116144612731286u, 14718058831904816114u, 11953603462921242321u, 1728949u}, + {4898112119081432221u, 17092690235010071617u, 8820751662979362963u, 13218433200613911806u, 3192370u}, + {6159789931060881952u, 3946352172236711225u, 16717947067022515324u, 17136538632585942193u, 3599645u}, + {2869570662772356395u, 8758188173069352979u, 9457987207881870765u, 8641255437721171235u, 3357886u}, + {5777985750342102290u, 10735609210976069480u, 2929619872438354458u, 18292513363907715517u, 1678526u}, + {14248406356583871739u, 5467131391233972087u, 13715403861520221010u, 13866021413117744474u, 3819147u}, + {3455778055543645930u, 14748891795032138497u, 799408594509026906u, 8861477313782105218u, 1392118u}, + {1118790032458618386u, 15101666895257662597u, 6616255070234723124u, 4132962913489774059u, 1279109u}, + {17261366427914262329u, 8491500653671996920u, 6415117257354830541u, 3338244726243026520u, 1384516u}, + {16182085872871998396u, 7450679729489755542u, 14908739289739243426u, 17247304790720977483u, 318353u}, + {4944788005040019563u, 5961211489976473261u, 11189535442778580280u, 9085129442342322383u, 2293051u}, + {17205482684651743868u, 16170295293055738670u, 7100941307359952554u, 9265671370884869011u, 3227340u}, + {10867578130417141736u, 11505812969304534904u, 3638628595121727606u, 8922617990949653283u, 1933963u}, + {13763910745144875178u, 4540907016620509893u, 9621590962163912685u, 3062094279024614848u, 1840793u}, + {8556043909833510900u, 11264165978312076951u, 12405183342880241256u, 13652841913594150209u, 2689864u}, + {2062845810527448941u, 3003332565500986607u, 17379976863772295505u, 5381881205260593846u, 628456u}, + {14759996971367899025u, 7748417920983770575u, 4260805757521364369u, 15720148472643758463u, 2861407u}, + {2735609345998128397u, 16498199175707704347u, 11153679462656909364u, 12951092991128970043u, 1919446u}, + {12046181269887254180u, 9030091274806295107u, 2584292545429578806u, 12285198528524147615u, 165952u}, + {14114342418240350174u, 16655948150695927491u, 625825109025934257u, 13766061747601954552u, 3299288u}, + {8880309890203181484u, 18342217773340881216u, 13539983199835167884u, 4672547153554910690u, 2220767u}, + {5160617449051327507u, 5734164436909752011u, 6797997127955967102u, 12723102475844203629u, 1051020u}, + {13193417342821639386u, 13843666898221111364u, 14455826952864686911u, 19387909679452688u, 736627u}, + {2173857675364363876u, 17170775993126165630u, 10287600134671528315u, 1166509874373019331u, 3191114u}, + {3568241330385846365u, 2103282926826159732u, 8643398204663834839u, 6976394692075623312u, 1274470u}, + {15962649220849151765u, 6549246259119923456u, 5970599223695743264u, 11840955251116196808u, 2878707u}, + {18147464113820337072u, 5202948149576897015u, 5903646542046486581u, 269275565246935261u, 2531017u}, + {6729504316477532231u, 14594125143069290235u, 8290127888044714743u, 14025862266472503277u, 2440243u}, + {8592123778852408541u, 7994527123988830949u, 15432287200302464256u, 15177109300089390043u, 2291164u}, + {7482962269589133332u, 3685632320314419036u, 3838971607287908635u, 10202385290463844947u, 2523605u}, + {10128113046425256707u, 5102588321985617008u, 8665185131131830599u, 12296343292228268203u, 2587377u}, + {50956410513612774u, 1923765916047473535u, 14016194668340774994u, 18350357579271241434u, 1385030u}, + {1283499051533077514u, 1374946850243174382u, 10070998354637934034u, 12203282704704588703u, 28358u}, + {1821794211003557456u, 7515154284197541374u, 3123314744109012113u, 14051753962367672480u, 3582976u}, + {3878526780973974375u, 12202758234488625772u, 14361928354828572261u, 12748230806021314252u, 2973662u}, + {9292835321578192162u, 18330075162707683840u, 12891544815418735163u, 9926744777820073330u, 1376999u}, + {7004317868747716235u, 6741122592586599618u, 12649923272645359593u, 14076631995465446276u, 322592u}, + {12188431477959222465u, 14985315137362870746u, 2589091817884735556u, 12255741772588607227u, 3850468u}, + {9643166116561629597u, 11444835890524846371u, 7016468418770675959u, 16067814486435751834u, 2971358u}, + {12305623516571138979u, 291771258568240256u, 5651461879623923592u, 11439911754637797840u, 2994046u}, + {565156304692772612u, 2107061042941123672u, 15042880322530789166u, 11224157487625655622u, 115443u}, + {648854778624924044u, 15043122893670957610u, 7247015746423966071u, 14701878742437557683u, 1681400u}, + {3743382907451010679u, 4278725973842124059u, 9679008153802175597u, 11055828257990388190u, 3748461u}, + {12894209676789310020u, 3072486985524410055u, 10154031793956020786u, 10229267671140948613u, 681440u}, + {15533283755899404347u, 1802358206727650941u, 18338934910476631213u, 2534586150838334067u, 934412u}, + {11741165439337297429u, 8621221557346667435u, 7064067379910651051u, 9745012056678260600u, 1823655u}, + {16318069712193218035u, 6872746447523625019u, 563309706582461854u, 18048039016290736849u, 2028034u}, + {12863831296075506756u, 10572148938951416749u, 1710747227483110265u, 10557819371756299149u, 419377u}, + {9739728236975264603u, 945726966320071356u, 7090234475579389989u, 7285553148577940998u, 875356u}, + {17257070097606713210u, 3140024939463839406u, 15537993111623726825u, 16877624480266076270u, 3630171u}, + {10755797354635963212u, 17172408334805606229u, 17810010556038147092u, 3237498989927255940u, 2360550u}, + {13809386488627086506u, 4855310930202681274u, 18343529762273698066u, 14815351242735920951u, 705174u}, + {1744960361622463932u, 909022828283730873u, 1608226550488125842u, 9164322621937633174u, 1966311u}, + {3056248166608605336u, 17548274043178913377u, 1572432748253357721u, 17113921831939563356u, 1609636u}, + {8437775108254453556u, 12040762332267337811u, 14103183916936182522u, 3200226698126580563u, 3686887u}, + {6908634809296509388u, 14709430083961432196u, 13935407527042844272u, 212126252193769357u, 1178796u}, + {17123794434878404527u, 460470591756419704u, 14766686768765767805u, 15153839696304105336u, 431886u}, + {15817597099303857142u, 2429008175165276256u, 13158673371133478607u, 17301789474767562459u, 2093932u}, + {5907247799058530331u, 15649246324361502442u, 11104138821883446311u, 7820846401109757351u, 649074u}, + {15175442351942554813u, 13576199910412687873u, 11351405692007757422u, 3182507447452574538u, 3238494u}, + {5919703648757498705u, 18393213369977789336u, 1912573969072122066u, 11372781937139437340u, 2305326u}, + {16897201491876820655u, 15548357758125912757u, 17121237711153727542u, 5230672540832061874u, 1249944u}, + {16060233414218495066u, 14067014625043534118u, 11384802476705895253u, 17460995159483701864u, 680934u}, + {13910538716997618902u, 4960096716024046913u, 5603958677203868203u, 5272765397458821827u, 2583448u}, + {17526408005178472839u, 6592329960926459210u, 2989733823023825435u, 9271028246211277999u, 1192276u}, + {17759787526398456657u, 13308139268961230084u, 10584668242209140807u, 15009973179397265063u, 1562213u}, + {9215712449966325065u, 10412167731179900187u, 2876793194691390501u, 18187331455967435071u, 535218u}, + {15735893713328448570u, 5415459459769155760u, 14097875443358219350u, 14349334261204633398u, 1017653u}, + {4059868951350713373u, 5340761965636875053u, 9874738500792007135u, 14430291206381764207u, 3627698u}, + {15340386402540699872u, 17751743350290867723u, 6641273826448159010u, 2949222992530116639u, 685307u}, + {1596811776039147307u, 136037856213067726u, 4047635338287570417u, 12694778236465461400u, 3168135u}, + {11598924518756578836u, 8196762343479171776u, 14285482539554246449u, 10146504953540651086u, 2527694u}, + {619190801874688813u, 14863720252416673310u, 16659339257807876930u, 8189135860747012912u, 1308766u}, + {13105644243542872761u, 13369573262231290465u, 14338262523883600727u, 6293153160943238847u, 2179426u}, + {5265147644117535889u, 1238361948138663348u, 3384816382660993245u, 10920900019669860010u, 1301521u}, + {2779677962459328608u, 10933274182773433533u, 18422172017864006895u, 10040014406986441652u, 3442078u}, + {3280367032340809724u, 16276707757740468568u, 18331261940207079727u, 9430982366918392112u, 696511u}, + {15205620300283059188u, 2356806490978881667u, 7821491226525070408u, 17090498156581426712u, 679725u}, + {13837036797384338615u, 2622510888386242831u, 10212344643340134513u, 1093402640774919421u, 1554630u}, + {3972714706084701288u, 6572761763155946733u, 68280651847924622u, 6730034108360011769u, 2069287u}, + {4978530906217486424u, 5534856984624270772u, 5438645457199419396u, 2199899435571926405u, 1314488u}, + {7661811547890802921u, 15506598780796743785u, 12111007152655513723u, 14796054803699088636u, 3423837u}, + {13401303554850801783u, 15927401618486578698u, 14302853256216020189u, 423446629874791973u, 2545637u}, + {4807803735146467127u, 15277889140634409757u, 13316545273478702085u, 10423252256128635175u, 3060539u}, + {14250199471371374661u, 16523295978549457411u, 9627654564192810282u, 8415137898483499789u, 400390u}, + {4165004525952904161u, 18415147510859217894u, 15772520129927110619u, 17949726815718866529u, 155705u}, + {9678196844469058557u, 11660702773711488227u, 8360724989436224387u, 16359946114845365233u, 3870299u}, + {3090434160274586276u, 12018722636175844286u, 13931320866511783878u, 2593410222829157878u, 2402799u}, + {2171871799474869565u, 8929701174492127542u, 13697280481425080507u, 8186831947092832227u, 557232u}, + {2241892540007104279u, 2137223747089089771u, 17688935958212196253u, 14637970713979884275u, 3304327u}, + {15084640703991326090u, 16366039243067849166u, 10007851334870344270u, 18219467786700659047u, 2397721u}, + {5047802739417560963u, 12446128886468827828u, 9424924548366143192u, 2566245955194104486u, 3398026u}, + {10403244460962044063u, 10722694335543356883u, 620078124984122418u, 13537452603636580960u, 3770745u}, + {933214355178528953u, 6891860357091721203u, 15584821751404672510u, 15489883105636250830u, 3073362u}, + {11650635113609934758u, 16774525737924885237u, 11250739729596126999u, 13531463622842271272u, 3732608u}, + {13436062758697716256u, 18086291003488233899u, 16243571963912050015u, 14912718849848099300u, 356521u}, + {2989917560426903664u, 5017945893925917183u, 16598144879526069679u, 5843241783628784668u, 695298u}, + {15703493034154850981u, 13105066071642125573u, 8269421483856706330u, 3543648097962672751u, 3511534u}, + {8043384986984385222u, 12079950904528967664u, 10828454514208870315u, 17286541347612554398u, 1369494u}, + {4471948545911513475u, 3272466190473848422u, 5411476014929933482u, 5285467087383761464u, 376135u}, + {17039697976712453411u, 1580182522250867923u, 10714710577673602518u, 5050970054022587349u, 855291u}, + {5003492868897572723u, 39147644959920785u, 2467945720384254954u, 17958118254680573234u, 3407806u}, + {14507650864935980793u, 18157621502373118480u, 17245634695429221109u, 9070062197833962106u, 2792923u}, + {8218060802537593171u, 16023031792918488728u, 15900644673286931129u, 5455839897713234499u, 2727299u}, + {2104988227129338622u, 17986845675346528037u, 2324283921570176810u, 1995864831145378156u, 2555928u}, + {12107624164032690752u, 4821758922984699407u, 18228294117151128580u, 5955871262792783889u, 2565038u}, + {12898832660579351775u, 5654268918474910478u, 12004869838920354557u, 12801510750194455735u, 2437861u}, + {11847978596590282657u, 12514417523279565472u, 7500245285778954902u, 15177065358720654951u, 3200970u}, + {13112220186992544684u, 12243436796605048503u, 2894708669451354261u, 9642707496599102910u, 3330793u}, + {18141040345940887940u, 13508945992699696966u, 2855821581726120529u, 15697940201906572867u, 1910218u}, + {13756797946157932023u, 16210648383368196134u, 3235285071468702716u, 5295441683037672842u, 1322912u}, + {4765463514125386344u, 10012805261853283617u, 7103815947768428711u, 5356665383198148197u, 707690u}, + {16171258230347382408u, 13328910822717536404u, 14411984355169591355u, 17595107526924605279u, 548170u}, + {4749900625754156385u, 9592449691010264101u, 15383625322747173432u, 14637803558993363899u, 770552u}, + {5308894532054452242u, 7978732002140321325u, 7566410439736173280u, 17740382323507560857u, 2060285u}, + {18204260834959538923u, 10671315131316290848u, 1083403426051724852u, 542408726119780559u, 3555220u}, + {3841584351550250270u, 18228307259579940271u, 3984793326202627750u, 10658048557583548990u, 41236u}, + {8631105509328027896u, 735936673078229005u, 12063919125282139127u, 17150468061623520812u, 2001937u}, + {999999130118288799u, 18150887648273008353u, 4740831759538323894u, 3063348186234131252u, 1257209u}, + {2021970363754745967u, 1981428071440203411u, 16818468352021138669u, 15515574133888018737u, 3628861u}, + {11023498352519687936u, 9042580609917884981u, 1379966131966612818u, 5255087456392451243u, 1739227u}, + {9789872831207235577u, 13732789647221491894u, 13298111613670397743u, 3562905188468641962u, 1974291u}, + {11078524020182030090u, 1781697808685166684u, 15461068793091685531u, 13799419705611169068u, 3157495u}, + {4741427662173485904u, 14232809316878613118u, 5366729494208533469u, 10290423869364204158u, 757016u}, + {2039497965652923325u, 8023007236270356037u, 5355864831470125161u, 1887461935688253515u, 3009238u}, + {6522165516418729189u, 6668238426533148978u, 6900597190886802385u, 199625833206199391u, 1680889u}, + {11367270680539169502u, 3230626719000185688u, 13142678246821307698u, 2985368284953984783u, 2192587u}, + {492558625943501772u, 12729059499912750294u, 11124408178042619537u, 2778634667674972457u, 26089u}, + {11493856733348911540u, 9797723103107780855u, 3082124087983032193u, 2522497051212251436u, 3306269u}, + {15435323869622119021u, 2168791697983939002u, 13357880265209739438u, 5105021483259292176u, 408616u}, + {13496578800602479167u, 3670915907895047751u, 7423258188121964063u, 17445475397060004897u, 3739775u}, + {11949099682150128712u, 13910505518915712791u, 8388311865488266195u, 9436473914694364215u, 2102636u}, + {5039185764063100219u, 7324937393249854807u, 8596625302574035284u, 17260551772673418975u, 2329714u}, + {2081587698989479700u, 9488128348201819182u, 127961364440389646u, 12869227393934662555u, 1568988u}, + {13939954471414720796u, 5741642332274774816u, 16704396762662708716u, 28942732959948795u, 2090294u}, + {4458334854681685311u, 4232042807760050809u, 8219203230041567974u, 7964894462657826326u, 256512u}, + {10130328368236673294u, 2936947854742435251u, 2987445008974636328u, 725307759560009207u, 3428406u}, + {14568140289531192084u, 9986771653816261977u, 10655084776998494580u, 3594065036646546892u, 5u}, + {1303492864762456670u, 16194937712193557066u, 3584294101388385139u, 95827785405u, 0u}, + {7968834245744663050u, 3824925371669121156u, 15269945517571305138u, 95u, 0u}, + {10075841910182007529u, 18053988140674653715u, 1767710632519u, 0u, 0u}, + {16846570551553151647u, 13108856226502528479u, 1767u, 0u, 0u}, + {5169403991708033428u, 32608505634471u, 0u, 0u, 0u}, + {9327309686551918131u, 32608u, 0u, 0u, 0u}, + {601520758065208u, 0u, 0u, 0u, 0u}, + {601521u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3032906u}, + {6813411472018392636u, 2475020607870878274u, 6520483079085988543u, 13818947702025853917u, 1032894u}, + {16585245098858652246u, 12486639416749945338u, 11671450904825323255u, 17601106490346634239u, 366888u}, + {15986041586919514763u, 15373007522506953865u, 5901579165798765411u, 8293391221002534280u, 107906u}, + {14096549836544842827u, 16482775085849014296u, 16218568798923525756u, 3604870224555805723u, 1478608u}, + {3680631783032940564u, 8573260314136600586u, 4641869538083308030u, 14582909502627652829u, 3535892u}, + {17530850727238022187u, 17133491705435138405u, 9412530507698429274u, 5325430074147925844u, 740504u}, + {7385221098248665799u, 236247505378978080u, 17667928229927239557u, 15289869829139710723u, 993856u}, + {4627584462873000022u, 14189830652144196552u, 4991357273108543525u, 6791747262133216493u, 345723u}, + {12303435377220277972u, 6709982898029943045u, 8237483240729299849u, 17804603197861342541u, 1169819u}, + {15020898690882440372u, 18126555992985462057u, 15185729494700143638u, 12127255167882059279u, 3408401u}, + {10120263540084716019u, 4007192837192860278u, 5895308161771698292u, 15122911067001769501u, 3653953u}, + {14487731430165917311u, 11437857107328758273u, 4753865208161272046u, 13326000853950014528u, 3231446u}, + {9582068860728580954u, 10400175999049389436u, 12568343461178903179u, 16344625923247726825u, 2697372u}, + {15849317301214543269u, 4716758885985598319u, 16773255039635850859u, 15253910089303010499u, 1913144u}, + {5239207946025223018u, 74615368947715167u, 13278910929666196443u, 12933600625787163619u, 3089108u}, + {10646964227361105394u, 13622477684417629839u, 6651197661655153114u, 15549366715780155631u, 2290247u}, + {8068534129099819448u, 6367307712493831614u, 4428044684881342984u, 5230394386554759187u, 3221917u}, + {9265461279900018221u, 1064752124833879208u, 17869860139078377842u, 3374083209300813499u, 966040u}, + {3188856633739919508u, 7441351369605628757u, 10033813872956417633u, 2539836087346527344u, 3265692u}, + {11770693646740491250u, 16343318836418246503u, 7055614280260961127u, 10868880492776587180u, 3173273u}, + {16492134886402724353u, 8604658941360119059u, 14051739937694508036u, 1427630852496523806u, 2082764u}, + {14612612591949613128u, 14558593157163430204u, 1078589072141489115u, 17620473161155982837u, 660722u}, + {2039133135819818427u, 7613615804569716447u, 9570347712348027251u, 1525397662054829339u, 3142006u}, + {18443442532834604438u, 8185001334124651020u, 9031729467879397568u, 3156436325716358763u, 648371u}, + {2010736664545437653u, 15343019476468169482u, 7511076989564967895u, 3038379286651224773u, 3386555u}, + {4125624828739999898u, 17962058526400255164u, 4134794397124731987u, 14185759347848796193u, 1781766u}, + {9581930628913130047u, 10618705377689535132u, 14636201058428623547u, 11490025247617538344u, 1288352u}, + {4753603102061351175u, 2242164176760423230u, 15884771284295558571u, 2617839296476282791u, 3458862u}, + {2259025435762639244u, 13571673582518751466u, 11029378081588543038u, 4026972416804154943u, 344321u}, + {6339989106174883648u, 4525397734138958464u, 6015993840895279070u, 13697294472599484003u, 365464u}, + {789478151396412089u, 11467114123563212436u, 3159444459209798832u, 17877024955979576788u, 3234369u}, + {15826031746016780108u, 8301394629932825981u, 13471050154735552370u, 5247810365790776236u, 2454435u}, + {121919657157286591u, 17870414412270910538u, 2054841791635616684u, 4729019952003681509u, 2341839u}, + {10970181486415721554u, 15565230072070132241u, 12000406374763851173u, 13517969394516375886u, 1562350u}, + {13026969388481582198u, 5660651816262534385u, 8921463153718397774u, 8099270816369458344u, 1792112u}, + {1580929975628493760u, 13228469163881005915u, 6181713060312353471u, 16894535644389831612u, 2518401u}, + {10208638815342373530u, 1362113480142541968u, 16401325341321406754u, 1847896166564708252u, 2596778u}, + {11985595473654122725u, 13001832535679848322u, 10902053434079780910u, 15252054443032930004u, 2596073u}, + {11301990167482935380u, 12028746653586860039u, 15224724567724218443u, 12802083254192966491u, 2661748u}, + {14697204116206183479u, 10214017306066273553u, 14531445883740212653u, 14965022562797874257u, 2060165u}, + {2238453987203376767u, 9474472908982662641u, 3741938596612862546u, 1118867262038555441u, 2161181u}, + {17805890333322536425u, 1525448677602936967u, 9399980006213533008u, 3210400891591660128u, 3633583u}, + {6620363638315021824u, 4531012947882258894u, 5186860230412114599u, 16063813655301984457u, 59869u}, + {4313049729883595798u, 17247823311442913607u, 8258289323565539809u, 6270115085484493004u, 162570u}, + {11388125036100031616u, 11636873821952068240u, 5362581478346363375u, 17873282214860306175u, 3231866u}, + {14097314984444359675u, 10290499056130502714u, 11128950791671138188u, 5896282539927968424u, 3854398u}, + {10064478537493642447u, 4001003983613561934u, 4751431036387180185u, 10015049076594555656u, 328134u}, + {10826432734406704729u, 3722984335185755197u, 11151429421539143921u, 17876336335341059814u, 3088545u}, + {9523814850939246737u, 6767646745454726133u, 8059355454028320464u, 6686272268540841714u, 2592252u}, + {2821490998595688445u, 16241790003951436689u, 2518366959622077169u, 8694729900456186321u, 1966211u}, + {18272278921599314261u, 12909679387122346977u, 11965172429963804444u, 4936186594385742079u, 3468415u}, + {1213156506406493014u, 11337670487983686814u, 15752610376918433029u, 17862206696150802100u, 2988008u}, + {9529965151820841937u, 11913760994114797978u, 1029753126688132740u, 3441825956511016418u, 2305340u}, + {5084938464653480468u, 8864384906077486972u, 4306315998623294646u, 4438039256738315630u, 180281u}, + {9595921821169565724u, 17291089914193498360u, 7622189601155226529u, 16288341854478105224u, 3083134u}, + {15216007741973496120u, 5933425076984934379u, 3507644113593435740u, 8487612302568862791u, 1111396u}, + {13410538186955737715u, 6808851369029820416u, 7317430959961543216u, 4920418040643256451u, 1303064u}, + {2082148064105559198u, 17777481743276866664u, 14945697323946490141u, 7662142261060443519u, 1717154u}, + {842207648564435736u, 16679233687401746338u, 8412902969280950502u, 15524058626189795152u, 2026644u}, + {9686752514834624465u, 4234446392556958371u, 13190378595475918657u, 5874050115792740462u, 2819860u}, + {14644968174249517310u, 2083032336500128817u, 233060272994809434u, 2357860250831434684u, 2616449u}, + {7445850599405654788u, 13305609238161990974u, 8256140402054361205u, 1633532036277188125u, 6876u}, + {7752818820500185719u, 5646412993613346033u, 2842638492308067215u, 18374813321117406543u, 2743274u}, + {9692538877979532775u, 2516830361874538777u, 11386019006752213106u, 15254756833779669313u, 1847371u}, + {1377311712155452835u, 5583000990352361340u, 15828613359999692541u, 3709015291235274457u, 3266814u}, + {13013630667376221563u, 1973547738931236548u, 7160027745900136210u, 13823262546747662462u, 68040u}, + {2653756363089997721u, 2623884100525319166u, 11798816099433658121u, 9296684761182741488u, 3800745u}, + {6592621915238573460u, 7464243466965585033u, 17330631361600153368u, 7275870783393909570u, 3795695u}, + {14879962092460600079u, 17229266498580546749u, 16878820466516429368u, 8572814317998226207u, 299416u}, + {14847813188963255544u, 11587130018269696997u, 1934739969660131786u, 1662847921768730665u, 747462u}, + {5695088492529823673u, 2784740751479316863u, 11782475138204395107u, 3688725537815995746u, 3834349u}, + {10448063464220809713u, 4720942157204222629u, 6368807209586092770u, 11167600740221911827u, 3334753u}, + {18269724497893535722u, 9241552599132443887u, 11105358218663828646u, 6906986779910789808u, 2120204u}, + {10009702429325441417u, 14174762198445219040u, 1572390736067489479u, 16324127120050755602u, 2219025u}, + {4137420533449922941u, 16856500290412997196u, 15226864934109428264u, 10777515314243552921u, 2558460u}, + {16392421612421568691u, 1258369751416537598u, 12378213194078827810u, 14026368510978357837u, 1297267u}, + {5157976436214406232u, 13269354596830669995u, 16133362058591842427u, 4203270820570457767u, 2420666u}, + {5411712367391271845u, 6987508516994740639u, 784983187721112013u, 13231193119334013314u, 363619u}, + {17560552440344736953u, 13221642966010130469u, 14445121729416633033u, 1519917074661017968u, 1405875u}, + {5743711161141809509u, 1785152698871585065u, 9945782852418700639u, 6943462845485625346u, 671849u}, + {8671743725318024995u, 9999277493682029696u, 540182104081763976u, 5921116144612731286u, 815344u}, + {4074951297389133494u, 15462116527962749966u, 4898112119081432220u, 17092690235010071617u, 2994679u}, + {15918474323707203552u, 16866926483684532532u, 6159789931060881951u, 3946352172236711225u, 2126082u}, + {8440536875405675139u, 15380285431507106004u, 2869570662772356394u, 8758188173069352979u, 3853541u}, + {15366707235936660638u, 8090486552490850187u, 5777985750342102289u, 10735609210976069480u, 3405036u}, + {9765823409473179696u, 16005767327498816419u, 14248406356583871738u, 5467131391233972087u, 2664026u}, + {11129898294636982138u, 5642788672271622038u, 3455778055543645929u, 14748891795032138497u, 2256752u}, + {6391588864077570929u, 14122052376096517072u, 1118790032458618385u, 15101666895257662597u, 3293922u}, + {16345781235894651266u, 2920037863467283789u, 17261366427914262328u, 8491500653671996920u, 1558407u}, + {4188112432308228554u, 10289513419431064381u, 16182085872871998395u, 7450679729489755542u, 2845422u}, + {9411011676124619220u, 16982233072773223836u, 4944788005040019562u, 5961211489976473261u, 1593464u}, + {5481003378346292284u, 12228031629949004027u, 17205482684651743867u, 16170295293055738670u, 2637620u}, + {13611744341104265505u, 17054186592219606113u, 10867578130417141735u, 11505812969304534904u, 69312u}, + {10190122539074320459u, 17546263899175620937u, 13763910745144875177u, 4540907016620509893u, 1256661u}, + {9381856012822321022u, 15560210140834459074u, 8556043909833510899u, 11264165978312076951u, 2654734u}, + {11874578281518761119u, 14819125809384250477u, 2062845810527448940u, 3003332565500986607u, 2073827u}, + {12807211039839611965u, 14348208932660955174u, 14759996971367899024u, 7748417920983770575u, 3744169u}, + {10532880253971531397u, 2792805486281980856u, 2735609345998128396u, 16498199175707704347u, 1240978u}, + {3879724979499624148u, 10670465911820187040u, 12046181269887254179u, 9030091274806295107u, 577008u}, + {12241836090200103888u, 3464312179856990176u, 14114342418240350173u, 16655948150695927491u, 2146117u}, + {6629418051058851251u, 14084863516504513239u, 8880309890203181483u, 18342217773340881216u, 2255926u}, + {16865340848071490205u, 1422516901746440478u, 5160617449051327506u, 5734164436909752011u, 466686u}, + {4217125785501567802u, 2715030495460155351u, 13193417342821639385u, 13843666898221111364u, 1142131u}, + {18099186593203930231u, 10740733784223564610u, 2173857675364363875u, 17170775993126165630u, 737945u}, + {8860572745026127903u, 15078735245629386252u, 3568241330385846364u, 2103282926826159732u, 3472851u}, + {8983320211652564763u, 4127538912866574729u, 15962649220849151764u, 6549246259119923456u, 802384u}, + {10696922920890746732u, 7953641399469137468u, 18147464113820337071u, 5202948149576897015u, 2086609u}, + {11741494801116372678u, 316472625983363572u, 6729504316477532230u, 14594125143069290235u, 3696683u}, + {439094870690751268u, 17055904544030375754u, 8592123778852408540u, 7994527123988830949u, 579778u}, + {17829612420126854096u, 14161729470891030744u, 7482962269589133331u, 3685632320314419036u, 3174367u}, + {18065945887590241507u, 14370822703329799006u, 10128113046425256706u, 5102588321985617008u, 2725059u}, + {13629200046437557520u, 13850138983909518774u, 50956410513612773u, 1923765916047473535u, 317268u}, + {5003034260982658300u, 16644820765896064346u, 1283499051533077513u, 1374946850243174382u, 1147330u}, + {8071616851091767454u, 5548620239576932987u, 1821794211003557455u, 7515154284197541374u, 1356599u}, + {4095389606693146076u, 832242997583451117u, 3878526780973974374u, 12202758234488625772u, 1487865u}, + {16140727171134864411u, 992496923738368980u, 9292835321578192161u, 18330075162707683840u, 2155737u}, + {14303726160175308145u, 13407106008423360644u, 7004317868747716234u, 6741122592586599618u, 3761811u}, + {3544232941997270016u, 17526357405256045944u, 12188431477959222464u, 14985315137362870746u, 3238296u}, + {14541183926702976374u, 4939428895189485143u, 9643166116561629596u, 11444835890524846371u, 191951u}, + {4645601312732034601u, 3940331308838487751u, 12305623516571138978u, 291771258568240256u, 942758u}, + {6776524020601886949u, 18225905597451023907u, 565156304692772611u, 2107061042941123672u, 2989326u}, + {13782444461525838161u, 9133817152439773674u, 648854778624924043u, 15043122893670957610u, 1481449u}, + {11350717465111417033u, 2973643690928878901u, 3743382907451010678u, 4278725973842124059u, 2497353u}, + {13252486664334344737u, 10537075181314278189u, 12894209676789310019u, 3072486985524410055u, 49784u}, + {16663376271375180170u, 7384866286579376522u, 15533283755899404346u, 1802358206727650941u, 2513607u}, + {7811377576057844594u, 12233083667044592223u, 11741165439337297428u, 8621221557346667435u, 1478581u}, + {4723322161151249461u, 16951567668537261168u, 16318069712193218034u, 6872746447523625019u, 2804842u}, + {4917241728910402410u, 6629182269485832673u, 12863831296075506755u, 10572148938951416749u, 486711u}, + {6146461641977922347u, 14460114086699066595u, 9739728236975264602u, 945726966320071356u, 2252343u}, + {6864643897181928922u, 10253019609980822492u, 17257070097606713209u, 3140024939463839406u, 1230621u}, + {11129691559074968562u, 15655520770821257296u, 10755797354635963211u, 17172408334805606229u, 1488182u}, + {9522407936518747808u, 13716856260194021356u, 13809386488627086505u, 4855310930202681274u, 2403226u}, + {1494940308603638570u, 16072322447873367241u, 1744960361622463931u, 909022828283730873u, 2075092u}, + {9407788879667817448u, 9506689157241521534u, 3056248166608605335u, 17548274043178913377u, 387283u}, + {5496048284555169966u, 11442268448759297422u, 8437775108254453555u, 12040762332267337811u, 524802u}, + {6926783949106350960u, 18002875633111401261u, 6908634809296509387u, 14709430083961432196u, 1524660u}, + {7062767426443625778u, 16993935399779042210u, 17123794434878404526u, 460470591756419704u, 2770547u}, + {8512422758294058089u, 3147616325653957458u, 15817597099303857141u, 2429008175165276256u, 691093u}, + {17865143661191245784u, 7283664526615983420u, 5907247799058530330u, 15649246324361502442u, 1592271u}, + {964747540554676514u, 14588297246848055480u, 15175442351942554812u, 13576199910412687873u, 1004344u}, + {8893636192354059935u, 12910367873297917282u, 5919703648757498704u, 18393213369977789336u, 3034412u}, + {12075853214375980241u, 5247905970298653190u, 16897201491876820654u, 15548357758125912757u, 855640u}, + {5253774505943284047u, 9802559333860663980u, 16060233414218495065u, 14067014625043534118u, 3262381u}, + {13098298865367769764u, 8385271696870267417u, 13910538716997618901u, 4960096716024046913u, 1902173u}, + {14276299925425714026u, 1226232507949622951u, 17526408005178472838u, 6592329960926459210u, 2685675u}, + {11534817687008092677u, 1736742472128424935u, 17759787526398456656u, 13308139268961230084u, 1944743u}, + {7244572527003572828u, 12913610133971733993u, 9215712449966325064u, 10412167731179900187u, 603895u}, + {8660923604615011286u, 7897021193356293476u, 15735893713328448569u, 5415459459769155760u, 460786u}, + {11119951827574282216u, 16161582547277397952u, 4059868951350713372u, 5340761965636875053u, 1386435u}, + {14295858323659190498u, 11934091210922577555u, 15340386402540699871u, 17751743350290867723u, 3468376u}, + {15698745074897147790u, 11335629299436110454u, 1596811776039147306u, 136037856213067726u, 2941127u}, + {9182785489349056981u, 14662273417002078424u, 11598924518756578835u, 8196762343479171776u, 1076389u}, + {450177745758502950u, 2211418475947505496u, 619190801874688812u, 14863720252416673310u, 2109768u}, + {6534448740539490317u, 5097941825486908686u, 13105644243542872760u, 13369573262231290465u, 725485u}, + {1700982504819063370u, 11753718567371323364u, 5265147644117535888u, 1238361948138663348u, 2850231u}, + {15250145352448339994u, 16184298738783432732u, 2779677962459328607u, 10933274182773433533u, 3455845u}, + {16224701170084979653u, 7143100534278439787u, 3280367032340809723u, 16276707757740468568u, 2762735u}, + {13149719525932299203u, 725100398888082709u, 15205620300283059187u, 2356806490978881667u, 1541600u}, + {3427952063346971926u, 13950399256360440802u, 13837036797384338614u, 2622510888386242831u, 841379u}, + {246015854317206890u, 5080995809569552482u, 3972714706084701287u, 6572761763155946733u, 3170198u}, + {3097741994527901988u, 16900170955665378210u, 4978530906217486423u, 5534856984624270772u, 770654u}, + {14034389774811131938u, 10017803204935392981u, 7661811547890802920u, 15506598780796743785u, 144921u}, + {2510857867933770618u, 884050184721557368u, 13401303554850801782u, 15927401618486578698u, 91029u}, + {13999443487487761341u, 15652172548275701071u, 4807803735146467126u, 15277889140634409757u, 1198419u}, + {4718018654631147581u, 11748224067629247107u, 14250199471371374660u, 16523295978549457411u, 2193396u}, + {17266759337143439938u, 3769507529548960760u, 4165004525952904160u, 18415147510859217894u, 3221713u}, + {3445627350253814682u, 17916676738947062590u, 9678196844469058556u, 11660702773711488227u, 3098759u}, + {5406992710867431949u, 15957660202582387982u, 3090434160274586275u, 12018722636175844286u, 3611320u}, + {15292009909788240701u, 17810965452164789758u, 2171871799474869564u, 8929701174492127542u, 2577881u}, + {7500071871225058031u, 16518730467264522830u, 2241892540007104278u, 2137223747089089771u, 486015u}, + {12538290581882544453u, 5165310714210469414u, 15084640703991326089u, 16366039243067849166u, 2830998u}, + {3397431721751405718u, 8603403407886966118u, 5047802739417560962u, 12446128886468827828u, 3153424u}, + {7532436155298969187u, 15553489484963456203u, 10403244460962044062u, 10722694335543356883u, 2514748u}, + {5017555919202344116u, 10735453102976274988u, 933214355178528952u, 6891860357091721203u, 3098862u}, + {17990875964326508448u, 5120928174227240195u, 11650635113609934757u, 16774525737924885237u, 3897299u}, + {6177823518053592403u, 16179364246557669108u, 13436062758697716255u, 18086291003488233899u, 2492141u}, + {4148386233526148820u, 18175841386081682080u, 2989917560426903663u, 5017945893925917183u, 3395805u}, + {7236680135505436964u, 3874987106947949644u, 15703493034154850980u, 13105066071642125573u, 2511700u}, + {8415050697537691244u, 15974182125550780752u, 8043384986984385221u, 12079950904528967664u, 1619497u}, + {13793368126942725644u, 17260394815865803991u, 4471948545911513474u, 3272466190473848422u, 3630616u}, + {11227137506143987553u, 5242570622860241119u, 17039697976712453410u, 1580182522250867923u, 2122198u}, + {15510815177228696173u, 12823572649564942097u, 5003492868897572722u, 39147644959920785u, 3857884u}, + {10631704832680523052u, 14960869979367442748u, 14507650864935980792u, 18157621502373118480u, 1422793u}, + {6717345488093724699u, 4824950317363939906u, 8218060802537593170u, 16023031792918488728u, 2412607u}, + {18427383595332240424u, 1918524291888035034u, 2104988227129338621u, 17986845675346528037u, 3575574u}, + {12764976211264735206u, 12554340405790000826u, 12107624164032690751u, 4821758922984699407u, 1831032u}, + {7030048755912928662u, 5579864408261298180u, 12898832660579351774u, 5654268918474910478u, 2626683u}, + {17463623010656842448u, 12386336927607704159u, 11847978596590282656u, 12514417523279565472u, 3561788u}, + {18087798767250939897u, 6846116823777653649u, 13112220186992544683u, 12243436796605048503u, 1852679u}, + {5726056225637966193u, 5288057202725470572u, 18141040345940887939u, 13508945992699696966u, 3781009u}, + {16562677683112914061u, 5635924867891757547u, 13756797946157932022u, 16210648383368196134u, 3732760u}, + {16074292895027654171u, 684062940411049457u, 4765463514125386343u, 10012805261853283617u, 3811703u}, + {7688012373484914198u, 7111791376570730831u, 16171258230347382407u, 13328910822717536404u, 476489u}, + {9088653830812264766u, 12043312067690211426u, 4749900625754156384u, 9592449691010264101u, 2840428u}, + {812182738792391857u, 9869686341364024335u, 5308894532054452241u, 7978732002140321325u, 368152u}, + {6238378627645665522u, 10171769943440305120u, 18204260834959538922u, 10671315131316290848u, 3783516u}, + {2141299829202014456u, 11420537649949970219u, 3841584351550250269u, 18228307259579940271u, 832706u}, + {11010420201386567688u, 5726941884047172018u, 8631105509328027895u, 735936673078229005u, 3492841u}, + {17121514384519191272u, 13171648045558673998u, 999999130118288798u, 18150887648273008353u, 1944680u}, + {4264090605873595498u, 11532744400996764359u, 2021970363754745966u, 1981428071440203411u, 1918027u}, + {14912311444237858409u, 13149308730696564995u, 11023498352519687935u, 9042580609917884981u, 2268518u}, + {11286980146990594257u, 11180745715041979709u, 9789872831207235576u, 13732789647221491894u, 2836031u}, + {16793251087569459815u, 546160436816599072u, 11078524020182030089u, 1781697808685166684u, 2030889u}, + {7495822370081015034u, 4413490824891447429u, 4741427662173485903u, 14232809316878613118u, 1334343u}, + {7359952295459612329u, 8633408253856143679u, 2039497965652923324u, 8023007236270356037u, 2110929u}, + {11430257845333144567u, 8157735737684671519u, 6522165516418729188u, 6668238426533148978u, 3257625u}, + {7813363713312398401u, 3167852653321034206u, 11367270680539169501u, 3230626719000185688u, 2543698u}, + {1602449443989187657u, 12983659598434164015u, 492558625943501771u, 12729059499912750294u, 3791883u}, + {17116128460797275463u, 296780879288649414u, 11493856733348911539u, 9797723103107780855u, 382933u}, + {5578761869376544690u, 13014245588509387837u, 15435323869622119020u, 2168791697983939002u, 3688250u}, + {461225220479062875u, 8102515635041788196u, 13496578800602479166u, 3670915907895047751u, 183765u}, + {2416326979399303329u, 1842951895405355946u, 11949099682150128711u, 13910505518915712791u, 2554401u}, + {2423753013329182047u, 16739808241106236525u, 5039185764063100218u, 7324937393249854807u, 2633718u}, + {1246725654062374863u, 8758361695937566360u, 2081587698989479699u, 9488128348201819182u, 2661304u}, + {5964483899277707113u, 17304455926781195101u, 13939954471414720795u, 5741642332274774816u, 2857000u}, + {16189119328389260214u, 5043624867699330224u, 4458334854681685310u, 4232042807760050809u, 2962262u}, + {16039256569359785570u, 992732308404131384u, 10130328368236673293u, 2936947854742435251u, 2321476u}, + {17201825425819414703u, 15073165979378091125u, 14568140289531192083u, 9986771653816261977u, 2929332u}, + {15429248513956387768u, 14604735683237217651u, 1303492864762456669u, 16194937712193557066u, 318369u}, + {3380909584718096437u, 8190549715904773111u, 7968834245744663049u, 3824925371669121156u, 2146158u}, + {5851805267204825442u, 8231623303632085126u, 10075841910182007528u, 18053988140674653715u, 3601269u}, + {3081979404896659179u, 47936307677375303u, 16846570551553151646u, 13108856226502528479u, 1767u}, + {9372382901656053232u, 6332148573649681306u, 5169403991708033427u, 32608505634471u, 0u}, + {2402672081157802693u, 13122802764957152577u, 9327309686551918130u, 32608u, 0u}, + {15449293985646324234u, 11271194141045823817u, 601520758065207u, 0u, 0u}, + {13024292844182575736u, 13983834875983848644u, 601520u, 0u, 0u}, + {8705110111045412146u, 11096099479052645u, 0u, 0u, 0u}, + {8836961548853745775u, 11096099u, 0u, 0u, 0u}, + {204686907306506031u, 0u, 0u, 0u, 0u}, + {204686908u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1358636u}, + {8540286447474164498u, 13645684075769366634u, 6813411472018392635u, 2475020607870878274u, 1120829u}, + {10683109426636252971u, 6500640797128554718u, 16585245098858652245u, 12486639416749945338u, 1341157u}, + {7153378740980472185u, 9590702888198678223u, 15986041586919514762u, 15373007522506953865u, 2908027u}, + {12940893593296405564u, 13345627464689214437u, 14096549836544842826u, 16482775085849014296u, 3819872u}, + {12609558605374707121u, 13089787361276572397u, 3680631783032940563u, 8573260314136600586u, 3027196u}, + {6408491820066156112u, 4105229105000233260u, 17530850727238022186u, 17133491705435138405u, 1088252u}, + {2122322040430024146u, 6324458425250549771u, 7385221098248665798u, 236247505378978080u, 3607261u}, + {13244793145342103565u, 10445009403454592217u, 4627584462873000021u, 14189830652144196552u, 467651u}, + {5083980990117162567u, 4092187143614878207u, 12303435377220277971u, 6709982898029943045u, 2173819u}, + {16467826940967297967u, 15625483451669857650u, 15020898690882440371u, 18126555992985462057u, 2386608u}, + {6105299459675223550u, 9962269870922613231u, 10120263540084716018u, 4007192837192860278u, 2859976u}, + {7688484563270719580u, 6067324543097670227u, 14487731430165917310u, 11437857107328758273u, 1294670u}, + {16878457148249750861u, 6865435391550762477u, 9582068860728580953u, 10400175999049389436u, 1789761u}, + {9492126302151689935u, 14008670424100799865u, 15849317301214543268u, 4716758885985598319u, 138657u}, + {13593112211263738096u, 1544571056659287720u, 5239207946025223017u, 74615368947715167u, 194745u}, + {12180714658099661891u, 11396059236212072452u, 10646964227361105393u, 13622477684417629839u, 1422442u}, + {11835157186403732831u, 13895393105345445864u, 8068534129099819447u, 6367307712493831614u, 3032828u}, + {2944876752563775912u, 1089930296262355579u, 9265461279900018220u, 1064752124833879208u, 1052716u}, + {8788609638503779741u, 18010162105114922455u, 3188856633739919507u, 7441351369605628757u, 3160589u}, + {5655618689152378596u, 11858459986344061647u, 11770693646740491249u, 16343318836418246503u, 1615745u}, + {14417162022741491042u, 11980511275936068437u, 16492134886402724352u, 8604658941360119059u, 160416u}, + {14179752250806951709u, 1429611462072604710u, 14612612591949613127u, 14558593157163430204u, 2578689u}, + {16689845007311721602u, 13508255077533334914u, 2039133135819818426u, 7613615804569716447u, 2303561u}, + {6390889590463171460u, 7383154265679819509u, 18443442532834604437u, 8185001334124651020u, 3621752u}, + {7196787153673903823u, 16396271690963158564u, 2010736664545437652u, 15343019476468169482u, 1068893u}, + {7045440898067283591u, 16754417136181986526u, 4125624828739999897u, 17962058526400255164u, 1422421u}, + {2106066216786898156u, 5091299481083613790u, 9581930628913130046u, 10618705377689535132u, 454213u}, + {14092780581001542311u, 13697952376791199918u, 4753603102061351174u, 2242164176760423230u, 1346899u}, + {9703531317559762131u, 18329898684202324803u, 2259025435762639243u, 13571673582518751466u, 3134802u}, + {10909267561607589145u, 10588431319553366122u, 6339989106174883647u, 4525397734138958464u, 539752u}, + {4644798857286167797u, 9827694448400912269u, 789478151396412088u, 11467114123563212436u, 800754u}, + {16226436352460926646u, 16744967157772353059u, 15826031746016780107u, 8301394629932825981u, 7106u}, + {2179174454314539674u, 3555088613518216126u, 121919657157286590u, 17870414412270910538u, 42812u}, + {676487228098108006u, 15780641136912298636u, 10970181486415721553u, 15565230072070132241u, 2177049u}, + {16350365393655819043u, 6143620854253970483u, 13026969388481582197u, 5660651816262534385u, 2273000u}, + {6192081226268580829u, 4674153285492223614u, 1580929975628493759u, 13228469163881005915u, 3527819u}, + {14639413985241460591u, 5401148802020150771u, 10208638815342373529u, 1362113480142541968u, 1705754u}, + {1595876304052708931u, 15652277090491465401u, 11985595473654122724u, 13001832535679848322u, 3642162u}, + {4225879174570192135u, 13597444601290296235u, 11301990167482935379u, 12028746653586860039u, 2921737u}, + {9535967522440964883u, 6567547728131470146u, 14697204116206183478u, 10214017306066273553u, 1893455u}, + {7356366785407406482u, 12134556138141705092u, 2238453987203376766u, 9474472908982662641u, 663488u}, + {3792936365870240507u, 3509920114283104709u, 17805890333322536424u, 1525448677602936967u, 3439204u}, + {6206123502489358018u, 9515681360565986322u, 6620363638315021823u, 4531012947882258894u, 1412625u}, + {8472662497686988008u, 18283057397749261260u, 4313049729883595797u, 17247823311442913607u, 1929943u}, + {4411463812345409917u, 14773291150213663464u, 11388125036100031615u, 11636873821952068240u, 3161571u}, + {2229849068869340948u, 7295038542383090523u, 14097314984444359674u, 10290499056130502714u, 2051110u}, + {15403581957534668973u, 4703212461029700032u, 10064478537493642446u, 4001003983613561934u, 2604635u}, + {8787690062323666451u, 13376220204256350584u, 10826432734406704728u, 3722984335185755197u, 3593615u}, + {12014122845434331730u, 15309073192919137676u, 9523814850939246736u, 6767646745454726133u, 1562950u}, + {16872238847381862022u, 9997819199853203081u, 2821490998595688444u, 16241790003951436689u, 616371u}, + {15175365015709644797u, 1119238571582811777u, 18272278921599314260u, 12909679387122346977u, 1335098u}, + {12810309284488042660u, 7763529547185091667u, 1213156506406493013u, 11337670487983686814u, 1315027u}, + {8724941965577400768u, 13363443973924472361u, 9529965151820841936u, 11913760994114797978u, 70518u}, + {12903073821913632434u, 6635821285983325193u, 5084938464653480467u, 8864384906077486972u, 3758112u}, + {5116637039448202378u, 10078531573262149937u, 9595921821169565723u, 17291089914193498360u, 1339117u}, + {13096695714043418421u, 4081154625233260610u, 15216007741973496119u, 5933425076984934379u, 1921072u}, + {13902005914308369817u, 14113666890507344284u, 13410538186955737714u, 6808851369029820416u, 2781716u}, + {4004517723036228989u, 7689865918815558602u, 2082148064105559197u, 17777481743276866664u, 1839319u}, + {17067509837137049300u, 16423628507879086661u, 842207648564435735u, 16679233687401746338u, 2987298u}, + {6259488618203599915u, 8494796331843423408u, 9686752514834624464u, 4234446392556958371u, 3546409u}, + {18263122828276093923u, 809138840958931543u, 14644968174249517309u, 2083032336500128817u, 2548522u}, + {6451198141179182350u, 6572641562358190394u, 7445850599405654787u, 13305609238161990974u, 1405161u}, + {3376318384054284568u, 10376167870366890163u, 7752818820500185718u, 5646412993613346033u, 3625147u}, + {4391435789826613795u, 15451160306057989439u, 9692538877979532774u, 2516830361874538777u, 1873840u}, + {11572051618379272028u, 14928165011556987792u, 1377311712155452834u, 5583000990352361340u, 1517487u}, + {811489401953035197u, 4908851016212389586u, 13013630667376221562u, 1973547738931236548u, 1616042u}, + {3920030847324871634u, 15968613681738090254u, 2653756363089997720u, 2623884100525319166u, 2293699u}, + {17948936073092295846u, 1650720191060245978u, 6592621915238573459u, 7464243466965585033u, 406658u}, + {8603659922646936409u, 2276528090818517503u, 14879962092460600078u, 17229266498580546749u, 3139576u}, + {12515602877109644906u, 11571257354804782616u, 14847813188963255543u, 11587130018269696997u, 2523598u}, + {7026503992428863153u, 16766086744572185663u, 5695088492529823672u, 2784740751479316863u, 2016537u}, + {18025850162995726514u, 1335030582773693617u, 10448063464220809712u, 4720942157204222629u, 985570u}, + {14737781831697351997u, 15056566326577524459u, 18269724497893535721u, 9241552599132443887u, 2790398u}, + {6518003464038638264u, 12066137080627614595u, 10009702429325441416u, 14174762198445219040u, 3636461u}, + {394135852068260580u, 11638184992892397211u, 4137420533449922940u, 16856500290412997196u, 1810110u}, + {8229538703074877641u, 9478155452373009039u, 16392421612421568690u, 1258369751416537598u, 583154u}, + {10868614109035121357u, 14584720499153630418u, 5157976436214406231u, 13269354596830669995u, 3793595u}, + {1924245444925695402u, 12318596821471828109u, 5411712367391271844u, 6987508516994740639u, 1902951u}, + {12098195516447040954u, 977698182365541906u, 17560552440344736952u, 13221642966010130469u, 3023321u}, + {12096578208334328541u, 15161198767363466660u, 5743711161141809508u, 1785152698871585065u, 2999419u}, + {6946004393120529962u, 9798331460712726990u, 8671743725318024994u, 9999277493682029696u, 2265516u}, + {8325181738788252866u, 11432646830256277634u, 4074951297389133493u, 15462116527962749966u, 295416u}, + {15876145174627303044u, 9663589668314725436u, 15918474323707203551u, 16866926483684532532u, 1735693u}, + {11931305604708057452u, 4410141901409270986u, 8440536875405675138u, 15380285431507106004u, 1086154u}, + {2719378477334093691u, 17947904015144970997u, 15366707235936660637u, 8090486552490850187u, 486885u}, + {7681623072065653445u, 17914876295563632802u, 9765823409473179695u, 16005767327498816419u, 1208686u}, + {10702443827176126051u, 1731588782117523527u, 11129898294636982137u, 5642788672271622038u, 3839243u}, + {8800055703385131002u, 1772056089385007458u, 6391588864077570928u, 14122052376096517072u, 2045569u}, + {11476858804862248214u, 490641778278099873u, 16345781235894651265u, 2920037863467283789u, 3108140u}, + {17353854502348167166u, 4889422577321786199u, 4188112432308228553u, 10289513419431064381u, 2639949u}, + {4488256786701971468u, 9442408551748217085u, 9411011676124619219u, 16982233072773223836u, 2726672u}, + {3485555038321695350u, 2864643356245446457u, 5481003378346292283u, 12228031629949004027u, 2634307u}, + {2794352806758973794u, 2041517900698954288u, 13611744341104265504u, 17054186592219606113u, 1966121u}, + {16584281400035694846u, 2637446995386507980u, 10190122539074320458u, 17546263899175620937u, 3676931u}, + {13213855774829907235u, 4486731207803924106u, 9381856012822321021u, 15560210140834459074u, 2565169u}, + {13763396341585913358u, 8803905421977137123u, 11874578281518761118u, 14819125809384250477u, 474214u}, + {8768329003739757869u, 927456811159135909u, 12807211039839611964u, 14348208932660955174u, 2960788u}, + {17817066779364814290u, 16883575762481040108u, 10532880253971531396u, 2792805486281980856u, 322116u}, + {11353423422034211805u, 4219795804150519583u, 3879724979499624147u, 10670465911820187040u, 300739u}, + {11281134370234747678u, 5514594580518652251u, 12241836090200103887u, 3464312179856990176u, 1823231u}, + {14239537518024518207u, 7713739188334591203u, 6629418051058851250u, 14084863516504513239u, 2896045u}, + {12526695205104949234u, 567919806830570711u, 16865340848071490204u, 1422516901746440478u, 2650848u}, + {8669824938675949919u, 5274243997783718737u, 4217125785501567801u, 2715030495460155351u, 225095u}, + {6918660356678203328u, 17936753162130700480u, 18099186593203930230u, 10740733784223564610u, 1013625u}, + {1306625686105758904u, 15623063898327995556u, 8860572745026127902u, 15078735245629386252u, 1098082u}, + {8115710948304974211u, 7248436441445730462u, 8983320211652564762u, 4127538912866574729u, 1480264u}, + {6693692959645955985u, 14056072377093969770u, 10696922920890746731u, 7953641399469137468u, 1531015u}, + {11799273799581280217u, 12886948163190871871u, 11741494801116372677u, 316472625983363572u, 2727438u}, + {7784326472474059266u, 15894355860278867758u, 439094870690751267u, 17055904544030375754u, 2083892u}, + {7158707043213892088u, 13579321321115997950u, 17829612420126854095u, 14161729470891030744u, 1700109u}, + {1726142978916145963u, 11953215372196644717u, 18065945887590241506u, 14370822703329799006u, 817538u}, + {14753727992631698592u, 5719422788781220916u, 13629200046437557519u, 13850138983909518774u, 3880041u}, + {10440954928216924868u, 4750885136480278895u, 5003034260982658299u, 16644820765896064346u, 10055u}, + {8283642054259195000u, 1717973227152727348u, 8071616851091767453u, 5548620239576932987u, 2147233u}, + {16823379616706133395u, 6098967544681836810u, 4095389606693146075u, 832242997583451117u, 3022116u}, + {7244927355414392561u, 13836202552723696418u, 16140727171134864410u, 992496923738368980u, 238173u}, + {204701054367176373u, 5999729331005569756u, 14303726160175308144u, 13407106008423360644u, 886988u}, + {2650158349742979208u, 11423024082411624917u, 3544232941997270015u, 17526357405256045944u, 2141976u}, + {7033302954366897976u, 15391826299451526657u, 14541183926702976373u, 4939428895189485143u, 2668288u}, + {15940489759401020537u, 9889756789646360106u, 4645601312732034600u, 3940331308838487751u, 3653322u}, + {14764583491458309749u, 4854206258097919706u, 6776524020601886948u, 18225905597451023907u, 2957719u}, + {8045556481417600547u, 5308964168617636127u, 13782444461525838160u, 9133817152439773674u, 1045297u}, + {8130626457346328412u, 13228488089888737893u, 11350717465111417032u, 2973643690928878901u, 903490u}, + {655938575722371623u, 13883987835805237503u, 13252486664334344736u, 10537075181314278189u, 1896903u}, + {5752158756898774639u, 15280709627313122091u, 16663376271375180169u, 7384866286579376522u, 3000544u}, + {9575274141387409957u, 1988038551542559576u, 7811377576057844593u, 12233083667044592223u, 977574u}, + {8291310752286580821u, 9120341531401644769u, 4723322161151249460u, 16951567668537261168u, 3899940u}, + {9388267066145862547u, 13012510146097237968u, 4917241728910402409u, 6629182269485832673u, 2634355u}, + {17179911720226526380u, 15372093486863972286u, 6146461641977922346u, 14460114086699066595u, 1129806u}, + {8368806675443004796u, 1181466048652086770u, 6864643897181928921u, 10253019609980822492u, 1031231u}, + {17891431304370333940u, 15821003698929852918u, 11129691559074968561u, 15655520770821257296u, 1404767u}, + {4146010931792361322u, 13022841454730565981u, 9522407936518747807u, 13716856260194021356u, 188595u}, + {15335655476854722006u, 859681430062670867u, 1494940308603638569u, 16072322447873367241u, 3639901u}, + {9823344341960674241u, 8551096701529641567u, 9407788879667817447u, 9506689157241521534u, 3099115u}, + {17794955369274948789u, 1158046590510686475u, 5496048284555169965u, 11442268448759297422u, 3281593u}, + {12925443127610677136u, 12846927311835634706u, 6926783949106350959u, 18002875633111401261u, 3274333u}, + {5249552932518117382u, 18348931757185392148u, 7062767426443625777u, 16993935399779042210u, 2663872u}, + {9626412223252685825u, 8652533298644884463u, 8512422758294058088u, 3147616325653957458u, 316995u}, + {10530527497711339443u, 11136390459079737439u, 17865143661191245783u, 7283664526615983420u, 1770678u}, + {11737585327138203769u, 7488265231439245591u, 964747540554676513u, 14588297246848055480u, 653694u}, + {9744627285246626270u, 1214730224252895632u, 8893636192354059934u, 12910367873297917282u, 3239552u}, + {16186910205439368365u, 3508485094248296781u, 12075853214375980240u, 5247905970298653190u, 147806u}, + {4914497399811400611u, 4178202588746862682u, 5253774505943284046u, 9802559333860663980u, 1441489u}, + {1764948359162130976u, 2744390557444486045u, 13098298865367769763u, 8385271696870267417u, 67947u}, + {12317752796323707463u, 2141048415033045797u, 14276299925425714025u, 1226232507949622951u, 398998u}, + {15511222593108923413u, 13520982483105404067u, 11534817687008092676u, 1736742472128424935u, 829458u}, + {13645318753514209410u, 5716802504140293880u, 7244572527003572827u, 12913610133971733993u, 2317126u}, + {11948196253007858739u, 14702995281455496191u, 8660923604615011285u, 7897021193356293476u, 1121145u}, + {9362270995716872862u, 13169234298072682501u, 11119951827574282215u, 16161582547277397952u, 2417130u}, + {9585639038451146266u, 11946368383108254477u, 14295858323659190497u, 11934091210922577555u, 1224445u}, + {8280013468164115999u, 6843950456160412729u, 15698745074897147789u, 11335629299436110454u, 1874684u}, + {4690557681985460954u, 230978274878502066u, 9182785489349056980u, 14662273417002078424u, 2693735u}, + {15434642569219945655u, 10024298748023155276u, 450177745758502949u, 2211418475947505496u, 2922480u}, + {2312024823735341772u, 4244879255607559122u, 6534448740539490316u, 5097941825486908686u, 451610u}, + {2246428889662887662u, 9423907555155643432u, 1700982504819063369u, 11753718567371323364u, 2352592u}, + {1923666171646107556u, 17146498487085414178u, 15250145352448339993u, 16184298738783432732u, 509505u}, + {15806039866900156518u, 813947565302512378u, 16224701170084979652u, 7143100534278439787u, 245271u}, + {16571534749785936754u, 16630662489401675298u, 13149719525932299202u, 725100398888082709u, 2346409u}, + {1390709238767046554u, 9576967544925136152u, 3427952063346971925u, 13950399256360440802u, 2003834u}, + {8046247077248357832u, 2086884981235932357u, 246015854317206889u, 5080995809569552482u, 2097603u}, + {13872635206257945643u, 17927611542876221368u, 3097741994527901987u, 16900170955665378210u, 97449u}, + {10766597587865291937u, 2264616232790275354u, 14034389774811131937u, 10017803204935392981u, 1049456u}, + {2025645426109429210u, 3624917457456807549u, 2510857867933770617u, 884050184721557368u, 849724u}, + {7698253032515298439u, 2695354296543077687u, 13999443487487761340u, 15652172548275701071u, 153752u}, + {3004205295843944934u, 18382641419387836336u, 4718018654631147580u, 11748224067629247107u, 1220412u}, + {16897523052604015207u, 13756887486895266881u, 17266759337143439937u, 3769507529548960760u, 2514992u}, + {6942588300726696755u, 3471242809159345167u, 3445627350253814681u, 17916676738947062590u, 1785242u}, + {5274505855690513539u, 14712984228019338366u, 5406992710867431948u, 15957660202582387982u, 690621u}, + {7980735572483199380u, 11039731370868357689u, 15292009909788240700u, 17810965452164789758u, 950922u}, + {6446890779262095767u, 950967668332250598u, 7500071871225058030u, 16518730467264522830u, 2668304u}, + {9048422052595448925u, 7772386824970788700u, 12538290581882544452u, 5165310714210469414u, 1547683u}, + {1365979267884301800u, 9512504909285936543u, 3397431721751405717u, 8603403407886966118u, 3312604u}, + {10029756827134917674u, 8440193925580631389u, 7532436155298969186u, 15553489484963456203u, 3845078u}, + {16917941041221736966u, 952899814600481638u, 5017555919202344115u, 10735453102976274988u, 262322u}, + {15985736625679184139u, 6708814357342919002u, 17990875964326508447u, 5120928174227240195u, 2085093u}, + {3872941932689136780u, 4396578081324073337u, 6177823518053592402u, 16179364246557669108u, 939335u}, + {6688058489659592756u, 13582202820169742119u, 4148386233526148819u, 18175841386081682080u, 3032221u}, + {5194863587424244930u, 5491851672899559056u, 7236680135505436963u, 3874987106947949644u, 2680898u}, + {10480029476037778689u, 15647066143635762355u, 8415050697537691243u, 15974182125550780752u, 2094127u}, + {15375688570284016872u, 9826679956322469362u, 13793368126942725643u, 17260394815865803991u, 2950322u}, + {8316379920176654678u, 1020361938694509008u, 11227137506143987552u, 5242570622860241119u, 3761016u}, + {18301284864176865187u, 15817809146970296009u, 15510815177228696172u, 12823572649564942097u, 2436636u}, + {11858139861838529251u, 14587259847388982822u, 10631704832680523051u, 14960869979367442748u, 3748580u}, + {13663355883982679510u, 7584126101652388099u, 6717345488093724698u, 4824950317363939906u, 2440910u}, + {9871564129297051416u, 10108405393708296644u, 18427383595332240423u, 1918524291888035034u, 884657u}, + {5011175875295906683u, 7629314348261136986u, 12764976211264735205u, 12554340405790000826u, 1703805u}, + {14912536107881017387u, 9484579803688968851u, 7030048755912928661u, 5579864408261298180u, 3495920u}, + {471672690892935108u, 10755319926680101241u, 17463623010656842447u, 12386336927607704159u, 34986u}, + {12491591885915042521u, 6847671347716472226u, 18087798767250939896u, 6846116823777653649u, 1509905u}, + {11038199366551643770u, 16706447991983182980u, 5726056225637966192u, 5288057202725470572u, 836599u}, + {6008155985367877831u, 5476629662621852064u, 16562677683112914060u, 5635924867891757547u, 1926876u}, + {273461033410740325u, 16315249881289342795u, 16074292895027654170u, 684062940411049457u, 2718483u}, + {16104333622823402411u, 5192166885982044795u, 7688012373484914197u, 7111791376570730831u, 525505u}, + {8314861846101753803u, 16291654742893918499u, 9088653830812264765u, 12043312067690211426u, 3786768u}, + {6732787163007263609u, 1310519231303647091u, 812182738792391856u, 9869686341364024335u, 631503u}, + {11821242414519380673u, 14647924607099233381u, 6238378627645665521u, 10171769943440305120u, 1921086u}, + {8873715730306052527u, 6417634397402334041u, 2141299829202014455u, 11420537649949970219u, 1864391u}, + {558171201809681746u, 14204023472535431131u, 11010420201386567687u, 5726941884047172018u, 3098971u}, + {11690283659503207377u, 229856609518429099u, 17121514384519191271u, 13171648045558673998u, 191326u}, + {9533908578118838202u, 8159044618006869936u, 4264090605873595497u, 11532744400996764359u, 1887954u}, + {16784592387062373793u, 8567602560278254882u, 14912311444237858408u, 13149308730696564995u, 640689u}, + {1738610700139593824u, 13257186356985632888u, 11286980146990594256u, 11180745715041979709u, 2263666u}, + {3197441003035210406u, 9306598151562341254u, 16793251087569459814u, 546160436816599072u, 974567u}, + {590029110530328963u, 4892071335672542454u, 7495822370081015033u, 4413490824891447429u, 3174249u}, + {3009540363822998920u, 6511826857087751303u, 7359952295459612328u, 8633408253856143679u, 825490u}, + {7267630063126716906u, 5479808838087870328u, 11430257845333144566u, 8157735737684671519u, 3760886u}, + {15032187263116261987u, 14364097509820693861u, 7813363713312398400u, 3167852653321034206u, 720597u}, + {1529071088741149741u, 15523572081570062238u, 1602449443989187656u, 12983659598434164015u, 463523u}, + {722425818297550190u, 2217397970453553038u, 17116128460797275462u, 296780879288649414u, 2378667u}, + {3727645104711584562u, 3649460278550593560u, 5578761869376544689u, 13014245588509387837u, 1738252u}, + {3093877737167482415u, 7202608574427255771u, 461225220479062874u, 8102515635041788196u, 2250372u}, + {10830652401696220915u, 576446776874024190u, 2416326979399303328u, 1842951895405355946u, 1216823u}, + {1681771627115048135u, 5669355030467959478u, 2423753013329182046u, 16739808241106236525u, 2135488u}, + {10908103250440129129u, 12302262276019425053u, 1246725654062374862u, 8758361695937566360u, 576435u}, + {1894996490476095490u, 16200889556484430075u, 5964483899277707112u, 17304455926781195101u, 3884201u}, + {10388398647305924883u, 5702755311208071130u, 16189119328389260213u, 5043624867699330224u, 3034876u}, + {6462491728088473147u, 8427241060804180713u, 16039256569359785569u, 992732308404131384u, 711715u}, + {17807047169760924639u, 10509278950268079279u, 17201825425819414702u, 15073165979378091125u, 2661807u}, + {10172065652685167513u, 3495357219868373073u, 15429248513956387767u, 14604735683237217651u, 2604339u}, + {14951457691573022117u, 11478843761453601245u, 3380909584718096436u, 8190549715904773111u, 924693u}, + {15597503625585566289u, 9174982918214346147u, 5851805267204825441u, 8231623303632085126u, 2598632u}, + {2770157368367570132u, 12544104167186005433u, 3081979404896659178u, 47936307677375303u, 3422712u}, + {7683109510753891852u, 6415546980185876702u, 9372382901656053231u, 6332148573649681306u, 451063u}, + {17203396305295096602u, 18028398764545993212u, 2402672081157802692u, 13122802764957152577u, 1637658u}, + {14301819063048660891u, 10391552189678960025u, 15449293985646324233u, 11271194141045823817u, 252707u}, + {9067083432391384371u, 8529292954714292816u, 13024292844182575735u, 13983834875983848644u, 601520u}, + {258220484089921530u, 18210580729593078385u, 8705110111045412145u, 11096099479052645u, 0u}, + {7008947863348393979u, 8379183837012106892u, 8836961548853745774u, 11096099u, 0u}, + {17998263518384539593u, 15319868923530310939u, 204686907306506030u, 0u, 0u}, + {7942345641840046399u, 5654038307778610962u, 204686907u, 0u, 0u}, + {7646224753088607887u, 3775806994322226444u, 0u, 0u, 0u}, + {5944028753895727460u, 3775806994u, 0u, 0u, 0u}, + {14311113074855950423u, 3u, 0u, 0u, 0u}, + {69651345296u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1452766u}, + {2985980661317373887u, 8929834458646081531u, 8540286447474164497u, 13645684075769366634u, 837943u}, + {12632896936406505597u, 6224301298171370976u, 10683109426636252970u, 6500640797128554718u, 381795u}, + {2974504733101087227u, 15318559571481076497u, 7153378740980472184u, 9590702888198678223u, 811664u}, + {17023900091356564369u, 13970703177880718382u, 12940893593296405563u, 13345627464689214437u, 2567544u}, + {11470109592151380046u, 10235541559289244741u, 12609558605374707120u, 13089787361276572397u, 3794915u}, + {1982186281281087039u, 14473258446922356142u, 6408491820066156111u, 4105229105000233260u, 3005828u}, + {4133287532412692168u, 10707778577013646006u, 2122322040430024145u, 6324458425250549771u, 3725094u}, + {3313092904293497419u, 4002591971994426742u, 13244793145342103564u, 10445009403454592217u, 3087909u}, + {4796127304994479805u, 11148506349724384841u, 5083980990117162566u, 4092187143614878207u, 3309155u}, + {17504000514676797550u, 5863754319466864231u, 16467826940967297966u, 15625483451669857650u, 993231u}, + {5407158764069212573u, 8253344508472779390u, 6105299459675223549u, 9962269870922613231u, 785322u}, + {1381133965475865709u, 577450926438412504u, 7688484563270719579u, 6067324543097670227u, 1082248u}, + {90257854098458547u, 18179072575958696020u, 16878457148249750860u, 6865435391550762477u, 1599045u}, + {5703855237553066582u, 9683124168292655165u, 9492126302151689934u, 14008670424100799865u, 1700114u}, + {133039639510647379u, 5650749764182357858u, 13593112211263738095u, 1544571056659287720u, 594109u}, + {7685270747099194008u, 13624881743468426358u, 12180714658099661890u, 11396059236212072452u, 3270769u}, + {7568472833365491654u, 6291704543566876319u, 11835157186403732830u, 13895393105345445864u, 491489u}, + {7138700460692200091u, 17077018693272375624u, 2944876752563775911u, 1089930296262355579u, 3676594u}, + {4131462822538923146u, 4421729563153993993u, 8788609638503779740u, 18010162105114922455u, 2223403u}, + {6238751587236627866u, 15119353364893956051u, 5655618689152378595u, 11858459986344061647u, 1027317u}, + {12920535544261103665u, 8728883077864304745u, 14417162022741491041u, 11980511275936068437u, 3280642u}, + {11343834596653981534u, 12338473440609829761u, 14179752250806951708u, 1429611462072604710u, 1815225u}, + {13067475192214144511u, 13961983989272800105u, 16689845007311721601u, 13508255077533334914u, 1804094u}, + {6135909669796136178u, 1625960397308817041u, 6390889590463171459u, 7383154265679819509u, 2124919u}, + {8520464633892878085u, 14412811317228560204u, 7196787153673903822u, 16396271690963158564u, 2008772u}, + {9327954975457421207u, 16366602120845357836u, 7045440898067283590u, 16754417136181986526u, 2562397u}, + {13136901263960357789u, 7582158555262084438u, 2106066216786898155u, 5091299481083613790u, 379986u}, + {10046661564302195619u, 3682014599794546771u, 14092780581001542310u, 13697952376791199918u, 1478298u}, + {12662054457445902176u, 15799482936584016737u, 9703531317559762130u, 18329898684202324803u, 3687511u}, + {12586284348098068644u, 12536772423144689221u, 10909267561607589144u, 10588431319553366122u, 1510383u}, + {1992962722711170326u, 4351401439066450426u, 4644798857286167796u, 9827694448400912269u, 1496488u}, + {3631641387633741540u, 15766635594844600074u, 16226436352460926645u, 16744967157772353059u, 1315489u}, + {18396909128314910375u, 5846916412795672503u, 2179174454314539673u, 3555088613518216126u, 1520u}, + {3794042351451722106u, 11741581514410256678u, 676487228098108005u, 15780641136912298636u, 1015103u}, + {9466593504958811168u, 5536305999986824482u, 16350365393655819042u, 6143620854253970483u, 3386357u}, + {10236273060421378021u, 9708066920649154959u, 6192081226268580828u, 4674153285492223614u, 3734363u}, + {987643096714516071u, 8358285788849648638u, 14639413985241460590u, 5401148802020150771u, 855391u}, + {15394121340680076246u, 9845319184881807718u, 1595876304052708930u, 15652277090491465401u, 2743948u}, + {3850312573272539040u, 15285253167020272545u, 4225879174570192134u, 13597444601290296235u, 558725u}, + {13077761089216122933u, 3300334556948275168u, 9535967522440964882u, 6567547728131470146u, 1565606u}, + {8243334021080306198u, 8408084133127956663u, 7356366785407406481u, 12134556138141705092u, 2773150u}, + {10622674000490828501u, 565236894620091265u, 3792936365870240506u, 3509920114283104709u, 221120u}, + {2840038315416947011u, 10248106564056329793u, 6206123502489358017u, 9515681360565986322u, 2845277u}, + {1293712389326473892u, 5261890979274249230u, 8472662497686988007u, 18283057397749261260u, 80467u}, + {7967435318451308737u, 3641647734991733173u, 4411463812345409916u, 14773291150213663464u, 933581u}, + {7920323355331701525u, 2325611945757278444u, 2229849068869340947u, 7295038542383090523u, 1055408u}, + {3620576630637321562u, 1007748637891648765u, 15403581957534668972u, 4703212461029700032u, 2470100u}, + {2392242194073000673u, 6511447643485505358u, 8787690062323666450u, 13376220204256350584u, 1781520u}, + {17036689384461301326u, 9896739334566482358u, 12014122845434331729u, 15309073192919137676u, 2920364u}, + {5938686180374076183u, 15626349974830528274u, 16872238847381862021u, 9997819199853203081u, 2080294u}, + {171030284890169448u, 17787069724027836915u, 15175365015709644796u, 1119238571582811777u, 2893030u}, + {8158246759373367527u, 12772121778302301613u, 12810309284488042659u, 7763529547185091667u, 1777499u}, + {5724998922125085449u, 200240803198044489u, 8724941965577400767u, 13363443973924472361u, 353592u}, + {8522838655657277462u, 12865425152432622646u, 12903073821913632433u, 6635821285983325193u, 3389541u}, + {14938470684033813605u, 16363664272390048614u, 5116637039448202377u, 10078531573262149937u, 2489835u}, + {9129852187534391557u, 12016215174956866445u, 13096695714043418420u, 4081154625233260610u, 3384665u}, + {8461911941078743577u, 4533959198549501986u, 13902005914308369816u, 14113666890507344284u, 2805966u}, + {17258398962878478803u, 2126526936973605468u, 4004517723036228988u, 7689865918815558602u, 3607935u}, + {6202244516164256897u, 507897527121905289u, 17067509837137049299u, 16423628507879086661u, 3472581u}, + {5956738946500158652u, 10325222089241232857u, 6259488618203599914u, 8494796331843423408u, 894754u}, + {1352211149971580022u, 10981882930467764608u, 18263122828276093922u, 809138840958931543u, 834863u}, + {7063118407068543451u, 10439158912548575296u, 6451198141179182349u, 6572641562358190394u, 3899437u}, + {14827391362631474299u, 4665353602568791857u, 3376318384054284567u, 10376167870366890163u, 1671578u}, + {2130217937842002104u, 8755480394672518658u, 4391435789826613794u, 15451160306057989439u, 663696u}, + {8318495822263414826u, 15688929907323286408u, 11572051618379272027u, 14928165011556987792u, 484346u}, + {15392022440576734151u, 7950762077194807212u, 811489401953035196u, 4908851016212389586u, 2379032u}, + {106582277383888142u, 10284000135380014579u, 3920030847324871633u, 15968613681738090254u, 3548220u}, + {11073920828429330128u, 1048336168285192690u, 17948936073092295845u, 1650720191060245978u, 2317085u}, + {851876887397324836u, 7032305647993474761u, 8603659922646936408u, 2276528090818517503u, 2279118u}, + {8166930417252960311u, 3358175606010529108u, 12515602877109644905u, 11571257354804782616u, 2641383u}, + {9538251546892990621u, 9249861730723494993u, 7026503992428863152u, 16766086744572185663u, 2059652u}, + {1822098276940876906u, 9671957607305864980u, 18025850162995726513u, 1335030582773693617u, 3718096u}, + {17950570120477900615u, 3111400545115084577u, 14737781831697351996u, 15056566326577524459u, 1762851u}, + {7654271952284803346u, 3574034457512761424u, 6518003464038638263u, 12066137080627614595u, 2001022u}, + {6637589806521987855u, 3139300390878419734u, 394135852068260579u, 11638184992892397211u, 2093086u}, + {4963127305731747764u, 16432300059463154962u, 8229538703074877640u, 9478155452373009039u, 1576782u}, + {3540901561357423659u, 8779714133936770311u, 10868614109035121356u, 14584720499153630418u, 3729971u}, + {766577161465856716u, 15615623026013944306u, 1924245444925695401u, 12318596821471828109u, 2219874u}, + {10964267460910347776u, 14361640468986122158u, 12098195516447040953u, 977698182365541906u, 1577732u}, + {10019519022899505581u, 6676962119505168342u, 12096578208334328540u, 15161198767363466660u, 3824862u}, + {8994010654404547937u, 1945581276971089206u, 6946004393120529961u, 9798331460712726990u, 2577526u}, + {3324636734021595389u, 11864644315017168241u, 8325181738788252865u, 11432646830256277634u, 426745u}, + {13940697120127433304u, 9876389168558723758u, 15876145174627303043u, 9663589668314725436u, 793021u}, + {5943262002826032015u, 2849213909640366046u, 11931305604708057451u, 4410141901409270986u, 301576u}, + {9832051398685256486u, 6351684065806642871u, 2719378477334093690u, 17947904015144970997u, 2417389u}, + {4055260044886798801u, 8337618901983308992u, 7681623072065653444u, 17914876295563632802u, 119615u}, + {61044854987695232u, 3111429228467780491u, 10702443827176126050u, 1731588782117523527u, 2313353u}, + {3088038287537140890u, 17586529050815331235u, 8800055703385131001u, 1772056089385007458u, 3160244u}, + {2293357651514081u, 472944891718715503u, 11476858804862248213u, 490641778278099873u, 3337379u}, + {11272111392274379618u, 17332686262223861183u, 17353854502348167165u, 4889422577321786199u, 155243u}, + {2356743029174671742u, 5647997499169378413u, 4488256786701971467u, 9442408551748217085u, 2948877u}, + {9634045206356415829u, 10630226611428102732u, 3485555038321695349u, 2864643356245446457u, 1295907u}, + {14319557739728494076u, 2413395894168712639u, 2794352806758973793u, 2041517900698954288u, 2351288u}, + {9475087152772369456u, 12865838988902327337u, 16584281400035694845u, 2637446995386507980u, 1038686u}, + {18230186557329709601u, 6013220596121186630u, 13213855774829907234u, 4486731207803924106u, 698169u}, + {17594920194665313860u, 14897343222890002330u, 13763396341585913357u, 8803905421977137123u, 3402534u}, + {8465151732758733119u, 15908170112417229837u, 8768329003739757868u, 927456811159135909u, 1197976u}, + {1498180459696185375u, 397524915726393220u, 17817066779364814289u, 16883575762481040108u, 2193088u}, + {11167185520269011621u, 12592576594024057724u, 11353423422034211804u, 4219795804150519583u, 2071771u}, + {12332287641017662959u, 11214080253851781818u, 11281134370234747677u, 5514594580518652251u, 193889u}, + {18237518347746214467u, 15215385073745446485u, 14239537518024518206u, 7713739188334591203u, 3443244u}, + {18034709739556973945u, 5518445293999396168u, 12526695205104949233u, 567919806830570711u, 761090u}, + {9237918271822297362u, 6535962725234119428u, 8669824938675949918u, 5274243997783718737u, 3603337u}, + {9711693148407288908u, 14148792574284755680u, 6918660356678203327u, 17936753162130700480u, 3177990u}, + {11312281935769148941u, 14743236419362425879u, 1306625686105758903u, 15623063898327995556u, 2313526u}, + {202618291901400629u, 1537190349069265861u, 8115710948304974210u, 7248436441445730462u, 262460u}, + {1186975172046969007u, 12843408355975045410u, 6693692959645955984u, 14056072377093969770u, 3290359u}, + {17280362682115368754u, 5215946174467252631u, 11799273799581280216u, 12886948163190871871u, 2259757u}, + {14159022282295463491u, 5782130902102537000u, 7784326472474059265u, 15894355860278867758u, 1761483u}, + {17474225394622644982u, 4305570441320445302u, 7158707043213892087u, 13579321321115997950u, 3453853u}, + {15362658442900586943u, 9795576299502481626u, 1726142978916145962u, 11953215372196644717u, 1456780u}, + {7182591230936076532u, 13396584750723303114u, 14753727992631698591u, 5719422788781220916u, 3639749u}, + {7544588652718959664u, 16809842570914304705u, 10440954928216924867u, 4750885136480278895u, 3287765u}, + {6461494844748175814u, 599611930987861536u, 8283642054259194999u, 1717973227152727348u, 2500693u}, + {17025709037907654661u, 15689479261652677088u, 16823379616706133394u, 6098967544681836810u, 62043u}, + {5995997594762452947u, 4303311112460389790u, 7244927355414392560u, 13836202552723696418u, 1027228u}, + {12057965994045875850u, 11385847250578815416u, 204701054367176372u, 5999729331005569756u, 2055876u}, + {5337273951229460144u, 4298414641303320463u, 2650158349742979207u, 11423024082411624917u, 2361325u}, + {4854543441580360206u, 12959470052019477341u, 7033302954366897975u, 15391826299451526657u, 968539u}, + {14211675586242484519u, 4864562687565727206u, 15940489759401020536u, 9889756789646360106u, 1428298u}, + {14104725966699523037u, 321595375957274371u, 14764583491458309748u, 4854206258097919706u, 2643274u}, + {4376316258816398670u, 8430191335436449515u, 8045556481417600546u, 5308964168617636127u, 2274026u}, + {5846549052943869316u, 4701588705964508616u, 8130626457346328411u, 13228488089888737893u, 2652488u}, + {8903473181767584097u, 3567895954524285331u, 655938575722371622u, 13883987835805237503u, 243928u}, + {9851600615378742468u, 9663615356764469238u, 5752158756898774638u, 15280709627313122091u, 2303035u}, + {7701480648705086515u, 8184684845386577938u, 9575274141387409956u, 1988038551542559576u, 2227205u}, + {15884586699239636624u, 13103557075803402862u, 8291310752286580820u, 9120341531401644769u, 2284588u}, + {5263381721639558056u, 15906953049789692555u, 9388267066145862546u, 13012510146097237968u, 1291607u}, + {1691422017263194533u, 14220016274181077827u, 17179911720226526379u, 15372093486863972286u, 1547402u}, + {10388484977864615371u, 16241949889334693058u, 8368806675443004795u, 1181466048652086770u, 2189579u}, + {4704651752882753583u, 9967553166615742674u, 17891431304370333939u, 15821003698929852918u, 2844649u}, + {10524978177216629002u, 17148985588345541753u, 4146010931792361321u, 13022841454730565981u, 3634673u}, + {3252305484066301495u, 11860343434946299023u, 15335655476854722005u, 859681430062670867u, 2618381u}, + {13333358842462042064u, 1679867758135635678u, 9823344341960674240u, 8551096701529641567u, 277831u}, + {12411110469930332753u, 12605185000221013266u, 17794955369274948788u, 1158046590510686475u, 1120825u}, + {9215467139814955819u, 8959834263564387785u, 12925443127610677135u, 12846927311835634706u, 2510083u}, + {17926734960726420850u, 2855055697424049776u, 5249552932518117381u, 18348931757185392148u, 304769u}, + {14704563506719366919u, 14064945311940275541u, 9626412223252685824u, 8652533298644884463u, 2142436u}, + {11872876224212531506u, 18199093744679846993u, 10530527497711339442u, 11136390459079737439u, 3595921u}, + {643490052480895531u, 2150186486333262854u, 11737585327138203768u, 7488265231439245591u, 3350657u}, + {2494278529711975183u, 2686868184051885890u, 9744627285246626269u, 1214730224252895632u, 2695358u}, + {995820807321558090u, 9319089040146886251u, 16186910205439368364u, 3508485094248296781u, 3844566u}, + {11086654542965674066u, 5350746638705281402u, 4914497399811400610u, 4178202588746862682u, 336210u}, + {13027391616123158392u, 2365176634836134036u, 1764948359162130975u, 2744390557444486045u, 2785217u}, + {15805716137645388359u, 5315902410849842361u, 12317752796323707462u, 2141048415033045797u, 2505179u}, + {7997397180323874119u, 3582284618430277297u, 15511222593108923412u, 13520982483105404067u, 1314734u}, + {9063112358596726886u, 16641515966087172693u, 13645318753514209409u, 5716802504140293880u, 175971u}, + {5479401186041870923u, 13304589940983193635u, 11948196253007858738u, 14702995281455496191u, 2968121u}, + {14255030563635412201u, 17870238509122618954u, 9362270995716872861u, 13169234298072682501u, 3082677u}, + {2607380474966840709u, 10014593287969194336u, 9585639038451146265u, 11946368383108254477u, 3823797u}, + {1017950370175709404u, 3810166310022842457u, 8280013468164115998u, 6843950456160412729u, 802607u}, + {242362935412008862u, 2676656769168934907u, 4690557681985460953u, 230978274878502066u, 449574u}, + {3625880117220784859u, 8710909554120365543u, 15434642569219945654u, 10024298748023155276u, 3552865u}, + {5506930548057920605u, 5889918293379701526u, 2312024823735341771u, 4244879255607559122u, 3058552u}, + {9404919105257516619u, 4632985280660853825u, 2246428889662887661u, 9423907555155643432u, 3732295u}, + {10562556099609682304u, 2480077916518879544u, 1923666171646107555u, 17146498487085414178u, 1155435u}, + {13491051228868024330u, 1456971128426719220u, 15806039866900156517u, 813947565302512378u, 3112520u}, + {2904642413146549462u, 1680285972313902515u, 16571534749785936753u, 16630662489401675298u, 3543450u}, + {13207692611721521518u, 8723124396753794852u, 1390709238767046553u, 9576967544925136152u, 3755261u}, + {4439719359060927604u, 17692976933888315130u, 8046247077248357831u, 2086884981235932357u, 3107769u}, + {15078199675007679818u, 3187568007966678033u, 13872635206257945642u, 17927611542876221368u, 1671341u}, + {14676983131170185903u, 3673831896430019772u, 10766597587865291936u, 2264616232790275354u, 1194669u}, + {13923513823354422591u, 14626276986357166413u, 2025645426109429209u, 3624917457456807549u, 1584199u}, + {1201432858329122547u, 9661706111364477258u, 7698253032515298438u, 2695354296543077687u, 431238u}, + {12788769542414817997u, 16815187824869432661u, 3004205295843944933u, 18382641419387836336u, 3574864u}, + {3178480067020605043u, 5067429320526028024u, 16897523052604015206u, 13756887486895266881u, 676449u}, + {7516604753487590373u, 11806739785577457191u, 6942588300726696754u, 3471242809159345167u, 717473u}, + {9938674337321147467u, 8325150531758015541u, 5274505855690513538u, 14712984228019338366u, 808786u}, + {6722327454912913163u, 3823371981927630968u, 7980735572483199379u, 11039731370868357689u, 770810u}, + {11586923404229132408u, 951375389500152411u, 6446890779262095766u, 950967668332250598u, 3373184u}, + {14890983252275691929u, 10735230989575513429u, 9048422052595448924u, 7772386824970788700u, 48924u}, + {912112501931052882u, 8342751565331413009u, 1365979267884301799u, 9512504909285936543u, 512579u}, + {8318108863694875185u, 1905738875535092266u, 10029756827134917673u, 8440193925580631389u, 875552u}, + {319364983584868327u, 10642221971954655219u, 16917941041221736965u, 952899814600481638u, 404305u}, + {17764267430116922516u, 10619459510160919971u, 15985736625679184138u, 6708814357342919002u, 57725u}, + {16856551575951027341u, 13128344300291414378u, 3872941932689136779u, 4396578081324073337u, 1917690u}, + {10680261847963347703u, 1605899968123387836u, 6688058489659592755u, 13582202820169742119u, 838875u}, + {13331040998050392749u, 16315389906652876629u, 5194863587424244929u, 5491851672899559056u, 572905u}, + {7066215498250140617u, 8866964447830151207u, 10480029476037778688u, 15647066143635762355u, 1455387u}, + {17997024395302143936u, 7126121867014502119u, 15375688570284016871u, 9826679956322469362u, 626431u}, + {15664622807919599997u, 12399890286980494163u, 8316379920176654677u, 1020361938694509008u, 2016402u}, + {11678966375759509288u, 4536292656718269135u, 18301284864176865186u, 15817809146970296009u, 1714440u}, + {6880765692952069150u, 14937995713280857732u, 11858139861838529250u, 14587259847388982822u, 980049u}, + {1078147044089020643u, 12066217231612044250u, 13663355883982679509u, 7584126101652388099u, 1102754u}, + {16178874094078105442u, 2642446608010760737u, 9871564129297051415u, 10108405393708296644u, 3429709u}, + {16902351408806257112u, 7363468424494126343u, 5011175875295906682u, 7629314348261136986u, 2441351u}, + {3986314977046727888u, 9516548250710534539u, 14912536107881017386u, 9484579803688968851u, 1015811u}, + {7668053759072433641u, 2380762957152599502u, 471672690892935107u, 10755319926680101241u, 119257u}, + {14536727603286958585u, 1507076027006461555u, 12491591885915042520u, 6847671347716472226u, 3314610u}, + {9046384599355600455u, 1229141534165107204u, 11038199366551643769u, 16706447991983182980u, 13688u}, + {16751990717903619976u, 2079855213869520815u, 6008155985367877830u, 5476629662621852064u, 1638968u}, + {12373533736247799398u, 5268955723598091237u, 273461033410740324u, 16315249881289342795u, 217930u}, + {8746332256166176604u, 9288915611213886708u, 16104333622823402410u, 5192166885982044795u, 359873u}, + {17178991522203218643u, 12199684436850640802u, 8314861846101753802u, 16291654742893918499u, 730889u}, + {4649574209087741096u, 17383521165632886931u, 6732787163007263608u, 1310519231303647091u, 1096834u}, + {4285606967922950512u, 10406600969062438384u, 11821242414519380672u, 14647924607099233381u, 244407u}, + {9119881084520389322u, 11555058207052574862u, 8873715730306052526u, 6417634397402334041u, 470405u}, + {17166050356845809125u, 14376884356165980922u, 558171201809681745u, 14204023472535431131u, 741801u}, + {3881808767236848629u, 1728675705648899523u, 11690283659503207376u, 229856609518429099u, 896445u}, + {6667243663271031649u, 14734434229412889245u, 9533908578118838201u, 8159044618006869936u, 3513165u}, + {192486560647829975u, 16773126652463188609u, 16784592387062373792u, 8567602560278254882u, 3829762u}, + {10897883070204478244u, 5303744711194388551u, 1738610700139593823u, 13257186356985632888u, 605446u}, + {10227853764943241737u, 2876404627193298352u, 3197441003035210405u, 9306598151562341254u, 3480968u}, + {13868852205505148197u, 921346192130010309u, 590029110530328962u, 4892071335672542454u, 1444341u}, + {6061368812765870623u, 16550513268076701442u, 3009540363822998919u, 6511826857087751303u, 186032u}, + {14130213086966097803u, 10816011529529458353u, 7267630063126716905u, 5479808838087870328u, 1335536u}, + {1362783798830436350u, 7612369354330074265u, 15032187263116261986u, 14364097509820693861u, 1690778u}, + {16788166786043667640u, 8471558941075768258u, 1529071088741149740u, 15523572081570062238u, 3017884u}, + {10551144526833819560u, 18378591700757075080u, 722425818297550189u, 2217397970453553038u, 2525138u}, + {13346468009990118726u, 5381662818983254986u, 3727645104711584561u, 3649460278550593560u, 3735443u}, + {9390349210544851623u, 1376358232536894876u, 3093877737167482414u, 7202608574427255771u, 3905492u}, + {14862787198848267875u, 11466029451862638812u, 10830652401696220914u, 576446776874024190u, 2648852u}, + {11382597904063195713u, 10799839393042761889u, 1681771627115048134u, 5669355030467959478u, 2844474u}, + {7728505185644300518u, 8588042680604108337u, 10908103250440129128u, 12302262276019425053u, 3251982u}, + {3500200059256014352u, 263245524270511849u, 1894996490476095489u, 16200889556484430075u, 553234u}, + {15019651460818893404u, 13429144701773851520u, 10388398647305924882u, 5702755311208071130u, 3716653u}, + {6620226557773571216u, 4666062052764928462u, 6462491728088473146u, 8427241060804180713u, 3302903u}, + {11998087273111033249u, 8786407818405582994u, 17807047169760924638u, 10509278950268079279u, 1983694u}, + {4084774155041239231u, 15633393623137069792u, 10172065652685167512u, 3495357219868373073u, 1175617u}, + {3968822599353582593u, 6833999087055714246u, 14951457691573022116u, 11478843761453601245u, 1283070u}, + {14639098912629423005u, 1018886657344533217u, 15597503625585566288u, 9174982918214346147u, 329749u}, + {9921724479864537310u, 9817253600132392074u, 2770157368367570131u, 12544104167186005433u, 131248u}, + {15388060413594323324u, 2853286065228990008u, 7683109510753891851u, 6415546980185876702u, 758955u}, + {187290103116338671u, 17714975814024508009u, 17203396305295096601u, 18028398764545993212u, 827172u}, + {11031374483215183148u, 3711662475257047053u, 14301819063048660890u, 10391552189678960025u, 1436397u}, + {18149150233531119756u, 11392253914884430548u, 9067083432391384370u, 8529292954714292816u, 2822559u}, + {17893220537645362882u, 8124147724366666091u, 258220484089921529u, 18210580729593078385u, 1111465u}, + {2227225863110095806u, 13416035272704354996u, 7008947863348393978u, 8379183837012106892u, 2366758u}, + {11115811781474633693u, 13667397419593172093u, 17998263518384539592u, 15319868923530310939u, 1818530u}, + {15337228622159128806u, 13162613299420428438u, 7942345641840046398u, 5654038307778610962u, 1561907u}, + {6377794835788439022u, 241054353978826909u, 7646224753088607886u, 3775806994322226444u, 0u}, + {7146511216770700339u, 2706900866591456414u, 5944028753895727459u, 3775806994u, 0u}, + {1036770148847208252u, 3551547267339855370u, 14311113074855950422u, 3u, 0u}, + {14581628963979443984u, 18162761432867240237u, 69651345295u, 0u, 0u}, + {9379928775179982568u, 12015199978642611074u, 69u, 0u, 0u}, + {11098900071914976720u, 1284840541064u, 0u, 0u, 0u}, + {15505245902150421015u, 1284u, 0u, 0u, 0u}, + {23701124636546u, 0u, 0u, 0u, 0u}, + {23702u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3618546u}, + {9256008311617887927u, 9062202391160917686u, 2985980661317373886u, 8929834458646081531u, 1482549u}, + {9815300430213501215u, 15348785449927466228u, 12632896936406505596u, 6224301298171370976u, 2295778u}, + {7724823269300122839u, 5955265337496371297u, 2974504733101087226u, 15318559571481076497u, 3447086u}, + {3504866642781123183u, 17009255611598832508u, 17023900091356564368u, 13970703177880718382u, 182319u}, + {740105733195911190u, 1660504787879441224u, 11470109592151380045u, 10235541559289244741u, 3346912u}, + {12711171579013488714u, 12692381375932269818u, 1982186281281087038u, 14473258446922356142u, 2344839u}, + {17759228806598715716u, 10090149394076564523u, 4133287532412692167u, 10707778577013646006u, 2137195u}, + {158048972417905263u, 12998383538221678688u, 3313092904293497418u, 4002591971994426742u, 2799240u}, + {12757059256267334065u, 5705687344189104950u, 4796127304994479804u, 11148506349724384841u, 1468508u}, + {1281788220960064168u, 3703377716889606371u, 17504000514676797549u, 5863754319466864231u, 2102202u}, + {4007054930936141528u, 16503766177663180801u, 5407158764069212572u, 8253344508472779390u, 53677u}, + {1488792169309214834u, 9989475000833594288u, 1381133965475865708u, 577450926438412504u, 1114499u}, + {10302568252567759232u, 1165330934482611571u, 90257854098458546u, 18179072575958696020u, 1485712u}, + {9505034995037189657u, 5920363308762207214u, 5703855237553066581u, 9683124168292655165u, 1640258u}, + {9789493730651313415u, 14682849555562670647u, 133039639510647378u, 5650749764182357858u, 325069u}, + {9380991487313933741u, 1376798030663542922u, 7685270747099194007u, 13624881743468426358u, 1230236u}, + {2637680354038513994u, 14459888957382006805u, 7568472833365491653u, 6291704543566876319u, 3872038u}, + {707996462597054591u, 9845774143032500786u, 7138700460692200090u, 17077018693272375624u, 1421189u}, + {9729700371826776447u, 9801671164624871185u, 4131462822538923145u, 4421729563153993993u, 3215538u}, + {3058200135264248996u, 4707040218271859608u, 6238751587236627865u, 15119353364893956051u, 537449u}, + {13528879147778885300u, 6188366593771132760u, 12920535544261103664u, 8728883077864304745u, 901235u}, + {5899989371911689145u, 15566649205303163046u, 11343834596653981533u, 12338473440609829761u, 2974418u}, + {4916184916119086801u, 718646740110467799u, 13067475192214144510u, 13961983989272800105u, 2205989u}, + {3070146647741237468u, 10763198762115722485u, 6135909669796136177u, 1625960397308817041u, 70067u}, + {18104377026223947045u, 10295348962528222927u, 8520464633892878084u, 14412811317228560204u, 516528u}, + {16547629339737992599u, 13305867390110875091u, 9327954975457421206u, 16366602120845357836u, 873388u}, + {3774662274065579357u, 13957122203265615313u, 13136901263960357788u, 7582158555262084438u, 383661u}, + {11848614981689911176u, 4558744098253892578u, 10046661564302195618u, 3682014599794546771u, 1022936u}, + {11948002228356987690u, 14882507907129590842u, 12662054457445902175u, 15799482936584016737u, 3838544u}, + {1987786805493478264u, 7940571283305328813u, 12586284348098068643u, 12536772423144689221u, 1514944u}, + {12203249871584310801u, 228707223525232215u, 1992962722711170325u, 4351401439066450426u, 3148528u}, + {3853981572137696179u, 2628578186404683299u, 3631641387633741539u, 15766635594844600074u, 555723u}, + {13351972419490830333u, 14556764986615924464u, 18396909128314910374u, 5846916412795672503u, 3699909u}, + {18190512908919594777u, 1942123516461251512u, 3794042351451722105u, 11741581514410256678u, 3248749u}, + {13344254113192736783u, 9239647545752901040u, 9466593504958811167u, 5536305999986824482u, 2837862u}, + {13029508234689263544u, 17878974532562848002u, 10236273060421378020u, 9708066920649154959u, 3884830u}, + {10284176159290712074u, 9681851932947281521u, 987643096714516070u, 8358285788849648638u, 2465822u}, + {339200234497817365u, 10117520965070510493u, 15394121340680076245u, 9845319184881807718u, 490234u}, + {1205448331994774054u, 6699289980500890585u, 3850312573272539039u, 15285253167020272545u, 3130244u}, + {2643967272944452159u, 11780035856213102209u, 13077761089216122932u, 3300334556948275168u, 2678154u}, + {3998496196450441559u, 12302625129586035746u, 8243334021080306197u, 8408084133127956663u, 3297803u}, + {10372584163481313022u, 2474718776100225294u, 10622674000490828500u, 565236894620091265u, 863470u}, + {15549171103944981553u, 3412187594313787508u, 2840038315416947010u, 10248106564056329793u, 91431u}, + {16435282559901607110u, 7575635699816229919u, 1293712389326473891u, 5261890979274249230u, 2101619u}, + {4524615374937966u, 8331966986843772683u, 7967435318451308736u, 3641647734991733173u, 1071676u}, + {4125681513578326359u, 14288600043587035012u, 7920323355331701524u, 2325611945757278444u, 3848913u}, + {3092307181775083192u, 1726880081045736249u, 3620576630637321561u, 1007748637891648765u, 1423784u}, + {8767721394212368864u, 17102812162203264795u, 2392242194073000672u, 6511447643485505358u, 1347064u}, + {639536432505398827u, 7661382636321882282u, 17036689384461301325u, 9896739334566482358u, 3356129u}, + {13045653882309012738u, 14043610993142570730u, 5938686180374076182u, 15626349974830528274u, 3301481u}, + {16175705693283511928u, 15687725487797356362u, 171030284890169447u, 17787069724027836915u, 971858u}, + {1232458753033535765u, 6679184842811670920u, 8158246759373367526u, 12772121778302301613u, 3042575u}, + {10981691038343146546u, 6782191434263980337u, 5724998922125085448u, 200240803198044489u, 2123595u}, + {12752444648040241023u, 6305724172900669711u, 8522838655657277461u, 12865425152432622646u, 357267u}, + {11338189708331894778u, 15624837707160350403u, 14938470684033813604u, 16363664272390048614u, 2962829u}, + {40568736541134335u, 10995049963432777072u, 9129852187534391556u, 12016215174956866445u, 3598920u}, + {11658301819361995787u, 8366413720723413288u, 8461911941078743576u, 4533959198549501986u, 1998006u}, + {683804138614072265u, 6246246263781053996u, 17258398962878478802u, 2126526936973605468u, 189430u}, + {5195132848543234518u, 6279735993485312903u, 6202244516164256896u, 507897527121905289u, 1137661u}, + {255005563214060772u, 3438442406237057762u, 5956738946500158651u, 10325222089241232857u, 1579066u}, + {14058866978040729595u, 11211666506682346809u, 1352211149971580021u, 10981882930467764608u, 3407938u}, + {791889978669207116u, 9196149763561755434u, 7063118407068543450u, 10439158912548575296u, 2909325u}, + {6869877583609206059u, 11755168965169070789u, 14827391362631474298u, 4665353602568791857u, 1979293u}, + {9920892819085496859u, 9054507196051786122u, 2130217937842002103u, 8755480394672518658u, 2842344u}, + {16289376002880475018u, 11782789440949690196u, 8318495822263414825u, 15688929907323286408u, 1324175u}, + {286814494152966097u, 16517195341641276784u, 15392022440576734150u, 7950762077194807212u, 2809264u}, + {10740661009389977826u, 8255233908441226039u, 106582277383888141u, 10284000135380014579u, 2142917u}, + {10281967067165317761u, 7481168507858515944u, 11073920828429330127u, 1048336168285192690u, 2315803u}, + {17753207454862459079u, 16319029012412030294u, 851876887397324835u, 7032305647993474761u, 2359564u}, + {3637938015016106290u, 11364186708321558013u, 8166930417252960310u, 3358175606010529108u, 1436009u}, + {5206635669252667385u, 7639127703769482529u, 9538251546892990620u, 9249861730723494993u, 880372u}, + {7966070908938820090u, 3689181694879730218u, 1822098276940876905u, 9671957607305864980u, 700611u}, + {356926686237575530u, 3211286706812394094u, 17950570120477900614u, 3111400545115084577u, 2342546u}, + {4985668777987299947u, 13619858747957924411u, 7654271952284803345u, 3574034457512761424u, 2213065u}, + {714617923730301059u, 3547994546024681234u, 6637589806521987854u, 3139300390878419734u, 171771u}, + {9457365628836977979u, 13982384345433901046u, 4963127305731747763u, 16432300059463154962u, 3293006u}, + {1110237629845544221u, 7584251391333261233u, 3540901561357423658u, 8779714133936770311u, 2774620u}, + {3434320679018473810u, 4027716600319988629u, 766577161465856715u, 15615623026013944306u, 1202339u}, + {1636656915799734952u, 16896309903503519002u, 10964267460910347775u, 14361640468986122158u, 2583841u}, + {65098303218360892u, 17512187745199214658u, 10019519022899505580u, 6676962119505168342u, 1422u}, + {12903423729542122968u, 13177186009722520425u, 8994010654404547936u, 1945581276971089206u, 2558657u}, + {17909383219068883287u, 7773078405632330412u, 3324636734021595388u, 11864644315017168241u, 243879u}, + {8707045843466621307u, 14917894262607034035u, 13940697120127433303u, 9876389168558723758u, 2112445u}, + {16831990833964305909u, 17765988230789623715u, 5943262002826032014u, 2849213909640366046u, 575483u}, + {6393827511300216638u, 4246359300966514543u, 9832051398685256485u, 6351684065806642871u, 2764476u}, + {13804749599994284588u, 8692531507291289017u, 4055260044886798800u, 8337618901983308992u, 702166u}, + {2259632176673114123u, 2821310865308525327u, 61044854987695231u, 3111429228467780491u, 242650u}, + {3943691030103579828u, 15122955993964388755u, 3088038287537140889u, 17586529050815331235u, 2200893u}, + {2340147814368708203u, 2263357534850494308u, 2293357651514080u, 472944891718715503u, 2106805u}, + {2075392191272589734u, 18188028637913085279u, 11272111392274379617u, 17332686262223861183u, 1491057u}, + {10743012436092375353u, 9235368655243468494u, 2356743029174671741u, 5647997499169378413u, 2046989u}, + {2282257418812430978u, 4324712483525018868u, 9634045206356415828u, 10630226611428102732u, 1924203u}, + {2503529315249290857u, 8288127798239588727u, 14319557739728494075u, 2413395894168712639u, 2146029u}, + {2393396700880550544u, 7992548519913487518u, 9475087152772369455u, 12865838988902327337u, 1758591u}, + {5007165877697508125u, 12069972926419772100u, 18230186557329709600u, 6013220596121186630u, 2899094u}, + {9596645671329245500u, 13034922131439687225u, 17594920194665313859u, 14897343222890002330u, 3008629u}, + {9459590591755456205u, 7844163653201125166u, 8465151732758733118u, 15908170112417229837u, 2018618u}, + {2070725504182777322u, 5873213068653756845u, 1498180459696185374u, 397524915726393220u, 2957445u}, + {17846491985795924139u, 17120770237726050694u, 11167185520269011620u, 12592576594024057724u, 2447758u}, + {15111608291458442635u, 17480305370644111309u, 12332287641017662958u, 11214080253851781818u, 608927u}, + {8682532644998824483u, 2882277178792468521u, 18237518347746214466u, 15215385073745446485u, 2280518u}, + {16931120205497510131u, 16098444668407383444u, 18034709739556973944u, 5518445293999396168u, 2752749u}, + {2260254849645692795u, 16655085182183024605u, 9237918271822297361u, 6535962725234119428u, 1382582u}, + {1543155386430423455u, 11583677248373519096u, 9711693148407288907u, 14148792574284755680u, 2357447u}, + {6907372251897252764u, 2006648250456383899u, 11312281935769148940u, 14743236419362425879u, 1300005u}, + {16862265480964451844u, 11578591152789311187u, 202618291901400628u, 1537190349069265861u, 930062u}, + {2086496536984526118u, 14587173807535405047u, 1186975172046969006u, 12843408355975045410u, 1507008u}, + {17288489082521913609u, 3610677413457944666u, 17280362682115368753u, 5215946174467252631u, 949944u}, + {16303565836085379028u, 7102529822700257949u, 14159022282295463490u, 5782130902102537000u, 2936691u}, + {5048817145539843457u, 261714775068274425u, 17474225394622644981u, 4305570441320445302u, 3675505u}, + {16061689145625431583u, 10033890483123154458u, 15362658442900586942u, 9795576299502481626u, 3574064u}, + {18254704813994209686u, 10117517866369544659u, 7182591230936076531u, 13396584750723303114u, 1107141u}, + {11395163958645332791u, 13507002109576778671u, 7544588652718959663u, 16809842570914304705u, 1255027u}, + {10501228757228747183u, 14519473871331676401u, 6461494844748175813u, 599611930987861536u, 2872125u}, + {13767185576807187388u, 6074180593684517635u, 17025709037907654660u, 15689479261652677088u, 2814212u}, + {2469027993911534493u, 5944307224372220019u, 5995997594762452946u, 4303311112460389790u, 40516u}, + {10300834019797393401u, 1885347307281991249u, 12057965994045875849u, 11385847250578815416u, 2548774u}, + {2359494138721059265u, 4057233137579706830u, 5337273951229460143u, 4298414641303320463u, 3315529u}, + {16165509576852002556u, 5118576263019854483u, 4854543441580360205u, 12959470052019477341u, 1989721u}, + {15905820847040632986u, 15287500031061939667u, 14211675586242484518u, 4864562687565727206u, 1808720u}, + {8285277843201541187u, 16595534627390079697u, 14104725966699523036u, 321595375957274371u, 3876588u}, + {11602612749008398317u, 16781901456885503387u, 4376316258816398669u, 8430191335436449515u, 967384u}, + {7133916633692216761u, 17675965575923246126u, 5846549052943869315u, 4701588705964508616u, 2009777u}, + {2228334483222877773u, 14535998985350702948u, 8903473181767584096u, 3567895954524285331u, 428138u}, + {15728093703523687330u, 2583981555153559659u, 9851600615378742467u, 9663615356764469238u, 2286404u}, + {8778673497059133779u, 6083280545068026978u, 7701480648705086514u, 8184684845386577938u, 3314002u}, + {16811645385041461160u, 11520752313160030868u, 15884586699239636623u, 13103557075803402862u, 2942652u}, + {1411008073079355327u, 4578166949353892581u, 5263381721639558055u, 15906953049789692555u, 1337376u}, + {18311537502287428887u, 13782602732391633516u, 1691422017263194532u, 14220016274181077827u, 1571617u}, + {1432503548939507121u, 3996622073731420349u, 10388484977864615370u, 16241949889334693058u, 1279639u}, + {3326967343446592969u, 6859264658439498984u, 4704651752882753582u, 9967553166615742674u, 3867121u}, + {13598077459860667316u, 16852077325717690390u, 10524978177216629001u, 17148985588345541753u, 2325505u}, + {10013646320090009408u, 650010317407366304u, 3252305484066301494u, 11860343434946299023u, 1222063u}, + {15157921011338445496u, 15711578737804540623u, 13333358842462042063u, 1679867758135635678u, 3640948u}, + {11211137982290625489u, 17312232416953101436u, 12411110469930332752u, 12605185000221013266u, 1338588u}, + {17893983930764097027u, 11336165016708896259u, 9215467139814955818u, 8959834263564387785u, 2429129u}, + {12532915155713145328u, 8084621369275005673u, 17926734960726420849u, 2855055697424049776u, 743463u}, + {8811647380937104381u, 6370970326438554404u, 14704563506719366918u, 14064945311940275541u, 2199848u}, + {2221567149263215581u, 13950347666463136564u, 11872876224212531505u, 18199093744679846993u, 3280592u}, + {6771151975815451163u, 1573214810310483754u, 643490052480895530u, 2150186486333262854u, 1124166u}, + {5081347397332350106u, 5331354196104014827u, 2494278529711975182u, 2686868184051885890u, 1282579u}, + {12219189005255689015u, 12730069424358025221u, 995820807321558089u, 9319089040146886251u, 1002056u}, + {11943393844676323520u, 18180063953031323816u, 11086654542965674065u, 5350746638705281402u, 3216482u}, + {3878539371775032278u, 14940709593466009104u, 13027391616123158391u, 2365176634836134036u, 3019397u}, + {3050705715358029795u, 17066422172702423033u, 15805716137645388358u, 5315902410849842361u, 2789788u}, + {4543492559155005992u, 6264607681916687019u, 7997397180323874118u, 3582284618430277297u, 3700888u}, + {16582290832078584675u, 5484383003181632615u, 9063112358596726885u, 16641515966087172693u, 2493265u}, + {17573202638305255069u, 9625374797047554543u, 5479401186041870922u, 13304589940983193635u, 3903820u}, + {7803153077675663483u, 15554239309238535738u, 14255030563635412200u, 17870238509122618954u, 3829689u}, + {7717330162951746519u, 10349712684249362167u, 2607380474966840708u, 10014593287969194336u, 3424529u}, + {8191931480828952879u, 12966067148707112057u, 1017950370175709403u, 3810166310022842457u, 570604u}, + {16588306208288995839u, 18135166385972831715u, 242362935412008861u, 2676656769168934907u, 3469353u}, + {7317306346839243330u, 7234380301674827377u, 3625880117220784858u, 8710909554120365543u, 2886860u}, + {7309800394298139199u, 12747078431101655956u, 5506930548057920604u, 5889918293379701526u, 1154635u}, + {3709766342475279103u, 4858599021015001951u, 9404919105257516618u, 4632985280660853825u, 1632793u}, + {18173259419737575198u, 256860327653906217u, 10562556099609682303u, 2480077916518879544u, 857563u}, + {17739244624102270682u, 5258560483427471028u, 13491051228868024329u, 1456971128426719220u, 1244735u}, + {9328953322465470358u, 12616982821886231746u, 2904642413146549461u, 1680285972313902515u, 225271u}, + {11206717601626018854u, 12805144562523903265u, 13207692611721521517u, 8723124396753794852u, 2106951u}, + {12008633853133530329u, 18189098504270915239u, 4439719359060927603u, 17692976933888315130u, 923407u}, + {5394891231042971291u, 16705893033029152585u, 15078199675007679817u, 3187568007966678033u, 3846326u}, + {12090973767186782041u, 3158853694473993402u, 14676983131170185902u, 3673831896430019772u, 3829564u}, + {14009866977380679412u, 4446082922315196270u, 13923513823354422590u, 14626276986357166413u, 324637u}, + {2299345895493359689u, 13686330632231641163u, 1201432858329122546u, 9661706111364477258u, 1396908u}, + {18365001295696229482u, 8611853666953967570u, 12788769542414817996u, 16815187824869432661u, 1268393u}, + {12508915185827759544u, 1177979201433546223u, 3178480067020605042u, 5067429320526028024u, 3325896u}, + {14738798278672366563u, 16966510959027899188u, 7516604753487590372u, 11806739785577457191u, 2088564u}, + {5431492175006289860u, 5973981995947092876u, 9938674337321147466u, 8325150531758015541u, 234160u}, + {7077332955622190993u, 14487126151453089208u, 6722327454912913162u, 3823371981927630968u, 792913u}, + {1839775992239978989u, 2936145726778217409u, 11586923404229132407u, 951375389500152411u, 3833038u}, + {10350755594104594168u, 7440713944235555325u, 14890983252275691928u, 10735230989575513429u, 3042718u}, + {9511969974732911809u, 12494359771492111670u, 912112501931052881u, 8342751565331413009u, 1747811u}, + {18218357269134676920u, 8550955780039596767u, 8318108863694875184u, 1905738875535092266u, 2697259u}, + {13699390959254845947u, 145289221206638822u, 319364983584868326u, 10642221971954655219u, 1463303u}, + {12126852489800462036u, 1426881442794938084u, 17764267430116922515u, 10619459510160919971u, 751470u}, + {16368113681662286918u, 8291552673186714822u, 16856551575951027340u, 13128344300291414378u, 1118511u}, + {15134234328391113518u, 13842883246196760271u, 10680261847963347702u, 1605899968123387836u, 1646559u}, + {10819398793046970257u, 16208611365094305863u, 13331040998050392748u, 16315389906652876629u, 210355u}, + {10792941582937904945u, 6028434570085495033u, 7066215498250140616u, 8866964447830151207u, 3495340u}, + {2417676793335125240u, 17191556925039497839u, 17997024395302143935u, 7126121867014502119u, 324399u}, + {5245729520706425490u, 5573373520167810372u, 15664622807919599996u, 12399890286980494163u, 3725417u}, + {16425218301179454775u, 14251854052846635823u, 11678966375759509287u, 4536292656718269135u, 1196620u}, + {11516591863290328247u, 7639906620425662259u, 6880765692952069149u, 14937995713280857732u, 1767196u}, + {17020708407345530126u, 14221728326678256454u, 1078147044089020642u, 12066217231612044250u, 2622317u}, + {4603236651899086241u, 12925489591385771767u, 16178874094078105441u, 2642446608010760737u, 736923u}, + {940350509216923831u, 1781887624874385100u, 16902351408806257111u, 7363468424494126343u, 268114u}, + {12737661767786367060u, 4360651345213142471u, 3986314977046727887u, 9516548250710534539u, 155168u}, + {18202936698205207140u, 4670669837451862940u, 7668053759072433640u, 2380762957152599502u, 3573755u}, + {324009182651181425u, 15666195361078785104u, 14536727603286958584u, 1507076027006461555u, 225646u}, + {6503616262072713250u, 16994654027251241441u, 9046384599355600454u, 1229141534165107204u, 3374177u}, + {4391998603115600551u, 3560476741691136892u, 16751990717903619975u, 2079855213869520815u, 474412u}, + {15638048064313850824u, 1213258723550347331u, 12373533736247799397u, 5268955723598091237u, 3553124u}, + {13488647752317920456u, 9923922801823449234u, 8746332256166176603u, 9288915611213886708u, 1189968u}, + {11751385025743216886u, 9562241299510169318u, 17178991522203218642u, 12199684436850640802u, 956320u}, + {13885329539811591630u, 16186217234869109405u, 4649574209087741095u, 17383521165632886931u, 1642968u}, + {17461056872497285423u, 10394980090947763720u, 4285606967922950511u, 10406600969062438384u, 1400960u}, + {10801431242370886003u, 13133654103114831885u, 9119881084520389321u, 11555058207052574862u, 2028712u}, + {14606383674187539979u, 11303998484105042841u, 17166050356845809124u, 14376884356165980922u, 3867947u}, + {12491658603476324038u, 8719405302964574560u, 3881808767236848628u, 1728675705648899523u, 1880280u}, + {18059063180677457772u, 730776555849588275u, 6667243663271031648u, 14734434229412889245u, 3023017u}, + {15027628917426384811u, 10715424388201579323u, 192486560647829974u, 16773126652463188609u, 2360326u}, + {10233997346506272108u, 2760864687031151191u, 10897883070204478243u, 5303744711194388551u, 3586457u}, + {11059406128662811279u, 964359830230200385u, 10227853764943241736u, 2876404627193298352u, 3071277u}, + {7077175739650364720u, 2784127976911906191u, 13868852205505148196u, 921346192130010309u, 2673872u}, + {9986036868799801791u, 8393917365204534474u, 6061368812765870622u, 16550513268076701442u, 399659u}, + {9540317399580911805u, 9385600054437036306u, 14130213086966097802u, 10816011529529458353u, 2511119u}, + {5507587756123471938u, 5997507157976871910u, 1362783798830436349u, 7612369354330074265u, 2212880u}, + {18373735813776628741u, 13428341831419049019u, 16788166786043667639u, 8471558941075768258u, 211702u}, + {8933320671842075492u, 15693211124594494726u, 10551144526833819559u, 18378591700757075080u, 2678025u}, + {770685607251628344u, 14122887027529298587u, 13346468009990118725u, 5381662818983254986u, 393779u}, + {13888586578198266738u, 14488226378758782498u, 9390349210544851622u, 1376358232536894876u, 480952u}, + {1593062639875062680u, 4961387416681352051u, 14862787198848267874u, 11466029451862638812u, 3429216u}, + {7798107286895553564u, 17404255151159486857u, 11382597904063195712u, 10799839393042761889u, 714976u}, + {11726379923505184986u, 4802119006028223650u, 7728505185644300517u, 8588042680604108337u, 2551818u}, + {15365450167400856675u, 4112703754304720162u, 3500200059256014351u, 263245524270511849u, 1432893u}, + {8275055376518539548u, 12524131761634656495u, 15019651460818893403u, 13429144701773851520u, 2947730u}, + {12377487529108646667u, 6163879987676412623u, 6620226557773571215u, 4666062052764928462u, 3655872u}, + {11616505918399722352u, 15903591806272112628u, 11998087273111033248u, 8786407818405582994u, 3737966u}, + {3719420634760401258u, 4227810175600799479u, 4084774155041239230u, 15633393623137069792u, 3284332u}, + {3404859128413118258u, 17106228298792461088u, 3968822599353582592u, 6833999087055714246u, 546456u}, + {2845013893137901595u, 7314209009899981070u, 14639098912629423004u, 1018886657344533217u, 944384u}, + {4325125997796564454u, 2307960333812683344u, 9921724479864537309u, 9817253600132392074u, 2333197u}, + {15158297319229028849u, 10723714448799208542u, 15388060413594323323u, 2853286065228990008u, 3299513u}, + {4879160243986123423u, 9304485683237780349u, 187290103116338670u, 17714975814024508009u, 1990875u}, + {12524346298034690228u, 9033282296082916335u, 11031374483215183147u, 3711662475257047053u, 387822u}, + {8830891135026693770u, 6689889334169248791u, 18149150233531119755u, 11392253914884430548u, 2910930u}, + {4673188191423045559u, 16194385616293292693u, 17893220537645362881u, 8124147724366666091u, 722229u}, + {4806521806832437466u, 11777717810954407355u, 2227225863110095805u, 13416035272704354996u, 2629848u}, + {18364328065831691289u, 2226670130382628504u, 11115811781474633692u, 13667397419593172093u, 2609196u}, + {12572633006869290162u, 16362914198690512488u, 15337228622159128805u, 13162613299420428438u, 1348832u}, + {530059234537237131u, 17506034021523293889u, 6377794835788439021u, 241054353978826909u, 2210140u}, + {4761782914287340734u, 13300799873810327326u, 7146511216770700338u, 2706900866591456414u, 1123513u}, + {13591117689223913010u, 12461334386969594652u, 1036770148847208251u, 3551547267339855370u, 230270u}, + {8427559367261534950u, 16398404545484629131u, 14581628963979443983u, 18162761432867240237u, 2907795u}, + {18404963147594106609u, 621959570725912273u, 9379928775179982567u, 12015199978642611074u, 69u}, + {3195789833192781037u, 3740420747707503264u, 11098900071914976719u, 1284840541064u, 0u}, + {16225024713921676999u, 3514771470453146414u, 15505245902150421014u, 1284u, 0u}, + {7391878619112761931u, 3960441394400666268u, 23701124636545u, 0u, 0u}, + {5867411013787967946u, 2299138451806825241u, 23701u, 0u, 0u}, + {16411626537853442259u, 437208580429441u, 0u, 0u, 0u}, + {10707033367384924379u, 437208u, 0u, 0u, 0u}, + {8065074790011774u, 0u, 0u, 0u, 0u}, + {8065075u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2981726u}, + {18434541478717816453u, 1325454934945920539u, 9256008311617887926u, 9062202391160917686u, 28076u}, + {3475142787575574686u, 1236063896058074506u, 9815300430213501214u, 15348785449927466228u, 2523080u}, + {12360867653534364352u, 677551530501074193u, 7724823269300122838u, 5955265337496371297u, 198594u}, + {766039004974216405u, 7533311856413756135u, 3504866642781123182u, 17009255611598832508u, 172394u}, + {3392779016848650897u, 10913126526063869353u, 740105733195911189u, 1660504787879441224u, 555373u}, + {9174545888314431151u, 14076383186767761830u, 12711171579013488713u, 12692381375932269818u, 113094u}, + {6396727092003485876u, 550072053346322581u, 17759228806598715715u, 10090149394076564523u, 1518783u}, + {13662932913126400654u, 2239673265946028757u, 158048972417905262u, 12998383538221678688u, 712180u}, + {18445916880027987172u, 10252684678674979400u, 12757059256267334064u, 5705687344189104950u, 1541758u}, + {5678741489591895950u, 5375619417691127757u, 1281788220960064167u, 3703377716889606371u, 139707u}, + {1394929455536692491u, 11527243002268889258u, 4007054930936141527u, 16503766177663180801u, 2468024u}, + {17331465918791649493u, 5466672086544914584u, 1488792169309214833u, 9989475000833594288u, 672716u}, + {1223822984738165159u, 10806448320489436519u, 10302568252567759231u, 1165330934482611571u, 631038u}, + {17222382739300884148u, 5384222666086220280u, 9505034995037189656u, 5920363308762207214u, 2990119u}, + {16716856098086139071u, 2367653331622434455u, 9789493730651313414u, 14682849555562670647u, 417620u}, + {5618343877839714229u, 17970517138792680018u, 9380991487313933740u, 1376798030663542922u, 2622151u}, + {10689474731011360914u, 6308003389999766673u, 2637680354038513993u, 14459888957382006805u, 2490485u}, + {12770348909972014617u, 17658275506817542073u, 707996462597054590u, 9845774143032500786u, 99658u}, + {11301462277792531470u, 4462393105202734299u, 9729700371826776446u, 9801671164624871185u, 1262911u}, + {1661436471874578739u, 11685455689314737647u, 3058200135264248995u, 4707040218271859608u, 3440775u}, + {2626211581253220055u, 4026812142112514874u, 13528879147778885299u, 6188366593771132760u, 119744u}, + {13608628738515656385u, 9223606738806437756u, 5899989371911689144u, 15566649205303163046u, 3801667u}, + {13505729601321452838u, 4681205017662986817u, 4916184916119086800u, 718646740110467799u, 1442924u}, + {4503013772284444586u, 2996439822314419630u, 3070146647741237467u, 10763198762115722485u, 3424485u}, + {8346469574154228247u, 10854495629970791838u, 18104377026223947044u, 10295348962528222927u, 2562516u}, + {11637552597892394794u, 15355630042321333101u, 16547629339737992598u, 13305867390110875091u, 2710860u}, + {10122918761043339679u, 8094464777293131000u, 3774662274065579356u, 13957122203265615313u, 1036262u}, + {1059410836949459509u, 18057381940025386057u, 11848614981689911175u, 4558744098253892578u, 2094870u}, + {3440538117164202674u, 15367022223708564293u, 11948002228356987689u, 14882507907129590842u, 771731u}, + {7737461809819789667u, 5756098000019822666u, 1987786805493478263u, 7940571283305328813u, 679493u}, + {4742088458098632117u, 8778102302103639732u, 12203249871584310800u, 228707223525232215u, 1870509u}, + {14678657845388294555u, 17619801338087289784u, 3853981572137696178u, 2628578186404683299u, 61311u}, + {1255364258120253805u, 13354265418885244417u, 13351972419490830332u, 14556764986615924464u, 3720226u}, + {3433953810317462503u, 9003361644351651031u, 18190512908919594776u, 1942123516461251512u, 882297u}, + {17855205528083298036u, 5619479617712093997u, 13344254113192736782u, 9239647545752901040u, 471151u}, + {14584203316167085900u, 7535924363038379263u, 13029508234689263543u, 17878974532562848002u, 1416744u}, + {16331940854922946252u, 770226079012611855u, 10284176159290712073u, 9681851932947281521u, 1596910u}, + {12516627933512613730u, 16222084614085413194u, 339200234497817364u, 10117520965070510493u, 3794237u}, + {14430179140578810095u, 1496088588228415518u, 1205448331994774053u, 6699289980500890585u, 1878273u}, + {6081624684932448027u, 15805260731343137663u, 2643967272944452158u, 11780035856213102209u, 2864144u}, + {8179882508686158091u, 17450722584112010827u, 3998496196450441558u, 12302625129586035746u, 1342273u}, + {17259278079078770147u, 10222938064688575054u, 10372584163481313021u, 2474718776100225294u, 1381310u}, + {10719565588094164200u, 17881821493346010411u, 15549171103944981552u, 3412187594313787508u, 519784u}, + {5611952517742741128u, 6464476715924691582u, 16435282559901607109u, 7575635699816229919u, 2458085u}, + {4619912349559011197u, 229255643750449033u, 4524615374937965u, 8331966986843772683u, 1149060u}, + {8202984508526084797u, 3502576508902292663u, 4125681513578326358u, 14288600043587035012u, 3770606u}, + {11452101004768737734u, 13222037446147214740u, 3092307181775083191u, 1726880081045736249u, 1364055u}, + {14394422745565055667u, 15503116983986755642u, 8767721394212368863u, 17102812162203264795u, 1261884u}, + {5685947558538843862u, 13382572111570364033u, 639536432505398826u, 7661382636321882282u, 3493177u}, + {8365599051855783649u, 8291852979689181409u, 13045653882309012737u, 14043610993142570730u, 2777052u}, + {14301020476213168677u, 6181875261903383425u, 16175705693283511927u, 15687725487797356362u, 2704335u}, + {1789236218793071512u, 11000802146854087255u, 1232458753033535764u, 6679184842811670920u, 475834u}, + {913052276652885056u, 2023548584944775204u, 10981691038343146545u, 6782191434263980337u, 1990242u}, + {9807090255698682975u, 13988783796129786034u, 12752444648040241022u, 6305724172900669711u, 3274149u}, + {13755964071204873966u, 13521370116386360307u, 11338189708331894777u, 15624837707160350403u, 2292852u}, + {4982578094757019518u, 1477741693679662459u, 40568736541134334u, 10995049963432777072u, 419196u}, + {2120170097180703686u, 9518373513257413221u, 11658301819361995786u, 8366413720723413288u, 2672188u}, + {7557025497851265731u, 6132710871697444746u, 683804138614072264u, 6246246263781053996u, 581420u}, + {17140601448519792726u, 3023002987658114648u, 5195132848543234517u, 6279735993485312903u, 2804586u}, + {5102405288399142717u, 4188757169584314601u, 255005563214060771u, 3438442406237057762u, 2316909u}, + {5737868474539708184u, 6692730865781837884u, 14058866978040729594u, 11211666506682346809u, 2430527u}, + {3467653710379624857u, 13367253243951638776u, 791889978669207115u, 9196149763561755434u, 530236u}, + {12683279809553682670u, 558421233472394318u, 6869877583609206058u, 11755168965169070789u, 2564568u}, + {1046147298479430064u, 12540873045324236857u, 9920892819085496858u, 9054507196051786122u, 2027545u}, + {13152405614945294474u, 17220506550724941283u, 16289376002880475017u, 11782789440949690196u, 867703u}, + {855966182148813630u, 9899211338108626862u, 286814494152966096u, 16517195341641276784u, 2204626u}, + {12583121771147751382u, 9091376295747582154u, 10740661009389977825u, 8255233908441226039u, 3211207u}, + {10681137252376679859u, 7170143195743158515u, 10281967067165317760u, 7481168507858515944u, 1843835u}, + {17150109512282048815u, 14061160247285622650u, 17753207454862459078u, 16319029012412030294u, 2772545u}, + {8143888550188490114u, 11849998442441705144u, 3637938015016106289u, 11364186708321558013u, 55442u}, + {11964468341814776616u, 17663658567428150752u, 5206635669252667384u, 7639127703769482529u, 772190u}, + {9936481854002130306u, 7242060547758176309u, 7966070908938820089u, 3689181694879730218u, 2209201u}, + {11487223570325089918u, 5193847430634202623u, 356926686237575529u, 3211286706812394094u, 52772u}, + {4986082309779497178u, 9575473623919511725u, 4985668777987299946u, 13619858747957924411u, 930919u}, + {5596895283372116134u, 8459790953337513962u, 714617923730301058u, 3547994546024681234u, 174074u}, + {13148815163676279706u, 15511257361363540511u, 9457365628836977978u, 13982384345433901046u, 986841u}, + {4763640550927807362u, 14237544074856315775u, 1110237629845544220u, 7584251391333261233u, 3499204u}, + {4644803960888649204u, 16058403033378123818u, 3434320679018473809u, 4027716600319988629u, 1888295u}, + {9670434528829617308u, 12513455720447696371u, 1636656915799734951u, 16896309903503519002u, 118849u}, + {14290522988867978259u, 9571578822588885127u, 65098303218360891u, 17512187745199214658u, 3399184u}, + {15342782312785135454u, 15181672651184060868u, 12903423729542122967u, 13177186009722520425u, 3410674u}, + {7483221397753795264u, 9838775928668064992u, 17909383219068883286u, 7773078405632330412u, 106918u}, + {1663334951616171825u, 7044473737917487774u, 8707045843466621306u, 14917894262607034035u, 2158651u}, + {15055983963195421819u, 7297121006039498255u, 16831990833964305908u, 17765988230789623715u, 3633098u}, + {16693499695570580725u, 8833224071075726450u, 6393827511300216637u, 4246359300966514543u, 2473077u}, + {7040521640534883712u, 4728605863078128582u, 13804749599994284587u, 8692531507291289017u, 599818u}, + {16057943370212272690u, 14550811412746626825u, 2259632176673114122u, 2821310865308525327u, 3410837u}, + {5429762996982709492u, 1491257421177725933u, 3943691030103579827u, 15122955993964388755u, 1603107u}, + {5613741145651813563u, 15285925819188858600u, 2340147814368708202u, 2263357534850494308u, 1600008u}, + {6059914961270078292u, 8931942604738239025u, 2075392191272589733u, 18188028637913085279u, 650337u}, + {17328866389835023775u, 15984311625160235712u, 10743012436092375352u, 9235368655243468494u, 68133u}, + {3383409138886446031u, 116090984250364241u, 2282257418812430977u, 4324712483525018868u, 81558u}, + {12648874289035472424u, 15167837399205850129u, 2503529315249290856u, 8288127798239588727u, 3589423u}, + {2346959799831942778u, 9897666513473504904u, 2393396700880550543u, 7992548519913487518u, 1970793u}, + {4487818495502629500u, 4303334663160759169u, 5007165877697508124u, 12069972926419772100u, 3499544u}, + {4526546496042293640u, 7301180504479684147u, 9596645671329245499u, 13034922131439687225u, 3357963u}, + {12645261126416892291u, 147116978699918910u, 9459590591755456204u, 7844163653201125166u, 1981268u}, + {17946438835391803620u, 1550092227085971838u, 2070725504182777321u, 5873213068653756845u, 2337564u}, + {8122364078342875889u, 8624259145547531060u, 17846491985795924138u, 17120770237726050694u, 2296752u}, + {3860946412983000533u, 4049734635086376104u, 15111608291458442634u, 17480305370644111309u, 3904808u}, + {11616514635193128101u, 16276455602312185484u, 8682532644998824482u, 2882277178792468521u, 1604684u}, + {4781946452578213613u, 6190069184478319315u, 16931120205497510130u, 16098444668407383444u, 530226u}, + {9159147027366211769u, 3815242130744384347u, 2260254849645692794u, 16655085182183024605u, 2952401u}, + {6754784979946423726u, 2990407773029841867u, 1543155386430423454u, 11583677248373519096u, 3311869u}, + {2807039779625826364u, 5730552143239940059u, 6907372251897252763u, 2006648250456383899u, 2676684u}, + {15667167926902953235u, 4832594103922189170u, 16862265480964451843u, 11578591152789311187u, 1709776u}, + {3701284353440114247u, 13605836807559738893u, 2086496536984526117u, 14587173807535405047u, 422714u}, + {12197580082039312981u, 651975335126833622u, 17288489082521913608u, 3610677413457944666u, 2216413u}, + {10372233314608114952u, 3294979415616911306u, 16303565836085379027u, 7102529822700257949u, 2468836u}, + {8379281098855260148u, 9469817349687790081u, 5048817145539843456u, 261714775068274425u, 969543u}, + {8359221498614001734u, 3131313860480746002u, 16061689145625431582u, 10033890483123154458u, 1596742u}, + {16047527233022311712u, 15008493486128422139u, 18254704813994209685u, 10117517866369544659u, 1747301u}, + {13431633294014141091u, 11383649682215752697u, 11395163958645332790u, 13507002109576778671u, 1946005u}, + {2303570254648237714u, 1146435751454644822u, 10501228757228747182u, 14519473871331676401u, 1156989u}, + {1333163425769524395u, 13865074266343946319u, 13767185576807187387u, 6074180593684517635u, 1929040u}, + {46856778868977869u, 9758655741094266143u, 2469027993911534492u, 5944307224372220019u, 642382u}, + {2658197053270832007u, 2067204648227469823u, 10300834019797393400u, 1885347307281991249u, 1193049u}, + {6176203657230312909u, 2445505671846195050u, 2359494138721059264u, 4057233137579706830u, 134825u}, + {18037472699269763545u, 15926028669604311608u, 16165509576852002555u, 5118576263019854483u, 612037u}, + {14823377214521436803u, 3401449665806070703u, 15905820847040632985u, 15287500031061939667u, 1208234u}, + {7384882450213487126u, 1020355106973971445u, 8285277843201541186u, 16595534627390079697u, 3498700u}, + {8272849193286988390u, 18405953490535987592u, 11602612749008398316u, 16781901456885503387u, 1184763u}, + {883070882227218264u, 13594634943560617786u, 7133916633692216760u, 17675965575923246126u, 2841833u}, + {15283123223200297443u, 514576071601435396u, 2228334483222877772u, 14535998985350702948u, 3359170u}, + {16342774056567289494u, 10863163254467074215u, 15728093703523687329u, 2583981555153559659u, 1650299u}, + {15841275911064916629u, 5850783657106788928u, 8778673497059133778u, 6083280545068026978u, 3447484u}, + {5908267239946698627u, 17225697457817193763u, 16811645385041461159u, 11520752313160030868u, 2089177u}, + {15617513574602379683u, 13756761955644901326u, 1411008073079355326u, 4578166949353892581u, 1062641u}, + {3363476286505317475u, 14907395304201165794u, 18311537502287428886u, 13782602732391633516u, 1813566u}, + {13042807331061450324u, 11481305878243901417u, 1432503548939507120u, 3996622073731420349u, 747732u}, + {2462222583469995172u, 15424409170948827182u, 3326967343446592968u, 6859264658439498984u, 3396692u}, + {3216451886159794026u, 8873892287696748757u, 13598077459860667315u, 16852077325717690390u, 80879u}, + {13300161897323700020u, 870453512796028835u, 10013646320090009407u, 650010317407366304u, 163890u}, + {15269930880572378409u, 10564090823288661197u, 15157921011338445495u, 15711578737804540623u, 997999u}, + {8033618099646580515u, 14584342803154656586u, 11211137982290625488u, 17312232416953101436u, 1253486u}, + {2085431468493294969u, 13308987919414353935u, 17893983930764097026u, 11336165016708896259u, 768202u}, + {2739785085886040378u, 9054098860478789442u, 12532915155713145327u, 8084621369275005673u, 1620993u}, + {5919624555129997446u, 14612748869056793667u, 8811647380937104380u, 6370970326438554404u, 2343612u}, + {5824454725027309029u, 10810535740740621790u, 2221567149263215580u, 13950347666463136564u, 3252895u}, + {16050699701533341508u, 16274974298630379565u, 6771151975815451162u, 1573214810310483754u, 3857040u}, + {13680677657561613724u, 9631928069010563378u, 5081347397332350105u, 5331354196104014827u, 2598446u}, + {12597296040757772392u, 16660322888888564874u, 12219189005255689014u, 12730069424358025221u, 1168241u}, + {12082233873067759928u, 9307582288761810190u, 11943393844676323519u, 18180063953031323816u, 1343739u}, + {4210674732954955712u, 11659894723426518232u, 3878539371775032277u, 14940709593466009104u, 3297599u}, + {156059311500304950u, 16934820994270939819u, 3050705715358029794u, 17066422172702423033u, 3667562u}, + {5064231191846840486u, 12595278117784204493u, 4543492559155005991u, 6264607681916687019u, 433998u}, + {5129372147209014759u, 1626260967190048193u, 16582290832078584674u, 5484383003181632615u, 2261363u}, + {7966338312863649062u, 9830547394430437762u, 17573202638305255068u, 9625374797047554543u, 3353252u}, + {6954607913532780054u, 13656151727418028661u, 7803153077675663482u, 15554239309238535738u, 2465298u}, + {2099481300910817146u, 3935981390835189134u, 7717330162951746518u, 10349712684249362167u, 3673158u}, + {7505849968572225612u, 10535976641773538338u, 8191931480828952878u, 12966067148707112057u, 2640589u}, + {3374830396944974688u, 5290057183961057906u, 16588306208288995838u, 18135166385972831715u, 1551541u}, + {4197222546812263988u, 6160308155834089739u, 7317306346839243329u, 7234380301674827377u, 3520506u}, + {15394466316450578138u, 13848917044924817632u, 7309800394298139198u, 12747078431101655956u, 1666430u}, + {17594039950095884347u, 14214805952365934411u, 3709766342475279102u, 4858599021015001951u, 2205676u}, + {2361397149026397220u, 11472144043852687185u, 18173259419737575197u, 256860327653906217u, 3817135u}, + {4387566362881303097u, 10301961087969924956u, 17739244624102270681u, 5258560483427471028u, 374259u}, + {9639093104562777560u, 15940994318013582773u, 9328953322465470357u, 12616982821886231746u, 2762027u}, + {9623888731499686604u, 14267693341566403254u, 11206717601626018853u, 12805144562523903265u, 1658005u}, + {17007086794673221723u, 6817001167342597634u, 12008633853133530328u, 18189098504270915239u, 3284525u}, + {636782839916649382u, 9177715466645630297u, 5394891231042971290u, 16705893033029152585u, 3273051u}, + {2665820023275265951u, 2113460190452749576u, 12090973767186782040u, 3158853694473993402u, 2741388u}, + {9191628439596698666u, 3987459269132961093u, 14009866977380679411u, 4446082922315196270u, 3656220u}, + {11603398802573217825u, 3800177797908164337u, 2299345895493359688u, 13686330632231641163u, 2005772u}, + {16528636602432211169u, 1118852733286124666u, 18365001295696229481u, 8611853666953967570u, 1358380u}, + {3517173599807896654u, 12523935079455491583u, 12508915185827759543u, 1177979201433546223u, 1787652u}, + {2070719908876905996u, 13168157042933205809u, 14738798278672366562u, 16966510959027899188u, 3537712u}, + {1211982096690225356u, 9025679068548238682u, 5431492175006289859u, 5973981995947092876u, 192432u}, + {14589370398559605178u, 2602438384085957613u, 7077332955622190992u, 14487126151453089208u, 2918778u}, + {10649833332604028188u, 883080468863725783u, 1839775992239978988u, 2936145726778217409u, 1018161u}, + {2625195838725942173u, 6262934287791442827u, 10350755594104594167u, 7440713944235555325u, 1539350u}, + {11505741548413126121u, 16981020527365191628u, 9511969974732911808u, 12494359771492111670u, 2610741u}, + {16140547119876312874u, 10675489121993625781u, 18218357269134676919u, 8550955780039596767u, 63644u}, + {1414729905939312775u, 3648914576978752162u, 13699390959254845946u, 145289221206638822u, 3132648u}, + {15928290128716508192u, 7646134581110144528u, 12126852489800462035u, 1426881442794938084u, 267221u}, + {1865250069213013514u, 2879344081310345692u, 16368113681662286917u, 8291552673186714822u, 424204u}, + {5484017421208222228u, 13208243099432870826u, 15134234328391113517u, 13842883246196760271u, 3670582u}, + {2625974193926316436u, 14505575909580343878u, 10819398793046970256u, 16208611365094305863u, 2583342u}, + {10467098268979730752u, 8412837169304718166u, 10792941582937904944u, 6028434570085495033u, 2268668u}, + {1083713869208429140u, 9416857730247463619u, 2417676793335125239u, 17191556925039497839u, 1351933u}, + {12403063047131787915u, 4508891749407683968u, 5245729520706425489u, 5573373520167810372u, 3063306u}, + {8829349595843402833u, 1900386844056150803u, 16425218301179454774u, 14251854052846635823u, 97667u}, + {117459780845903682u, 8501512094307888665u, 11516591863290328246u, 7639906620425662259u, 1430187u}, + {1355187415608129450u, 1320990942062059365u, 17020708407345530125u, 14221728326678256454u, 1473444u}, + {9606367267824808635u, 16680177849093924286u, 4603236651899086240u, 12925489591385771767u, 2846321u}, + {3702381338355888947u, 18091922591445404726u, 940350509216923830u, 1781887624874385100u, 2016383u}, + {10390954537738442558u, 8273901129574831817u, 12737661767786367059u, 4360651345213142471u, 3197519u}, + {12553045526615432957u, 4597442539285470866u, 18202936698205207139u, 4670669837451862940u, 1609902u}, + {14901175134682770800u, 12030145443338835364u, 324009182651181424u, 15666195361078785104u, 3313290u}, + {13564920481980050316u, 15608891959925831589u, 6503616262072713249u, 16994654027251241441u, 1607580u}, + {12873830498521464378u, 16839449486684451302u, 4391998603115600550u, 3560476741691136892u, 3270887u}, + {11601777282111108594u, 10627159943651020875u, 15638048064313850823u, 1213258723550347331u, 2820683u}, + {12651750107761443739u, 7019579507090263348u, 13488647752317920455u, 9923922801823449234u, 2745139u}, + {7102104874098104598u, 4144890853067097954u, 11751385025743216885u, 9562241299510169318u, 2456594u}, + {11397825277706991002u, 7697376888078018956u, 13885329539811591629u, 16186217234869109405u, 1012999u}, + {17238855046296666491u, 864352693738991770u, 17461056872497285422u, 10394980090947763720u, 1039315u}, + {10846985882467079536u, 5512801756553429383u, 10801431242370886002u, 13133654103114831885u, 3415985u}, + {13473976609243179299u, 13862475862340089596u, 14606383674187539978u, 11303998484105042841u, 23658u}, + {2355171608589129863u, 2120399417536181736u, 12491658603476324037u, 8719405302964574560u, 552976u}, + {12737723676474299529u, 14294493642979809128u, 18059063180677457771u, 730776555849588275u, 2759320u}, + {499651916919130155u, 6883035309171449345u, 15027628917426384810u, 10715424388201579323u, 1229274u}, + {3169964078436371255u, 3368075198642367590u, 10233997346506272107u, 2760864687031151191u, 1496801u}, + {579823486237560376u, 1774558687002997755u, 11059406128662811278u, 964359830230200385u, 2490380u}, + {10504941928421491853u, 5334368910795836908u, 7077175739650364719u, 2784127976911906191u, 1910172u}, + {8167757486676570120u, 2363946698158641724u, 9986036868799801790u, 8393917365204534474u, 981898u}, + {17526714861023357767u, 11924625840699328008u, 9540317399580911804u, 9385600054437036306u, 906764u}, + {18257726797966878648u, 4548426315752136399u, 5507587756123471937u, 5997507157976871910u, 1389369u}, + {11723646975043308132u, 12384955099424448558u, 18373735813776628740u, 13428341831419049019u, 3074429u}, + {7253083541313362450u, 17888768225731537210u, 8933320671842075491u, 15693211124594494726u, 3884489u}, + {3214010648839940262u, 6075595499217753660u, 770685607251628343u, 14122887027529298587u, 252075u}, + {11825798480085649313u, 16726882833127360730u, 13888586578198266737u, 14488226378758782498u, 3332350u}, + {7187596935871058393u, 5388019196404464956u, 1593062639875062679u, 4961387416681352051u, 2080312u}, + {2383393644995999907u, 4380758004711712275u, 7798107286895553563u, 17404255151159486857u, 2510892u}, + {6202110928415413848u, 181575493709185853u, 11726379923505184985u, 4802119006028223650u, 293867u}, + {12105027309286092918u, 17857255068777973292u, 15365450167400856674u, 4112703754304720162u, 3153293u}, + {3597131265826198444u, 10744547276321403086u, 8275055376518539547u, 12524131761634656495u, 2113353u}, + {16072058667760132274u, 2506127344700177893u, 12377487529108646666u, 6163879987676412623u, 2760439u}, + {15665354735905990917u, 12995447454617164657u, 11616505918399722351u, 15903591806272112628u, 2627548u}, + {3011601599634376777u, 14866583155002109996u, 3719420634760401257u, 4227810175600799479u, 1549244u}, + {2556227236578645537u, 17814917001908718329u, 3404859128413118257u, 17106228298792461088u, 1972814u}, + {9636673424864545878u, 6197988871309714215u, 2845013893137901594u, 7314209009899981070u, 114780u}, + {13442712771028838714u, 677556184042505743u, 4325125997796564453u, 2307960333812683344u, 3208725u}, + {4984647007472099186u, 2438695667500111157u, 15158297319229028848u, 10723714448799208542u, 490929u}, + {14538009261935049100u, 147857001869439079u, 4879160243986123422u, 9304485683237780349u, 1413964u}, + {11638916353426559755u, 3971380900565271922u, 12524346298034690227u, 9033282296082916335u, 3284627u}, + {11420606273305070829u, 11378403675418494147u, 8830891135026693769u, 6689889334169248791u, 2899403u}, + {5610127766520010465u, 14516679888452185771u, 4673188191423045558u, 16194385616293292693u, 1752611u}, + {3275587668249202120u, 10151225975233105003u, 4806521806832437465u, 11777717810954407355u, 3520529u}, + {3610015034906903839u, 11140973240548894001u, 18364328065831691288u, 2226670130382628504u, 316606u}, + {2163954512778246522u, 9754492326679472945u, 12572633006869290161u, 16362914198690512488u, 3691505u}, + {9421381769535914157u, 530381699252248966u, 530059234537237130u, 17506034021523293889u, 2287805u}, + {3312605620390140545u, 2401873697232291341u, 4761782914287340733u, 13300799873810327326u, 3655290u}, + {4828109956274340888u, 10931573541707301851u, 13591117689223913009u, 12461334386969594652u, 2240541u}, + {18223989369011169681u, 12531027050707814470u, 8427559367261534949u, 16398404545484629131u, 2466495u}, + {11846246526433894334u, 708859780113050894u, 18404963147594106608u, 621959570725912273u, 3549865u}, + {3447474195956473524u, 17261415624970776659u, 3195789833192781036u, 3740420747707503264u, 3036143u}, + {4584446581898186670u, 5975082455206458759u, 16225024713921676998u, 3514771470453146414u, 3758458u}, + {5858329512852352033u, 13880748248251095144u, 7391878619112761930u, 3960441394400666268u, 3542795u}, + {2428044430419004223u, 13910884111654169873u, 5867411013787967945u, 2299138451806825241u, 23701u}, + {9249713713118916373u, 13813402643114925011u, 16411626537853442258u, 437208580429441u, 0u}, + {7699487163811386042u, 12709233245113008371u, 10707033367384924378u, 437208u, 0u}, + {13926518256030955772u, 513788062702692973u, 8065074790011773u, 0u, 0u}, + {16488956846596042133u, 14573144992262313621u, 8065074u, 0u, 0u}, + {10185797813483916202u, 148774370586673980u, 0u, 0u, 0u}, + {10822224773950393825u, 148774370u, 0u, 0u, 0u}, + {2744402738939596879u, 0u, 0u, 0u, 0u}, + {2744402739u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1540556u}, + {904078173679462098u, 14163586007945680625u, 18434541478717816452u, 1325454934945920539u, 600908u}, + {1004820142061437307u, 3365784157202451710u, 3475142787575574685u, 1236063896058074506u, 1573892u}, + {8384868608267773599u, 390759836496135392u, 12360867653534364351u, 677551530501074193u, 2131654u}, + {3732543719049777218u, 17274240668129691060u, 766039004974216404u, 7533311856413756135u, 1758024u}, + {5872705225677787688u, 6827204710132356294u, 3392779016848650896u, 10913126526063869353u, 1363511u}, + {3398813597577870092u, 4671773711530531159u, 9174545888314431150u, 14076383186767761830u, 2475715u}, + {9474518539412297291u, 2192201293617057759u, 6396727092003485875u, 550072053346322581u, 319181u}, + {16838702129160675614u, 9409025734555220657u, 13662932913126400653u, 2239673265946028757u, 1111650u}, + {4584098874163625178u, 12973306701605360937u, 18445916880027987171u, 10252684678674979400u, 2350412u}, + {3405247285666595494u, 9028158329203638978u, 5678741489591895949u, 5375619417691127757u, 3799345u}, + {3805192046640300306u, 14535989716437370699u, 1394929455536692490u, 11527243002268889258u, 3380137u}, + {13274663295620744794u, 772602967433318758u, 17331465918791649492u, 5466672086544914584u, 3787487u}, + {16651958640706190201u, 6524028765430487370u, 1223822984738165158u, 10806448320489436519u, 2816795u}, + {14715570640739884941u, 16827735739772550321u, 17222382739300884147u, 5384222666086220280u, 3350744u}, + {4056516088574296926u, 4312477835684450682u, 16716856098086139070u, 2367653331622434455u, 1527436u}, + {3387171560428857677u, 5884053257383498298u, 5618343877839714228u, 17970517138792680018u, 2113798u}, + {16593140744617817791u, 7780711292102017198u, 10689474731011360913u, 6308003389999766673u, 225783u}, + {4264999070597363906u, 10120336286803155330u, 12770348909972014616u, 17658275506817542073u, 3625564u}, + {5818774878638668005u, 15060212740157368478u, 11301462277792531469u, 4462393105202734299u, 657322u}, + {15106522733450532689u, 10280176519824610799u, 1661436471874578738u, 11685455689314737647u, 3450173u}, + {3939605605646977783u, 6331811303613277813u, 2626211581253220054u, 4026812142112514874u, 12723u}, + {7698885683964010561u, 16201980564745474580u, 13608628738515656384u, 9223606738806437756u, 3768632u}, + {7891556450890197015u, 14106562268275389506u, 13505729601321452837u, 4681205017662986817u, 2281078u}, + {15507837186870087669u, 17748141484702323646u, 4503013772284444585u, 2996439822314419630u, 2485887u}, + {10483340713805471300u, 13369981288647878079u, 8346469574154228246u, 10854495629970791838u, 399122u}, + {534901262959620637u, 12903130144468328792u, 11637552597892394793u, 15355630042321333101u, 1301814u}, + {12965527977456514254u, 7556103540365421774u, 10122918761043339678u, 8094464777293131000u, 2330136u}, + {18030055712988907024u, 17750816569637202056u, 1059410836949459508u, 18057381940025386057u, 1016693u}, + {12820651399067426396u, 17109588091600588497u, 3440538117164202673u, 15367022223708564293u, 3444947u}, + {16084365219378242924u, 976994794358258557u, 7737461809819789666u, 5756098000019822666u, 3205629u}, + {5508420872970120702u, 8024402774543949863u, 4742088458098632116u, 8778102302103639732u, 2046344u}, + {9556729334178466681u, 5990688834177661958u, 14678657845388294554u, 17619801338087289784u, 1279928u}, + {9866761533817578658u, 705415784900895178u, 1255364258120253804u, 13354265418885244417u, 3698212u}, + {6729843488480112948u, 10748887298434761743u, 3433953810317462502u, 9003361644351651031u, 3851350u}, + {9568062572236918676u, 15175106994976934272u, 17855205528083298035u, 5619479617712093997u, 2273278u}, + {17934506629697502338u, 11083171959437796479u, 14584203316167085899u, 7535924363038379263u, 2691539u}, + {7361784473413185569u, 6340066462196931235u, 16331940854922946251u, 770226079012611855u, 494719u}, + {13889106192676433855u, 15167923773085578715u, 12516627933512613729u, 16222084614085413194u, 2978124u}, + {12719995684423868506u, 5851745843582434137u, 14430179140578810094u, 1496088588228415518u, 1336151u}, + {4307749082520391479u, 6143472604565925u, 6081624684932448026u, 15805260731343137663u, 693066u}, + {13010901898796067300u, 8587430311694141554u, 8179882508686158090u, 17450722584112010827u, 3405332u}, + {12021938255506228387u, 874152730332388204u, 17259278079078770146u, 10222938064688575054u, 625485u}, + {15063930794007491050u, 2293180611553330234u, 10719565588094164199u, 17881821493346010411u, 2783734u}, + {8681552403417814134u, 13305545726232293467u, 5611952517742741127u, 6464476715924691582u, 709223u}, + {1173358642600918118u, 5273856389088123798u, 4619912349559011196u, 229255643750449033u, 2375053u}, + {15198679563144364989u, 10570089358376697019u, 8202984508526084796u, 3502576508902292663u, 1924336u}, + {5923466083595497864u, 11493639034952884351u, 11452101004768737733u, 13222037446147214740u, 581905u}, + {12359672694348336816u, 9630330336384771909u, 14394422745565055666u, 15503116983986755642u, 2814437u}, + {2832358642448155239u, 12707287035643183412u, 5685947558538843861u, 13382572111570364033u, 283500u}, + {11702445397231006714u, 14942733195818118124u, 8365599051855783648u, 8291852979689181409u, 3088879u}, + {343079567748043648u, 10383458566950489949u, 14301020476213168676u, 6181875261903383425u, 2604679u}, + {13794983408015568891u, 9897344133389693923u, 1789236218793071511u, 11000802146854087255u, 321788u}, + {3203775682346727195u, 208981679322129673u, 913052276652885055u, 2023548584944775204u, 520989u}, + {1039284417674975256u, 2325483313178186412u, 9807090255698682974u, 13988783796129786034u, 2526192u}, + {14774918412498352773u, 9077079581901383310u, 13755964071204873965u, 13521370116386360307u, 1983537u}, + {7945582581033035477u, 4460052850434627212u, 4982578094757019517u, 1477741693679662459u, 367062u}, + {12084066183504888038u, 2000835932529550653u, 2120170097180703685u, 9518373513257413221u, 423672u}, + {12621068634950111523u, 14849725882083644179u, 7557025497851265730u, 6132710871697444746u, 3721070u}, + {2890471162310541348u, 901182234177056317u, 17140601448519792725u, 3023002987658114648u, 510481u}, + {5875663953457929627u, 16117551711704116485u, 5102405288399142716u, 4188757169584314601u, 3438667u}, + {11240785985912004044u, 3207097150066975418u, 5737868474539708183u, 6692730865781837884u, 1984000u}, + {5392209276600990866u, 2040813604352673851u, 3467653710379624856u, 13367253243951638776u, 2928325u}, + {1373142485440047843u, 10156372788821244421u, 12683279809553682669u, 558421233472394318u, 154590u}, + {10088287718898662792u, 1637768301958739914u, 1046147298479430063u, 12540873045324236857u, 3838030u}, + {8382945654962021397u, 17432406594839547373u, 13152405614945294473u, 17220506550724941283u, 1481071u}, + {6085496115510708038u, 9452244073083397856u, 855966182148813629u, 9899211338108626862u, 656996u}, + {12461214807959205110u, 8774540571560545817u, 12583121771147751381u, 9091376295747582154u, 1975491u}, + {11708437591864534469u, 7906959649288096040u, 10681137252376679858u, 7170143195743158515u, 538274u}, + {9005256123322193176u, 16461081984053445096u, 17150109512282048814u, 14061160247285622650u, 1764702u}, + {11394625986998462509u, 8274791146452059548u, 8143888550188490113u, 11849998442441705144u, 517599u}, + {6762918096303769006u, 7205611118691976195u, 11964468341814776615u, 17663658567428150752u, 1967888u}, + {11797331007011406337u, 16486164630011673875u, 9936481854002130305u, 7242060547758176309u, 309033u}, + {4286695480545008763u, 17651278002885758627u, 11487223570325089917u, 5193847430634202623u, 3462465u}, + {17463758167207317243u, 11532493511310247792u, 4986082309779497177u, 9575473623919511725u, 1574936u}, + {10915530257427584461u, 1141144985595475793u, 5596895283372116133u, 8459790953337513962u, 1023196u}, + {13480530257865766761u, 7760768457000789309u, 13148815163676279705u, 15511257361363540511u, 2287560u}, + {2623318221264352498u, 9888982977994898296u, 4763640550927807361u, 14237544074856315775u, 3340272u}, + {1804272055976129544u, 1879830092988405287u, 4644803960888649203u, 16058403033378123818u, 2574543u}, + {13706537211494915814u, 7843623816527460091u, 9670434528829617307u, 12513455720447696371u, 3251327u}, + {1721401674174942786u, 18421010043466867291u, 14290522988867978258u, 9571578822588885127u, 2687623u}, + {10443316817849052247u, 2715408301777278064u, 15342782312785135453u, 15181672651184060868u, 2111111u}, + {3423925560684392118u, 14240623690643340304u, 7483221397753795263u, 9838775928668064992u, 2975436u}, + {13988282617940424396u, 8157466623742595607u, 1663334951616171824u, 7044473737917487774u, 1046472u}, + {12940484082412873089u, 1787449663932722962u, 15055983963195421818u, 7297121006039498255u, 2287536u}, + {3160930517390123042u, 4077916825975617127u, 16693499695570580724u, 8833224071075726450u, 2431987u}, + {1381341323079770031u, 15057468375105615100u, 7040521640534883711u, 4728605863078128582u, 3644817u}, + {9984069646975714766u, 5961909762186684034u, 16057943370212272689u, 14550811412746626825u, 2716226u}, + {15618067847997364841u, 6830035111890463160u, 5429762996982709491u, 1491257421177725933u, 526699u}, + {17612017261650007669u, 2833991063088576508u, 5613741145651813562u, 15285925819188858600u, 3732828u}, + {2307027086434314483u, 13100669749176803914u, 6059914961270078291u, 8931942604738239025u, 3230019u}, + {10763077384128097823u, 959052786086975504u, 17328866389835023774u, 15984311625160235712u, 2387054u}, + {1701884517939408263u, 8382661492187075042u, 3383409138886446030u, 116090984250364241u, 1937613u}, + {281528048542319076u, 3329711358917947429u, 12648874289035472423u, 15167837399205850129u, 1397326u}, + {1195845547268139034u, 10370714197919032173u, 2346959799831942777u, 9897666513473504904u, 2815489u}, + {3005641884876509802u, 10203071707451176651u, 4487818495502629499u, 4303334663160759169u, 1266538u}, + {16473148086684461119u, 12072581076881388933u, 4526546496042293639u, 7301180504479684147u, 162727u}, + {17475983832815597149u, 8509957189937723793u, 12645261126416892290u, 147116978699918910u, 1999418u}, + {11874020146477450709u, 16404384367219394138u, 17946438835391803619u, 1550092227085971838u, 2678275u}, + {1973856414590841087u, 9454181902520318817u, 8122364078342875888u, 8624259145547531060u, 786554u}, + {43858408834441960u, 10507845989768630290u, 3860946412983000532u, 4049734635086376104u, 3442176u}, + {15824338739993563451u, 3629449517124298489u, 11616514635193128100u, 16276455602312185484u, 3533072u}, + {6023033602844113210u, 4470440704636992986u, 4781946452578213612u, 6190069184478319315u, 3699690u}, + {15680928887603285131u, 13689795336621411220u, 9159147027366211768u, 3815242130744384347u, 1954080u}, + {7310873025489415729u, 6402994008882896669u, 6754784979946423725u, 2990407773029841867u, 2060104u}, + {11627274347760088389u, 7269533881189041818u, 2807039779625826363u, 5730552143239940059u, 256701u}, + {17766546702675835358u, 16258561101635609821u, 15667167926902953234u, 4832594103922189170u, 3198891u}, + {18045819253810905730u, 8242876877049471539u, 3701284353440114246u, 13605836807559738893u, 187403u}, + {5810731245006379360u, 11765409046999019254u, 12197580082039312980u, 651975335126833622u, 2839942u}, + {9907019409190139115u, 8694350492903215041u, 10372233314608114951u, 3294979415616911306u, 1641077u}, + {442286247814747997u, 15876440415135371519u, 8379281098855260147u, 9469817349687790081u, 1780114u}, + {18010241554594003875u, 4895157648546612988u, 8359221498614001733u, 3131313860480746002u, 1112062u}, + {1223277035579335287u, 18203675703823783972u, 16047527233022311711u, 15008493486128422139u, 3827635u}, + {10552723589455127495u, 6204099281885912911u, 13431633294014141090u, 11383649682215752697u, 3554656u}, + {2186952997894852460u, 5316140949536382147u, 2303570254648237713u, 1146435751454644822u, 1627182u}, + {14430818881780355480u, 12133660565912263788u, 1333163425769524394u, 13865074266343946319u, 1674037u}, + {10996032362041147723u, 11702499529279420900u, 46856778868977868u, 9758655741094266143u, 2688388u}, + {14905733729414740887u, 7904206346535845331u, 2658197053270832006u, 2067204648227469823u, 3664878u}, + {9847351672138041052u, 667003688907869522u, 6176203657230312908u, 2445505671846195050u, 70494u}, + {6226002550061086054u, 13049097114691790471u, 18037472699269763544u, 15926028669604311608u, 799205u}, + {7624159291066871567u, 13473770321506314236u, 14823377214521436802u, 3401449665806070703u, 626061u}, + {10626108433130041089u, 12501315417526065413u, 7384882450213487125u, 1020355106973971445u, 1694988u}, + {16149175934025294802u, 2775769639581855464u, 8272849193286988389u, 18405953490535987592u, 2591636u}, + {1513258301030481626u, 14969884727127764933u, 883070882227218263u, 13594634943560617786u, 551474u}, + {7959642067361802353u, 16350208592177845936u, 15283123223200297442u, 514576071601435396u, 2955760u}, + {16937611226632532397u, 827962533656455536u, 16342774056567289493u, 10863163254467074215u, 765367u}, + {17548500105609381013u, 5716927947753719229u, 15841275911064916628u, 5850783657106788928u, 213180u}, + {6993502421825756593u, 15060186688951328061u, 5908267239946698626u, 17225697457817193763u, 3568059u}, + {8340611757723878208u, 16010916798416924798u, 15617513574602379682u, 13756761955644901326u, 3444018u}, + {16296549054626744064u, 13069383641682860480u, 3363476286505317474u, 14907395304201165794u, 1309088u}, + {16172876224247917087u, 2221960253637162591u, 13042807331061450323u, 11481305878243901417u, 221396u}, + {5841909118310080971u, 10736056169048747543u, 2462222583469995171u, 15424409170948827182u, 585914u}, + {13088662489765983317u, 11249785013507826579u, 3216451886159794025u, 8873892287696748757u, 312379u}, + {6619074648908899452u, 14048102483765016204u, 13300161897323700019u, 870453512796028835u, 2368011u}, + {11370582719747536889u, 13995201541098047928u, 15269930880572378408u, 10564090823288661197u, 1556307u}, + {10287069603226724197u, 4550364480329048615u, 8033618099646580514u, 14584342803154656586u, 2731680u}, + {3885875548003101957u, 701890684455061224u, 2085431468493294968u, 13308987919414353935u, 2542432u}, + {10348843757148150392u, 1051555170884177777u, 2739785085886040377u, 9054098860478789442u, 3096203u}, + {9484549332387288493u, 14675864654156864240u, 5919624555129997445u, 14612748869056793667u, 102816u}, + {7896122316982008956u, 13972918206926162287u, 5824454725027309028u, 10810535740740621790u, 3361874u}, + {9664339229776892038u, 1605792996299078301u, 16050699701533341507u, 16274974298630379565u, 2616616u}, + {17118213061619958870u, 17701891168270651280u, 13680677657561613723u, 9631928069010563378u, 814163u}, + {2023276981202444820u, 15413802354667261701u, 12597296040757772391u, 16660322888888564874u, 658796u}, + {15224564902275484035u, 12168869765742950172u, 12082233873067759927u, 9307582288761810190u, 3177909u}, + {10038594694525961628u, 10467650518699960966u, 4210674732954955711u, 11659894723426518232u, 69735u}, + {7757008890328808497u, 17522613543373110732u, 156059311500304949u, 16934820994270939819u, 3103894u}, + {11843580850767798382u, 15486265186599723263u, 5064231191846840485u, 12595278117784204493u, 2222283u}, + {314155423669739925u, 7167025333454709018u, 5129372147209014758u, 1626260967190048193u, 1665042u}, + {4381813503887002090u, 169079137104344194u, 7966338312863649061u, 9830547394430437762u, 2020218u}, + {7948878561084044696u, 1648951888820549710u, 6954607913532780053u, 13656151727418028661u, 2432478u}, + {10626100501354808664u, 17445347760581689306u, 2099481300910817145u, 3935981390835189134u, 843938u}, + {1971757321441285885u, 8225613806389526368u, 7505849968572225611u, 10535976641773538338u, 1618324u}, + {6380178621372636912u, 6906452928195309720u, 3374830396944974687u, 5290057183961057906u, 1919724u}, + {17313851164754401555u, 3431259078700775533u, 4197222546812263987u, 6160308155834089739u, 751297u}, + {10372689452365096651u, 17911615892818935997u, 15394466316450578137u, 13848917044924817632u, 1054924u}, + {2897014773587429155u, 8180776707988378295u, 17594039950095884346u, 14214805952365934411u, 812424u}, + {7777400965550719315u, 3594751447448998573u, 2361397149026397219u, 11472144043852687185u, 3782929u}, + {10789467799732410577u, 8866848183728360230u, 4387566362881303096u, 10301961087969924956u, 881783u}, + {4158502469481303567u, 11291953770529028639u, 9639093104562777559u, 15940994318013582773u, 15705u}, + {15013678664000545694u, 15783130292954237938u, 9623888731499686603u, 14267693341566403254u, 2362873u}, + {11714169827904183200u, 14586175455503930952u, 17007086794673221722u, 6817001167342597634u, 1431202u}, + {8087233391720359610u, 5311710049991953286u, 636782839916649381u, 9177715466645630297u, 1289656u}, + {15594678038697851528u, 93312288359503531u, 2665820023275265950u, 2113460190452749576u, 1316850u}, + {5556509578925722509u, 15222518215643797193u, 9191628439596698665u, 3987459269132961093u, 2883051u}, + {17409980559946486622u, 14875587418839928010u, 11603398802573217824u, 3800177797908164337u, 2059378u}, + {16452926909362407899u, 4740274301744084685u, 16528636602432211168u, 1118852733286124666u, 3142631u}, + {257797784335315953u, 13026208177357473388u, 3517173599807896653u, 12523935079455491583u, 2909723u}, + {3580094136300395957u, 2625552195304332938u, 2070719908876905995u, 13168157042933205809u, 1001792u}, + {2939090111373254618u, 14838053484034791839u, 1211982096690225355u, 9025679068548238682u, 453467u}, + {12421427668156257553u, 24966188755549391u, 14589370398559605177u, 2602438384085957613u, 996888u}, + {17464410673573424684u, 10204862654594056954u, 10649833332604028187u, 883080468863725783u, 3576848u}, + {9512229656662892498u, 5949336973082271947u, 2625195838725942172u, 6262934287791442827u, 2574217u}, + {9250127997181508968u, 10791908947781340937u, 11505741548413126120u, 16981020527365191628u, 594424u}, + {7336881249548834599u, 9900705351929303069u, 16140547119876312873u, 10675489121993625781u, 2495555u}, + {15852767596427646366u, 7825165090090977887u, 1414729905939312774u, 3648914576978752162u, 435286u}, + {4164108975024181834u, 15527417372620270869u, 15928290128716508191u, 7646134581110144528u, 3745805u}, + {4155527058377087613u, 15963951037984353563u, 1865250069213013513u, 2879344081310345692u, 1176543u}, + {3397644016946186518u, 5558527763777123775u, 5484017421208222227u, 13208243099432870826u, 1192595u}, + {15507815876386770101u, 8432843521302579493u, 2625974193926316435u, 14505575909580343878u, 2935816u}, + {12830410701837614819u, 16248471028938505516u, 10467098268979730751u, 8412837169304718166u, 2676380u}, + {2814148736592346052u, 15978501240134938955u, 1083713869208429139u, 9416857730247463619u, 2240011u}, + {15856428274479365219u, 1528376569773088552u, 12403063047131787914u, 4508891749407683968u, 1457677u}, + {7764189881573143878u, 11326815785200114790u, 8829349595843402832u, 1900386844056150803u, 3836644u}, + {7530910835291760451u, 13376548452244001496u, 117459780845903681u, 8501512094307888665u, 1298562u}, + {15471317171142539274u, 15669819066637247296u, 1355187415608129449u, 1320990942062059365u, 1890503u}, + {14589511604198080425u, 7268306001383344473u, 9606367267824808634u, 16680177849093924286u, 296338u}, + {9466726682799748530u, 18155339721147335260u, 3702381338355888946u, 18091922591445404726u, 3216578u}, + {7192439757233657564u, 9812629867079793544u, 10390954537738442557u, 8273901129574831817u, 3134109u}, + {18317264023065382596u, 15811839438892174126u, 12553045526615432956u, 4597442539285470866u, 3717991u}, + {11322313689630372691u, 3433996233938563141u, 14901175134682770799u, 12030145443338835364u, 2409728u}, + {13672848411926487610u, 7791222004617486919u, 13564920481980050315u, 15608891959925831589u, 2712135u}, + {308475746785688610u, 5092531751518030604u, 12873830498521464377u, 16839449486684451302u, 1880744u}, + {1796789832904061591u, 285401997315653831u, 11601777282111108593u, 10627159943651020875u, 1625917u}, + {7466499539832193592u, 1531038160995408566u, 12651750107761443738u, 7019579507090263348u, 2038733u}, + {6583728375798499787u, 4551537717681461310u, 7102104874098104597u, 4144890853067097954u, 3213137u}, + {11435428817408918835u, 8157071521688938923u, 11397825277706991001u, 7697376888078018956u, 3887903u}, + {9632955492475691299u, 11802977003364200044u, 17238855046296666490u, 864352693738991770u, 1974582u}, + {16669851794348539926u, 7822862071335879122u, 10846985882467079535u, 5512801756553429383u, 1486322u}, + {10696858162058835521u, 1924314451149523111u, 13473976609243179298u, 13862475862340089596u, 1665832u}, + {7809427767689479458u, 16527135784102033881u, 2355171608589129862u, 2120399417536181736u, 1468553u}, + {15276080392366520538u, 1401185292256059831u, 12737723676474299528u, 14294493642979809128u, 2036341u}, + {12260093194694347044u, 1895824868905295605u, 499651916919130154u, 6883035309171449345u, 2896222u}, + {17555760831632995429u, 11908127883988419599u, 3169964078436371254u, 3368075198642367590u, 2449019u}, + {14374184957872657261u, 8091818477727790764u, 579823486237560375u, 1774558687002997755u, 114218u}, + {8002997665733353380u, 13249629666246797761u, 10504941928421491852u, 5334368910795836908u, 3149807u}, + {13998490921562678851u, 7137491190065604893u, 8167757486676570119u, 2363946698158641724u, 1904012u}, + {1547609770353626319u, 2519042644488888813u, 17526714861023357766u, 11924625840699328008u, 476934u}, + {13302669914979119455u, 6942885887670357502u, 18257726797966878647u, 4548426315752136399u, 3421011u}, + {5687977068230080556u, 3155342273189579349u, 11723646975043308131u, 12384955099424448558u, 1002068u}, + {9841677776484604660u, 7348608539637980837u, 7253083541313362449u, 17888768225731537210u, 1233691u}, + {3340803442928717488u, 7237725866180453790u, 3214010648839940261u, 6075595499217753660u, 516135u}, + {4205331661686063458u, 49757904214012610u, 11825798480085649312u, 16726882833127360730u, 3022605u}, + {11721757774590092179u, 12175807958206653432u, 7187596935871058392u, 5388019196404464956u, 3106367u}, + {6485131307743031564u, 13506109086307716410u, 2383393644995999906u, 4380758004711712275u, 2030727u}, + {8235406821369904916u, 10970183123113389469u, 6202110928415413847u, 181575493709185853u, 3199987u}, + {1610041810677320364u, 2367701723018100253u, 12105027309286092917u, 17857255068777973292u, 431824u}, + {8759244228384518416u, 17954373415376389274u, 3597131265826198443u, 10744547276321403086u, 3044935u}, + {17112272268339181634u, 15396773796530421186u, 16072058667760132273u, 2506127344700177893u, 1359618u}, + {3809258017889076053u, 6440517805535548814u, 15665354735905990916u, 12995447454617164657u, 1231587u}, + {8198205565068486753u, 15880567705847334680u, 3011601599634376776u, 14866583155002109996u, 904835u}, + {18199023346037721972u, 5879347615218849303u, 2556227236578645536u, 17814917001908718329u, 56149u}, + {15834869727639248065u, 13179426539624873057u, 9636673424864545877u, 6197988871309714215u, 1574144u}, + {1357096595550192041u, 1294241673646824990u, 13442712771028838713u, 677556184042505743u, 3295707u}, + {3148203949496330746u, 9902005487400694918u, 4984647007472099185u, 2438695667500111157u, 202844u}, + {15576775542422263261u, 3424818105855087223u, 14538009261935049099u, 147857001869439079u, 445240u}, + {7260366780895393391u, 17002736695733432984u, 11638916353426559754u, 3971380900565271922u, 3543249u}, + {9674818916683131267u, 11701622944870114352u, 11420606273305070828u, 11378403675418494147u, 1794543u}, + {13692039720283749527u, 1592820800873292713u, 5610127766520010464u, 14516679888452185771u, 3424062u}, + {14010277511271105771u, 13276503042535076822u, 3275587668249202119u, 10151225975233105003u, 2390869u}, + {6471341372712273431u, 14409346366259273542u, 3610015034906903838u, 11140973240548894001u, 1448338u}, + {1944619869357834866u, 3189803288896179221u, 2163954512778246521u, 9754492326679472945u, 1408299u}, + {7122084624130929543u, 6577167879225709102u, 9421381769535914156u, 530381699252248966u, 1299584u}, + {9326211867424540087u, 5762348098610278518u, 3312605620390140544u, 2401873697232291341u, 2758039u}, + {5009601887865721080u, 17254943921907397308u, 4828109956274340887u, 10931573541707301851u, 3527087u}, + {7159913863329957729u, 5365987697082972516u, 18223989369011169680u, 12531027050707814470u, 3271115u}, + {14859641067522573216u, 825429821604402467u, 11846246526433894333u, 708859780113050894u, 2149466u}, + {17268915697880302703u, 6775886312839087317u, 3447474195956473523u, 17261415624970776659u, 3597368u}, + {18332627311709927168u, 8006851238312284880u, 4584446581898186669u, 5975082455206458759u, 2476870u}, + {10753540691722007242u, 16473199484314659826u, 5858329512852352032u, 13880748248251095144u, 204288u}, + {13990218242125693870u, 7917860262335023622u, 2428044430419004222u, 13910884111654169873u, 2732307u}, + {11103879885768428522u, 8916749932738042576u, 9249713713118916372u, 13813402643114925011u, 1468914u}, + {3075822809314133235u, 17625180187436902236u, 7699487163811386041u, 12709233245113008371u, 508756u}, + {16552448739512879814u, 4860206346044478241u, 13926518256030955771u, 513788062702692973u, 949273u}, + {8331978764843304750u, 17864225913574618247u, 16488956846596042132u, 14573144992262313621u, 252574u}, + {5839133096847019109u, 9512827516038136664u, 10185797813483916201u, 148774370586673980u, 0u}, + {15483871580745470487u, 1071163349222448987u, 10822224773950393824u, 148774370u, 0u}, + {5003703160224186616u, 11128473256515883940u, 2744402738939596878u, 0u, 0u}, + {12716056207320828136u, 17332503152050969833u, 2744402738u, 0u, 0u}, + {13903208475620639509u, 13731806812987167191u, 2u, 0u, 0u}, + {7494366531701931190u, 50625294960u, 0u, 0u, 0u}, + {11534656105194817662u, 50u, 0u, 0u, 0u}, + {933871859791u, 0u, 0u, 0u, 0u}, + {934u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2184536u}, + {12244510716637114204u, 10722066986224769282u, 904078173679462097u, 14163586007945680625u, 2772024u}, + {10701501129329870842u, 17731177191384858407u, 1004820142061437306u, 3365784157202451710u, 1651883u}, + {5807363968998846294u, 9195191221918963949u, 8384868608267773598u, 390759836496135392u, 2844713u}, + {4563132662752990216u, 9809963713305183656u, 3732543719049777217u, 17274240668129691060u, 2916008u}, + {18098817381967301812u, 90717868984254388u, 5872705225677787687u, 6827204710132356294u, 3257360u}, + {15706022854192763404u, 4456271295806643188u, 3398813597577870091u, 4671773711530531159u, 1651970u}, + {1684609589779182507u, 1173975792645367037u, 9474518539412297290u, 2192201293617057759u, 2251807u}, + {16520495454057883572u, 7566611402803206815u, 16838702129160675613u, 9409025734555220657u, 159365u}, + {2251702846448775927u, 10888979572083986433u, 4584098874163625177u, 12973306701605360937u, 1136193u}, + {17925838737148579452u, 13910253949438099204u, 3405247285666595493u, 9028158329203638978u, 2841331u}, + {1173257877282329777u, 11281509911607430784u, 3805192046640300305u, 14535989716437370699u, 2820390u}, + {1157548834637506747u, 15037559420173007899u, 13274663295620744793u, 772602967433318758u, 2105808u}, + {12867249683952773143u, 7978109263952246693u, 16651958640706190200u, 6524028765430487370u, 2077132u}, + {12979403722914827368u, 6554207719727558788u, 14715570640739884940u, 16827735739772550321u, 3311141u}, + {10187648664040998726u, 16516937432483800529u, 4056516088574296925u, 4312477835684450682u, 2568916u}, + {7222547002551930158u, 14026917731629086510u, 3387171560428857676u, 5884053257383498298u, 3824454u}, + {9816464343944114683u, 16302351926383293145u, 16593140744617817790u, 7780711292102017198u, 1749529u}, + {3622720236428547969u, 9941208320000067899u, 4264999070597363905u, 10120336286803155330u, 9518u}, + {1477454836910666396u, 13549417482812400593u, 5818774878638668004u, 15060212740157368478u, 2601985u}, + {14548533568643765997u, 3622361543222987824u, 15106522733450532688u, 10280176519824610799u, 3404428u}, + {4737648960800460493u, 788801964828018628u, 3939605605646977782u, 6331811303613277813u, 3311126u}, + {14143505403593523432u, 15560438218067468558u, 7698885683964010560u, 16201980564745474580u, 2999522u}, + {8488411524057763881u, 975018759137188843u, 7891556450890197014u, 14106562268275389506u, 1191177u}, + {5876446359259012306u, 13271739170260239289u, 15507837186870087668u, 17748141484702323646u, 2131887u}, + {7794009568343891591u, 15877058699233878719u, 10483340713805471299u, 13369981288647878079u, 261336u}, + {17011771546415045912u, 737172104517828994u, 534901262959620636u, 12903130144468328792u, 3367193u}, + {5708139289424770433u, 7004441158229441692u, 12965527977456514253u, 7556103540365421774u, 1336194u}, + {2874469582591104873u, 4759988642859161076u, 18030055712988907023u, 17750816569637202056u, 1731378u}, + {3271796951840116992u, 17644234839804799596u, 12820651399067426395u, 17109588091600588497u, 2181743u}, + {6356439507724219721u, 11647926410421171731u, 16084365219378242923u, 976994794358258557u, 1409996u}, + {7731449317865794313u, 9657520062540456068u, 5508420872970120701u, 8024402774543949863u, 537142u}, + {4100206586186202244u, 17019852661028878938u, 9556729334178466680u, 5990688834177661958u, 3084416u}, + {14474300497359745022u, 5263972203052623459u, 9866761533817578657u, 705415784900895178u, 667098u}, + {3924326166898501925u, 9960522252921046887u, 6729843488480112947u, 10748887298434761743u, 2331698u}, + {10719854100283269179u, 16902233675467226855u, 9568062572236918675u, 15175106994976934272u, 3163705u}, + {5628385098724818994u, 1562562962257935067u, 17934506629697502337u, 11083171959437796479u, 3851941u}, + {15559021014900100809u, 1016387874567616470u, 7361784473413185568u, 6340066462196931235u, 1942295u}, + {857014310106953133u, 13249242000844658152u, 13889106192676433854u, 15167923773085578715u, 817527u}, + {10045238090569116794u, 14884246263194618838u, 12719995684423868505u, 5851745843582434137u, 333038u}, + {7445187784844612246u, 2816213242902678964u, 4307749082520391478u, 6143472604565925u, 681780u}, + {14105839516085788787u, 14557210420332707385u, 13010901898796067299u, 8587430311694141554u, 512914u}, + {14736995701331896144u, 10703932578532182127u, 12021938255506228386u, 874152730332388204u, 3219820u}, + {6427171179710072237u, 7452926784938038249u, 15063930794007491049u, 2293180611553330234u, 2545079u}, + {11406044685022700441u, 10479119703324870604u, 8681552403417814133u, 13305545726232293467u, 740077u}, + {5285923306377695787u, 17406881142929832067u, 1173358642600918117u, 5273856389088123798u, 2693192u}, + {17636803975309009989u, 15264371515630627511u, 15198679563144364988u, 10570089358376697019u, 1977670u}, + {13202890053527580946u, 8640182148938563475u, 5923466083595497863u, 11493639034952884351u, 2530003u}, + {6760802311907010808u, 18390914033733215900u, 12359672694348336815u, 9630330336384771909u, 1363410u}, + {7324903314963847459u, 6491717669043473597u, 2832358642448155238u, 12707287035643183412u, 1453439u}, + {3354640416928608856u, 5673226306988027204u, 11702445397231006713u, 14942733195818118124u, 388416u}, + {1532310011728297039u, 15033889693085676811u, 343079567748043647u, 10383458566950489949u, 1379850u}, + {16736024518438171634u, 11627219494866229843u, 13794983408015568890u, 9897344133389693923u, 3516419u}, + {13105994692456874738u, 3421769986036305538u, 3203775682346727194u, 208981679322129673u, 1064703u}, + {17528000640917020676u, 7881672644244899590u, 1039284417674975255u, 2325483313178186412u, 3788220u}, + {11713362674684815941u, 4808427321810247967u, 14774918412498352772u, 9077079581901383310u, 3498699u}, + {13740042264026013976u, 7326631256422344989u, 7945582581033035476u, 4460052850434627212u, 2996783u}, + {14964523523968407204u, 12856571109785258062u, 12084066183504888037u, 2000835932529550653u, 317753u}, + {1490484207866844435u, 10877522083268836253u, 12621068634950111522u, 14849725882083644179u, 1978186u}, + {10096956065417169518u, 8777949623524365721u, 2890471162310541347u, 901182234177056317u, 2640479u}, + {14327903582165929274u, 6973368123940145461u, 5875663953457929626u, 16117551711704116485u, 1982084u}, + {12490816177289485778u, 16186532597816920368u, 11240785985912004043u, 3207097150066975418u, 1257727u}, + {9320030331960683422u, 5093146848147734968u, 5392209276600990865u, 2040813604352673851u, 3703072u}, + {16941053980732885222u, 15343575845624322149u, 1373142485440047842u, 10156372788821244421u, 2846097u}, + {8684518844656174627u, 14976347242887146027u, 10088287718898662791u, 1637768301958739914u, 3606405u}, + {4062341010919400395u, 15440653358828433104u, 8382945654962021396u, 17432406594839547373u, 688427u}, + {7186274481024956686u, 12742012409982966159u, 6085496115510708037u, 9452244073083397856u, 3012547u}, + {864200433802304966u, 2279681203874328896u, 12461214807959205109u, 8774540571560545817u, 2855891u}, + {6310353119153559092u, 8059062935135795434u, 11708437591864534468u, 7906959649288096040u, 1732042u}, + {2481891251585437106u, 2147353388344903584u, 9005256123322193175u, 16461081984053445096u, 3264826u}, + {17427381721044735915u, 5373812643237496984u, 11394625986998462508u, 8274791146452059548u, 3898211u}, + {7801512811493552386u, 2918224964051712103u, 6762918096303769005u, 7205611118691976195u, 3091775u}, + {15264579327043993593u, 12431713240589499524u, 11797331007011406336u, 16486164630011673875u, 3752697u}, + {12601542962442787917u, 13077545621379998598u, 4286695480545008762u, 17651278002885758627u, 177725u}, + {9369663990226360517u, 1841309623648991718u, 17463758167207317242u, 11532493511310247792u, 3267843u}, + {8733855779361309329u, 14948476265124840928u, 10915530257427584460u, 1141144985595475793u, 2743351u}, + {11720459681738149356u, 5638155181144408463u, 13480530257865766760u, 7760768457000789309u, 926591u}, + {6206113069559735614u, 3015426540437604971u, 2623318221264352497u, 9888982977994898296u, 343293u}, + {8398352980472763398u, 10370085126738345711u, 1804272055976129543u, 1879830092988405287u, 3328699u}, + {1588400717882288983u, 6185176308833605897u, 13706537211494915813u, 7843623816527460091u, 2511205u}, + {3278205589252927784u, 16396155106342634763u, 1721401674174942785u, 18421010043466867291u, 2671328u}, + {14577666919188495866u, 13537486430348377220u, 10443316817849052246u, 2715408301777278064u, 2454507u}, + {17952928660143757465u, 11765994920885409822u, 3423925560684392117u, 14240623690643340304u, 810901u}, + {12204786741138465619u, 8548317821121715156u, 13988282617940424395u, 8157466623742595607u, 3147840u}, + {15993436107474955469u, 12385703782979315639u, 12940484082412873088u, 1787449663932722962u, 2314314u}, + {2465810662610401193u, 16747077025130536998u, 3160930517390123041u, 4077916825975617127u, 3766996u}, + {16294167352731098181u, 17195251468107966916u, 1381341323079770030u, 15057468375105615100u, 2883275u}, + {13274929992688793719u, 15579567212930449687u, 9984069646975714765u, 5961909762186684034u, 3069445u}, + {3660131970862439517u, 14653643942134614641u, 15618067847997364840u, 6830035111890463160u, 1287213u}, + {3773390136813270830u, 17279868138373421370u, 17612017261650007668u, 2833991063088576508u, 3157480u}, + {10554315435338337288u, 6440412790104631527u, 2307027086434314482u, 13100669749176803914u, 1209105u}, + {10615940793640953339u, 11817839930729354646u, 10763077384128097822u, 959052786086975504u, 1299990u}, + {5891518587226615217u, 13916181793128302054u, 1701884517939408262u, 8382661492187075042u, 816514u}, + {3191270903336855774u, 13144421526492090074u, 281528048542319075u, 3329711358917947429u, 3603793u}, + {15541869358950459989u, 4795543752077036624u, 1195845547268139033u, 10370714197919032173u, 2328375u}, + {17529236981034203504u, 2308510431649040178u, 3005641884876509801u, 10203071707451176651u, 2112181u}, + {15671037164641355089u, 6204993158315071456u, 16473148086684461118u, 12072581076881388933u, 388203u}, + {3931378967097172186u, 7581250522570191197u, 17475983832815597148u, 8509957189937723793u, 2564708u}, + {14488614045340727519u, 10464680828124147443u, 11874020146477450708u, 16404384367219394138u, 793477u}, + {17080133489546363206u, 13978024538175742370u, 1973856414590841086u, 9454181902520318817u, 3225222u}, + {5339738625727315972u, 9535907672508591058u, 43858408834441959u, 10507845989768630290u, 1440352u}, + {16613662232843552669u, 2168656630662015870u, 15824338739993563450u, 3629449517124298489u, 155576u}, + {14750923235423042530u, 18360972803361003155u, 6023033602844113209u, 4470440704636992986u, 3844042u}, + {2813352558591893207u, 10013330571934595064u, 15680928887603285130u, 13689795336621411220u, 3357000u}, + {13238738721713957797u, 14989983808645949802u, 7310873025489415728u, 6402994008882896669u, 3457221u}, + {11861779048893588603u, 9546311969219515842u, 11627274347760088388u, 7269533881189041818u, 2472113u}, + {4746109409709160269u, 13663370602172622437u, 17766546702675835357u, 16258561101635609821u, 1534750u}, + {10834782297305162829u, 15568168283705892962u, 18045819253810905729u, 8242876877049471539u, 1085352u}, + {14535134176700600093u, 1744236789844954469u, 5810731245006379359u, 11765409046999019254u, 2571684u}, + {5206765102506284693u, 3822271018320166019u, 9907019409190139114u, 8694350492903215041u, 1288559u}, + {10222093578947667224u, 16836846436394845132u, 442286247814747996u, 15876440415135371519u, 3648277u}, + {16712907381049431644u, 1247627326879047134u, 18010241554594003874u, 4895157648546612988u, 2448237u}, + {13188728394944577160u, 4914130608259700164u, 1223277035579335286u, 18203675703823783972u, 387395u}, + {6082841394036611015u, 7818304907004087225u, 10552723589455127494u, 6204099281885912911u, 3032328u}, + {9725636909970320564u, 3659672401670706104u, 2186952997894852459u, 5316140949536382147u, 1517057u}, + {3421372087865053039u, 12157455867986700582u, 14430818881780355479u, 12133660565912263788u, 1581270u}, + {3840942205606155694u, 9279929895469433677u, 10996032362041147722u, 11702499529279420900u, 2706634u}, + {5770785212338253899u, 7864238558492020308u, 14905733729414740886u, 7904206346535845331u, 1002092u}, + {7192061816645133933u, 9337958312070974494u, 9847351672138041051u, 667003688907869522u, 361722u}, + {5714319012656729698u, 10599053388520925479u, 6226002550061086053u, 13049097114691790471u, 3852052u}, + {10810446800089012581u, 3099881292237911692u, 7624159291066871566u, 13473770321506314236u, 1916416u}, + {8390514465458087950u, 2769569033861204979u, 10626108433130041088u, 12501315417526065413u, 2037273u}, + {1127965337215153485u, 9287898455246275674u, 16149175934025294801u, 2775769639581855464u, 2925327u}, + {15859342249614273496u, 9202540820589764793u, 1513258301030481625u, 14969884727127764933u, 3534083u}, + {9436018905718908949u, 13942384929301105519u, 7959642067361802352u, 16350208592177845936u, 1915188u}, + {17668542635655591000u, 214510855095591948u, 16937611226632532396u, 827962533656455536u, 1321535u}, + {17701120424025769115u, 6640524085768543587u, 17548500105609381012u, 5716927947753719229u, 8106u}, + {12537908467780106112u, 12519204066971322720u, 6993502421825756592u, 15060186688951328061u, 766038u}, + {5752953915684041781u, 401853035005953499u, 8340611757723878207u, 16010916798416924798u, 1461456u}, + {14075022070149366488u, 2525206359031063672u, 16296549054626744063u, 13069383641682860480u, 3265206u}, + {956923682307084343u, 6800939686215596188u, 16172876224247917086u, 2221960253637162591u, 3877771u}, + {1272538974787882477u, 8350079530480402825u, 5841909118310080970u, 10736056169048747543u, 477067u}, + {14443044017778934693u, 10264506465192463168u, 13088662489765983316u, 11249785013507826579u, 3736661u}, + {9792843406058691060u, 6098002843853547260u, 6619074648908899451u, 14048102483765016204u, 868895u}, + {2090256289951975303u, 15058930078679357789u, 11370582719747536888u, 13995201541098047928u, 582002u}, + {12553558264013007540u, 2014448072281579265u, 10287069603226724196u, 4550364480329048615u, 2893320u}, + {7671413546924797943u, 5762946506425309849u, 3885875548003101956u, 701890684455061224u, 2317420u}, + {12018076073806771540u, 8551974384069189670u, 10348843757148150391u, 1051555170884177777u, 2611467u}, + {2495166936281151056u, 9521360288004852446u, 9484549332387288492u, 14675864654156864240u, 3567163u}, + {12765571287296336417u, 15752037437050435542u, 7896122316982008955u, 13972918206926162287u, 1112712u}, + {16588246537645557195u, 9347766177081603635u, 9664339229776892037u, 1605792996299078301u, 2590193u}, + {9653745863643295222u, 9183295775279389109u, 17118213061619958869u, 17701891168270651280u, 3552649u}, + {13178291201641766705u, 6961327012151377703u, 2023276981202444819u, 15413802354667261701u, 3425751u}, + {1289183170592308872u, 11169634349454687190u, 15224564902275484034u, 12168869765742950172u, 1046221u}, + {8222130399316202835u, 7070079221975204654u, 10038594694525961627u, 10467650518699960966u, 684033u}, + {2967342337581845187u, 1384699888788930886u, 7757008890328808496u, 17522613543373110732u, 3574617u}, + {10034420885061133393u, 16538682227867452633u, 11843580850767798381u, 15486265186599723263u, 1806471u}, + {8858814079721606948u, 16590506618055834955u, 314155423669739924u, 7167025333454709018u, 1353298u}, + {8061104590455518336u, 4213142284630992288u, 4381813503887002089u, 169079137104344194u, 3452361u}, + {8307528685440158939u, 11628222581094722613u, 7948878561084044695u, 1648951888820549710u, 401697u}, + {7645474542819057236u, 1108960840625339366u, 10626100501354808663u, 17445347760581689306u, 598917u}, + {16414133175449961811u, 6227995472212186580u, 1971757321441285884u, 8225613806389526368u, 3305813u}, + {15021393639583379872u, 13803519663167337963u, 6380178621372636911u, 6906452928195309720u, 2415177u}, + {12422241329226164263u, 8463590193634748999u, 17313851164754401554u, 3431259078700775533u, 2240643u}, + {42398728424274238u, 4966215661450568604u, 10372689452365096650u, 17911615892818935997u, 2074543u}, + {10463789473911654005u, 2501054023132974309u, 2897014773587429154u, 8180776707988378295u, 3465616u}, + {3034833054984359850u, 17290147426781953509u, 7777400965550719314u, 3594751447448998573u, 204053u}, + {17695679523780774828u, 8426370330731061516u, 10789467799732410576u, 8866848183728360230u, 2763040u}, + {14763133173300936321u, 17347843793761957097u, 4158502469481303566u, 11291953770529028639u, 136457u}, + {6676939393517962237u, 455368630812414974u, 15013678664000545693u, 15783130292954237938u, 1655655u}, + {6136299646022062673u, 1754971230256551584u, 11714169827904183199u, 14586175455503930952u, 2792128u}, + {917171531185328194u, 17790408902875192926u, 8087233391720359609u, 5311710049991953286u, 1152219u}, + {1454188380180061529u, 11691373916203689459u, 15594678038697851527u, 93312288359503531u, 995616u}, + {9089119641759790087u, 12794376127171313819u, 5556509578925722508u, 15222518215643797193u, 1719709u}, + {15336568042227157128u, 13833632134759642090u, 17409980559946486621u, 14875587418839928010u, 3064534u}, + {12047285412354744762u, 16449926192374333214u, 16452926909362407898u, 4740274301744084685u, 3027160u}, + {6655642495641808283u, 666920244383399906u, 257797784335315952u, 13026208177357473388u, 1706469u}, + {1096391279581165814u, 9275388609182600015u, 3580094136300395956u, 2625552195304332938u, 3591241u}, + {13634847703080353902u, 13609651026827910248u, 2939090111373254617u, 14838053484034791839u, 1353419u}, + {3763510790085126601u, 17337808936189836461u, 12421427668156257552u, 24966188755549391u, 2425463u}, + {3983290989151884062u, 17908607113639855311u, 17464410673573424683u, 10204862654594056954u, 2201703u}, + {15545439265889344716u, 13788423136199186813u, 9512229656662892497u, 5949336973082271947u, 2999306u}, + {11228292827477395121u, 15448380514265545191u, 9250127997181508967u, 10791908947781340937u, 1562062u}, + {4563940082162025341u, 11071651525315180615u, 7336881249548834598u, 9900705351929303069u, 2328049u}, + {12130013533176226101u, 15190403920929333997u, 15852767596427646365u, 7825165090090977887u, 1899232u}, + {5980050398061779608u, 17501598390057795707u, 4164108975024181833u, 15527417372620270869u, 2126269u}, + {15320539736979417949u, 12639594705440870231u, 4155527058377087612u, 15963951037984353563u, 547143u}, + {4602925287605697428u, 4422895190027843638u, 3397644016946186517u, 5558527763777123775u, 114113u}, + {4753223426195820744u, 4488746682400121733u, 15507815876386770100u, 8432843521302579493u, 1925129u}, + {9700012388873960069u, 14120219119069685753u, 12830410701837614818u, 16248471028938505516u, 2915037u}, + {854823771835935571u, 2921826773365486664u, 2814148736592346051u, 15978501240134938955u, 822209u}, + {18246243166600269299u, 10089882662833448154u, 15856428274479365218u, 1528376569773088552u, 746664u}, + {11167125732672787362u, 12924674979035631089u, 7764189881573143877u, 11326815785200114790u, 2487894u}, + {14414315068453126196u, 16145663676252227048u, 7530910835291760450u, 13376548452244001496u, 1806343u}, + {12378719943772726820u, 8689216952875197039u, 15471317171142539273u, 15669819066637247296u, 3390657u}, + {15872461382336065525u, 6672855130732174131u, 14589511604198080424u, 7268306001383344473u, 3734188u}, + {1370785887471395406u, 9229948676724789868u, 9466726682799748529u, 18155339721147335260u, 693730u}, + {1963533642997447111u, 17707021695037051504u, 7192439757233657563u, 9812629867079793544u, 1692783u}, + {16852815227478395905u, 11406483618131040800u, 18317264023065382595u, 15811839438892174126u, 2563558u}, + {4098788040688299889u, 10068060615800764369u, 11322313689630372690u, 3433996233938563141u, 487991u}, + {13848093285059941944u, 5932167462984679932u, 13672848411926487609u, 7791222004617486919u, 2629199u}, + {9817365400230685383u, 17592705152679155943u, 308475746785688609u, 5092531751518030604u, 3752923u}, + {12183936470410108822u, 7995382650084061460u, 1796789832904061590u, 285401997315653831u, 966495u}, + {16196210982453665611u, 5863651899990643296u, 7466499539832193591u, 1531038160995408566u, 645604u}, + {14295814056549672750u, 14878694984881206953u, 6583728375798499786u, 4551537717681461310u, 789483u}, + {16982095796110127928u, 8031601593426927058u, 11435428817408918834u, 8157071521688938923u, 3121915u}, + {6734547120186337967u, 7683560372887241611u, 9632955492475691298u, 11802977003364200044u, 2203202u}, + {1075006799358902272u, 4785906558769515169u, 16669851794348539925u, 7822862071335879122u, 2754795u}, + {1821466947108453522u, 4099467846480739638u, 10696858162058835520u, 1924314451149523111u, 1406576u}, + {10940831611489352525u, 16512926738932554725u, 7809427767689479457u, 16527135784102033881u, 1739656u}, + {12850956533245975663u, 9379805774221796846u, 15276080392366520537u, 1401185292256059831u, 1210372u}, + {10808240410613737775u, 16264108076582334324u, 12260093194694347043u, 1895824868905295605u, 1009656u}, + {18221333505013287802u, 8957994591883583881u, 17555760831632995428u, 11908127883988419599u, 1158358u}, + {5856960077102694907u, 5077773638002816675u, 14374184957872657260u, 8091818477727790764u, 3420113u}, + {9777115020945831628u, 10443557975490699815u, 8002997665733353379u, 13249629666246797761u, 205422u}, + {12593267655330137138u, 7559468113344429785u, 13998490921562678850u, 7137491190065604893u, 3745075u}, + {7511381253723257849u, 17098566336292639321u, 1547609770353626318u, 2519042644488888813u, 1374598u}, + {16681884031537180143u, 10940631368912787722u, 13302669914979119454u, 6942885887670357502u, 3082697u}, + {3844832932339718161u, 17925061270915033337u, 5687977068230080555u, 3155342273189579349u, 3837617u}, + {9678844158845177506u, 302506163294720173u, 9841677776484604659u, 7348608539637980837u, 1732905u}, + {8692302625523307288u, 15276614491887509119u, 3340803442928717487u, 7237725866180453790u, 2697381u}, + {14432026559726722725u, 4094049421047700569u, 4205331661686063457u, 49757904214012610u, 3801872u}, + {18151569490523550693u, 10709937020158501734u, 11721757774590092178u, 12175807958206653432u, 1698890u}, + {2681489092587887042u, 18043168615651600648u, 6485131307743031563u, 13506109086307716410u, 944818u}, + {12614295774333663454u, 13644782324728491958u, 8235406821369904915u, 10970183123113389469u, 3353367u}, + {7658392599086458313u, 5198461668706033960u, 1610041810677320363u, 2367701723018100253u, 652283u}, + {13075614906584947221u, 13219550328679873862u, 8759244228384518415u, 17954373415376389274u, 2629529u}, + {5314717826996099228u, 5496565701091454893u, 17112272268339181633u, 15396773796530421186u, 1484919u}, + {6446142060147614298u, 14999974984994619720u, 3809258017889076052u, 6440517805535548814u, 1512300u}, + {8351832302854000934u, 9123174429347724852u, 8198205565068486752u, 15880567705847334680u, 2313822u}, + {15570134387717962849u, 2266633799725412075u, 18199023346037721971u, 5879347615218849303u, 3520644u}, + {9769532238253090596u, 12823130238325885498u, 15834869727639248064u, 13179426539624873057u, 3754731u}, + {13569588941945093685u, 7320710523672173793u, 1357096595550192040u, 1294241673646824990u, 1632543u}, + {16535115396064993282u, 13076684522255635119u, 3148203949496330745u, 9902005487400694918u, 2066011u}, + {15351887775478463485u, 7464295128301791841u, 15576775542422263260u, 3424818105855087223u, 3751453u}, + {16736446409294715135u, 9114742784030833833u, 7260366780895393390u, 17002736695733432984u, 1533750u}, + {9820249237960313742u, 4444476143075288963u, 9674818916683131266u, 11701622944870114352u, 409488u}, + {12154348999723406961u, 11477907756161676072u, 13692039720283749526u, 1592820800873292713u, 970672u}, + {2654787682798389007u, 7089861584415100479u, 14010277511271105770u, 13276503042535076822u, 3788481u}, + {10639133950852276900u, 9415005269991117973u, 6471341372712273430u, 14409346366259273542u, 1044582u}, + {618103863413843057u, 5230550200067588366u, 1944619869357834865u, 3189803288896179221u, 1080235u}, + {535814127118359451u, 13764557574588791873u, 7122084624130929542u, 6577167879225709102u, 3783766u}, + {5522043777920004114u, 10864425209479138189u, 9326211867424540086u, 5762348098610278518u, 1798634u}, + {9291688396908926267u, 6003977613193967722u, 5009601887865721079u, 17254943921907397308u, 1828275u}, + {327913648484062635u, 16802940087037220633u, 7159913863329957728u, 5365987697082972516u, 1777890u}, + {11221556872980890018u, 11194432926097142447u, 14859641067522573215u, 825429821604402467u, 134033u}, + {6082987398048782905u, 7063109544026865772u, 17268915697880302702u, 6775886312839087317u, 458525u}, + {6077725440716443706u, 14399885818220469584u, 18332627311709927167u, 8006851238312284880u, 2388933u}, + {2866378767222985720u, 12258040292563677481u, 10753540691722007241u, 16473199484314659826u, 3446814u}, + {14539888540316034094u, 13873560868087357602u, 13990218242125693869u, 7917860262335023622u, 2909232u}, + {7933380354741151916u, 15947741771632464033u, 11103879885768428521u, 8916749932738042576u, 2337932u}, + {3531180849623850649u, 7227071478124470154u, 3075822809314133234u, 17625180187436902236u, 1753563u}, + {6145355001968135558u, 1611587591482129659u, 16552448739512879813u, 4860206346044478241u, 3577877u}, + {14495232997582767573u, 7209470539823874152u, 8331978764843304749u, 17864225913574618247u, 66412u}, + {9219411904332264840u, 820101167827545053u, 5839133096847019108u, 9512827516038136664u, 3380381u}, + {11218198172498423534u, 15253850048073269893u, 15483871580745470486u, 1071163349222448987u, 1713244u}, + {5457745300950232082u, 11374386779051704524u, 5003703160224186615u, 11128473256515883940u, 2096878u}, + {318754061454271651u, 4077985254536323631u, 12716056207320828135u, 17332503152050969833u, 2215238u}, + {1541334063659549028u, 16649935115918346590u, 13903208475620639508u, 13731806812987167191u, 2u}, + {17630612266575847914u, 14633674365067756047u, 7494366531701931189u, 50625294960u, 0u}, + {3589168826506087042u, 859370161314004003u, 11534656105194817661u, 50u, 0u}, + {16832044840913076714u, 12403562326482543228u, 933871859790u, 0u, 0u}, + {7424147988743268093u, 16082974426691716519u, 933u, 0u, 0u}, + {12974964729871316354u, 17226895195197u, 0u, 0u, 0u}, + {16513436708047969310u, 17226u, 0u, 0u, 0u}, + {317780126850429u, 0u, 0u, 0u, 0u}, + {317781u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3119416u}, + {1475531741771517865u, 1978038759213676812u, 12244510716637114203u, 10722066986224769282u, 271541u}, + {10781498191248144394u, 15022061969131820025u, 10701501129329870841u, 17731177191384858407u, 2378564u}, + {14054962015761002722u, 1135134006848161551u, 5807363968998846293u, 9195191221918963949u, 549198u}, + {16015060913808091198u, 4662417609477995339u, 4563132662752990215u, 9809963713305183656u, 1011575u}, + {8658295063035460504u, 10112164044018814989u, 18098817381967301811u, 90717868984254388u, 3293701u}, + {15006953686587338586u, 6800050486951224777u, 15706022854192763403u, 4456271295806643188u, 1141355u}, + {8262478072455938642u, 14018014548458976239u, 1684609589779182506u, 1173975792645367037u, 30576u}, + {3037992500427528979u, 11605639072233635590u, 16520495454057883571u, 7566611402803206815u, 449015u}, + {3778011359176244855u, 1665048344668387863u, 2251702846448775926u, 10888979572083986433u, 170127u}, + {13617728094243903390u, 3991443138215172004u, 17925838737148579451u, 13910253949438099204u, 2196877u}, + {13674970509213397488u, 7266468140592904862u, 1173257877282329776u, 11281509911607430784u, 2687729u}, + {13022249625694415968u, 16345662587311648441u, 1157548834637506746u, 15037559420173007899u, 2806669u}, + {7608255289886017363u, 4292955701289402932u, 12867249683952773142u, 7978109263952246693u, 3741812u}, + {2693648253400758492u, 11919867320527082896u, 12979403722914827367u, 6554207719727558788u, 853722u}, + {7685507716534173494u, 12836499046131194100u, 10187648664040998725u, 16516937432483800529u, 2588233u}, + {17005992347408947521u, 8411730750372844277u, 7222547002551930157u, 14026917731629086510u, 939768u}, + {1911722380786545921u, 16045209049193821958u, 9816464343944114682u, 16302351926383293145u, 3757732u}, + {13009180021967968328u, 2795876981547718055u, 3622720236428547968u, 9941208320000067899u, 140393u}, + {17234671529266288720u, 14474513703523419351u, 1477454836910666395u, 13549417482812400593u, 1056112u}, + {11436565018367593981u, 15686995974840376081u, 14548533568643765996u, 3622361543222987824u, 3698540u}, + {16596705383045270809u, 5714133926521628253u, 4737648960800460492u, 788801964828018628u, 3689296u}, + {4880029142410635427u, 15269076880969458054u, 14143505403593523431u, 15560438218067468558u, 2074622u}, + {17673794326903665977u, 6251284131830479455u, 8488411524057763880u, 975018759137188843u, 712422u}, + {14854961120618209493u, 876046950358194963u, 5876446359259012305u, 13271739170260239289u, 1322076u}, + {13234002698235338095u, 4511261667864998949u, 7794009568343891590u, 15877058699233878719u, 899679u}, + {1041754741884577160u, 1344290208854572230u, 17011771546415045911u, 737172104517828994u, 805266u}, + {4063448896278959215u, 8960091086321231252u, 5708139289424770432u, 7004441158229441692u, 227001u}, + {9521799998554811973u, 9774342349287475575u, 2874469582591104872u, 4759988642859161076u, 3370887u}, + {11907265118947323261u, 8881833531583437602u, 3271796951840116991u, 17644234839804799596u, 2529105u}, + {6378052422692720799u, 3181897470027276315u, 6356439507724219720u, 11647926410421171731u, 97711u}, + {12534105623272754740u, 14358285787015384004u, 7731449317865794312u, 9657520062540456068u, 773061u}, + {12816832105891479186u, 11226448945092865855u, 4100206586186202243u, 17019852661028878938u, 204254u}, + {17009998302823550897u, 10610564896581173820u, 14474300497359745021u, 5263972203052623459u, 898493u}, + {4303437031255955973u, 6427594085638275297u, 3924326166898501924u, 9960522252921046887u, 2209423u}, + {8934513756284976096u, 753940646599968206u, 10719854100283269178u, 16902233675467226855u, 2675457u}, + {17411959327114533550u, 83974191463484952u, 5628385098724818993u, 1562562962257935067u, 410997u}, + {5983616583248287154u, 17367958133604277927u, 15559021014900100808u, 1016387874567616470u, 3399098u}, + {1247586198233276984u, 8863347245284049802u, 857014310106953132u, 13249242000844658152u, 2189106u}, + {1638281204768922819u, 2466792704794564406u, 10045238090569116793u, 14884246263194618838u, 323475u}, + {17053897244449059555u, 14329220524488676184u, 7445187784844612245u, 2816213242902678964u, 85458u}, + {8483511075617998484u, 5434870455966139051u, 14105839516085788786u, 14557210420332707385u, 2136347u}, + {16265429489751015737u, 130311089091999848u, 14736995701331896143u, 10703932578532182127u, 1680220u}, + {11064006033243207709u, 14824978503127081697u, 6427171179710072236u, 7452926784938038249u, 1667967u}, + {1424052663956695611u, 9508606160085061560u, 11406044685022700440u, 10479119703324870604u, 2222667u}, + {6574892858960091953u, 6162497456532794712u, 5285923306377695786u, 17406881142929832067u, 3264487u}, + {14229242699045388648u, 8070987892065293447u, 17636803975309009988u, 15264371515630627511u, 3541462u}, + {17330605815290037881u, 9454075069091991489u, 13202890053527580945u, 8640182148938563475u, 879697u}, + {13960324764975734528u, 4530804009540762377u, 6760802311907010807u, 18390914033733215900u, 354219u}, + {11103742992450764047u, 13330319558186956203u, 7324903314963847458u, 6491717669043473597u, 2858714u}, + {6202741815783084062u, 14992735033161068126u, 3354640416928608855u, 5673226306988027204u, 2488793u}, + {4881955875988426749u, 8724998709944597246u, 1532310011728297038u, 15033889693085676811u, 1406581u}, + {1716027667633088016u, 1200247557590151226u, 16736024518438171633u, 11627219494866229843u, 1900772u}, + {17315908377882838838u, 3539781747995549371u, 13105994692456874737u, 3421769986036305538u, 1485080u}, + {10383845120845729715u, 1542159337316946331u, 17528000640917020675u, 7881672644244899590u, 2852867u}, + {8824608835937473773u, 16069004272268179591u, 11713362674684815940u, 4808427321810247967u, 2646226u}, + {9787456490002130846u, 2928340726475068281u, 13740042264026013975u, 7326631256422344989u, 1643616u}, + {6584893677389337044u, 2230784962946797515u, 14964523523968407203u, 12856571109785258062u, 3734153u}, + {6647891555701269342u, 17535330351565779067u, 1490484207866844434u, 10877522083268836253u, 3197352u}, + {13850740948785944991u, 1063340332890964560u, 10096956065417169517u, 8777949623524365721u, 3027043u}, + {15687117372239352410u, 4392709535191925387u, 14327903582165929273u, 6973368123940145461u, 2473690u}, + {11862879971475030313u, 5352080942117985530u, 12490816177289485777u, 16186532597816920368u, 2662543u}, + {7458784143849222489u, 10734032601247470441u, 9320030331960683421u, 5093146848147734968u, 3651913u}, + {837338912543977286u, 11948085957013755877u, 16941053980732885221u, 15343575845624322149u, 3275660u}, + {9704339843543815226u, 18417025735318848905u, 8684518844656174626u, 14976347242887146027u, 1101995u}, + {12921157535043369260u, 17071704936299824042u, 4062341010919400394u, 15440653358828433104u, 3245876u}, + {3999568940235750253u, 13622033485370680407u, 7186274481024956685u, 12742012409982966159u, 2488015u}, + {6446995220745874478u, 4471849916749599848u, 864200433802304965u, 2279681203874328896u, 3288927u}, + {14844250948228958695u, 5053459957830551346u, 6310353119153559091u, 8059062935135795434u, 3127010u}, + {4488189988532077011u, 12888869124329119270u, 2481891251585437105u, 2147353388344903584u, 2252467u}, + {15713004601172641749u, 17164525681876872848u, 17427381721044735914u, 5373812643237496984u, 1947292u}, + {9395594692162700115u, 15857544519760386402u, 7801512811493552385u, 2918224964051712103u, 2049525u}, + {1833918673699492026u, 6056420881485159971u, 15264579327043993592u, 12431713240589499524u, 1903918u}, + {2761073882674185418u, 10114515507220126239u, 12601542962442787916u, 13077545621379998598u, 2161344u}, + {948705111552720413u, 17571983763222809385u, 9369663990226360516u, 1841309623648991718u, 1764772u}, + {2922413643356677726u, 10542403464151332971u, 8733855779361309328u, 14948476265124840928u, 957504u}, + {237036439965188503u, 2003589428759551671u, 11720459681738149355u, 5638155181144408463u, 3310350u}, + {15391688011471962489u, 15075512369341635953u, 6206113069559735613u, 3015426540437604971u, 3569691u}, + {6964005116664391093u, 7802951452265247568u, 8398352980472763397u, 10370085126738345711u, 3267829u}, + {9469361589650986641u, 10210852025024870530u, 1588400717882288982u, 6185176308833605897u, 2118599u}, + {15374884863080801534u, 4210260490998654641u, 3278205589252927783u, 16396155106342634763u, 3399859u}, + {5499501281205191419u, 12358202413345480277u, 14577666919188495865u, 13537486430348377220u, 1117112u}, + {2753301793446168275u, 15737257853195189354u, 17952928660143757464u, 11765994920885409822u, 2467737u}, + {6533991005335169336u, 18445358517605944997u, 12204786741138465618u, 8548317821121715156u, 3461597u}, + {10395952851897520491u, 4453282849387622521u, 15993436107474955468u, 12385703782979315639u, 1610864u}, + {13586420618861338358u, 16239334297279004282u, 2465810662610401192u, 16747077025130536998u, 2468949u}, + {6390799714822619958u, 7289594411610891991u, 16294167352731098180u, 17195251468107966916u, 820030u}, + {642821942821957409u, 16485820432297985822u, 13274929992688793718u, 15579567212930449687u, 1406879u}, + {4596190126858995318u, 5005408433588541399u, 3660131970862439516u, 14653643942134614641u, 3149778u}, + {3517123357391337468u, 8572315239066849646u, 3773390136813270829u, 17279868138373421370u, 1479226u}, + {13867755392285283167u, 13003438350408410571u, 10554315435338337287u, 6440412790104631527u, 21386u}, + {17437403387317244613u, 6934738653826926426u, 10615940793640953338u, 11817839930729354646u, 491476u}, + {7185370345685990263u, 15512057653383382027u, 5891518587226615216u, 13916181793128302054u, 1623018u}, + {16029147652369923384u, 18434360568563999162u, 3191270903336855773u, 13144421526492090074u, 2154447u}, + {1678922790945775977u, 7892627424246359254u, 15541869358950459988u, 4795543752077036624u, 144601u}, + {6691351692451332612u, 2685724713022685720u, 17529236981034203503u, 2308510431649040178u, 435853u}, + {10004333843372552847u, 8315111896745808099u, 15671037164641355088u, 6204993158315071456u, 824164u}, + {2033738546927879984u, 11585491790907844398u, 3931378967097172185u, 7581250522570191197u, 885234u}, + {8108743281754053647u, 4750723585761750349u, 14488614045340727518u, 10464680828124147443u, 3843978u}, + {9831500931560834198u, 1473108545327230816u, 17080133489546363205u, 13978024538175742370u, 1317590u}, + {2640678282442394567u, 16820555948333493091u, 5339738625727315971u, 9535907672508591058u, 375611u}, + {9173420673067322281u, 8993992601843136700u, 16613662232843552668u, 2168656630662015870u, 3162830u}, + {7642681393037540345u, 8468514085987096860u, 14750923235423042529u, 18360972803361003155u, 3761237u}, + {10705194494932991498u, 14508771544996968012u, 2813352558591893206u, 10013330571934595064u, 108650u}, + {9697314872099800369u, 13529045585754489716u, 13238738721713957796u, 14989983808645949802u, 1881608u}, + {5545765174708906846u, 7364661072725322865u, 11861779048893588602u, 9546311969219515842u, 2411554u}, + {11508739774434971765u, 13500284669629248323u, 4746109409709160268u, 13663370602172622437u, 202093u}, + {5024358344523268869u, 18412541388726961047u, 10834782297305162828u, 15568168283705892962u, 805265u}, + {11489761283995186632u, 247283418874077092u, 14535134176700600092u, 1744236789844954469u, 174477u}, + {16845161240166583684u, 15793742712221916765u, 5206765102506284692u, 3822271018320166019u, 2571024u}, + {12695385111347936545u, 14138919111351035219u, 10222093578947667223u, 16836846436394845132u, 1227762u}, + {4267996090762519790u, 4826443156199642131u, 16712907381049431643u, 1247627326879047134u, 770554u}, + {2299547268856541489u, 17147481066757779992u, 13188728394944577159u, 4914130608259700164u, 1956158u}, + {2774598537832567866u, 17922639459432677929u, 6082841394036611014u, 7818304907004087225u, 3078738u}, + {14986714134466896825u, 17375710303406199265u, 9725636909970320563u, 3659672401670706104u, 2807003u}, + {7847561951239664091u, 14503033030077250220u, 3421372087865053038u, 12157455867986700582u, 3066007u}, + {11637189233428723241u, 606339732945894974u, 3840942205606155693u, 9279929895469433677u, 539976u}, + {1859045723913649296u, 8771293640609763417u, 5770785212338253898u, 7864238558492020308u, 2305484u}, + {12428174637508148729u, 3779670169923630252u, 7192061816645133932u, 9337958312070974494u, 357085u}, + {5953424497091156862u, 6371173291658646231u, 5714319012656729697u, 10599053388520925479u, 76151u}, + {5936481432885865604u, 3086871094562749428u, 10810446800089012580u, 3099881292237911692u, 1701138u}, + {1027445060253501258u, 5769104473391394889u, 8390514465458087949u, 2769569033861204979u, 3497984u}, + {4879377071331857619u, 7313925896381558024u, 1127965337215153484u, 9287898455246275674u, 2776987u}, + {11183040942903419362u, 16784798324293230004u, 15859342249614273495u, 9202540820589764793u, 1911951u}, + {11631347816998845071u, 3852411389863690474u, 9436018905718908948u, 13942384929301105519u, 3816156u}, + {7927006485246310478u, 1272102011209752152u, 17668542635655590999u, 214510855095591948u, 608532u}, + {13684560227896834526u, 1647691940409850074u, 17701120424025769114u, 6640524085768543587u, 2886162u}, + {12343013871811577560u, 15870242652568083957u, 12537908467780106111u, 12519204066971322720u, 2253246u}, + {5562616960595470248u, 14831326264863705602u, 5752953915684041780u, 401853035005953499u, 172961u}, + {14652464318174382885u, 2619204875387872379u, 14075022070149366487u, 2525206359031063672u, 1492179u}, + {13455648887367711757u, 15090599961935138442u, 956923682307084342u, 6800939686215596188u, 3439968u}, + {14736959415936112528u, 13499282281282221835u, 1272538974787882476u, 8350079530480402825u, 1752510u}, + {3712134450672900589u, 15796910547940205622u, 14443044017778934692u, 10264506465192463168u, 2448396u}, + {2941062511168632253u, 9404865066587360649u, 9792843406058691059u, 6098002843853547260u, 3846235u}, + {7812548690776538432u, 9472981931637008753u, 2090256289951975302u, 15058930078679357789u, 3734698u}, + {728516847240446318u, 14156264098867437614u, 12553558264013007539u, 2014448072281579265u, 3816206u}, + {12007410989543939295u, 12792922452416219394u, 7671413546924797942u, 5762946506425309849u, 2665960u}, + {18215126213725143265u, 11007203302785920175u, 12018076073806771539u, 8551974384069189670u, 528975u}, + {11366852707458164014u, 11450186604472986950u, 2495166936281151055u, 9521360288004852446u, 2357160u}, + {16843695572440042589u, 9179630224866922711u, 12765571287296336416u, 15752037437050435542u, 2837169u}, + {14609296384225554900u, 6542697690496847937u, 16588246537645557194u, 9347766177081603635u, 1733711u}, + {6745108376857827263u, 7062789211664290570u, 9653745863643295221u, 9183295775279389109u, 2374293u}, + {4293164951553620884u, 9399464164783106409u, 13178291201641766704u, 6961327012151377703u, 38341u}, + {10843202350078151244u, 7880804140618115376u, 1289183170592308871u, 11169634349454687190u, 457262u}, + {16557803099215094289u, 17304916135274788451u, 8222130399316202834u, 7070079221975204654u, 845981u}, + {9681873163828538928u, 14543081630813498363u, 2967342337581845186u, 1384699888788930886u, 2032510u}, + {4156012988027241459u, 2248501725632019063u, 10034420885061133392u, 16538682227867452633u, 935665u}, + {8005518421539597894u, 3352078878523387884u, 8858814079721606947u, 16590506618055834955u, 1832400u}, + {7211553829259769372u, 17397467946769417995u, 8061104590455518335u, 4213142284630992288u, 1460959u}, + {12941791949790970308u, 9776812136948649186u, 8307528685440158938u, 11628222581094722613u, 1523137u}, + {389637195674561296u, 15836696149794518912u, 7645474542819057235u, 1108960840625339366u, 1682811u}, + {281649020977707141u, 3712508846890357331u, 16414133175449961810u, 6227995472212186580u, 2196550u}, + {3344608148120867623u, 1035819547797599481u, 15021393639583379871u, 13803519663167337963u, 1780893u}, + {18128007822165664545u, 971927347006977557u, 12422241329226164262u, 8463590193634748999u, 3594090u}, + {14042438823703776117u, 6140767736879608258u, 42398728424274237u, 4966215661450568604u, 2769910u}, + {5397739318128036648u, 1944789708199947873u, 10463789473911654004u, 2501054023132974309u, 3707020u}, + {9116974192361154300u, 18090878122060563150u, 3034833054984359849u, 17290147426781953509u, 3669450u}, + {12238592678213849045u, 8474426737728208134u, 17695679523780774827u, 8426370330731061516u, 2928496u}, + {8632896899488778231u, 554045365737378727u, 14763133173300936320u, 17347843793761957097u, 1248082u}, + {13404152286509190100u, 12735308626939043230u, 6676939393517962236u, 455368630812414974u, 1387181u}, + {3802702705419946350u, 9555519622375744636u, 6136299646022062672u, 1754971230256551584u, 3482499u}, + {17638333891439030637u, 12247364511287812987u, 917171531185328193u, 17790408902875192926u, 978149u}, + {15484061132840028648u, 7523902165384825799u, 1454188380180061528u, 11691373916203689459u, 2178269u}, + {14727038851235404145u, 3241589822773039824u, 9089119641759790086u, 12794376127171313819u, 3828950u}, + {10978920350877855469u, 2376361041232819911u, 15336568042227157127u, 13833632134759642090u, 1127285u}, + {11978163484151291493u, 358817342788212374u, 12047285412354744761u, 16449926192374333214u, 997568u}, + {9961844319336256859u, 8054910866271844732u, 6655642495641808282u, 666920244383399906u, 2819824u}, + {4392204527577923428u, 11419643644828322882u, 1096391279581165813u, 9275388609182600015u, 3405660u}, + {3405082463816402553u, 6147949562857309675u, 13634847703080353901u, 13609651026827910248u, 2384505u}, + {7198680635180286687u, 9400533632302684145u, 3763510790085126600u, 17337808936189836461u, 2077536u}, + {14533658710239762772u, 13260441839212692221u, 3983290989151884061u, 17908607113639855311u, 1378165u}, + {12872939595538418730u, 4046752225480953658u, 15545439265889344715u, 13788423136199186813u, 1520885u}, + {17834787851078018773u, 4051699743708297388u, 11228292827477395120u, 15448380514265545191u, 2539181u}, + {16168526557320551466u, 14859429959875179563u, 4563940082162025340u, 11071651525315180615u, 3160946u}, + {4755829981145781247u, 14686311778556699623u, 12130013533176226100u, 15190403920929333997u, 3451049u}, + {4316072503736700557u, 17124713828380715180u, 5980050398061779607u, 17501598390057795707u, 1600051u}, + {18118155546254569145u, 16046386882515911390u, 15320539736979417948u, 12639594705440870231u, 1484378u}, + {9330739152138157102u, 302445674542228091u, 4602925287605697427u, 4422895190027843638u, 1147945u}, + {5014484907047255946u, 8186191953462974400u, 4753223426195820743u, 4488746682400121733u, 3739862u}, + {12144943166135154794u, 5071938618485850452u, 9700012388873960068u, 14120219119069685753u, 2142546u}, + {5470933967573172383u, 16777201067397973595u, 854823771835935570u, 2921826773365486664u, 98635u}, + {8169591807426507763u, 8126660619016310254u, 18246243166600269298u, 10089882662833448154u, 1429284u}, + {1149130891336732208u, 8593667828068766554u, 11167125732672787361u, 12924674979035631089u, 258181u}, + {11515374270671655638u, 1005323967225168116u, 14414315068453126195u, 16145663676252227048u, 2293394u}, + {10968805702742670762u, 9303752378548971765u, 12378719943772726819u, 8689216952875197039u, 2361201u}, + {3663304771643505122u, 14235546083351443237u, 15872461382336065524u, 6672855130732174131u, 356520u}, + {13766005937579237824u, 17133415968766257523u, 1370785887471395405u, 9229948676724789868u, 2868319u}, + {17425746963422294387u, 1595358506440561886u, 1963533642997447110u, 17707021695037051504u, 1159215u}, + {16918580947722900013u, 14367147269240461782u, 16852815227478395904u, 11406483618131040800u, 2821909u}, + {492268169062627409u, 12948105558019975652u, 4098788040688299888u, 10068060615800764369u, 1270942u}, + {10228239162361558849u, 17557274258545047144u, 13848093285059941943u, 5932167462984679932u, 577457u}, + {663409416936116328u, 2509853815176723090u, 9817365400230685382u, 17592705152679155943u, 3743061u}, + {8494689970603619382u, 8172757763810566159u, 12183936470410108821u, 7995382650084061460u, 1462956u}, + {16884991649889650846u, 13931942521599100664u, 16196210982453665610u, 5863651899990643296u, 1888171u}, + {6352664210695289022u, 11125580414077535833u, 14295814056549672749u, 14878694984881206953u, 1800244u}, + {8062120154997602473u, 2686843197689059941u, 16982095796110127927u, 8031601593426927058u, 2464142u}, + {14152188086439304902u, 2615091737377042072u, 6734547120186337966u, 7683560372887241611u, 1632014u}, + {11327099398067315518u, 16694003187009180400u, 1075006799358902271u, 4785906558769515169u, 3482597u}, + {5219456662135146897u, 17919104620092819530u, 1821466947108453521u, 4099467846480739638u, 636302u}, + {1271035753875848866u, 11298340060826347396u, 10940831611489352524u, 16512926738932554725u, 667789u}, + {8272677097497678057u, 14416663763380037444u, 12850956533245975662u, 9379805774221796846u, 2772815u}, + {13399664211762580838u, 18397812955772568223u, 10808240410613737774u, 16264108076582334324u, 1238859u}, + {11900961501440319446u, 17273052697371653210u, 18221333505013287801u, 8957994591883583881u, 1829160u}, + {6904205362125972570u, 5815270729695735691u, 5856960077102694906u, 5077773638002816675u, 3646412u}, + {8189648584756242079u, 16092710390264599939u, 9777115020945831627u, 10443557975490699815u, 3549587u}, + {9839747179645009882u, 875322722580543311u, 12593267655330137137u, 7559468113344429785u, 1133888u}, + {437986791319239988u, 11563168585254464126u, 7511381253723257848u, 17098566336292639321u, 3249064u}, + {10399116111922020065u, 553914562963893900u, 16681884031537180142u, 10940631368912787722u, 2969518u}, + {7481090572508686726u, 9105997286435572012u, 3844832932339718160u, 17925061270915033337u, 773891u}, + {3191758599946248493u, 4313513741769659536u, 9678844158845177505u, 302506163294720173u, 21931u}, + {6723500273707459805u, 9418328466606392980u, 8692302625523307287u, 15276614491887509119u, 3188863u}, + {3304979254076841604u, 3923772243011484543u, 14432026559726722724u, 4094049421047700569u, 2461849u}, + {5748553232738144343u, 2758422294430651754u, 18151569490523550692u, 10709937020158501734u, 1559630u}, + {3686087620605672445u, 12085829244329316615u, 2681489092587887041u, 18043168615651600648u, 1403881u}, + {15235124152287479349u, 15310704344973464483u, 12614295774333663453u, 13644782324728491958u, 559171u}, + {11064257405994394812u, 17406911400421697592u, 7658392599086458312u, 5198461668706033960u, 1789509u}, + {17579444734280603850u, 12354758068935432212u, 13075614906584947220u, 13219550328679873862u, 1094423u}, + {5380579754499308312u, 6078536070709789469u, 5314717826996099227u, 5496565701091454893u, 650273u}, + {4395215640372042695u, 5229353169061432080u, 6446142060147614297u, 14999974984994619720u, 2380776u}, + {14471205982549413004u, 3254958858438238867u, 8351832302854000933u, 9123174429347724852u, 1780714u}, + {17585075477188843751u, 7537733451311911273u, 15570134387717962848u, 2266633799725412075u, 3737033u}, + {9320815301355511285u, 6680969760064995093u, 9769532238253090595u, 12823130238325885498u, 2325262u}, + {3229848785561686085u, 16538554489461012066u, 13569588941945093684u, 7320710523672173793u, 1857238u}, + {1514833086652727062u, 9393297925777120574u, 16535115396064993281u, 13076684522255635119u, 2296499u}, + {2632111274136502680u, 12881142414765778813u, 15351887775478463484u, 7464295128301791841u, 1923696u}, + {17311956993984613490u, 4808880175929983233u, 16736446409294715134u, 9114742784030833833u, 2654284u}, + {5349133165334254204u, 12979438413182060507u, 9820249237960313741u, 4444476143075288963u, 1124876u}, + {10901601237990109893u, 17592796434216103608u, 12154348999723406960u, 11477907756161676072u, 1529666u}, + {10787739619638065370u, 15211056201139129319u, 2654787682798389006u, 7089861584415100479u, 2575958u}, + {12405524073856175404u, 16989228433535654680u, 10639133950852276899u, 9415005269991117973u, 2298694u}, + {3571842624676046785u, 5639349185588819630u, 618103863413843056u, 5230550200067588366u, 84411u}, + {1209797948352788640u, 4227162315684688179u, 535814127118359450u, 13764557574588791873u, 3024170u}, + {11142807170009786031u, 2436219767506888066u, 5522043777920004113u, 10864425209479138189u, 1257528u}, + {6320941892571868437u, 11586553155342721295u, 9291688396908926266u, 6003977613193967722u, 732957u}, + {14964069911112534314u, 8670346224276586826u, 327913648484062634u, 16802940087037220633u, 1382674u}, + {4254537182534329437u, 14470897151435261542u, 11221556872980890017u, 11194432926097142447u, 79435u}, + {5479524276356499611u, 2009620208281319148u, 6082987398048782904u, 7063109544026865772u, 3275624u}, + {13702668508662797446u, 16026881741385879133u, 6077725440716443705u, 14399885818220469584u, 447195u}, + {3035180004585777214u, 11889984842793452401u, 2866378767222985719u, 12258040292563677481u, 2087241u}, + {3316845911723930173u, 4002536005755113373u, 14539888540316034093u, 13873560868087357602u, 1247563u}, + {14600941434479352562u, 3204211495329765253u, 7933380354741151915u, 15947741771632464033u, 1155329u}, + {13423598370464393328u, 7220577067768861545u, 3531180849623850648u, 7227071478124470154u, 1426838u}, + {13729833874459346953u, 15417339341341384743u, 6145355001968135557u, 1611587591482129659u, 201181u}, + {18039044018930336416u, 3358119776101251682u, 14495232997582767572u, 7209470539823874152u, 1489023u}, + {17171593612359121780u, 771898327525321260u, 9219411904332264839u, 820101167827545053u, 2694118u}, + {15916293156891082302u, 5767121722789659450u, 11218198172498423533u, 15253850048073269893u, 3325492u}, + {11515893155456123206u, 9812874144923343681u, 5457745300950232081u, 11374386779051704524u, 2318023u}, + {17016902438214055516u, 6139341203661102875u, 318754061454271650u, 4077985254536323631u, 251041u}, + {11644152058382405766u, 1871146266019320667u, 1541334063659549027u, 16649935115918346590u, 324326u}, + {7460627655892988888u, 10898652264217523489u, 17630612266575847913u, 14633674365067756047u, 3617799u}, + {12842830443853397471u, 15786266275946955203u, 3589168826506087041u, 859370161314004003u, 523461u}, + {3960052638597371814u, 40123621054712290u, 16832044840913076713u, 12403562326482543228u, 766040u}, + {5893777273702088355u, 15386196821392675957u, 7424147988743268092u, 16082974426691716519u, 933u}, + {10944199825008825552u, 6546772434895344384u, 12974964729871316353u, 17226895195197u, 0u}, + {16699794329279300718u, 9926279784540748962u, 16513436708047969309u, 17226u, 0u}, + {8681837665504033514u, 14464212403127020161u, 317780126850428u, 0u, 0u}, + {5620940765541904479u, 2339977395420732573u, 317780u, 0u, 0u}, + {13526352776507011038u, 5862008671720816u, 0u, 0u, 0u}, + {12391061995261696936u, 5862008u, 0u, 0u, 0u}, + {108134973725099977u, 0u, 0u, 0u, 0u}, + {108134974u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1760946u}, + {6385517845005574083u, 16428621867789277255u, 1475531741771517864u, 1978038759213676812u, 1847611u}, + {4235284030464885607u, 17787783447805064704u, 10781498191248144393u, 15022061969131820025u, 2941987u}, + {12656763870093952522u, 2303221099032560692u, 14054962015761002721u, 1135134006848161551u, 2750165u}, + {12434284708005169469u, 2970098773289638083u, 16015060913808091197u, 4662417609477995339u, 1306511u}, + {14924003958032661458u, 13901448572703073888u, 8658295063035460503u, 10112164044018814989u, 1443975u}, + {14097229099939831405u, 417086929493333637u, 15006953686587338585u, 6800050486951224777u, 2105591u}, + {10789202615659435063u, 7651316766350711884u, 8262478072455938641u, 14018014548458976239u, 236704u}, + {760642426870531712u, 4952432235019675326u, 3037992500427528978u, 11605639072233635590u, 418701u}, + {11027295927120582364u, 14240537306777867055u, 3778011359176244854u, 1665048344668387863u, 1532816u}, + {1335632512740772017u, 5420051098005144602u, 13617728094243903389u, 3991443138215172004u, 3291027u}, + {3206657328012850837u, 801827673784756340u, 13674970509213397487u, 7266468140592904862u, 3287644u}, + {17670162493363574079u, 17779048363903790899u, 13022249625694415967u, 16345662587311648441u, 2252844u}, + {4727160643303868157u, 3675098482916345100u, 7608255289886017362u, 4292955701289402932u, 1646052u}, + {13122601933649434171u, 17807143551211316525u, 2693648253400758491u, 11919867320527082896u, 555507u}, + {4616534370848138846u, 15952866391750187672u, 7685507716534173493u, 12836499046131194100u, 2875837u}, + {17996752580078536699u, 2358006082422153633u, 17005992347408947520u, 8411730750372844277u, 2625025u}, + {3829648588504033061u, 17486324528472598581u, 1911722380786545920u, 16045209049193821958u, 3127294u}, + {11055863720207011781u, 6987813206083576031u, 13009180021967968327u, 2795876981547718055u, 3414960u}, + {7592766626832093822u, 7367204706171158369u, 17234671529266288719u, 14474513703523419351u, 2737505u}, + {291971549463323332u, 5826721683747595494u, 11436565018367593980u, 15686995974840376081u, 1170070u}, + {10427461673867572100u, 15997252511084812032u, 16596705383045270808u, 5714133926521628253u, 3519566u}, + {3726745245347216718u, 15385059614024404727u, 4880029142410635426u, 15269076880969458054u, 2945291u}, + {15602117846029963402u, 10293364115934496705u, 17673794326903665976u, 6251284131830479455u, 615600u}, + {17928907108121239003u, 4169496470198713743u, 14854961120618209492u, 876046950358194963u, 2368485u}, + {11223580240152352384u, 14172335745551195304u, 13234002698235338094u, 4511261667864998949u, 2561618u}, + {6652646337752163058u, 11623025718973238398u, 1041754741884577159u, 1344290208854572230u, 1352511u}, + {13933306859717424872u, 2109696116323075320u, 4063448896278959214u, 8960091086321231252u, 2524410u}, + {17086839341630451285u, 17098349913641394563u, 9521799998554811972u, 9774342349287475575u, 1016410u}, + {4389437357071165355u, 2999147890548561383u, 11907265118947323260u, 8881833531583437602u, 616007u}, + {8467873223046676873u, 16896558730605760560u, 6378052422692720798u, 3181897470027276315u, 1020482u}, + {13153831611024150368u, 784680791008708364u, 12534105623272754739u, 14358285787015384004u, 3118266u}, + {6270504843830044370u, 15413370683938726520u, 12816832105891479185u, 11226448945092865855u, 981125u}, + {7990435203554548177u, 15545419244155360361u, 17009998302823550896u, 10610564896581173820u, 784323u}, + {18074481868763500427u, 16514416361855946316u, 4303437031255955972u, 6427594085638275297u, 1808704u}, + {4863415545007027248u, 15283108075608014333u, 8934513756284976095u, 753940646599968206u, 646000u}, + {13879658395052809401u, 27171903282985581u, 17411959327114533549u, 83974191463484952u, 112647u}, + {11923174591518528755u, 9476092670499441526u, 5983616583248287153u, 17367958133604277927u, 14266u}, + {11675623582184231943u, 3115627062921387973u, 1247586198233276983u, 8863347245284049802u, 912600u}, + {11519324153379443239u, 767432794817697160u, 1638281204768922818u, 2466792704794564406u, 3351101u}, + {6054307747273063955u, 4440425893812179010u, 17053897244449059554u, 14329220524488676184u, 1656167u}, + {17998706054820227769u, 17882680460201290525u, 8483511075617998483u, 5434870455966139051u, 3157928u}, + {14891997423783158983u, 47556960036556622u, 16265429489751015736u, 130311089091999848u, 2882445u}, + {15959300373360278479u, 15522197711033054031u, 11064006033243207708u, 14824978503127081697u, 3743822u}, + {16431612599025015938u, 12233970926678380929u, 1424052663956695610u, 9508606160085061560u, 2038406u}, + {17072495321957737140u, 2865806961206434356u, 6574892858960091952u, 6162497456532794712u, 29130u}, + {1326504276608304757u, 15784137790349164924u, 14229242699045388647u, 8070987892065293447u, 787686u}, + {9005626007052425884u, 5301221915039135097u, 17330605815290037880u, 9454075069091991489u, 3427877u}, + {2970828828335504121u, 6445163552594728462u, 13960324764975734527u, 4530804009540762377u, 3888071u}, + {10880417640353600087u, 2435470776575264474u, 11103742992450764046u, 13330319558186956203u, 257794u}, + {18107984423965040456u, 13184370521847167410u, 6202741815783084061u, 14992735033161068126u, 326877u}, + {15774128786724388322u, 9750553967309877310u, 4881955875988426748u, 8724998709944597246u, 2565550u}, + {16500336884670397045u, 4755885776128631627u, 1716027667633088015u, 1200247557590151226u, 485703u}, + {15585373896781801471u, 6171963269374289868u, 17315908377882838837u, 3539781747995549371u, 1569375u}, + {6034937858404979426u, 13603226262571284830u, 10383845120845729714u, 1542159337316946331u, 8717u}, + {1835174746036302223u, 12752465919757693234u, 8824608835937473772u, 16069004272268179591u, 2495668u}, + {8109886168031320595u, 15822057148714670121u, 9787456490002130845u, 2928340726475068281u, 3743595u}, + {6994892780381466292u, 1137191262334233115u, 6584893677389337043u, 2230784962946797515u, 1373413u}, + {6620729979841328143u, 14439938065556920208u, 6647891555701269341u, 17535330351565779067u, 2956294u}, + {15061475822117977212u, 16753253236908322196u, 13850740948785944990u, 1063340332890964560u, 3754261u}, + {17549775806766407066u, 8147704885992579164u, 15687117372239352409u, 4392709535191925387u, 1074389u}, + {15836089370367921980u, 12444693481753885909u, 11862879971475030312u, 5352080942117985530u, 3768073u}, + {3362309991329832985u, 14698201145419326720u, 7458784143849222488u, 10734032601247470441u, 3175787u}, + {9726757417825058501u, 2365260281721218742u, 837338912543977285u, 11948085957013755877u, 2295215u}, + {3238895087708119439u, 13942188575319904416u, 9704339843543815225u, 18417025735318848905u, 3583978u}, + {702709976834881568u, 5608689623980118222u, 12921157535043369259u, 17071704936299824042u, 170664u}, + {13757560738480537691u, 11068930325576712386u, 3999568940235750252u, 13622033485370680407u, 231969u}, + {17521352730152326979u, 5264236428263812939u, 6446995220745874477u, 4471849916749599848u, 511113u}, + {7223555124449262451u, 2020644784989846496u, 14844250948228958694u, 5053459957830551346u, 3394495u}, + {17729595471815746321u, 16612557564702348804u, 4488189988532077010u, 12888869124329119270u, 803301u}, + {15357353122666870006u, 8266605588388267252u, 15713004601172641748u, 17164525681876872848u, 264210u}, + {11288132128156295023u, 11923124539888803973u, 9395594692162700114u, 15857544519760386402u, 194233u}, + {4560741232332042669u, 9259509109737832917u, 1833918673699492025u, 6056420881485159971u, 1433984u}, + {2050922974861032980u, 1431022137211151335u, 2761073882674185417u, 10114515507220126239u, 3360398u}, + {17705587084571413411u, 9609962833468514526u, 948705111552720412u, 17571983763222809385u, 1192336u}, + {534585443476581026u, 16861021158545550347u, 2922413643356677725u, 10542403464151332971u, 3146050u}, + {18440850763787700554u, 2489529450114473837u, 237036439965188502u, 2003589428759551671u, 838913u}, + {15798863269869184777u, 2507395199612090198u, 15391688011471962488u, 15075512369341635953u, 1123845u}, + {12646229868454239922u, 11263228789445900320u, 6964005116664391092u, 7802951452265247568u, 2750147u}, + {7040010108274449919u, 11251499546662930134u, 9469361589650986640u, 10210852025024870530u, 1676178u}, + {16401434436224155721u, 10056395429649144514u, 15374884863080801533u, 4210260490998654641u, 1970745u}, + {16335821516737707724u, 5794235014768111883u, 5499501281205191418u, 12358202413345480277u, 1555957u}, + {3595605336940471324u, 721497213466043577u, 2753301793446168274u, 15737257853195189354u, 3831138u}, + {14574208634607420989u, 1918115803083813706u, 6533991005335169335u, 18445358517605944997u, 3131696u}, + {12291919933391912661u, 16741229378344839016u, 10395952851897520490u, 4453282849387622521u, 1429826u}, + {1647064190282095588u, 14468723690332403942u, 13586420618861338357u, 16239334297279004282u, 638454u}, + {1226638938323591488u, 12954910285309182421u, 6390799714822619957u, 7289594411610891991u, 3073116u}, + {2769516034492238858u, 2858218026755681827u, 642821942821957408u, 16485820432297985822u, 1812484u}, + {2638320689254069221u, 6267511222119172904u, 4596190126858995317u, 5005408433588541399u, 3768640u}, + {2866689702101687417u, 440617846854237223u, 3517123357391337467u, 8572315239066849646u, 1792805u}, + {13737138147366328761u, 1458021115059934698u, 13867755392285283166u, 13003438350408410571u, 932935u}, + {3600105140857408294u, 5248454011612736343u, 17437403387317244612u, 6934738653826926426u, 1066580u}, + {3902985560527289757u, 3198471884390868901u, 7185370345685990262u, 15512057653383382027u, 3234938u}, + {11029198582786920122u, 16975535477184132058u, 16029147652369923383u, 18434360568563999162u, 2078939u}, + {300058476374461039u, 17446826503806709600u, 1678922790945775976u, 7892627424246359254u, 1062178u}, + {87587502345272863u, 847473102557513830u, 6691351692451332611u, 2685724713022685720u, 1544369u}, + {12624105860918625046u, 12830584787547839715u, 10004333843372552846u, 8315111896745808099u, 3050768u}, + {17351470925906673916u, 3156035710633753064u, 2033738546927879983u, 11585491790907844398u, 3630991u}, + {15665694802912402011u, 9004963457175061891u, 8108743281754053646u, 4750723585761750349u, 1732374u}, + {3736334071069148883u, 7903400036654847415u, 9831500931560834197u, 1473108545327230816u, 1687915u}, + {16353771016159810069u, 9193619162114481192u, 2640678282442394566u, 16820555948333493091u, 3190315u}, + {6313445841967551523u, 11391385816590278464u, 9173420673067322280u, 8993992601843136700u, 2047818u}, + {3703720162854349213u, 5693264530359620121u, 7642681393037540344u, 8468514085987096860u, 1365831u}, + {17098301123597343649u, 4062453403939787192u, 10705194494932991497u, 14508771544996968012u, 2942280u}, + {700693982927960035u, 2779160068916764972u, 9697314872099800368u, 13529045585754489716u, 801576u}, + {5221724494225163334u, 3856035072710635797u, 5545765174708906845u, 7364661072725322865u, 1383148u}, + {14917243034649645956u, 15317257136747486008u, 11508739774434971764u, 13500284669629248323u, 2052118u}, + {13660895866145600925u, 8145630990907352194u, 5024358344523268868u, 18412541388726961047u, 1686510u}, + {9493252970721918611u, 9109544197084293165u, 11489761283995186631u, 247283418874077092u, 711758u}, + {12236389085883314701u, 14422899553898150578u, 16845161240166583683u, 15793742712221916765u, 847340u}, + {12521443027682390144u, 12635152025412947334u, 12695385111347936544u, 14138919111351035219u, 3829507u}, + {10066269714767327687u, 7572990556619488843u, 4267996090762519789u, 4826443156199642131u, 3785561u}, + {17413085557312221697u, 14071919809231551097u, 2299547268856541488u, 17147481066757779992u, 2838231u}, + {14135943524024080199u, 5932157395066274880u, 2774598537832567865u, 17922639459432677929u, 532892u}, + {10496650739259033880u, 5557300823903499562u, 14986714134466896824u, 17375710303406199265u, 1054745u}, + {17971528397431798184u, 10289921906769095565u, 7847561951239664090u, 14503033030077250220u, 1619742u}, + {1761261144779988540u, 685923040950463073u, 11637189233428723240u, 606339732945894974u, 2836531u}, + {14909485585010377382u, 7493074084254609442u, 1859045723913649295u, 8771293640609763417u, 1771330u}, + {1776366018295029835u, 15163918100656468456u, 12428174637508148728u, 3779670169923630252u, 1631996u}, + {7009767029430620733u, 7832158016224860969u, 5953424497091156861u, 6371173291658646231u, 3277117u}, + {2961099275645407778u, 9067838488050148403u, 5936481432885865603u, 3086871094562749428u, 243780u}, + {4029634042509578253u, 9501639907449181796u, 1027445060253501257u, 5769104473391394889u, 1957467u}, + {7677644166019442081u, 14973846282823928769u, 4879377071331857618u, 7313925896381558024u, 3655740u}, + {5491327152274008545u, 3818141082252833049u, 11183040942903419361u, 16784798324293230004u, 1808389u}, + {15371317535500072775u, 4574980856908358383u, 11631347816998845070u, 3852411389863690474u, 2554538u}, + {9770939577053145193u, 16707924135064758875u, 7927006485246310477u, 1272102011209752152u, 3384059u}, + {15148796126225493513u, 10126672457171782224u, 13684560227896834525u, 1647691940409850074u, 952578u}, + {18166690342697772200u, 10211890210105059908u, 12343013871811577559u, 15870242652568083957u, 3226557u}, + {3066507727128554432u, 10614977135388117526u, 5562616960595470247u, 14831326264863705602u, 1362380u}, + {3208177857964233782u, 3066740941762165134u, 14652464318174382884u, 2619204875387872379u, 1656813u}, + {6191464261770848077u, 4107113632798501082u, 13455648887367711756u, 15090599961935138442u, 1328808u}, + {10942577194357556827u, 11085727209805637438u, 14736959415936112527u, 13499282281282221835u, 883486u}, + {9907899102653372125u, 1794194958639208404u, 3712134450672900588u, 15796910547940205622u, 2026256u}, + {748229833262957926u, 3823539213578447646u, 2941062511168632252u, 9404865066587360649u, 1812629u}, + {17272155134942419677u, 3775474084101429113u, 7812548690776538431u, 9472981931637008753u, 1787614u}, + {1227227239063937104u, 7886707369798873458u, 728516847240446317u, 14156264098867437614u, 2099465u}, + {11894061281732926605u, 1804120742597882052u, 12007410989543939294u, 12792922452416219394u, 2951686u}, + {10581079639968112884u, 3078665922891478649u, 18215126213725143264u, 11007203302785920175u, 3528359u}, + {9554227997648218581u, 13799580689862461066u, 11366852707458164013u, 11450186604472986950u, 1535001u}, + {9924867965990523166u, 9790547984816415683u, 16843695572440042588u, 9179630224866922711u, 3117852u}, + {7364576638373519877u, 11099518001358577051u, 14609296384225554899u, 6542697690496847937u, 62070u}, + {13827030537687951944u, 13193941679014091057u, 6745108376857827262u, 7062789211664290570u, 1733473u}, + {3231577692709465675u, 2068895886052921600u, 4293164951553620883u, 9399464164783106409u, 1437998u}, + {6883628342483759084u, 1786252002985166632u, 10843202350078151243u, 7880804140618115376u, 601383u}, + {3506872596230735654u, 5597526269500071135u, 16557803099215094288u, 17304916135274788451u, 3225784u}, + {5999723509951856582u, 16669632864354443917u, 9681873163828538927u, 14543081630813498363u, 797772u}, + {4466218487096467822u, 9190528861633021754u, 4156012988027241458u, 2248501725632019063u, 2029060u}, + {9645089882885375628u, 12149184777750019374u, 8005518421539597893u, 3352078878523387884u, 1712377u}, + {4207284661678921675u, 1014743394813555227u, 7211553829259769371u, 17397467946769417995u, 2658297u}, + {9838711058941513841u, 3695800066434343643u, 12941791949790970307u, 9776812136948649186u, 3040268u}, + {15454326154185206735u, 8139904206034956067u, 389637195674561295u, 15836696149794518912u, 2036757u}, + {10751369931341344166u, 12676810596419515446u, 281649020977707140u, 3712508846890357331u, 1464390u}, + {9754842334811924201u, 3325134025031134392u, 3344608148120867622u, 1035819547797599481u, 1907037u}, + {9533554638504854612u, 8404240495770581714u, 18128007822165664544u, 971927347006977557u, 860436u}, + {740829847716468581u, 14814607327607657899u, 14042438823703776116u, 6140767736879608258u, 3864761u}, + {12911297852052925951u, 5340757806071862262u, 5397739318128036647u, 1944789708199947873u, 239718u}, + {15896854896063115102u, 11893701002487953549u, 9116974192361154299u, 18090878122060563150u, 2368343u}, + {18185694271424286918u, 9925125060602151459u, 12238592678213849044u, 8474426737728208134u, 2691109u}, + {3848568786900080133u, 4446371694413197486u, 8632896899488778230u, 554045365737378727u, 2882464u}, + {879345631624228509u, 12948851497536052744u, 13404152286509190099u, 12735308626939043230u, 2380756u}, + {16273256158956164150u, 16282766039444733573u, 3802702705419946349u, 9555519622375744636u, 3774710u}, + {1667470074791489688u, 10369945756407464261u, 17638333891439030636u, 12247364511287812987u, 1621553u}, + {17410011177652609476u, 1139617649363857108u, 15484061132840028647u, 7523902165384825799u, 3851936u}, + {2798752203124312998u, 14055471689657878774u, 14727038851235404144u, 3241589822773039824u, 3822790u}, + {13667175383964217856u, 12153489182770609736u, 10978920350877855468u, 2376361041232819911u, 3826527u}, + {884311689414918454u, 15550143286032059213u, 11978163484151291492u, 358817342788212374u, 3063843u}, + {4248029802781409066u, 3065356057385997540u, 9961844319336256858u, 8054910866271844732u, 1872622u}, + {6547914793724174052u, 16622386950220224359u, 4392204527577923427u, 11419643644828322882u, 1249763u}, + {17194435779779353397u, 5989393420173069880u, 3405082463816402552u, 6147949562857309675u, 1791449u}, + {347850565340281974u, 14198958752501056533u, 7198680635180286686u, 9400533632302684145u, 99992u}, + {11948012602373136772u, 7425245382915126985u, 14533658710239762771u, 13260441839212692221u, 624877u}, + {11510998695329509370u, 570609802996625601u, 12872939595538418729u, 4046752225480953658u, 893083u}, + {85705078663723243u, 7105481151138031278u, 17834787851078018772u, 4051699743708297388u, 843812u}, + {22935021459988902u, 7140883171221730091u, 16168526557320551465u, 14859429959875179563u, 3177806u}, + {15962104798545998066u, 9435893459140748644u, 4755829981145781246u, 14686311778556699623u, 2551346u}, + {1866465266959427875u, 9176181401133864755u, 4316072503736700556u, 17124713828380715180u, 2688875u}, + {14095107914228000926u, 9595690724451053226u, 18118155546254569144u, 16046386882515911390u, 770612u}, + {1672863697666309305u, 13067792603591276958u, 9330739152138157101u, 302445674542228091u, 2368105u}, + {5543149750416196984u, 13610248280853188737u, 5014484907047255945u, 8186191953462974400u, 1512843u}, + {9249116041726033504u, 1062823063815311600u, 12144943166135154793u, 5071938618485850452u, 3243892u}, + {15403334427695210837u, 8900774953281452537u, 5470933967573172382u, 16777201067397973595u, 3047154u}, + {2761923147447266612u, 11838163449005485571u, 8169591807426507762u, 8126660619016310254u, 1019916u}, + {18392059127940076494u, 12265902790388260112u, 1149130891336732207u, 8593667828068766554u, 3717471u}, + {5290623322392762539u, 12243680459399003400u, 11515374270671655637u, 1005323967225168116u, 451177u}, + {12726008078461562011u, 10905988212666778644u, 10968805702742670761u, 9303752378548971765u, 2179249u}, + {6971271120468648689u, 14463530243510882810u, 3663304771643505121u, 14235546083351443237u, 3023090u}, + {7537340705400150186u, 14012979738688465858u, 13766005937579237823u, 17133415968766257523u, 547057u}, + {18125187558997199870u, 13844834530059560259u, 17425746963422294386u, 1595358506440561886u, 1500864u}, + {2562182580102243814u, 9228908767146357965u, 16918580947722900012u, 14367147269240461782u, 2699458u}, + {11864250662115236583u, 5309536907502339170u, 492268169062627408u, 12948105558019975652u, 2562994u}, + {1982479603352744165u, 10557815116266660087u, 10228239162361558848u, 17557274258545047144u, 3246947u}, + {14188656887565018512u, 1205833860717785390u, 663409416936116327u, 2509853815176723090u, 1639836u}, + {1321965968853964151u, 15334612015389271480u, 8494689970603619381u, 8172757763810566159u, 1345867u}, + {10777685691816400626u, 823364478766302043u, 16884991649889650845u, 13931942521599100664u, 1556422u}, + {9674255833337600194u, 7162765596650307300u, 6352664210695289021u, 11125580414077535833u, 1122811u}, + {13065621126744461274u, 10541723303841373059u, 8062120154997602472u, 2686843197689059941u, 1139407u}, + {13959473591045700733u, 3052266906865659913u, 14152188086439304901u, 2615091737377042072u, 2639976u}, + {11223686378748318991u, 13533607066725787902u, 11327099398067315517u, 16694003187009180400u, 2646607u}, + {2173388867840743657u, 9957030587685433712u, 5219456662135146896u, 17919104620092819530u, 3109241u}, + {6224397491185269782u, 3664856566083442675u, 1271035753875848865u, 11298340060826347396u, 278908u}, + {14420274726905267594u, 7485888877502648286u, 8272677097497678056u, 14416663763380037444u, 1253688u}, + {18050244126305826686u, 9449110164232941696u, 13399664211762580837u, 18397812955772568223u, 2780312u}, + {9702812673261602100u, 7233585902401980927u, 11900961501440319445u, 17273052697371653210u, 2746457u}, + {17043634535575391230u, 16938136091115605488u, 6904205362125972569u, 5815270729695735691u, 1293828u}, + {17463698209599272668u, 8773138552709859614u, 8189648584756242078u, 16092710390264599939u, 576339u}, + {14141764523294360416u, 5340942747086476499u, 9839747179645009881u, 875322722580543311u, 1840625u}, + {18438719957093437296u, 6165832642140402059u, 437986791319239987u, 11563168585254464126u, 2684018u}, + {14321953150484860381u, 9449857680322984393u, 10399116111922020064u, 553914562963893900u, 1449602u}, + {556973792206606532u, 3368430374819585165u, 7481090572508686725u, 9105997286435572012u, 3367298u}, + {5868411871946270378u, 7508267655459707280u, 3191758599946248492u, 4313513741769659536u, 2756109u}, + {3209667656711018858u, 18311038247256333520u, 6723500273707459804u, 9418328466606392980u, 1770619u}, + {12967291636438679870u, 7333074201121068597u, 3304979254076841603u, 3923772243011484543u, 1096872u}, + {8015755303400629069u, 13976705500609145142u, 5748553232738144342u, 2758422294430651754u, 2830366u}, + {7622113013983271793u, 5680706247833975374u, 3686087620605672444u, 12085829244329316615u, 1869945u}, + {13877430935017862368u, 2318058522606986959u, 15235124152287479348u, 15310704344973464483u, 2224307u}, + {12412696908911487941u, 8075889889097513942u, 11064257405994394811u, 17406911400421697592u, 1784026u}, + {4249977956504674677u, 1333798091771700006u, 17579444734280603849u, 12354758068935432212u, 1393100u}, + {14217058068857466376u, 6327455335861565832u, 5380579754499308311u, 6078536070709789469u, 2233803u}, + {4767132317735018675u, 5590975392498842437u, 4395215640372042694u, 5229353169061432080u, 670423u}, + {2005519487369968682u, 11792078609059124091u, 14471205982549413003u, 3254958858438238867u, 2371349u}, + {7461043804800659204u, 5372544476120642821u, 17585075477188843750u, 7537733451311911273u, 2801096u}, + {3942444146086073132u, 574924033214163516u, 9320815301355511284u, 6680969760064995093u, 2025585u}, + {2092377807244005231u, 4202783167439424778u, 3229848785561686084u, 16538554489461012066u, 1399200u}, + {17078877751940797337u, 8424995850742765158u, 1514833086652727061u, 9393297925777120574u, 2975629u}, + {16538484900293529952u, 883238766197179751u, 2632111274136502679u, 12881142414765778813u, 2877416u}, + {9920612475137671938u, 6162912997711175773u, 17311956993984613489u, 4808880175929983233u, 491766u}, + {13168311218216851270u, 1614815309462268507u, 5349133165334254203u, 12979438413182060507u, 582405u}, + {27183633297419604u, 8834426036790519595u, 10901601237990109892u, 17592796434216103608u, 374258u}, + {13884301325019465741u, 10201788605737353474u, 10787739619638065369u, 15211056201139129319u, 3019168u}, + {6961963005247812538u, 3923317752914456626u, 12405524073856175403u, 16989228433535654680u, 1022231u}, + {8868510736798703010u, 4298397939537404258u, 3571842624676046784u, 5639349185588819630u, 2592428u}, + {1804828895637931056u, 10395183601987309663u, 1209797948352788639u, 4227162315684688179u, 3161488u}, + {16571229645084490700u, 9554351479967151953u, 11142807170009786030u, 2436219767506888066u, 3108305u}, + {3430389914678287205u, 16250525757542151761u, 6320941892571868436u, 11586553155342721295u, 1270410u}, + {142173062949933424u, 14619932278203196022u, 14964069911112534313u, 8670346224276586826u, 3218906u}, + {17112791055952439476u, 17157911861774724474u, 4254537182534329436u, 14470897151435261542u, 3472979u}, + {895688796054970787u, 5484747042122487380u, 5479524276356499610u, 2009620208281319148u, 1631500u}, + {10642676111336955795u, 7786495711028880382u, 13702668508662797445u, 16026881741385879133u, 26119u}, + {4677721203889783552u, 18052825612377954805u, 3035180004585777213u, 11889984842793452401u, 2134161u}, + {14639836469506620738u, 15929789994775005000u, 3316845911723930172u, 4002536005755113373u, 1825653u}, + {8822803365117250799u, 6430013104741606297u, 14600941434479352561u, 3204211495329765253u, 803267u}, + {4587049902477662173u, 10289190992301375253u, 13423598370464393327u, 7220577067768861545u, 3744390u}, + {11498863608060121284u, 9096677724363649270u, 13729833874459346952u, 15417339341341384743u, 2356537u}, + {15726599415843781539u, 4660191962426813778u, 18039044018930336415u, 3358119776101251682u, 2782192u}, + {12332154644552305409u, 5226812608262280397u, 17171593612359121779u, 771898327525321260u, 136295u}, + {15496005505002040778u, 12759123285977249135u, 15916293156891082301u, 5767121722789659450u, 706973u}, + {2860731398176819974u, 8963940527395877891u, 11515893155456123205u, 9812874144923343681u, 783103u}, + {5912790128805354738u, 2377594746752076237u, 17016902438214055515u, 6139341203661102875u, 3778792u}, + {10309444557546393533u, 15067165291809263994u, 11644152058382405765u, 1871146266019320667u, 973373u}, + {18092743575866415952u, 3025537671462017129u, 7460627655892988887u, 10898652264217523489u, 306459u}, + {5338372811361964530u, 6373191715194314958u, 12842830443853397470u, 15786266275946955203u, 2175105u}, + {10315163361229475429u, 12145305777833936u, 3960052638597371813u, 40123621054712290u, 2056151u}, + {13511341318936138791u, 2497657954148189951u, 5893777273702088354u, 15386196821392675957u, 3338744u}, + {12751792041658051607u, 17436528981831309267u, 10944199825008825551u, 6546772434895344384u, 2948455u}, + {7015084037684132429u, 8504881979498160137u, 16699794329279300717u, 9926279784540748962u, 2856525u}, + {17971258610318153480u, 6383933149067315895u, 8681837665504033513u, 14464212403127020161u, 1850428u}, + {3447822052334483549u, 18340986258434505365u, 5620940765541904478u, 2339977395420732573u, 317780u}, + {9520161355216373436u, 15760531544326706255u, 13526352776507011037u, 5862008671720816u, 0u}, + {825678912143803427u, 11984736258012124u, 12391061995261696935u, 5862008u, 0u}, + {1665237984864249512u, 9428165262369145888u, 108134973725099976u, 0u, 0u}, + {1872475570816657107u, 13375733694553103370u, 108134973u, 0u, 0u}, + {7219497396953235475u, 1994738185724226068u, 0u, 0u, 0u}, + {13359612935124468138u, 1994738185u, 0u, 0u, 0u}, + {18349680732400958527u, 1u, 0u, 0u, 0u}, + {36796424807u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3878626u}, + {11358783659110083547u, 17095325567840813766u, 6385517845005574082u, 16428621867789277255u, 3340172u}, + {18294035850200623283u, 2919724732959905761u, 4235284030464885606u, 17787783447805064704u, 3764115u}, + {16526827647612003963u, 8067659727256742046u, 12656763870093952521u, 2303221099032560692u, 853127u}, + {15729157320191982440u, 12090986756367378427u, 12434284708005169468u, 2970098773289638083u, 3599037u}, + {7098283431226458066u, 5661849356966812220u, 14924003958032661457u, 13901448572703073888u, 3079077u}, + {11112588918795085318u, 12096832010649692550u, 14097229099939831404u, 417086929493333637u, 716213u}, + {5234627670075224775u, 6122011799606639851u, 10789202615659435062u, 7651316766350711884u, 2846889u}, + {17043383876748732662u, 8223558329714289172u, 760642426870531711u, 4952432235019675326u, 2449824u}, + {7161931949165403543u, 1681278155657238258u, 11027295927120582363u, 14240537306777867055u, 852808u}, + {17612599174182421012u, 16682528665625476897u, 1335632512740772016u, 5420051098005144602u, 498415u}, + {11139529532032082396u, 9525734258962956220u, 3206657328012850836u, 801827673784756340u, 2866643u}, + {2251726987855802490u, 4039071126641161937u, 17670162493363574078u, 17779048363903790899u, 8737u}, + {3713021173175291379u, 2556865089122695792u, 4727160643303868156u, 3675098482916345100u, 483436u}, + {9394781842831852749u, 16528145670185643822u, 13122601933649434170u, 17807143551211316525u, 1525369u}, + {4492364481266488378u, 7214813709501614424u, 4616534370848138845u, 15952866391750187672u, 2827765u}, + {12976653876847618356u, 5292235058585469344u, 17996752580078536698u, 2358006082422153633u, 2623052u}, + {13838222644098150610u, 3136709049329377838u, 3829648588504033060u, 17486324528472598581u, 3810112u}, + {10746170807141785987u, 1087122488141468118u, 11055863720207011780u, 6987813206083576031u, 939467u}, + {6633120200418315033u, 6896533461132342196u, 7592766626832093821u, 7367204706171158369u, 3367215u}, + {12611796096889354328u, 5271768912226242412u, 291971549463323331u, 5826721683747595494u, 25296u}, + {8315640756377728663u, 411963964886479655u, 10427461673867572099u, 15997252511084812032u, 1994502u}, + {6596150284979668500u, 9496950588875817715u, 3726745245347216717u, 15385059614024404727u, 3316886u}, + {13445771902238523271u, 12019004979876884299u, 15602117846029963401u, 10293364115934496705u, 3372606u}, + {4660934614245571430u, 14299233802022571392u, 17928907108121239002u, 4169496470198713743u, 2658860u}, + {11248769053002845472u, 5537672924727082721u, 11223580240152352383u, 14172335745551195304u, 1179236u}, + {2984936457724362463u, 8147765693692209873u, 6652646337752163057u, 11623025718973238398u, 1085605u}, + {7696157852282697540u, 73881155071100187u, 13933306859717424871u, 2109696116323075320u, 1122156u}, + {8779385090626585347u, 3832516338308348669u, 17086839341630451284u, 17098349913641394563u, 2427882u}, + {581139095187574280u, 1234664270305287271u, 4389437357071165354u, 2999147890548561383u, 1901784u}, + {966783656434783935u, 2022644647825537412u, 8467873223046676872u, 16896558730605760560u, 3475130u}, + {6792356875808278274u, 18093140504618594124u, 13153831611024150367u, 784680791008708364u, 3529249u}, + {2618520566930744662u, 5274719849072320773u, 6270504843830044369u, 15413370683938726520u, 2875115u}, + {13059690436128796166u, 6611647502315535428u, 7990435203554548176u, 15545419244155360361u, 717054u}, + {8943200023230890076u, 15897628656890380572u, 18074481868763500426u, 16514416361855946316u, 373948u}, + {12469971185080793762u, 11586314560169536751u, 4863415545007027247u, 15283108075608014333u, 1472991u}, + {15539697467028665782u, 1828520070216344129u, 13879658395052809400u, 27171903282985581u, 1981263u}, + {12123534346657021891u, 5349689042483478516u, 11923174591518528754u, 9476092670499441526u, 929731u}, + {7586736553282765459u, 7277851240337411383u, 11675623582184231942u, 3115627062921387973u, 2540115u}, + {9340903316038096146u, 15345915577487103640u, 11519324153379443238u, 767432794817697160u, 2434720u}, + {5148307863404558254u, 8341730542657617773u, 6054307747273063954u, 4440425893812179010u, 672050u}, + {12657469514308027966u, 14920628919197637318u, 17998706054820227768u, 17882680460201290525u, 2578067u}, + {5858996536744336229u, 13340717057427183428u, 14891997423783158982u, 47556960036556622u, 1616274u}, + {14752404977832841627u, 3718772823726231864u, 15959300373360278478u, 15522197711033054031u, 3048642u}, + {13772683725363253109u, 3344124016759776917u, 16431612599025015937u, 12233970926678380929u, 3011956u}, + {14716596774893198267u, 10417155610132951555u, 17072495321957737139u, 2865806961206434356u, 191074u}, + {9627186387228271036u, 1682346371906655911u, 1326504276608304756u, 15784137790349164924u, 2223565u}, + {15950995367212322296u, 14557849082372160486u, 9005626007052425883u, 5301221915039135097u, 1736766u}, + {856721818924894747u, 16762259933607198197u, 2970828828335504120u, 6445163552594728462u, 3120885u}, + {11528288079588743601u, 4402449634675948442u, 10880417640353600086u, 2435470776575264474u, 3788658u}, + {15331737045307605845u, 18191369529871366915u, 18107984423965040455u, 13184370521847167410u, 1234839u}, + {11138603392518255606u, 4043352901307466300u, 15774128786724388321u, 9750553967309877310u, 4584u}, + {14538278572105737570u, 5127006609515100249u, 16500336884670397044u, 4755885776128631627u, 2551549u}, + {4750371772411563343u, 11977500815912017883u, 15585373896781801470u, 6171963269374289868u, 3057373u}, + {11075488216023574576u, 8070325954915955813u, 6034937858404979425u, 13603226262571284830u, 3812562u}, + {17935190876282854090u, 9829808332073189576u, 1835174746036302222u, 12752465919757693234u, 2246686u}, + {9046867852108562698u, 10634606665863007382u, 8109886168031320594u, 15822057148714670121u, 3053511u}, + {12368012820955600074u, 7840016509138390540u, 6994892780381466291u, 1137191262334233115u, 1540611u}, + {4275064163341174125u, 4978218163985762555u, 6620729979841328142u, 14439938065556920208u, 1945677u}, + {9953742593869704671u, 14238303553670279347u, 15061475822117977211u, 16753253236908322196u, 281716u}, + {17114690582341511100u, 11012419250245351168u, 17549775806766407065u, 8147704885992579164u, 2753185u}, + {16402748038944325052u, 15643271543219903435u, 15836089370367921979u, 12444693481753885909u, 3822330u}, + {8666514342286582247u, 1348704249142259695u, 3362309991329832984u, 14698201145419326720u, 3221016u}, + {12003084147638751551u, 9757807418158178444u, 9726757417825058500u, 2365260281721218742u, 1901307u}, + {11525117445916972658u, 9581581326999532871u, 3238895087708119438u, 13942188575319904416u, 3266423u}, + {8613253053244930065u, 11348392359500527251u, 702709976834881567u, 5608689623980118222u, 2391665u}, + {3581483239824833776u, 10661158486526175243u, 13757560738480537690u, 11068930325576712386u, 218578u}, + {9530661352757254543u, 1064064176254245058u, 17521352730152326978u, 5264236428263812939u, 164373u}, + {11503848900929884961u, 10388163837869678319u, 7223555124449262450u, 2020644784989846496u, 2131050u}, + {16435615390459606848u, 5558166072890283351u, 17729595471815746320u, 16612557564702348804u, 2821086u}, + {12557808297512484879u, 5039185628544958093u, 15357353122666870005u, 8266605588388267252u, 1822626u}, + {6129114848000406517u, 17276347844353656694u, 11288132128156295022u, 11923124539888803973u, 1958994u}, + {9954113209258940255u, 2558575484470486859u, 4560741232332042668u, 9259509109737832917u, 3357115u}, + {6363952190738227151u, 2388779204192786106u, 2050922974861032979u, 1431022137211151335u, 1425879u}, + {10733413547974972072u, 7627916151127699907u, 17705587084571413410u, 9609962833468514526u, 3881538u}, + {16421187748427265486u, 10564205993069376004u, 534585443476581025u, 16861021158545550347u, 2145161u}, + {11468966004096562153u, 1013762838100594337u, 18440850763787700553u, 2489529450114473837u, 3113666u}, + {596777878567964677u, 13136458478448164401u, 15798863269869184776u, 2507395199612090198u, 1205856u}, + {12049222877591760386u, 7218784293984816918u, 12646229868454239921u, 11263228789445900320u, 570012u}, + {14849996561207824665u, 15377473584659808267u, 7040010108274449918u, 11251499546662930134u, 2189538u}, + {4638856371750759780u, 5980319889793412482u, 16401434436224155720u, 10056395429649144514u, 1606109u}, + {16275378755769260353u, 8924074505682873760u, 16335821516737707723u, 5794235014768111883u, 49942u}, + {6024481728045171647u, 11173122852082702044u, 3595605336940471323u, 721497213466043577u, 2418766u}, + {10791980963945349455u, 16193014068461157758u, 14574208634607420988u, 1918115803083813706u, 1293863u}, + {3081483413782180973u, 9624854591126562926u, 12291919933391912660u, 16741229378344839016u, 3101082u}, + {4573727307678171783u, 3190510274025056438u, 1647064190282095587u, 14468723690332403942u, 3068343u}, + {5795707077909269858u, 13586087278990483848u, 1226638938323591487u, 12954910285309182421u, 2600559u}, + {2647120324158997858u, 18423459260313485318u, 2769516034492238857u, 2858218026755681827u, 3824964u}, + {17210334194492205873u, 3422034722056747109u, 2638320689254069220u, 6267511222119172904u, 448441u}, + {14366139631460411087u, 7087648225324799330u, 2866689702101687416u, 440617846854237223u, 914483u}, + {18102952893537217430u, 8219998883836950750u, 13737138147366328760u, 1458021115059934698u, 3269262u}, + {14704452199241844088u, 13055981963641928134u, 3600105140857408293u, 5248454011612736343u, 1514508u}, + {14187763469131269133u, 11267127943629579293u, 3902985560527289756u, 3198471884390868901u, 2276872u}, + {1632465973873583522u, 557634090355899758u, 11029198582786920121u, 16975535477184132058u, 481859u}, + {11001184487969093745u, 12953350783654101415u, 300058476374461038u, 17446826503806709600u, 2972858u}, + {11440545081635450512u, 4977593543898016950u, 87587502345272862u, 847473102557513830u, 234895u}, + {1516402470062238272u, 7269479295847927247u, 12624105860918625045u, 12830584787547839715u, 3120288u}, + {5824726478057780833u, 18326357179612860594u, 17351470925906673915u, 3156035710633753064u, 3785047u}, + {2942708184213528057u, 1470644018554384593u, 15665694802912402010u, 9004963457175061891u, 2662924u}, + {10806544536182561086u, 5436720522410947097u, 3736334071069148882u, 7903400036654847415u, 2293343u}, + {7785964431674610968u, 18095498333966683406u, 16353771016159810068u, 9193619162114481192u, 340762u}, + {15560854236036981324u, 4006371108500295153u, 6313445841967551522u, 11391385816590278464u, 38738u}, + {13541820086204824789u, 17785093936990355239u, 3703720162854349212u, 5693264530359620121u, 1476040u}, + {3110118242017407212u, 12793351767119876675u, 17098301123597343648u, 4062453403939787192u, 2221069u}, + {8955695376548246889u, 505669244891602300u, 700693982927960034u, 2779160068916764972u, 2004830u}, + {718023952972841463u, 12471608767901662475u, 5221724494225163333u, 3856035072710635797u, 2225173u}, + {2936353515581105549u, 14095953560474971420u, 14917243034649645955u, 15317257136747486008u, 169290u}, + {16723009991410075648u, 1490886585826754297u, 13660895866145600924u, 8145630990907352194u, 1641880u}, + {15371052503912904555u, 13001702560049878070u, 9493252970721918610u, 9109544197084293165u, 616951u}, + {3265999115780844854u, 18288358608100441037u, 12236389085883314700u, 14422899553898150578u, 1359213u}, + {9804973033000569800u, 16828833222128801440u, 12521443027682390143u, 12635152025412947334u, 376390u}, + {15666935449585325527u, 17614901577317394194u, 10066269714767327686u, 7572990556619488843u, 1121551u}, + {17525179324652351999u, 13625433515994566897u, 17413085557312221696u, 14071919809231551097u, 1270396u}, + {6482585828884977860u, 2508776097115864014u, 14135943524024080198u, 5932157395066274880u, 480631u}, + {10129229626843661906u, 8644052299983120468u, 10496650739259033879u, 5557300823903499562u, 3130284u}, + {11286523566844944055u, 10344188375551189137u, 17971528397431798183u, 10289921906769095565u, 2027712u}, + {1657798884608768947u, 439952919594033442u, 1761261144779988539u, 685923040950463073u, 3856610u}, + {15981693010331108554u, 2929133902394442365u, 14909485585010377381u, 7493074084254609442u, 1725147u}, + {15163284979994989523u, 13263572116083392486u, 1776366018295029834u, 15163918100656468456u, 2707136u}, + {1316396971579715625u, 18280810938557111593u, 7009767029430620732u, 7832158016224860969u, 3287259u}, + {956785263627674202u, 7056538913107908811u, 2961099275645407777u, 9067838488050148403u, 3366181u}, + {11007197775373304949u, 15514570671897087812u, 4029634042509578252u, 9501639907449181796u, 3140083u}, + {17598348588615400293u, 8717035417070509134u, 7677644166019442080u, 14973846282823928769u, 3856842u}, + {7628143928286347384u, 13662852838130685005u, 5491327152274008544u, 3818141082252833049u, 1916459u}, + {10534137117699926486u, 9756852479425119237u, 15371317535500072774u, 4574980856908358383u, 3394632u}, + {16414502094773354503u, 4725574270740451341u, 9770939577053145192u, 16707924135064758875u, 2093013u}, + {3677344815364630739u, 440768721232079142u, 15148796126225493512u, 10126672457171782224u, 2806427u}, + {7495562737489015373u, 4364411251482847417u, 18166690342697772199u, 10211890210105059908u, 1220313u}, + {5732021301783357474u, 11482899979983535123u, 3066507727128554431u, 10614977135388117526u, 2185859u}, + {5819230902065936410u, 15214453033823197963u, 3208177857964233781u, 3066740941762165134u, 3897076u}, + {273108829537215905u, 16249607392048543685u, 6191464261770848076u, 4107113632798501082u, 3302226u}, + {4946243345004737835u, 13377535357974736564u, 10942577194357556826u, 11085727209805637438u, 3513503u}, + {1708017169083367112u, 12098241810781211804u, 9907899102653372124u, 1794194958639208404u, 243226u}, + {6874786226229859213u, 12395290504084114262u, 748229833262957925u, 3823539213578447646u, 1543860u}, + {2599555727685410254u, 3543878190753552851u, 17272155134942419676u, 3775474084101429113u, 1758013u}, + {9369164829776482776u, 13049470479668716854u, 1227227239063937103u, 7886707369798873458u, 145331u}, + {10115248621035847553u, 1963788127510628525u, 11894061281732926604u, 1804120742597882052u, 2832314u}, + {15309499770614870627u, 17869579026681182024u, 10581079639968112883u, 3078665922891478649u, 1983018u}, + {16960933083579899612u, 2593868183207164703u, 9554227997648218580u, 13799580689862461066u, 3402919u}, + {223307132685456282u, 2310294211152548250u, 9924867965990523165u, 9790547984816415683u, 143576u}, + {6012779577168084601u, 16951147534018192977u, 7364576638373519876u, 11099518001358577051u, 401261u}, + {13985780965331722292u, 12324828816515884957u, 13827030537687951943u, 13193941679014091057u, 2780070u}, + {1534890076219306974u, 10624069759015916455u, 3231577692709465674u, 2068895886052921600u, 3082915u}, + {3943306599232341620u, 2428431115834017568u, 6883628342483759083u, 1786252002985166632u, 2661257u}, + {7171211607565094003u, 6703483840076958602u, 3506872596230735653u, 5597526269500071135u, 1318858u}, + {15916573500507132535u, 172976251134046801u, 5999723509951856581u, 16669632864354443917u, 2125817u}, + {604700538234301541u, 246005871373687200u, 4466218487096467821u, 9190528861633021754u, 2358626u}, + {18263948941607902852u, 2286321576523000026u, 9645089882885375627u, 12149184777750019374u, 321849u}, + {12869859970685835372u, 15260735979294533119u, 4207284661678921674u, 1014743394813555227u, 1130973u}, + {15537076849178467094u, 2159102754036420747u, 9838711058941513840u, 3695800066434343643u, 3765091u}, + {5207034979374025737u, 14214570744689180324u, 15454326154185206734u, 8139904206034956067u, 3617529u}, + {11459486432463858930u, 4321578331345865483u, 10751369931341344165u, 12676810596419515446u, 568376u}, + {2245197412622732495u, 17379053116532455414u, 9754842334811924200u, 3325134025031134392u, 2469790u}, + {17106942407166429770u, 17351301017701958232u, 9533554638504854611u, 8404240495770581714u, 2320222u}, + {15524006984751188912u, 1004751130792336329u, 740829847716468580u, 14814607327607657899u, 460560u}, + {2668032171711809345u, 7291236525533750449u, 12911297852052925950u, 5340757806071862262u, 227573u}, + {190749094717803928u, 6827465205069161078u, 15896854896063115101u, 11893701002487953549u, 2885857u}, + {11029004095051914536u, 12853286869417952836u, 18185694271424286917u, 9925125060602151459u, 2757042u}, + {10656474581185311018u, 8920251701547725541u, 3848568786900080132u, 4446371694413197486u, 2739896u}, + {15110046933403282380u, 5791652008293046975u, 879345631624228508u, 12948851497536052744u, 3784265u}, + {14815181673690199284u, 2143560587921985383u, 16273256158956164149u, 16282766039444733573u, 3562135u}, + {4563824387770083881u, 5212804111402585842u, 1667470074791489687u, 10369945756407464261u, 3185046u}, + {4296196265932481438u, 8695286750846071234u, 17410011177652609475u, 1139617649363857108u, 229897u}, + {10572083487326893047u, 2512373410194275422u, 2798752203124312997u, 14055471689657878774u, 2591968u}, + {5044868079283805441u, 15851235331253399916u, 13667175383964217855u, 12153489182770609736u, 3131206u}, + {13504340921863823324u, 14179037588482121361u, 884311689414918453u, 15550143286032059213u, 2110784u}, + {5203937215608991764u, 4735245368124904231u, 4248029802781409065u, 3065356057385997540u, 2663902u}, + {2604711683216883432u, 1743125399575078701u, 6547914793724174051u, 16622386950220224359u, 466917u}, + {15851535349191353002u, 9658518685572829397u, 17194435779779353396u, 5989393420173069880u, 195846u}, + {15806879041662682816u, 17618323902341354622u, 347850565340281973u, 14198958752501056533u, 179608u}, + {13385691806785127777u, 17726925371346077861u, 11948012602373136771u, 7425245382915126985u, 3589069u}, + {17248144404324939455u, 6405982293226247282u, 11510998695329509369u, 570609802996625601u, 2376405u}, + {2527969901053781544u, 11273289813582985267u, 85705078663723242u, 7105481151138031278u, 389302u}, + {9337810087146073581u, 5228032368933764145u, 22935021459988901u, 7140883171221730091u, 3708309u}, + {9395914054267653735u, 5553463531497161475u, 15962104798545998065u, 9435893459140748644u, 1348040u}, + {6500153356113380996u, 2161091580041455295u, 1866465266959427874u, 9176181401133864755u, 652186u}, + {11931789693236791993u, 17556961132724126020u, 14095107914228000925u, 9595690724451053226u, 1375206u}, + {6050245258131664588u, 11840486843524499542u, 1672863697666309304u, 13067792603591276958u, 3438037u}, + {6482016274186768011u, 2367184052909463462u, 5543149750416196983u, 13610248280853188737u, 2928253u}, + {2882483623753852383u, 151490991933704173u, 9249116041726033503u, 1062823063815311600u, 2043227u}, + {4946310198614635753u, 8083134790325663617u, 15403334427695210836u, 8900774953281452537u, 1123126u}, + {824041168737600189u, 7574087100322189199u, 2761923147447266611u, 11838163449005485571u, 873422u}, + {13791414221772684726u, 24382526509090837u, 18392059127940076493u, 12265902790388260112u, 3574997u}, + {13406317164658709828u, 9012767718058673007u, 5290623322392762538u, 12243680459399003400u, 1371055u}, + {10005700218867802060u, 14943025185635541555u, 12726008078461562010u, 10905988212666778644u, 2819545u}, + {5820827656506635626u, 10989799687346193485u, 6971271120468648688u, 14463530243510882810u, 1832653u}, + {13479732099048482895u, 16975476344713959548u, 7537340705400150185u, 14012979738688465858u, 529983u}, + {10183313384536100178u, 9536265007385494692u, 18125187558997199869u, 13844834530059560259u, 300146u}, + {1904495659058806431u, 11357678579549124836u, 2562182580102243813u, 9228908767146357965u, 2674322u}, + {5094625395743438072u, 8852557166815991246u, 11864250662115236582u, 5309536907502339170u, 2027804u}, + {6945192913846774666u, 4282557854457757796u, 1982479603352744164u, 10557815116266660087u, 2868384u}, + {18235778925073433371u, 8398836891986493804u, 14188656887565018511u, 1205833860717785390u, 3165983u}, + {6011834273333755074u, 7209172041398522685u, 1321965968853964150u, 15334612015389271480u, 1665927u}, + {7977452329476568603u, 13962996230777799444u, 10777685691816400625u, 823364478766302043u, 1575551u}, + {10451367149239566414u, 1823725726914780540u, 9674255833337600193u, 7162765596650307300u, 1155465u}, + {11873207505036154899u, 7364014631767428002u, 13065621126744461273u, 10541723303841373059u, 1401220u}, + {17112900493769319163u, 12417443065180796367u, 13959473591045700732u, 3052266906865659913u, 3189559u}, + {9378241158882926705u, 18163734950204881983u, 11223686378748318990u, 13533607066725787902u, 709209u}, + {11841599579841793877u, 17785740546420990748u, 2173388867840743656u, 9957030587685433712u, 3359772u}, + {9705998419754487193u, 3526469247445136167u, 6224397491185269781u, 3664856566083442675u, 3467099u}, + {7953235632018207587u, 4533632774923371768u, 14420274726905267593u, 7485888877502648286u, 518538u}, + {6290017288001784291u, 6422586231267188801u, 18050244126305826685u, 9449110164232941696u, 1508477u}, + {3356394848829085197u, 8281111120060425204u, 9702812673261602099u, 7233585902401980927u, 249447u}, + {9373443903309356228u, 12150777413383693494u, 17043634535575391229u, 16938136091115605488u, 2936543u}, + {11328119977851193390u, 6970959019430434931u, 17463698209599272667u, 8773138552709859614u, 470586u}, + {11752971166871867027u, 7421901884877023322u, 14141764523294360415u, 5340942747086476499u, 2219207u}, + {9106603752792795892u, 2701861241738110569u, 18438719957093437295u, 6165832642140402059u, 559061u}, + {7082956652142357738u, 210614873059956730u, 14321953150484860380u, 9449857680322984393u, 2915476u}, + {10240073825186688285u, 10029172377787065938u, 556973792206606531u, 3368430374819585165u, 774005u}, + {14923208513787248145u, 18261989814578026367u, 5868411871946270377u, 7508267655459707280u, 455872u}, + {2155144027080442992u, 8302962333272805879u, 3209667656711018857u, 18311038247256333520u, 2995498u}, + {3604053267462766156u, 17377059175053424003u, 12967291636438679869u, 7333074201121068597u, 3772473u}, + {2851891485163817235u, 1160914662211741163u, 8015755303400629068u, 13976705500609145142u, 3264202u}, + {6327432352736543385u, 12108012116563231372u, 7622113013983271792u, 5680706247833975374u, 662204u}, + {8310527017488227452u, 150990301700139538u, 13877430935017862367u, 2318058522606986959u, 294868u}, + {6744030804003992153u, 11858414146772610749u, 12412696908911487940u, 8075889889097513942u, 1992839u}, + {10577235499373818000u, 14570747351152471159u, 4249977956504674676u, 1333798091771700006u, 3168291u}, + {3039968960689319942u, 5005082551492662165u, 14217058068857466375u, 6327455335861565832u, 2306133u}, + {2002149191713562295u, 610781570293685240u, 4767132317735018674u, 5590975392498842437u, 2531112u}, + {1256980475372507287u, 5027954102107366646u, 2005519487369968681u, 11792078609059124091u, 2183719u}, + {1454191184424969677u, 11732767511698923354u, 7461043804800659203u, 5372544476120642821u, 3822944u}, + {1805725990281404147u, 14323055668778705407u, 3942444146086073131u, 574924033214163516u, 1270832u}, + {9500513541993928594u, 12048793045287632595u, 2092377807244005230u, 4202783167439424778u, 3594940u}, + {15620468303873376487u, 12469613800966702734u, 17078877751940797336u, 8424995850742765158u, 1005469u}, + {3583759335243071827u, 16835338497501138454u, 16538484900293529951u, 883238766197179751u, 2060933u}, + {17585441505044051722u, 11044176650930850412u, 9920612475137671937u, 6162912997711175773u, 1601813u}, + {10344685800946525921u, 4184474802862264739u, 13168311218216851269u, 1614815309462268507u, 2352695u}, + {6569556206373456843u, 11733651109896574742u, 27183633297419603u, 8834426036790519595u, 2258818u}, + {4750044685223670033u, 5053561754226151269u, 13884301325019465740u, 10201788605737353474u, 1745981u}, + {3849028060498377767u, 12277010269186713740u, 6961963005247812537u, 3923317752914456626u, 2547869u}, + {13396940730043889323u, 2623263839059303212u, 8868510736798703009u, 4298397939537404258u, 1024032u}, + {11215843173093782230u, 11466395196704293858u, 1804828895637931055u, 10395183601987309663u, 2317431u}, + {12309848837107619577u, 10232150676289307470u, 16571229645084490699u, 9554351479967151953u, 2036516u}, + {6530349553824589819u, 3223089714976973542u, 3430389914678287204u, 16250525757542151761u, 3485616u}, + {1486312431366912903u, 17625861678256301144u, 142173062949933423u, 14619932278203196022u, 444765u}, + {12554488477372468633u, 5405501361129539080u, 17112791055952439475u, 17157911861774724474u, 453732u}, + {9844708122233824705u, 10223983411183266878u, 895688796054970786u, 5484747042122487380u, 231778u}, + {1545678927050904268u, 18233234716516089699u, 10642676111336955794u, 7786495711028880382u, 2083137u}, + {1218292100123501906u, 14085391052813711648u, 4677721203889783551u, 18052825612377954805u, 274395u}, + {9838092518176985724u, 17247107144605374012u, 14639836469506620737u, 15929789994775005000u, 915458u}, + {14883965242084250465u, 18221464796929727126u, 8822803365117250798u, 6430013104741606297u, 3090661u}, + {18201759927206816461u, 14318162916209524191u, 4587049902477662172u, 10289190992301375253u, 944387u}, + {12802174384058396102u, 3293084948666728916u, 11498863608060121283u, 9096677724363649270u, 2629512u}, + {7924649619713815471u, 9000739669428065706u, 15726599415843781538u, 4660191962426813778u, 2096079u}, + {15895682342236165596u, 12086819730047927750u, 12332154644552305408u, 5226812608262280397u, 267209u}, + {11730697299819491393u, 1913356517584631011u, 15496005505002040777u, 12759123285977249135u, 1561189u}, + {4234644671660470288u, 4624121357902457578u, 2860731398176819973u, 8963940527395877891u, 3889669u}, + {4993066295173456937u, 14026717757030511424u, 5912790128805354737u, 2377594746752076237u, 386417u}, + {9972699446475286645u, 1661994119673182457u, 10309444557546393532u, 15067165291809263994u, 3858475u}, + {9984097934425737886u, 17660865480379713845u, 18092743575866415951u, 3025537671462017129u, 1741415u}, + {3334402570451513022u, 5915809137740592125u, 5338372811361964529u, 6373191715194314958u, 658398u}, + {4734918480975283080u, 13098002629766724693u, 10315163361229475428u, 12145305777833936u, 2585809u}, + {14651880274982566687u, 10971088673371861414u, 13511341318936138790u, 2497657954148189951u, 3829880u}, + {16400210465473247111u, 15389286385254826253u, 12751792041658051606u, 17436528981831309267u, 113075u}, + {11761634832872127795u, 17783847022260864045u, 7015084037684132428u, 8504881979498160137u, 2323709u}, + {3675484788613323195u, 14637014112322724921u, 17971258610318153479u, 6383933149067315895u, 2079357u}, + {15218157611841129567u, 4914278878131207353u, 3447822052334483548u, 18340986258434505365u, 2817626u}, + {12167237339377246577u, 14809541331686221574u, 9520161355216373435u, 15760531544326706255u, 649693u}, + {14291444203317078051u, 265901031535141358u, 825678912143803426u, 11984736258012124u, 3289363u}, + {13403322465385581580u, 279253047053213137u, 1665237984864249511u, 9428165262369145888u, 2443726u}, + {6800509113193543767u, 10015282920352148579u, 1872475570816657106u, 13375733694553103370u, 2666223u}, + {16521833770456330724u, 16012764714406348957u, 7219497396953235474u, 1994738185724226068u, 0u}, + {10754635338151291699u, 15715913221515782701u, 13359612935124468137u, 1994738185u, 0u}, + {12954953815911108024u, 14538341978142428738u, 18349680732400958526u, 1u, 0u}, + {18131640678213654351u, 2038552321561642993u, 36796424806u, 0u, 0u}, + {12570155405993318771u, 14691444572274331667u, 36u, 0u, 0u}, + {15092938650099753871u, 678774231225u, 0u, 0u, 0u}, + {14282045276542575092u, 678u, 0u, 0u, 0u}, + {12521174527252u, 0u, 0u, 0u, 0u}, + {12522u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 958206u}, + {8559742597383587436u, 15244535695874542414u, 11358783659110083546u, 17095325567840813766u, 2028594u}, + {16441661769054260693u, 12558585180948069461u, 18294035850200623282u, 2919724732959905761u, 3754960u}, + {13336172316164032383u, 7649953656338883368u, 16526827647612003962u, 8067659727256742046u, 3109955u}, + {1880546254380768252u, 5628005295641184943u, 15729157320191982439u, 12090986756367378427u, 2241968u}, + {10963553148753550614u, 4703105855628664818u, 7098283431226458065u, 5661849356966812220u, 3426827u}, + {9856116952237132818u, 1017074096587701359u, 11112588918795085317u, 12096832010649692550u, 3749924u}, + {11949733213488134344u, 2336749810503249527u, 5234627670075224774u, 6122011799606639851u, 487490u}, + {6533622909753609882u, 1567224864194991301u, 17043383876748732661u, 8223558329714289172u, 1298521u}, + {5661356030132685160u, 13663340802701856291u, 7161931949165403542u, 1681278155657238258u, 2017941u}, + {5995762701005809395u, 11438098584864831097u, 17612599174182421011u, 16682528665625476897u, 766088u}, + {12293606676644822655u, 14708339677869827403u, 11139529532032082395u, 9525734258962956220u, 208484u}, + {5613228148562967380u, 16003041532531873779u, 2251726987855802489u, 4039071126641161937u, 1889184u}, + {17415813457372800300u, 3009301955068858645u, 3713021173175291378u, 2556865089122695792u, 1461322u}, + {1313909153692743263u, 17830550550313673753u, 9394781842831852748u, 16528145670185643822u, 490834u}, + {15309591479025065644u, 630203588105295740u, 4492364481266488377u, 7214813709501614424u, 1736387u}, + {7497698845191509456u, 14942730306048959178u, 12976653876847618355u, 5292235058585469344u, 2072588u}, + {14797435215749411880u, 15614179888047841958u, 13838222644098150609u, 3136709049329377838u, 339278u}, + {4530839820014369595u, 10551640650841695080u, 10746170807141785986u, 1087122488141468118u, 2768078u}, + {11596400896420858971u, 2063567947213299189u, 6633120200418315032u, 6896533461132342196u, 626915u}, + {16557504502521971699u, 13651365527433684533u, 12611796096889354327u, 5271768912226242412u, 2801361u}, + {3052019228448763415u, 10040262776679115586u, 8315640756377728662u, 411963964886479655u, 3111973u}, + {16475983701783105021u, 8180463787997302843u, 6596150284979668499u, 9496950588875817715u, 3114065u}, + {724449902237950584u, 7140265704432333448u, 13445771902238523270u, 12019004979876884299u, 1725517u}, + {14416764029306931971u, 10439440553595475467u, 4660934614245571429u, 14299233802022571392u, 3322850u}, + {17978106086013482605u, 6476845563978382149u, 11248769053002845471u, 5537672924727082721u, 285013u}, + {16244068354075695823u, 16708720169313636370u, 2984936457724362462u, 8147765693692209873u, 98855u}, + {17758941188498015211u, 4909602981068365439u, 7696157852282697539u, 73881155071100187u, 729877u}, + {944003420421080628u, 13638058694740988077u, 8779385090626585346u, 3832516338308348669u, 525034u}, + {17878542685988438337u, 2593131766505477812u, 581139095187574279u, 1234664270305287271u, 272786u}, + {16196010877868560226u, 1671849455276136u, 966783656434783934u, 2022644647825537412u, 362362u}, + {15731857517365187127u, 15263957571735148249u, 6792356875808278273u, 18093140504618594124u, 786885u}, + {16071558311961859154u, 3913240965771944717u, 2618520566930744661u, 5274719849072320773u, 2949379u}, + {72568861621489109u, 353248751904585302u, 13059690436128796165u, 6611647502315535428u, 2437176u}, + {8858547200713240568u, 9129958998044100476u, 8943200023230890075u, 15897628656890380572u, 3095370u}, + {12393187276872111585u, 11862236837632486128u, 12469971185080793761u, 11586314560169536751u, 1468021u}, + {5535354646706316823u, 5055919654075726699u, 15539697467028665781u, 1828520070216344129u, 944724u}, + {14858507827069333801u, 3178122930322488136u, 12123534346657021890u, 5349689042483478516u, 1856u}, + {16535230634164140631u, 14509583214892564150u, 7586736553282765458u, 7277851240337411383u, 3778750u}, + {18015236487813506965u, 7130964991526697034u, 9340903316038096145u, 15345915577487103640u, 2987368u}, + {59304861366174947u, 5173688090729594321u, 5148307863404558253u, 8341730542657617773u, 255164u}, + {4580024045405321765u, 15771748608849005318u, 12657469514308027965u, 14920628919197637318u, 545470u}, + {13983423119518209279u, 18072979352346522041u, 5858996536744336228u, 13340717057427183428u, 2376328u}, + {17254043009594656429u, 14812171850549833030u, 14752404977832841626u, 3718772823726231864u, 1597826u}, + {7190517356034076324u, 14068012888309641077u, 13772683725363253108u, 3344124016759776917u, 2215137u}, + {10048522742599128636u, 4429256071534734643u, 14716596774893198266u, 10417155610132951555u, 1356429u}, + {9600699514401496702u, 16421508697023246481u, 9627186387228271035u, 1682346371906655911u, 120080u}, + {10742593075337910964u, 15973214477243427760u, 15950995367212322295u, 14557849082372160486u, 2433931u}, + {11007324790992060251u, 2624625028000706448u, 856721818924894746u, 16762259933607198197u, 376022u}, + {4815347823889337064u, 4549688912297004711u, 11528288079588743600u, 4402449634675948442u, 1781118u}, + {8055906958014867383u, 3589988752752496003u, 15331737045307605844u, 18191369529871366915u, 440599u}, + {5231180284145815752u, 3211442157425510302u, 11138603392518255605u, 4043352901307466300u, 591835u}, + {7158350206843384062u, 18001405825206269940u, 14538278572105737569u, 5127006609515100249u, 864120u}, + {13209261640685906825u, 1273723217461664551u, 4750371772411563342u, 11977500815912017883u, 3899496u}, + {10357722977604208061u, 11343612135720384343u, 11075488216023574575u, 8070325954915955813u, 1624977u}, + {16726486748920737518u, 4970565498816891626u, 17935190876282854089u, 9829808332073189576u, 2284432u}, + {15976119599932342109u, 753768961295845604u, 9046867852108562697u, 10634606665863007382u, 3133146u}, + {14693439749157423224u, 5111824935852853348u, 12368012820955600073u, 7840016509138390540u, 338497u}, + {11833676136728267929u, 9683329522827180133u, 4275064163341174124u, 4978218163985762555u, 2328732u}, + {14405476938886057174u, 15385816735874243073u, 9953742593869704670u, 14238303553670279347u, 3234443u}, + {18372329055524712760u, 16073725970065175907u, 17114690582341511099u, 11012419250245351168u, 367199u}, + {6346432662226854383u, 10363940344878251752u, 16402748038944325051u, 15643271543219903435u, 2800903u}, + {1831404121178666352u, 7088544725581943164u, 8666514342286582246u, 1348704249142259695u, 1628050u}, + {9122863477861047541u, 7866432612040762152u, 12003084147638751550u, 9757807418158178444u, 3793564u}, + {4032878111530889091u, 9577295666844489420u, 11525117445916972657u, 9581581326999532871u, 1916332u}, + {14101443432199785243u, 18004789333370123255u, 8613253053244930064u, 11348392359500527251u, 3723809u}, + {14378037962746503723u, 14347390269344627468u, 3581483239824833775u, 10661158486526175243u, 2995534u}, + {7689490970559887455u, 6093217227568132669u, 9530661352757254542u, 1064064176254245058u, 643490u}, + {8448683115380338587u, 16804794040246100278u, 11503848900929884960u, 10388163837869678319u, 527536u}, + {14645282560870696142u, 14299009918675537839u, 16435615390459606847u, 5558166072890283351u, 3643550u}, + {8772209830639871104u, 13098311030817349750u, 12557808297512484878u, 5039185628544958093u, 2958943u}, + {17567847743604760996u, 17767243031842166428u, 6129114848000406516u, 17276347844353656694u, 1981904u}, + {18362197719460176731u, 1749051004865641862u, 9954113209258940254u, 2558575484470486859u, 589730u}, + {14945683223232040514u, 13117503287502839359u, 6363952190738227150u, 2388779204192786106u, 3353913u}, + {3648879311074277331u, 3355495484649257487u, 10733413547974972071u, 7627916151127699907u, 2374254u}, + {942414625137438295u, 8709180246329270283u, 16421187748427265485u, 10564205993069376004u, 268693u}, + {1658561425771179011u, 4018345710795705253u, 11468966004096562152u, 1013762838100594337u, 1191341u}, + {9442908455281753463u, 5157031544715386779u, 596777878567964676u, 13136458478448164401u, 706080u}, + {5299541705460696002u, 5092023965359723141u, 12049222877591760385u, 7218784293984816918u, 1583263u}, + {5215402891863671162u, 18396214775881614451u, 14849996561207824664u, 15377473584659808267u, 3881290u}, + {1816894851943204408u, 13833072761294189571u, 4638856371750759779u, 5980319889793412482u, 3306298u}, + {11736837487419822938u, 9389034493134579020u, 16275378755769260352u, 8924074505682873760u, 227453u}, + {9526568268210325599u, 12941462363992086002u, 6024481728045171646u, 11173122852082702044u, 2825051u}, + {13568312574586181604u, 10216895349542625354u, 10791980963945349454u, 16193014068461157758u, 2233162u}, + {16966869133401167707u, 18385690046515463071u, 3081483413782180972u, 9624854591126562926u, 1082908u}, + {2799766533797552020u, 14435747443720474025u, 4573727307678171782u, 3190510274025056438u, 2128267u}, + {17339177526216268628u, 15552493145254891038u, 5795707077909269857u, 13586087278990483848u, 2643977u}, + {18246044068929091432u, 5540825234734866068u, 2647120324158997857u, 18423459260313485318u, 1915123u}, + {2325806020109330203u, 10448620149909202861u, 17210334194492205872u, 3422034722056747109u, 1409680u}, + {2940521632799318584u, 13129988384632888456u, 14366139631460411086u, 7087648225324799330u, 294532u}, + {1621700940847014781u, 14650163574033904958u, 18102952893537217429u, 8219998883836950750u, 734950u}, + {8022994845893974202u, 13313321963553548691u, 14704452199241844087u, 13055981963641928134u, 1417229u}, + {8283170479275734606u, 11639601390489793734u, 14187763469131269132u, 11267127943629579293u, 2885654u}, + {15692380259649499423u, 6279434837334920647u, 1632465973873583521u, 557634090355899758u, 2983803u}, + {6221934034266937631u, 17405233844484364938u, 11001184487969093744u, 12953350783654101415u, 304636u}, + {15761845161746631036u, 16147180353583782239u, 11440545081635450511u, 4977593543898016950u, 3454262u}, + {14927104711465059897u, 6341385261888257272u, 1516402470062238271u, 7269479295847927247u, 1286313u}, + {739479957272192736u, 14833417083095138747u, 5824726478057780832u, 18326357179612860594u, 1598771u}, + {5046640672429476883u, 2046137069617505255u, 2942708184213528056u, 1470644018554384593u, 1756460u}, + {13050136537759748767u, 13949171534629651733u, 10806544536182561085u, 5436720522410947097u, 490180u}, + {14145325017188185793u, 15512271402821396980u, 7785964431674610967u, 18095498333966683406u, 2342062u}, + {14464098314233969501u, 7772670937837571635u, 15560854236036981323u, 4006371108500295153u, 3194374u}, + {6411340700181951377u, 491552518480377836u, 13541820086204824788u, 17785093936990355239u, 2122738u}, + {13795996638395566668u, 1863629175268007192u, 3110118242017407211u, 12793351767119876675u, 68634u}, + {14082300370193899830u, 16776116819913243725u, 8955695376548246888u, 505669244891602300u, 306016u}, + {15033097893452130966u, 6262355740003351351u, 718023952972841462u, 12471608767901662475u, 2424423u}, + {1409821041766408700u, 13252896342985116027u, 2936353515581105548u, 14095953560474971420u, 2696123u}, + {14100162174073600529u, 14228072518066332292u, 16723009991410075647u, 1490886585826754297u, 1698708u}, + {12222676943090704868u, 15262254010699597767u, 15371052503912904554u, 13001702560049878070u, 3132656u}, + {958469351587419413u, 5741969878436673266u, 3265999115780844853u, 18288358608100441037u, 2136626u}, + {2858405673486702741u, 8620128481019447374u, 9804973033000569799u, 16828833222128801440u, 1780727u}, + {11506056821949299726u, 14335063536827359461u, 15666935449585325526u, 17614901577317394194u, 354980u}, + {17952703772815144775u, 10140062890981795168u, 17525179324652351998u, 13625433515994566897u, 3188524u}, + {10966616523380308709u, 5595607576662543271u, 6482585828884977859u, 2508776097115864014u, 3751264u}, + {9545421633093430966u, 4320317247961791309u, 10129229626843661905u, 8644052299983120468u, 2165825u}, + {937839801610212500u, 3918630650724784556u, 11286523566844944054u, 10344188375551189137u, 412395u}, + {1512175757089923922u, 5318870844012893645u, 1657798884608768946u, 439952919594033442u, 2538667u}, + {10320428777584933956u, 7568336989175732953u, 15981693010331108553u, 2929133902394442365u, 269685u}, + {3014120534086204006u, 17381108013282049021u, 15163284979994989522u, 13263572116083392486u, 2723496u}, + {6344584320005948312u, 481774997413241827u, 1316396971579715624u, 18280810938557111593u, 3629490u}, + {8610989189844695009u, 8903087713238645806u, 956785263627674201u, 7056538913107908811u, 1202811u}, + {3397781320517789269u, 792575306949254308u, 11007197775373304948u, 15514570671897087812u, 3801436u}, + {15590140393220683939u, 13950533862319421568u, 17598348588615400292u, 8717035417070509134u, 2383486u}, + {9053071711156429621u, 15463471187011803269u, 7628143928286347383u, 13662852838130685005u, 1576282u}, + {7046179378429070963u, 12199792116670354621u, 10534137117699926485u, 9756852479425119237u, 2267644u}, + {3213800558664780621u, 7468960161427187992u, 16414502094773354502u, 4725574270740451341u, 456620u}, + {1982974078123933920u, 1186315247044073917u, 3677344815364630738u, 440768721232079142u, 2220208u}, + {15238848732680288502u, 15327898784032728117u, 7495562737489015372u, 4364411251482847417u, 1395505u}, + {11852234170554383154u, 7944948566992202450u, 5732021301783357473u, 11482899979983535123u, 558401u}, + {14160407018604716134u, 13761420450219038898u, 5819230902065936409u, 15214453033823197963u, 1986731u}, + {6476152800225660453u, 9494261620341649559u, 273108829537215904u, 16249607392048543685u, 2541394u}, + {17819975496571668756u, 12185375482145451049u, 4946243345004737834u, 13377535357974736564u, 3503252u}, + {6185299725001349384u, 8944460414592155400u, 1708017169083367111u, 12098241810781211804u, 75044u}, + {5616126439543289452u, 13103578972848393925u, 6874786226229859212u, 12395290504084114262u, 707771u}, + {1545483073740492011u, 10164731167197760177u, 2599555727685410253u, 3543878190753552851u, 381962u}, + {5373942987329251503u, 8080119237298198197u, 9369164829776482775u, 13049470479668716854u, 988417u}, + {5383085566455523344u, 8140990723645216731u, 10115248621035847552u, 1963788127510628525u, 3868070u}, + {1097099504153830816u, 14976982947378829084u, 15309499770614870626u, 17869579026681182024u, 3895125u}, + {3507826287112817599u, 3353127588652459494u, 16960933083579899611u, 2593868183207164703u, 241300u}, + {15504917062899489283u, 14684391516332556308u, 223307132685456281u, 2310294211152548250u, 954799u}, + {6175901826003754809u, 9609012765615111569u, 6012779577168084600u, 16951147534018192977u, 161558u}, + {6537925459461018657u, 1931261220052671717u, 13985780965331722291u, 12324828816515884957u, 1713225u}, + {18385149756149318303u, 5771403360822482919u, 1534890076219306973u, 10624069759015916455u, 2739264u}, + {16937031400551571173u, 10539669663325772886u, 3943306599232341619u, 2428431115834017568u, 115337u}, + {7526717087879908546u, 10769802798548853796u, 7171211607565094002u, 6703483840076958602u, 1564561u}, + {1569526395856059025u, 12232140230150622934u, 15916573500507132534u, 172976251134046801u, 1617255u}, + {9195159846292387848u, 10968180026793944640u, 604700538234301540u, 246005871373687200u, 2847991u}, + {10145495562652063384u, 3423745889921977395u, 18263948941607902851u, 2286321576523000026u, 3067405u}, + {13120935663122334981u, 16333421379441844753u, 12869859970685835371u, 15260735979294533119u, 3763944u}, + {735792248411504337u, 2552072729540416672u, 15537076849178467093u, 2159102754036420747u, 1042174u}, + {5639953576904958539u, 1368556363768770069u, 5207034979374025736u, 14214570744689180324u, 3804480u}, + {17382833077072462632u, 1913890281852884504u, 11459486432463858929u, 4321578331345865483u, 714107u}, + {12858503822111550581u, 430533155089471860u, 2245197412622732494u, 17379053116532455414u, 3115912u}, + {9845139850136141148u, 6800749885571148586u, 17106942407166429769u, 17351301017701958232u, 3686417u}, + {9187303386267008404u, 15080689821797964470u, 15524006984751188911u, 1004751130792336329u, 727474u}, + {12849713682110481257u, 4969344770818147509u, 2668032171711809344u, 7291236525533750449u, 2930130u}, + {18006745650745046317u, 14278779879123285368u, 190749094717803927u, 6827465205069161078u, 1465577u}, + {4293884791662502452u, 7711773659624234602u, 11029004095051914535u, 12853286869417952836u, 3099063u}, + {2753708303139704122u, 17468388524755825403u, 10656474581185311017u, 8920251701547725541u, 1466084u}, + {8769505304706162142u, 8311984413644727046u, 15110046933403282379u, 5791652008293046975u, 2921402u}, + {13891270864160972281u, 10374915411970604430u, 14815181673690199283u, 2143560587921985383u, 1336677u}, + {12262104165114732963u, 13108254928753629114u, 4563824387770083880u, 5212804111402585842u, 2622439u}, + {1391963465480675629u, 4101923835862317624u, 4296196265932481437u, 8695286750846071234u, 3383535u}, + {9557145211907151056u, 11382979242842568147u, 10572083487326893046u, 2512373410194275422u, 3828439u}, + {3831651785790366108u, 12072880856099238323u, 5044868079283805440u, 15851235331253399916u, 3022167u}, + {15436838487222318218u, 8987527622040180842u, 13504340921863823323u, 14179037588482121361u, 2791915u}, + {10844255467394248784u, 13958115168734019256u, 5203937215608991763u, 4735245368124904231u, 745017u}, + {2816224436036340911u, 2851752480854539660u, 2604711683216883431u, 1743125399575078701u, 151847u}, + {12797091571257534754u, 8182486447849730726u, 15851535349191353001u, 9658518685572829397u, 1966252u}, + {1761445773066985472u, 15436078006101970129u, 15806879041662682815u, 17618323902341354622u, 41049u}, + {5155250786019331291u, 11878030282131728601u, 13385691806785127776u, 17726925371346077861u, 3518995u}, + {10249928793366176936u, 10922462390690804035u, 17248144404324939454u, 6405982293226247282u, 1751265u}, + {9716596127973394765u, 13265773208026340072u, 2527969901053781543u, 11273289813582985267u, 2162202u}, + {7643211110283536443u, 12994054902219942113u, 9337810087146073580u, 5228032368933764145u, 272611u}, + {17524111157913039508u, 1603271399192315195u, 9395914054267653734u, 5553463531497161475u, 3871759u}, + {16104210563397592745u, 16334931999940310411u, 6500153356113380995u, 2161091580041455295u, 2546020u}, + {4069015493066817999u, 7444973753562818903u, 11931789693236791992u, 17556961132724126020u, 1249077u}, + {10303614978746957057u, 3251541619760948831u, 6050245258131664587u, 11840486843524499542u, 3325304u}, + {17322322042683693854u, 6945329805291461887u, 6482016274186768010u, 2367184052909463462u, 399843u}, + {12281142112320312011u, 5811167296489048330u, 2882483623753852382u, 151490991933704173u, 687615u}, + {2973367417190211914u, 5391307963255930727u, 4946310198614635752u, 8083134790325663617u, 435834u}, + {11330314414572869466u, 20386018775998452u, 824041168737600188u, 7574087100322189199u, 1321779u}, + {4163946436239695198u, 5827252592141962241u, 13791414221772684725u, 24382526509090837u, 301867u}, + {15802096084384686196u, 10042696521587623446u, 13406317164658709827u, 9012767718058673007u, 1469268u}, + {11798578071290199312u, 1857095477195451788u, 10005700218867802059u, 14943025185635541555u, 2008234u}, + {15002162830484006265u, 11406242466442583051u, 5820827656506635625u, 10989799687346193485u, 2273666u}, + {15721494928560724223u, 9322524791843477084u, 13479732099048482894u, 16975476344713959548u, 1336961u}, + {16964819960542177962u, 15623242601770353283u, 10183313384536100177u, 9536265007385494692u, 2419739u}, + {9604020820694777177u, 7829765418637593120u, 1904495659058806430u, 11357678579549124836u, 3335585u}, + {10382000530960191571u, 8076042965691544480u, 5094625395743438071u, 8852557166815991246u, 1689176u}, + {16492220939075135092u, 6253296147907053188u, 6945192913846774665u, 4282557854457757796u, 2176860u}, + {10126512911066585515u, 9689727149961318997u, 18235778925073433370u, 8398836891986493804u, 184999u}, + {12363204253917319043u, 4183153000061213580u, 6011834273333755073u, 7209172041398522685u, 3029292u}, + {3489949484910114128u, 5647160520347732801u, 7977452329476568602u, 13962996230777799444u, 1208119u}, + {1260405539172705454u, 13773840142643989503u, 10451367149239566413u, 1823725726914780540u, 766533u}, + {17617354831136817293u, 2101473408516057416u, 11873207505036154898u, 7364014631767428002u, 1275937u}, + {16433227520893003298u, 8106244633443516401u, 17112900493769319162u, 12417443065180796367u, 283044u}, + {1127058613999667421u, 14470553893857436364u, 9378241158882926704u, 18163734950204881983u, 3229426u}, + {14802865967727559888u, 1095099978417429395u, 11841599579841793876u, 17785740546420990748u, 3670280u}, + {17481480923985792329u, 10126715071984512410u, 9705998419754487192u, 3526469247445136167u, 3581225u}, + {13553218275948364387u, 8502042815361217516u, 7953235632018207586u, 4533632774923371768u, 512847u}, + {10896964195902666265u, 2065295741000621285u, 6290017288001784290u, 6422586231267188801u, 3607433u}, + {12112024237795080513u, 16339925829170993108u, 3356394848829085196u, 8281111120060425204u, 2444963u}, + {9078559869112863133u, 10339602762478011430u, 9373443903309356227u, 12150777413383693494u, 2896445u}, + {12065023721411039398u, 4730048658225488392u, 11328119977851193389u, 6970959019430434931u, 3904607u}, + {4999739560246453007u, 10213402837722480293u, 11752971166871867026u, 7421901884877023322u, 1936941u}, + {9975303333535172529u, 9821996082760818243u, 9106603752792795891u, 2701861241738110569u, 3604955u}, + {13198760557737739684u, 10012705919747794390u, 7082956652142357737u, 210614873059956730u, 713774u}, + {6352611633788447858u, 3094042159282472202u, 10240073825186688284u, 10029172377787065938u, 1703201u}, + {8871130911717581343u, 16845838743787203763u, 14923208513787248144u, 18261989814578026367u, 885739u}, + {17946006532170306022u, 7923489028407338319u, 2155144027080442991u, 8302962333272805879u, 606015u}, + {9442538540563544398u, 824593356551881439u, 3604053267462766155u, 17377059175053424003u, 433309u}, + {9973585466489363234u, 1150945988268354555u, 2851891485163817234u, 1160914662211741163u, 126652u}, + {11665208493190394184u, 1134695274062740536u, 6327432352736543384u, 12108012116563231372u, 372700u}, + {13639262702035540538u, 6100185822417418857u, 8310527017488227451u, 150990301700139538u, 2220919u}, + {8977078963488099904u, 9597267678185686856u, 6744030804003992152u, 11858414146772610749u, 819296u}, + {14329177125810157006u, 1272226052861760063u, 10577235499373817999u, 14570747351152471159u, 1794818u}, + {10375682581180334576u, 7096387755561536109u, 3039968960689319941u, 5005082551492662165u, 1860535u}, + {3335768367774315123u, 5689299453766210413u, 2002149191713562294u, 610781570293685240u, 3034688u}, + {5313094042609164406u, 8077752902939735096u, 1256980475372507286u, 5027954102107366646u, 3222101u}, + {3302342475068539329u, 8243781275837109173u, 1454191184424969676u, 11732767511698923354u, 3016903u}, + {12214144519948799332u, 2989304256334403559u, 1805725990281404146u, 14323055668778705407u, 822629u}, + {12792257556030707029u, 4206405188052677871u, 9500513541993928593u, 12048793045287632595u, 197868u}, + {2733949391189828u, 1011396630986970661u, 15620468303873376486u, 12469613800966702734u, 2489278u}, + {50208882978134745u, 15706727392048493915u, 3583759335243071826u, 16835338497501138454u, 1049765u}, + {15238176346926036593u, 11393102624680838694u, 17585441505044051721u, 11044176650930850412u, 278333u}, + {16649515998606438928u, 13504868007030475971u, 10344685800946525920u, 4184474802862264739u, 3270001u}, + {17735540405688061941u, 2824668767838087323u, 6569556206373456842u, 11733651109896574742u, 516631u}, + {18115841286502781668u, 5110940693246579887u, 4750044685223670032u, 5053561754226151269u, 1475560u}, + {7129869941064507487u, 12895862303511687370u, 3849028060498377766u, 12277010269186713740u, 1582417u}, + {11241672703707089176u, 5761854506951048622u, 13396940730043889322u, 2623263839059303212u, 500779u}, + {8685384378635475876u, 2162034743827590966u, 11215843173093782229u, 11466395196704293858u, 3904749u}, + {4958547202586969139u, 1681629191135437365u, 12309848837107619576u, 10232150676289307470u, 2849043u}, + {12628770659984200344u, 8083874303378972758u, 6530349553824589818u, 3223089714976973542u, 2374876u}, + {5528797161465089787u, 5344264267135124392u, 1486312431366912902u, 17625861678256301144u, 64065u}, + {13943191546405472958u, 13681770155272943737u, 12554488477372468632u, 5405501361129539080u, 3462001u}, + {17598533741521661887u, 13844380463122976315u, 9844708122233824704u, 10223983411183266878u, 144384u}, + {33728247377089097u, 2229522497145176644u, 1545678927050904267u, 18233234716516089699u, 1851828u}, + {1824156979415211813u, 8512239337484488265u, 1218292100123501905u, 14085391052813711648u, 1373801u}, + {8883839957539405547u, 10816973888129509850u, 9838092518176985723u, 17247107144605374012u, 3412585u}, + {4932029417883656879u, 10469687111680778918u, 14883965242084250464u, 18221464796929727126u, 2751666u}, + {12366124165395518961u, 2229690728076435523u, 18201759927206816460u, 14318162916209524191u, 2737242u}, + {8644878668634738504u, 3397954233915437760u, 12802174384058396101u, 3293084948666728916u, 3556075u}, + {9451961736877821806u, 7259154559376512332u, 7924649619713815470u, 9000739669428065706u, 2884060u}, + {3201940614349996971u, 1698718721111043552u, 15895682342236165595u, 12086819730047927750u, 2160764u}, + {9599899896539551486u, 6611718518704218082u, 11730697299819491392u, 1913356517584631011u, 674121u}, + {4555128052442877284u, 16845296339242136767u, 4234644671660470287u, 4624121357902457578u, 2577393u}, + {17951343023340874747u, 6106435724147401234u, 4993066295173456936u, 14026717757030511424u, 253131u}, + {2437931491507156431u, 9466626600730072775u, 9972699446475286644u, 1661994119673182457u, 366186u}, + {11592884483738899760u, 18127873148609200843u, 9984097934425737885u, 17660865480379713845u, 384155u}, + {17261433842791202115u, 644549270780604856u, 3334402570451513021u, 5915809137740592125u, 3012895u}, + {15797325160722157880u, 18388860792441714706u, 4734918480975283079u, 13098002629766724693u, 993908u}, + {11210841709773461790u, 7975394755126125410u, 14651880274982566686u, 10971088673371861414u, 2223636u}, + {7422206610882259622u, 15928500206798684445u, 16400210465473247110u, 15389286385254826253u, 3126778u}, + {8754781597870371402u, 14177996435877121996u, 11761634832872127794u, 17783847022260864045u, 505374u}, + {3987074181544999741u, 12074114503350928916u, 3675484788613323194u, 14637014112322724921u, 778591u}, + {12230466771639015534u, 6605484396579671500u, 15218157611841129566u, 4914278878131207353u, 2045594u}, + {8473813469861066311u, 17312027261606163371u, 12167237339377246576u, 14809541331686221574u, 2695773u}, + {12391979217664734689u, 15576165965481426766u, 14291444203317078050u, 265901031535141358u, 3419588u}, + {17285699779102754742u, 6471352220963677225u, 13403322465385581579u, 279253047053213137u, 3867075u}, + {15741631654929539550u, 969785390307647372u, 6800509113193543766u, 10015282920352148579u, 866214u}, + {7291813406851304019u, 244327384480485433u, 16521833770456330723u, 16012764714406348957u, 398862u}, + {3677534512557996080u, 16848486937069966658u, 10754635338151291698u, 15715913221515782701u, 2968847u}, + {1767644386465028887u, 7880407506176065246u, 12954953815911108023u, 14538341978142428738u, 1135142u}, + {8841416965565659045u, 3918741150281876334u, 18131640678213654350u, 2038552321561642993u, 3456056u}, + {9146484503763957319u, 5970446885758525516u, 12570155405993318770u, 14691444572274331667u, 36u}, + {14583981928082736287u, 5326590660885604737u, 15092938650099753870u, 678774231225u, 0u}, + {3399223179347815367u, 17638102829046651306u, 14282045276542575091u, 678u, 0u}, + {9489291632850881240u, 11410616131456490643u, 12521174527251u, 0u, 0u}, + {8108787653629104004u, 3219459544495685547u, 12521u, 0u, 0u}, + {14600035003161000364u, 230974902006461u, 0u, 0u, 0u}, + {16639082353499510799u, 230974u, 0u, 0u, 0u}, + {4260734904763344u, 0u, 0u, 0u, 0u}, + {4260735u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2189186u}, + {2743817708075818480u, 14102809151311148291u, 8559742597383587435u, 15244535695874542414u, 1114766u}, + {12698929934268261483u, 9403924262498755991u, 16441661769054260692u, 12558585180948069461u, 642318u}, + {8686800665762480305u, 4299099972757223932u, 13336172316164032382u, 7649953656338883368u, 407278u}, + {6832196980787072456u, 3492555964890136858u, 1880546254380768251u, 5628005295641184943u, 1049629u}, + {1337445509893469467u, 15931271585805247557u, 10963553148753550613u, 4703105855628664818u, 448197u}, + {13750049649203572390u, 6599162830369976835u, 9856116952237132817u, 1017074096587701359u, 1675461u}, + {10713368456253605267u, 10611677267515020539u, 11949733213488134343u, 2336749810503249527u, 2928180u}, + {4714239208632274642u, 801512055185281339u, 6533622909753609881u, 1567224864194991301u, 2409939u}, + {5626563808783318610u, 4282660318070042141u, 5661356030132685159u, 13663340802701856291u, 2873066u}, + {1801101672415658892u, 15247073510973143324u, 5995762701005809394u, 11438098584864831097u, 465691u}, + {8104067806661982497u, 11259306766141090949u, 12293606676644822654u, 14708339677869827403u, 339119u}, + {485282286033680092u, 3418240090509424045u, 5613228148562967379u, 16003041532531873779u, 2978335u}, + {3211188788290951435u, 502673834767057593u, 17415813457372800299u, 3009301955068858645u, 1752332u}, + {6520949286860152193u, 13378243088457679021u, 1313909153692743262u, 17830550550313673753u, 2913404u}, + {18322464030421062332u, 6630393183980482682u, 15309591479025065643u, 630203588105295740u, 1453283u}, + {4025942477000168179u, 2755787345767039949u, 7497698845191509455u, 14942730306048959178u, 2696387u}, + {10728979593997685162u, 8165461873861162751u, 14797435215749411879u, 15614179888047841958u, 1693085u}, + {2486699012465250428u, 12062284766384621082u, 4530839820014369594u, 10551640650841695080u, 2491242u}, + {16961380847022744079u, 15710856300931912311u, 11596400896420858970u, 2063567947213299189u, 1760758u}, + {11188912904112222288u, 2474483934009654069u, 16557504502521971698u, 13651365527433684533u, 1314985u}, + {5773363189064013655u, 5308884144262122051u, 3052019228448763414u, 10040262776679115586u, 2057580u}, + {468620557266302501u, 8734291118460669028u, 16475983701783105020u, 8180463787997302843u, 355829u}, + {12592144848050108195u, 10871152031036278805u, 724449902237950583u, 7140265704432333448u, 3423206u}, + {928162642715867685u, 18126702058466206823u, 14416764029306931970u, 10439440553595475467u, 3454251u}, + {9290540156283433007u, 7290819166624289624u, 17978106086013482604u, 6476845563978382149u, 3437785u}, + {3767784232259910904u, 13323167333994480472u, 16244068354075695822u, 16708720169313636370u, 525110u}, + {6236882987038514719u, 14079106684919589190u, 17758941188498015210u, 4909602981068365439u, 1039393u}, + {15946285375104422710u, 15290521708935464082u, 944003420421080627u, 13638058694740988077u, 3855204u}, + {1016935997058001016u, 14225761641133611842u, 17878542685988438336u, 2593131766505477812u, 90631u}, + {11607696092557704539u, 2170282771182199557u, 16196010877868560225u, 1671849455276136u, 3242048u}, + {3843161117296873999u, 5683402910203456023u, 15731857517365187126u, 15263957571735148249u, 1199717u}, + {873317106528324042u, 14500348408379663655u, 16071558311961859153u, 3913240965771944717u, 3524653u}, + {13571416138389611706u, 3410740145672185373u, 72568861621489108u, 353248751904585302u, 2748569u}, + {10729538318527663338u, 12153519350999182781u, 8858547200713240567u, 9129958998044100476u, 2428147u}, + {3208365118526356599u, 1248140197021201396u, 12393187276872111584u, 11862236837632486128u, 644453u}, + {198660295048796469u, 4972282972828402416u, 5535354646706316822u, 5055919654075726699u, 411389u}, + {3857639494142690986u, 1822257744477425550u, 14858507827069333800u, 3178122930322488136u, 1409832u}, + {3603125748426491433u, 3733565071813039504u, 16535230634164140630u, 14509583214892564150u, 3757886u}, + {15760858295213367437u, 4719581876798307533u, 18015236487813506964u, 7130964991526697034u, 3122443u}, + {11848487415994093422u, 16858865245781786807u, 59304861366174946u, 5173688090729594321u, 3425705u}, + {1474496208747939448u, 12581125185359088418u, 4580024045405321764u, 15771748608849005318u, 3175673u}, + {3131538792082659676u, 3023892496105763237u, 13983423119518209278u, 18072979352346522041u, 2188194u}, + {5561841007541278650u, 7159697849971145198u, 17254043009594656428u, 14812171850549833030u, 909756u}, + {4994232794808898370u, 10011004555432833852u, 7190517356034076323u, 14068012888309641077u, 1829202u}, + {2633990742582596359u, 9797893437624502545u, 10048522742599128635u, 4429256071534734643u, 3493020u}, + {12715024017386471300u, 12008809058899918257u, 9600699514401496701u, 16421508697023246481u, 2628441u}, + {735998261243407880u, 903523252286301752u, 10742593075337910963u, 15973214477243427760u, 1656207u}, + {10836207617869394997u, 296596252193823383u, 11007324790992060250u, 2624625028000706448u, 545380u}, + {15505893142797042808u, 8779792368889427179u, 4815347823889337063u, 4549688912297004711u, 3207430u}, + {5238091032221623893u, 171888965221162742u, 8055906958014867382u, 3589988752752496003u, 2217628u}, + {152980882983212452u, 3907105213112822914u, 5231180284145815751u, 3211442157425510302u, 3201915u}, + {16139832666125577438u, 6247949539435791459u, 7158350206843384061u, 18001405825206269940u, 2642423u}, + {7998576185858717720u, 13333398653531397184u, 13209261640685906824u, 1273723217461664551u, 1657196u}, + {8605786859181763380u, 15678046738726085653u, 10357722977604208060u, 11343612135720384343u, 3829895u}, + {16284231186196467391u, 9873314819558057674u, 16726486748920737517u, 4970565498816891626u, 1799397u}, + {8530259883591083447u, 11717319548974173039u, 15976119599932342108u, 753768961295845604u, 3675085u}, + {7320685413360619121u, 13573334407703095130u, 14693439749157423223u, 5111824935852853348u, 1496845u}, + {12101826080884859921u, 16946837684889339821u, 11833676136728267928u, 9683329522827180133u, 2035546u}, + {300983231174247671u, 10660886826924647048u, 14405476938886057173u, 15385816735874243073u, 264680u}, + {14309991322705782622u, 5869518243972748216u, 18372329055524712759u, 16073725970065175907u, 3236581u}, + {4668057954461062310u, 4857035228302081184u, 6346432662226854382u, 10363940344878251752u, 1458279u}, + {3999242904227891930u, 13782112916275112586u, 1831404121178666351u, 7088544725581943164u, 658916u}, + {14334103766559062851u, 8019926223730980519u, 9122863477861047540u, 7866432612040762152u, 3561238u}, + {17803759193075350540u, 9471069390273251777u, 4032878111530889090u, 9577295666844489420u, 3385335u}, + {11604789474327577394u, 5832668086037340820u, 14101443432199785242u, 18004789333370123255u, 429834u}, + {14582897114415554547u, 5666722205729516517u, 14378037962746503722u, 14347390269344627468u, 2188967u}, + {10789926909104413209u, 2030948933717721618u, 7689490970559887454u, 6093217227568132669u, 833460u}, + {8365663122501930993u, 8694841793750414108u, 8448683115380338586u, 16804794040246100278u, 1713380u}, + {12248681091115985287u, 8813284580975804962u, 14645282560870696141u, 14299009918675537839u, 3029613u}, + {8614475464358026222u, 11365785996633516052u, 8772209830639871103u, 13098311030817349750u, 2226674u}, + {5087471902675585903u, 1201702952998121975u, 17567847743604760995u, 17767243031842166428u, 1066244u}, + {5729958768920385174u, 7172092381512777766u, 18362197719460176730u, 1749051004865641862u, 163778u}, + {10413659382667752063u, 12089377922687422503u, 14945683223232040513u, 13117503287502839359u, 2214274u}, + {14458847979757300580u, 12034980526919930758u, 3648879311074277330u, 3355495484649257487u, 3375607u}, + {15386336680578223109u, 2648585629067022350u, 942414625137438294u, 8709180246329270283u, 2991207u}, + {7601404706456706828u, 471000977337028642u, 1658561425771179010u, 4018345710795705253u, 2219490u}, + {1647851529522134432u, 9988825179794088595u, 9442908455281753462u, 5157031544715386779u, 2601672u}, + {7446683530690442424u, 11462673186071358749u, 5299541705460696001u, 5092023965359723141u, 1167051u}, + {5163969682184496015u, 7706645941570982570u, 5215402891863671161u, 18396214775881614451u, 3798626u}, + {3109388683358185669u, 4979392963195470254u, 1816894851943204407u, 13833072761294189571u, 1168079u}, + {16004655740166580887u, 2322706418882717754u, 11736837487419822937u, 9389034493134579020u, 2339330u}, + {4043281823815836508u, 11914452000132835069u, 9526568268210325598u, 12941462363992086002u, 3077756u}, + {7863509888417716636u, 10300248068417316022u, 13568312574586181603u, 10216895349542625354u, 596504u}, + {8020782275864606132u, 11175101967737055757u, 16966869133401167706u, 18385690046515463071u, 1313436u}, + {10765163550575892899u, 18436842942577042571u, 2799766533797552019u, 14435747443720474025u, 3258592u}, + {13001045846788386902u, 4190295458986461195u, 17339177526216268627u, 15552493145254891038u, 3493737u}, + {3126282385438661704u, 16984601776187022772u, 18246044068929091431u, 5540825234734866068u, 14583u}, + {15304574464511479868u, 15674570471903342284u, 2325806020109330202u, 10448620149909202861u, 840596u}, + {8495654417918446113u, 16247363770367208051u, 2940521632799318583u, 13129988384632888456u, 1218208u}, + {14555412329633563723u, 15555296775464550111u, 1621700940847014780u, 14650163574033904958u, 2966629u}, + {9193507197029966069u, 17890182430089545755u, 8022994845893974201u, 13313321963553548691u, 2077805u}, + {355689150745338865u, 13503808727695867080u, 8283170479275734605u, 11639601390489793734u, 565094u}, + {15255599167881927017u, 7869853511804263369u, 15692380259649499422u, 6279434837334920647u, 2133367u}, + {15221555661253573835u, 17143801221059646397u, 6221934034266937630u, 17405233844484364938u, 340400u}, + {4491498209544816722u, 17306732318725562606u, 15761845161746631035u, 16147180353583782239u, 17183u}, + {180540465456694289u, 18421429753251140833u, 14927104711465059896u, 6341385261888257272u, 3339901u}, + {16164957408282690535u, 8236790449792196019u, 739479957272192735u, 14833417083095138747u, 1546312u}, + {15403602484249187277u, 10020421896060716283u, 5046640672429476882u, 2046137069617505255u, 2279854u}, + {2096584248203035632u, 17783148032865558554u, 13050136537759748766u, 13949171534629651733u, 1078167u}, + {14411690179934616210u, 12322064351387511195u, 14145325017188185792u, 15512271402821396980u, 3388585u}, + {937945137385141929u, 9985872495108249576u, 14464098314233969500u, 7772670937837571635u, 3209615u}, + {4875606833454852570u, 6942083498663469135u, 6411340700181951376u, 491552518480377836u, 3371290u}, + {6318707266174322999u, 11175638783078180209u, 13795996638395566667u, 1863629175268007192u, 3185115u}, + {11276470179747970357u, 7571768255450907532u, 14082300370193899829u, 16776116819913243725u, 3545484u}, + {842213044208027375u, 9138039859758525481u, 15033097893452130965u, 6262355740003351351u, 3597200u}, + {11781625111144951646u, 4048827553853820298u, 1409821041766408699u, 13252896342985116027u, 1774106u}, + {13137848064000355141u, 4152669546924324139u, 14100162174073600528u, 14228072518066332292u, 3149697u}, + {5299879653507065970u, 6890103003000770400u, 12222676943090704867u, 15262254010699597767u, 2679060u}, + {5169921097737960830u, 14736323531655601801u, 958469351587419412u, 5741969878436673266u, 2454351u}, + {17356862200768959654u, 12856685634582159926u, 2858405673486702740u, 8620128481019447374u, 3667851u}, + {16912174319650239628u, 5394938105067714367u, 11506056821949299725u, 14335063536827359461u, 2818910u}, + {17112464214864198673u, 8673136306572864419u, 17952703772815144774u, 10140062890981795168u, 2557244u}, + {11765009370264761528u, 18209215061932912797u, 10966616523380308708u, 5595607576662543271u, 3736117u}, + {6798775043825325679u, 16023598163353377392u, 9545421633093430965u, 4320317247961791309u, 1491893u}, + {17645322775468821166u, 17392743563816219526u, 937839801610212499u, 3918630650724784556u, 3180316u}, + {10173316323324896553u, 13959667507546526004u, 1512175757089923921u, 5318870844012893645u, 124120u}, + {10115843603123352474u, 2614327204894987416u, 10320428777584933955u, 7568336989175732953u, 825503u}, + {2010786462426837739u, 4281459252376218062u, 3014120534086204005u, 17381108013282049021u, 2679574u}, + {6902974954406081104u, 3172317665401055044u, 6344584320005948311u, 481774997413241827u, 2168602u}, + {7722491893084785655u, 968366537241439373u, 8610989189844695008u, 8903087713238645806u, 3903093u}, + {6148542658875615833u, 16603008827941243692u, 3397781320517789268u, 792575306949254308u, 2353706u}, + {1317942467676956837u, 12311484884226682531u, 15590140393220683938u, 13950533862319421568u, 2338952u}, + {16565809622253866932u, 12945407350708651770u, 9053071711156429620u, 15463471187011803269u, 1195805u}, + {9731923589280353082u, 15672435017429943020u, 7046179378429070962u, 12199792116670354621u, 2549391u}, + {3632203098729746862u, 7834549784676486919u, 3213800558664780620u, 7468960161427187992u, 1810278u}, + {2570558936945225682u, 411739821062020883u, 1982974078123933919u, 1186315247044073917u, 2802058u}, + {12031282055894797451u, 3886917852954913058u, 15238848732680288501u, 15327898784032728117u, 1009024u}, + {17317112148929367217u, 14433738228303937460u, 11852234170554383153u, 7944948566992202450u, 3820597u}, + {487894630908722812u, 13562075495514357406u, 14160407018604716133u, 13761420450219038898u, 2966203u}, + {16872272224462407222u, 14257430751376493154u, 6476152800225660452u, 9494261620341649559u, 414278u}, + {15773083666756436034u, 467930528394804809u, 17819975496571668755u, 12185375482145451049u, 505170u}, + {6095773689468025179u, 15121560901250201912u, 6185299725001349383u, 8944460414592155400u, 3315189u}, + {17042846948230125217u, 3008312876663633855u, 5616126439543289451u, 13103578972848393925u, 249930u}, + {14210241806800914877u, 2228741727866189300u, 1545483073740492010u, 10164731167197760177u, 524141u}, + {6135156656399069895u, 591169044558408642u, 5373942987329251502u, 8080119237298198197u, 3823991u}, + {17903831351076984071u, 10933915556970939436u, 5383085566455523343u, 8140990723645216731u, 3310122u}, + {6930725329746410957u, 4574207244471169627u, 1097099504153830815u, 14976982947378829084u, 2085910u}, + {15397466497640229043u, 15716912230396025119u, 3507826287112817598u, 3353127588652459494u, 3073709u}, + {15421072509350191145u, 16994435728532590031u, 15504917062899489282u, 14684391516332556308u, 1374375u}, + {7055403531597177633u, 5012404841402456959u, 6175901826003754808u, 9609012765615111569u, 3131380u}, + {9275717096742803849u, 14703707712453969265u, 6537925459461018656u, 1931261220052671717u, 368403u}, + {16342568277129741137u, 14404842871822043130u, 18385149756149318302u, 5771403360822482919u, 1044137u}, + {4359518637453976989u, 8544511172100256478u, 16937031400551571172u, 10539669663325772886u, 1800929u}, + {16353644232310976030u, 10165955878871234100u, 7526717087879908545u, 10769802798548853796u, 2949400u}, + {18445677794468759142u, 11949234155583803131u, 1569526395856059024u, 12232140230150622934u, 836230u}, + {11225579793939736891u, 10113819406778574009u, 9195159846292387847u, 10968180026793944640u, 2007886u}, + {17610709180188508797u, 11925231657971325412u, 10145495562652063383u, 3423745889921977395u, 2624047u}, + {10821774533245954089u, 2882601411657978401u, 13120935663122334980u, 16333421379441844753u, 1629389u}, + {6852909964845443314u, 17168130368576792793u, 735792248411504336u, 2552072729540416672u, 3877089u}, + {3501818206770564933u, 9743162047348652487u, 5639953576904958538u, 1368556363768770069u, 2189700u}, + {5969948546550451310u, 5931425903548018240u, 17382833077072462631u, 1913890281852884504u, 3807999u}, + {3040260728233046853u, 11128139283074691983u, 12858503822111550580u, 430533155089471860u, 1481890u}, + {9896878585566307878u, 15414250253486363557u, 9845139850136141147u, 6800749885571148586u, 1119583u}, + {4415240987532902846u, 14666987246721062896u, 9187303386267008403u, 15080689821797964470u, 3763719u}, + {13515573143700677978u, 9574907724177958279u, 12849713682110481256u, 4969344770818147509u, 616708u}, + {7400786641350225072u, 7349416162959837366u, 18006745650745046316u, 14278779879123285368u, 87337u}, + {14389526274660303988u, 2260347368932262478u, 4293884791662502451u, 7711773659624234602u, 1650739u}, + {16873309683250744291u, 16332475429242346406u, 2753708303139704121u, 17468388524755825403u, 1374827u}, + {11832510931871977926u, 1911515850366379750u, 8769505304706162141u, 8311984413644727046u, 3831541u}, + {18026920503233122303u, 14106265279852082141u, 13891270864160972280u, 10374915411970604430u, 3568673u}, + {16007046139521416212u, 8218929274847197830u, 12262104165114732962u, 13108254928753629114u, 3615736u}, + {16846043773813842952u, 11716501194412445517u, 1391963465480675628u, 4101923835862317624u, 3791291u}, + {17176679212486546595u, 5061522944676100700u, 9557145211907151055u, 11382979242842568147u, 2128432u}, + {844984193789965352u, 864111887305999623u, 3831651785790366107u, 12072880856099238323u, 2839848u}, + {13668790744942240519u, 203739917279888415u, 15436838487222318217u, 8987527622040180842u, 2764689u}, + {18050736450706925938u, 6599065784768617454u, 10844255467394248783u, 13958115168734019256u, 2250061u}, + {6592574411822819671u, 5553674452939933686u, 2816224436036340910u, 2851752480854539660u, 2167229u}, + {2301681245875798752u, 16067241265608338064u, 12797091571257534753u, 8182486447849730726u, 853965u}, + {14928555368405596574u, 13866620616480218683u, 1761445773066985471u, 15436078006101970129u, 3284311u}, + {523192085923583711u, 4020112803354942556u, 5155250786019331290u, 11878030282131728601u, 2264122u}, + {3541360991525388249u, 3513775254319137786u, 10249928793366176935u, 10922462390690804035u, 389006u}, + {10181884821843172856u, 11167663126935418829u, 9716596127973394764u, 13265773208026340072u, 1284127u}, + {13676860208687209095u, 12892614428232839910u, 7643211110283536442u, 12994054902219942113u, 976016u}, + {15697792687328368124u, 12204003339750829089u, 17524111157913039507u, 1603271399192315195u, 2705938u}, + {2456604003028033778u, 16186471083156069763u, 16104210563397592744u, 16334931999940310411u, 1249085u}, + {11771100618075992800u, 8684444521969718753u, 4069015493066817998u, 7444973753562818903u, 485174u}, + {2329089478739274832u, 7946277943407164141u, 10303614978746957056u, 3251541619760948831u, 1507083u}, + {14340811351522247619u, 16640084724471975041u, 17322322042683693853u, 6945329805291461887u, 2524010u}, + {3556567707947378500u, 74004756748713072u, 12281142112320312010u, 5811167296489048330u, 3200890u}, + {12834638591394340512u, 9985390985946378014u, 2973367417190211913u, 5391307963255930727u, 1105128u}, + {14564047974296470212u, 1974965855231037039u, 11330314414572869465u, 20386018775998452u, 3395996u}, + {3694384919565289522u, 4329415289198767581u, 4163946436239695197u, 5827252592141962241u, 1446919u}, + {14723384133616356448u, 9295880971709370484u, 15802096084384686195u, 10042696521587623446u, 3017097u}, + {14958315217893509902u, 10565154323403426159u, 11798578071290199311u, 1857095477195451788u, 1146143u}, + {15440039008445770257u, 9195755924929269551u, 15002162830484006264u, 11406242466442583051u, 1468831u}, + {6009377514715534445u, 6205385398321556236u, 15721494928560724222u, 9322524791843477084u, 3187678u}, + {17959174128823015756u, 6078776499422673528u, 16964819960542177961u, 15623242601770353283u, 2577433u}, + {12076982274859293644u, 17402764194187118365u, 9604020820694777176u, 7829765418637593120u, 303166u}, + {6737603869901446634u, 17257460217013419976u, 10382000530960191570u, 8076042965691544480u, 3054363u}, + {17683514176468095299u, 17108502500218494337u, 16492220939075135091u, 6253296147907053188u, 1843661u}, + {14003391567060793336u, 16964867609869127924u, 10126512911066585514u, 9689727149961318997u, 206678u}, + {6496346856634504469u, 5289379457012680785u, 12363204253917319042u, 4183153000061213580u, 1445685u}, + {15609245560029181942u, 5648977470404987427u, 3489949484910114127u, 5647160520347732801u, 587620u}, + {14487748794041072691u, 3904166006622926907u, 1260405539172705453u, 13773840142643989503u, 639851u}, + {13843429552718699302u, 10730938785670489234u, 17617354831136817292u, 2101473408516057416u, 1940402u}, + {2272915474205087513u, 12065035049364279572u, 16433227520893003297u, 8106244633443516401u, 3200298u}, + {10479418000443275252u, 9800223890644341061u, 1127058613999667420u, 14470553893857436364u, 771738u}, + {9168234969105548917u, 12279299736233852116u, 14802865967727559887u, 1095099978417429395u, 2095324u}, + {14774494145513608005u, 7683879671828111592u, 17481480923985792328u, 10126715071984512410u, 3865414u}, + {14175613447430185988u, 14579009200926693423u, 13553218275948364386u, 8502042815361217516u, 2584906u}, + {1122526283616631058u, 10248150997829831592u, 10896964195902666264u, 2065295741000621285u, 2976654u}, + {6716185768678120178u, 7042248360015298670u, 12112024237795080512u, 16339925829170993108u, 1917238u}, + {984180989819930897u, 1786042692753514724u, 9078559869112863132u, 10339602762478011430u, 2510201u}, + {7045368875765813665u, 16618610273239724143u, 12065023721411039397u, 4730048658225488392u, 2888427u}, + {9791772288466375973u, 1016426332638313392u, 4999739560246453006u, 10213402837722480293u, 1201474u}, + {8812312180405633933u, 14086720307974854774u, 9975303333535172528u, 9821996082760818243u, 3727375u}, + {14170416735408023011u, 9479988692247589609u, 13198760557737739683u, 10012705919747794390u, 3665861u}, + {2168278882871383510u, 263374117415395690u, 6352611633788447857u, 3094042159282472202u, 3058498u}, + {12595785904988523459u, 7275015435731389162u, 8871130911717581342u, 16845838743787203763u, 3751950u}, + {2988261171096016209u, 15640100562622973023u, 17946006532170306021u, 7923489028407338319u, 1732545u}, + {5663809775590520118u, 10929973410577598855u, 9442538540563544397u, 824593356551881439u, 3799157u}, + {15876896120470427723u, 6953360234067501657u, 9973585466489363233u, 1150945988268354555u, 2918204u}, + {17442817840753412421u, 7273904210558375015u, 11665208493190394183u, 1134695274062740536u, 2566736u}, + {14507121197565973269u, 16558313535501059765u, 13639262702035540537u, 6100185822417418857u, 737673u}, + {1702161462652230678u, 7713420033812346836u, 8977078963488099903u, 9597267678185686856u, 2561262u}, + {6129800890003605015u, 794624333197806138u, 14329177125810157005u, 1272226052861760063u, 1883451u}, + {6966266106376874478u, 13855044531431586059u, 10375682581180334575u, 7096387755561536109u, 3730041u}, + {17562825892425910952u, 18284162140697710748u, 3335768367774315122u, 5689299453766210413u, 395862u}, + {2272188417953562665u, 4388251730686638619u, 5313094042609164405u, 8077752902939735096u, 1583778u}, + {14424025019810219967u, 18285156300056026450u, 3302342475068539328u, 8243781275837109173u, 1894258u}, + {17498905256890375581u, 4341119229668148598u, 12214144519948799331u, 2989304256334403559u, 1467182u}, + {16411486594037649268u, 12061176113241448493u, 12792257556030707028u, 4206405188052677871u, 140421u}, + {16540552244681223498u, 10091467339522449513u, 2733949391189827u, 1011396630986970661u, 3807148u}, + {12029729997711916984u, 10267743520030649603u, 50208882978134744u, 15706727392048493915u, 433830u}, + {1486029629832899306u, 16759012066428266815u, 15238176346926036592u, 11393102624680838694u, 1631611u}, + {14695292580982328863u, 13853536396940739520u, 16649515998606438927u, 13504868007030475971u, 781850u}, + {10358896948329833951u, 3791390000258455119u, 17735540405688061940u, 2824668767838087323u, 3627150u}, + {14780432430322758194u, 4693890395408402368u, 18115841286502781667u, 5110940693246579887u, 3773596u}, + {8528035463006412351u, 8748273104217504539u, 7129869941064507486u, 12895862303511687370u, 3757008u}, + {16671942307409261179u, 16983567785399436775u, 11241672703707089175u, 5761854506951048622u, 16638u}, + {659855824154715991u, 15568447976559735730u, 8685384378635475875u, 2162034743827590966u, 1317551u}, + {1087323444494553886u, 13278726165872747105u, 4958547202586969138u, 1681629191135437365u, 727704u}, + {15102318697297938774u, 6251195788382759745u, 12628770659984200343u, 8083874303378972758u, 650646u}, + {2055160940386104477u, 10220932246772193451u, 5528797161465089786u, 5344264267135124392u, 3408996u}, + {4748833781088044251u, 17531147947718838258u, 13943191546405472957u, 13681770155272943737u, 505368u}, + {17018294072266660864u, 10293241834614120418u, 17598533741521661886u, 13844380463122976315u, 3675156u}, + {1983110044432250673u, 9249641354407112614u, 33728247377089096u, 2229522497145176644u, 511919u}, + {13309931605346444010u, 14260990876436564588u, 1824156979415211812u, 8512239337484488265u, 451829u}, + {392978454796771963u, 18316714390947513465u, 8883839957539405546u, 10816973888129509850u, 1156625u}, + {12993026926086895822u, 8672167588729609848u, 4932029417883656878u, 10469687111680778918u, 3684276u}, + {6444049081796576237u, 5894734959579534009u, 12366124165395518960u, 2229690728076435523u, 609718u}, + {6531036264900422049u, 11298695978728879961u, 8644878668634738503u, 3397954233915437760u, 2894557u}, + {5564210236962627083u, 8072362640803585174u, 9451961736877821805u, 7259154559376512332u, 2243976u}, + {18066039105169387852u, 10377019853188399590u, 3201940614349996970u, 1698718721111043552u, 2953229u}, + {1728017326595319505u, 8632493799375706704u, 9599899896539551485u, 6611718518704218082u, 3029094u}, + {7260639944879622740u, 6477995901131871923u, 4555128052442877283u, 16845296339242136767u, 2905543u}, + {106927131132963646u, 3306456450650015818u, 17951343023340874746u, 6106435724147401234u, 1468106u}, + {13003793054384815825u, 17963277530552315086u, 2437931491507156430u, 9466626600730072775u, 2245222u}, + {11173179579900447250u, 1248366120105630296u, 11592884483738899759u, 18127873148609200843u, 3691085u}, + {14688780908458203415u, 2585897918767512258u, 17261433842791202114u, 644549270780604856u, 768391u}, + {13391029334171269355u, 10926683623632034923u, 15797325160722157879u, 18388860792441714706u, 2659515u}, + {12563980796395890923u, 1214286731070293899u, 11210841709773461789u, 7975394755126125410u, 204476u}, + {5222538505564190729u, 1167704818755524910u, 7422206610882259621u, 15928500206798684445u, 2965726u}, + {13625260694503721316u, 3590286055544747886u, 8754781597870371401u, 14177996435877121996u, 2195308u}, + {13244025237335997764u, 5835911294465876730u, 3987074181544999740u, 12074114503350928916u, 2615276u}, + {17781140587612084528u, 18035932358905828286u, 12230466771639015533u, 6605484396579671500u, 986878u}, + {545328237004852613u, 3660459405330750227u, 8473813469861066310u, 17312027261606163371u, 635648u}, + {17293858928180602159u, 7188831457606108255u, 12391979217664734688u, 15576165965481426766u, 3156456u}, + {18292749472437718417u, 2310426663369960758u, 17285699779102754741u, 6471352220963677225u, 1790921u}, + {16596148833186007373u, 7985435338740499537u, 15741631654929539549u, 969785390307647372u, 1526264u}, + {4404250497900033238u, 7009266261878321060u, 7291813406851304018u, 244327384480485433u, 3202057u}, + {16407671757375063226u, 3155845703348475330u, 3677534512557996079u, 16848486937069966658u, 1416496u}, + {9543523745270462593u, 4843996624155252963u, 1767644386465028886u, 7880407506176065246u, 1497883u}, + {17784323034645923481u, 3064263741176270240u, 8841416965565659044u, 3918741150281876334u, 3346074u}, + {11243990621541380170u, 4555211904805800211u, 9146484503763957318u, 5970446885758525516u, 3598808u}, + {12792178086487083590u, 17571180844680953500u, 14583981928082736286u, 5326590660885604737u, 3038470u}, + {17791291941104464185u, 15145765610675585405u, 3399223179347815366u, 17638102829046651306u, 1383239u}, + {18093093093808227911u, 17613169776853942656u, 9489291632850881239u, 11410616131456490643u, 2652251u}, + {7061597821801941369u, 16284744789452350529u, 8108787653629104003u, 3219459544495685547u, 12521u}, + {6051761077562241651u, 5652793171965255507u, 14600035003161000363u, 230974902006461u, 0u}, + {8018971781462254949u, 3799869517586538406u, 16639082353499510798u, 230974u, 0u}, + {7189177965605301193u, 8752330409342263856u, 4260734904763343u, 0u, 0u}, + {8586519307974351828u, 16689937844347222740u, 4260734u, 0u, 0u}, + {779723294015835795u, 78596686354090637u, 0u, 0u, 0u}, + {6531819360415513379u, 78596686u, 0u, 0u, 0u}, + {1449852958215529844u, 0u, 0u, 0u, 0u}, + {1449852959u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2796066u}, + {6180897705302832356u, 17209559613061430484u, 2743817708075818479u, 14102809151311148291u, 1975255u}, + {14572055736138614790u, 5350072584120554554u, 12698929934268261482u, 9403924262498755991u, 2585926u}, + {260911832661759910u, 11982289111281272941u, 8686800665762480304u, 4299099972757223932u, 1831838u}, + {9348663152967806233u, 5978415333859593792u, 6832196980787072455u, 3492555964890136858u, 354713u}, + {2033848876248514150u, 7975027578721636837u, 1337445509893469466u, 15931271585805247557u, 2272583u}, + {14623421225820388345u, 9927713485365156886u, 13750049649203572389u, 6599162830369976835u, 1041427u}, + {13216204154070094729u, 9451659008643662974u, 10713368456253605266u, 10611677267515020539u, 481305u}, + {5987386909073757476u, 18245238676195314755u, 4714239208632274641u, 801512055185281339u, 1694731u}, + {13839765135401583162u, 16664914070740892904u, 5626563808783318609u, 4282660318070042141u, 2326761u}, + {18061063251805012189u, 10579991379072337177u, 1801101672415658891u, 15247073510973143324u, 993242u}, + {6838643555366030245u, 8161777181450131449u, 8104067806661982496u, 11259306766141090949u, 1709416u}, + {9352231128784274857u, 8894573146576081430u, 485282286033680091u, 3418240090509424045u, 3812503u}, + {7794795200203031576u, 16109932292057861667u, 3211188788290951434u, 502673834767057593u, 2579761u}, + {11207545803560538070u, 17028442891921304010u, 6520949286860152192u, 13378243088457679021u, 59334u}, + {12028792030782994633u, 16206026057097935115u, 18322464030421062331u, 6630393183980482682u, 954031u}, + {10890972083160544725u, 8075165148857569502u, 4025942477000168178u, 2755787345767039949u, 1244325u}, + {2213906181635240559u, 1285054839505718842u, 10728979593997685161u, 8165461873861162751u, 1554017u}, + {3288458751403202859u, 4998321087080936228u, 2486699012465250427u, 12062284766384621082u, 124726u}, + {8678421056835829895u, 12692835575002668994u, 16961380847022744078u, 15710856300931912311u, 1329542u}, + {17421243278002833688u, 12151272583746588534u, 11188912904112222287u, 2474483934009654069u, 2638936u}, + {10425868187456780502u, 4408746149453360742u, 5773363189064013654u, 5308884144262122051u, 830620u}, + {11902159928088760110u, 13648391582592787429u, 468620557266302500u, 8734291118460669028u, 3388832u}, + {17579556540834337125u, 1654878453789119486u, 12592144848050108194u, 10871152031036278805u, 2181737u}, + {9035794898474779024u, 2246557868640304668u, 928162642715867684u, 18126702058466206823u, 704848u}, + {5614563708022836247u, 12434624412833824902u, 9290540156283433006u, 7290819166624289624u, 3500348u}, + {8007417091025423317u, 5132844883278492318u, 3767784232259910903u, 13323167333994480472u, 1511152u}, + {2004515268309624781u, 9705034367753696361u, 6236882987038514718u, 14079106684919589190u, 775842u}, + {5098674917336238771u, 10544005998729043019u, 15946285375104422709u, 15290521708935464082u, 1648833u}, + {2174216696249528060u, 11014736637222057450u, 1016935997058001015u, 14225761641133611842u, 463764u}, + {12272806732948316192u, 5229985307023550525u, 11607696092557704538u, 2170282771182199557u, 3410389u}, + {10669328734868276315u, 10344104605472283429u, 3843161117296873998u, 5683402910203456023u, 909212u}, + {12941527980341050430u, 5087424570059921904u, 873317106528324041u, 14500348408379663655u, 1302843u}, + {3798501311420582104u, 7157519863408638459u, 13571416138389611705u, 3410740145672185373u, 2593604u}, + {3380439845196256295u, 6612270413852216467u, 10729538318527663337u, 12153519350999182781u, 1255565u}, + {9424892296830090859u, 16276301519221473567u, 3208365118526356598u, 1248140197021201396u, 16750u}, + {5645377205052890301u, 15891879886338415597u, 198660295048796468u, 4972282972828402416u, 1128540u}, + {7301911605629600020u, 6944368392077422486u, 3857639494142690985u, 1822257744477425550u, 3178218u}, + {8802866965334688043u, 2622116003523418832u, 3603125748426491432u, 3733565071813039504u, 1942796u}, + {18056189321835934776u, 9323000543035755664u, 15760858295213367436u, 4719581876798307533u, 3764666u}, + {15479825557904375554u, 16006322114559347224u, 11848487415994093421u, 16858865245781786807u, 2336662u}, + {2665918008776084140u, 14492193906357591036u, 1474496208747939447u, 12581125185359088418u, 3769290u}, + {3410209660818427309u, 14493776082082664896u, 3131538792082659675u, 3023892496105763237u, 1409248u}, + {10582066532292204725u, 4931658736171431809u, 5561841007541278649u, 7159697849971145198u, 3635144u}, + {3052639254435130970u, 7707571371296657981u, 4994232794808898369u, 10011004555432833852u, 3801117u}, + {7509404417300714438u, 10699103324764510360u, 2633990742582596358u, 9797893437624502545u, 2561343u}, + {14644127387924033604u, 11414927995604488525u, 12715024017386471299u, 12008809058899918257u, 2105093u}, + {12807375735140251150u, 8619610465225327579u, 735998261243407879u, 903523252286301752u, 453515u}, + {18303051236646639060u, 8432134948030302863u, 10836207617869394996u, 296596252193823383u, 3297248u}, + {4113665544148167463u, 3366623256965425550u, 15505893142797042807u, 8779792368889427179u, 1505619u}, + {2785032423923145885u, 13558086376041302744u, 5238091032221623892u, 171888965221162742u, 867098u}, + {15900731395416963441u, 15196236894572340250u, 152980882983212451u, 3907105213112822914u, 2764523u}, + {14381127037861631014u, 3186065628845598793u, 16139832666125577437u, 6247949539435791459u, 148739u}, + {15614789478590898497u, 1877494211976922244u, 7998576185858717719u, 13333398653531397184u, 2252366u}, + {5343246789156421897u, 16013101267114185080u, 8605786859181763379u, 15678046738726085653u, 77218u}, + {1879716585626383564u, 6909007293528171890u, 16284231186196467390u, 9873314819558057674u, 2384665u}, + {10415535560263758731u, 10626999815982018883u, 8530259883591083446u, 11717319548974173039u, 1436932u}, + {12045308377637612458u, 5553529963621538350u, 7320685413360619120u, 13573334407703095130u, 721161u}, + {15798489034376619045u, 3609467334906553623u, 12101826080884859920u, 16946837684889339821u, 3709082u}, + {123504490700092561u, 6128083057315790758u, 300983231174247670u, 10660886826924647048u, 1780971u}, + {11909391041463290558u, 11755759774420196852u, 14309991322705782621u, 5869518243972748216u, 1581657u}, + {10953188837177837616u, 6577412934339940745u, 4668057954461062309u, 4857035228302081184u, 1036088u}, + {6563662213995992645u, 7424441521527081126u, 3999242904227891929u, 13782112916275112586u, 1167321u}, + {16706205638375533451u, 10536047536099473734u, 14334103766559062850u, 8019926223730980519u, 1708950u}, + {7098015640819788342u, 881067309829594717u, 17803759193075350539u, 9471069390273251777u, 3689570u}, + {13889803811380044570u, 17751045247248447603u, 11604789474327577393u, 5832668086037340820u, 2506126u}, + {3377589759541194374u, 3776453786159945788u, 14582897114415554546u, 5666722205729516517u, 722962u}, + {430340923033179212u, 11847397219881676752u, 10789926909104413208u, 2030948933717721618u, 2598318u}, + {18357934364619330454u, 11960479716727691510u, 8365663122501930992u, 8694841793750414108u, 1206614u}, + {8760173831906517416u, 3694873700339442345u, 12248681091115985286u, 8813284580975804962u, 2859243u}, + {15482479979740334648u, 590142447823350530u, 8614475464358026221u, 11365785996633516052u, 2644447u}, + {13555661655882390715u, 5474091319180771864u, 5087471902675585902u, 1201702952998121975u, 2081157u}, + {2345240988466174110u, 12010344764466996533u, 5729958768920385173u, 7172092381512777766u, 3022740u}, + {850919474204475397u, 17175107987777625300u, 10413659382667752062u, 12089377922687422503u, 73851u}, + {3426194131678179575u, 13473575048399560820u, 14458847979757300579u, 12034980526919930758u, 2955114u}, + {10906826995749067964u, 2451415337524251263u, 15386336680578223108u, 2648585629067022350u, 2095514u}, + {10126966160429826689u, 3502097615201554783u, 7601404706456706827u, 471000977337028642u, 2432798u}, + {489262542025362756u, 5899751823161470454u, 1647851529522134431u, 9988825179794088595u, 299008u}, + {15434620207564833179u, 13329425408977163167u, 7446683530690442423u, 11462673186071358749u, 3715613u}, + {81950174044164881u, 15343878786291779169u, 5163969682184496014u, 7706645941570982570u, 402183u}, + {2239650207047814742u, 439725789833944267u, 3109388683358185668u, 4979392963195470254u, 914167u}, + {6862395604107413766u, 9701387755351854142u, 16004655740166580886u, 2322706418882717754u, 1352487u}, + {9009908055290147410u, 18385176636218895993u, 4043281823815836507u, 11914452000132835069u, 3690066u}, + {14406591783487127803u, 12190606600274044546u, 7863509888417716635u, 10300248068417316022u, 334741u}, + {7792728800986255287u, 1503429632021766884u, 8020782275864606131u, 11175101967737055757u, 3369508u}, + {3572247784350086468u, 17943942850649590707u, 10765163550575892898u, 18436842942577042571u, 593871u}, + {16940893322290964738u, 15409004559689926339u, 13001045846788386901u, 4190295458986461195u, 2768357u}, + {4489755768712439926u, 7076647207888763224u, 3126282385438661703u, 16984601776187022772u, 2063917u}, + {15970728674314022102u, 4126433483725869646u, 15304574464511479867u, 15674570471903342284u, 1865104u}, + {5636797538696323998u, 3398669360739686014u, 8495654417918446112u, 16247363770367208051u, 3410577u}, + {2234569481222672506u, 4365913409704158373u, 14555412329633563722u, 15555296775464550111u, 1078732u}, + {14938774956789040270u, 16361282291168530978u, 9193507197029966068u, 17890182430089545755u, 1574187u}, + {13327434995883888968u, 12607287427217996624u, 355689150745338864u, 13503808727695867080u, 844363u}, + {13991386403214799905u, 3876817036838251746u, 15255599167881927016u, 7869853511804263369u, 3586076u}, + {14943725133871293076u, 13111354952937349850u, 15221555661253573834u, 17143801221059646397u, 699838u}, + {10108824511093250358u, 3734460598739939016u, 4491498209544816721u, 17306732318725562606u, 2533957u}, + {13247233380868396703u, 17297501019626159586u, 180540465456694288u, 18421429753251140833u, 1204804u}, + {17518212946226701666u, 10892157494650174362u, 16164957408282690534u, 8236790449792196019u, 239409u}, + {14187195976310346279u, 9027407526191945718u, 15403602484249187276u, 10020421896060716283u, 3088886u}, + {2434889767219207269u, 10714396912853304672u, 2096584248203035631u, 17783148032865558554u, 11696u}, + {11425186627548034472u, 17294713022600283586u, 14411690179934616209u, 12322064351387511195u, 2272732u}, + {17089600927390629815u, 5972596811816056015u, 937945137385141928u, 9985872495108249576u, 1331100u}, + {13355810167150520518u, 4359672952544926177u, 4875606833454852569u, 6942083498663469135u, 363842u}, + {6846410810507429599u, 17576033426534700509u, 6318707266174322998u, 11175638783078180209u, 310129u}, + {1987879532174345384u, 8487873915581007712u, 11276470179747970356u, 7571768255450907532u, 3186633u}, + {245503439220254855u, 13315039109456848434u, 842213044208027374u, 9138039859758525481u, 737381u}, + {3258811585081391894u, 10337396860903302375u, 11781625111144951645u, 4048827553853820298u, 2460417u}, + {4793980712672573126u, 16424803199189231428u, 13137848064000355140u, 4152669546924324139u, 2419482u}, + {5864476798290729504u, 6006251696470264478u, 5299879653507065969u, 6890103003000770400u, 1982699u}, + {18131472363030248807u, 2907799252315316065u, 5169921097737960829u, 14736323531655601801u, 1649824u}, + {7074848210342186578u, 14521368968538142021u, 17356862200768959653u, 12856685634582159926u, 3397680u}, + {2156144091015294778u, 13512648625448104120u, 16912174319650239627u, 5394938105067714367u, 1421661u}, + {12481435239439737958u, 8268847399648892161u, 17112464214864198672u, 8673136306572864419u, 2748526u}, + {16862564877194831137u, 5070339082943130469u, 11765009370264761527u, 18209215061932912797u, 1453496u}, + {13674478224199139184u, 4457501772402957124u, 6798775043825325678u, 16023598163353377392u, 1456267u}, + {14231197396934000573u, 6810277854273117071u, 17645322775468821165u, 17392743563816219526u, 2848841u}, + {13855591195682039432u, 8216136965454028916u, 10173316323324896552u, 13959667507546526004u, 1097961u}, + {866329729693305900u, 16003661576448220666u, 10115843603123352473u, 2614327204894987416u, 1629621u}, + {16419394253867615257u, 17837169679356794056u, 2010786462426837738u, 4281459252376218062u, 96685u}, + {3437489826512749662u, 14977820771297347780u, 6902974954406081103u, 3172317665401055044u, 1714005u}, + {13313988673011931029u, 4756926233061887871u, 7722491893084785654u, 968366537241439373u, 1613412u}, + {12171585567092644307u, 17424984347566463455u, 6148542658875615832u, 16603008827941243692u, 3344432u}, + {5039255566765161021u, 10334513454447086073u, 1317942467676956836u, 12311484884226682531u, 2553188u}, + {9118606212344359780u, 2543781299462001851u, 16565809622253866931u, 12945407350708651770u, 1948154u}, + {1237471261296841307u, 1097202655507386732u, 9731923589280353081u, 15672435017429943020u, 2836794u}, + {10128151114259533836u, 10300393768431504909u, 3632203098729746861u, 7834549784676486919u, 2789210u}, + {11982608521432987753u, 7088119454280521287u, 2570558936945225681u, 411739821062020883u, 3678989u}, + {2127824101018773974u, 3687884021223368723u, 12031282055894797450u, 3886917852954913058u, 1204517u}, + {16105697355573646678u, 1780958065756161231u, 17317112148929367216u, 14433738228303937460u, 826585u}, + {4575976956482406826u, 16632697461387921142u, 487894630908722811u, 13562075495514357406u, 3365619u}, + {8396948277728158376u, 11251078209951011206u, 16872272224462407221u, 14257430751376493154u, 1929064u}, + {8397177611471454055u, 6644540635519488239u, 15773083666756436033u, 467930528394804809u, 3335209u}, + {264060261425150310u, 13814982119863148842u, 6095773689468025178u, 15121560901250201912u, 2924717u}, + {14884507972614354891u, 10309385775675222610u, 17042846948230125216u, 3008312876663633855u, 3632831u}, + {1647351851401769054u, 16041230217521986349u, 14210241806800914876u, 2228741727866189300u, 797338u}, + {15390443484846601011u, 10398942543663529883u, 6135156656399069894u, 591169044558408642u, 2885000u}, + {8613547393358696214u, 14187305395276921121u, 17903831351076984070u, 10933915556970939436u, 1874521u}, + {9543974114732897848u, 8035866996474213181u, 6930725329746410956u, 4574207244471169627u, 453019u}, + {12588021511762897677u, 7009095943140720157u, 15397466497640229042u, 15716912230396025119u, 3301456u}, + {10866826955934255037u, 2286497583671297361u, 15421072509350191144u, 16994435728532590031u, 2191760u}, + {17633577682244909985u, 12037124010331671395u, 7055403531597177632u, 5012404841402456959u, 214592u}, + {14728349826592751085u, 4774742851864086817u, 9275717096742803848u, 14703707712453969265u, 3544346u}, + {5041329905693013920u, 9944895480571400037u, 16342568277129741136u, 14404842871822043130u, 2261378u}, + {14346102618304590894u, 17134914651751131379u, 4359518637453976988u, 8544511172100256478u, 316322u}, + {6261645224331850080u, 11391422828700185815u, 16353644232310976029u, 10165955878871234100u, 3238031u}, + {16959863735224836196u, 7182512182666485071u, 18445677794468759141u, 11949234155583803131u, 1396248u}, + {9641926297217123761u, 3775788881148019936u, 11225579793939736890u, 10113819406778574009u, 1936853u}, + {9705525074101882523u, 15946719608998823726u, 17610709180188508796u, 11925231657971325412u, 16135u}, + {12889383774694096810u, 494689081889511563u, 10821774533245954088u, 2882601411657978401u, 998712u}, + {7081143894385014322u, 17860963584072921375u, 6852909964845443313u, 17168130368576792793u, 834122u}, + {6182225269214728906u, 5383653369725132720u, 3501818206770564932u, 9743162047348652487u, 1230742u}, + {11171398687512515398u, 8257025998494444950u, 5969948546550451309u, 5931425903548018240u, 1695139u}, + {10066024445508079305u, 9947213667934682189u, 3040260728233046852u, 11128139283074691983u, 3576930u}, + {11068812898061273974u, 1406591177813914594u, 9896878585566307877u, 15414250253486363557u, 2130221u}, + {8428923058741623211u, 10610157029249846335u, 4415240987532902845u, 14666987246721062896u, 3431787u}, + {3729112311101472439u, 13194857411794037175u, 13515573143700677977u, 9574907724177958279u, 3881398u}, + {10576456195208761573u, 10230607238941122407u, 7400786641350225071u, 7349416162959837366u, 1439926u}, + {9356884692649562205u, 2613918089275860417u, 14389526274660303987u, 2260347368932262478u, 2572767u}, + {9987152271906671665u, 10042171118209581548u, 16873309683250744290u, 16332475429242346406u, 2060981u}, + {3954839899461112575u, 8755465255272451658u, 11832510931871977925u, 1911515850366379750u, 2983423u}, + {15433790624055927671u, 5180727738827503623u, 18026920503233122302u, 14106265279852082141u, 236548u}, + {1161664520415068906u, 4204124508593804200u, 16007046139521416211u, 8218929274847197830u, 2340302u}, + {15150795099037765991u, 12479392135454346525u, 16846043773813842951u, 11716501194412445517u, 948208u}, + {847415048357882462u, 2977659993181158223u, 17176679212486546594u, 5061522944676100700u, 3874849u}, + {11498335769185561304u, 2625855984683934676u, 844984193789965351u, 864111887305999623u, 3232263u}, + {13780393501901302660u, 4619268499864509978u, 13668790744942240518u, 203739917279888415u, 2267323u}, + {14013377468254302369u, 11219705359122822567u, 18050736450706925937u, 6599065784768617454u, 284045u}, + {14266418632729804928u, 16628838135265287291u, 6592574411822819670u, 5553674452939933686u, 3819394u}, + {11137883082990346983u, 16283566539583798837u, 2301681245875798751u, 16067241265608338064u, 1711009u}, + {7525601994848248560u, 18011941032073306879u, 14928555368405596573u, 13866620616480218683u, 3087001u}, + {16598678996282753971u, 9122316308272126004u, 523192085923583710u, 4020112803354942556u, 2982138u}, + {3203729955671864057u, 12830211046341005492u, 3541360991525388248u, 3513775254319137786u, 3837731u}, + {3603933973417427404u, 4198419196555706175u, 10181884821843172855u, 11167663126935418829u, 3597528u}, + {1732443811287885791u, 15123217939107343762u, 13676860208687209094u, 12892614428232839910u, 1424096u}, + {4391997141051646278u, 17683923813252610162u, 15697792687328368123u, 12204003339750829089u, 2470355u}, + {6330712166926210525u, 14379473639526752770u, 2456604003028033777u, 16186471083156069763u, 2034680u}, + {16062034045681272752u, 1083098102356880011u, 11771100618075992799u, 8684444521969718753u, 1081090u}, + {7213861285192233102u, 1025909898911559744u, 2329089478739274831u, 7946277943407164141u, 3623300u}, + {1483353168472632000u, 9806316580918345144u, 14340811351522247618u, 16640084724471975041u, 105555u}, + {12422089259176724204u, 2503259225546622763u, 3556567707947378499u, 74004756748713072u, 2246630u}, + {6467805886601662080u, 160415305491711142u, 12834638591394340511u, 9985390985946378014u, 1594363u}, + {8702446136390264498u, 9159429405502960967u, 14564047974296470211u, 1974965855231037039u, 323073u}, + {2192213564732539202u, 1005338762079676809u, 3694384919565289521u, 4329415289198767581u, 24467u}, + {8222213982416631208u, 12948588129929879460u, 14723384133616356447u, 9295880971709370484u, 2425663u}, + {17389055074197064901u, 18193173648434658278u, 14958315217893509901u, 10565154323403426159u, 2409177u}, + {4986752430553294329u, 5894925616200541857u, 15440039008445770256u, 9195755924929269551u, 457116u}, + {16550783018880697536u, 14855819122246441233u, 6009377514715534444u, 6205385398321556236u, 1406134u}, + {5354101389260964275u, 15710776945832441569u, 17959174128823015755u, 6078776499422673528u, 1999487u}, + {4253316865463652808u, 8768845662095154930u, 12076982274859293643u, 17402764194187118365u, 1935042u}, + {11596049264307802965u, 10340555473898106140u, 6737603869901446633u, 17257460217013419976u, 1672528u}, + {3106085136181080902u, 13447835395668501757u, 17683514176468095298u, 17108502500218494337u, 1698565u}, + {17674235700375173619u, 8578741908677116278u, 14003391567060793335u, 16964867609869127924u, 1581584u}, + {13997393958704085600u, 18320288386589313501u, 6496346856634504468u, 5289379457012680785u, 1544182u}, + {13259110523843008857u, 7857427918939900790u, 15609245560029181941u, 5648977470404987427u, 707763u}, + {4475969756867866957u, 17735564931065591894u, 14487748794041072690u, 3904166006622926907u, 3600357u}, + {10760159185171555937u, 846598468922741392u, 13843429552718699301u, 10730938785670489234u, 1703110u}, + {5665605186516368209u, 15252314116847957916u, 2272915474205087512u, 12065035049364279572u, 21201u}, + {9482774511116486105u, 821885843019287808u, 10479418000443275251u, 9800223890644341061u, 1599672u}, + {11878012585750858419u, 16366361949093336737u, 9168234969105548916u, 12279299736233852116u, 2481451u}, + {10874687408021958930u, 75097227999267597u, 14774494145513608004u, 7683879671828111592u, 1267172u}, + {15204731119472794542u, 16466727897393246662u, 14175613447430185987u, 14579009200926693423u, 865878u}, + {6557231480349254967u, 12091950016848487563u, 1122526283616631057u, 10248150997829831592u, 2854798u}, + {12732286521307377584u, 4726971115877042387u, 6716185768678120177u, 7042248360015298670u, 3071568u}, + {10553435184116780327u, 7835326584570711000u, 984180989819930896u, 1786042692753514724u, 2459168u}, + {1600210934335914474u, 17409179069642045021u, 7045368875765813664u, 16618610273239724143u, 413081u}, + {776623219454220163u, 7049140808632027579u, 9791772288466375972u, 1016426332638313392u, 1923888u}, + {7881864506184863478u, 1403398264877611496u, 8812312180405633932u, 14086720307974854774u, 2192466u}, + {9348405699381722142u, 2965115107777141508u, 14170416735408023010u, 9479988692247589609u, 2558789u}, + {2339587942644041714u, 11106193170237144860u, 2168278882871383509u, 263374117415395690u, 3754377u}, + {8445211561922971937u, 7597502975997300788u, 12595785904988523458u, 7275015435731389162u, 195300u}, + {8971345027706409108u, 9368475055673281802u, 2988261171096016208u, 15640100562622973023u, 2671295u}, + {7303909704933399840u, 13123509887034056567u, 5663809775590520117u, 10929973410577598855u, 1942413u}, + {244540506048893315u, 8751193047766551516u, 15876896120470427722u, 6953360234067501657u, 3694137u}, + {12826456719215860175u, 11822313637412890944u, 17442817840753412420u, 7273904210558375015u, 3096725u}, + {13897760469676542863u, 11100665095723822258u, 14507121197565973268u, 16558313535501059765u, 176587u}, + {14544467051673254581u, 12740874315320606311u, 1702161462652230677u, 7713420033812346836u, 107921u}, + {9546794664726175844u, 683647951114572661u, 6129800890003605014u, 794624333197806138u, 1083469u}, + {10249166652079571431u, 3214250818878344369u, 6966266106376874477u, 13855044531431586059u, 2905165u}, + {9113594458550372865u, 331415332493905119u, 17562825892425910951u, 18284162140697710748u, 3512602u}, + {12977218333390759772u, 4918791675295800878u, 2272188417953562664u, 4388251730686638619u, 2959059u}, + {8072480240475577428u, 12835260616966729964u, 14424025019810219966u, 18285156300056026450u, 957544u}, + {9278595029643052206u, 4000863237501041091u, 17498905256890375580u, 4341119229668148598u, 1493917u}, + {15365597167056595173u, 8912048185798050313u, 16411486594037649267u, 12061176113241448493u, 184540u}, + {7479775343069456363u, 3111120781034553277u, 16540552244681223497u, 10091467339522449513u, 1927991u}, + {14926501974267125693u, 12581627642473167727u, 12029729997711916983u, 10267743520030649603u, 2257864u}, + {14582674483983041446u, 760290224978357401u, 1486029629832899305u, 16759012066428266815u, 1001712u}, + {5461986358351206809u, 2385809959128164336u, 14695292580982328862u, 13853536396940739520u, 2406663u}, + {16407871499777629214u, 13295020586005530429u, 10358896948329833950u, 3791390000258455119u, 550058u}, + {11287283449852214245u, 9902594116558121828u, 14780432430322758193u, 4693890395408402368u, 1588585u}, + {7425398967594609389u, 13119594473904810407u, 8528035463006412350u, 8748273104217504539u, 2712304u}, + {4931537349527049687u, 2696028516086904714u, 16671942307409261178u, 16983567785399436775u, 217255u}, + {16690304912286752428u, 7013689287755699797u, 659855824154715990u, 15568447976559735730u, 1091187u}, + {11496196663692175661u, 4855071296838444740u, 1087323444494553885u, 13278726165872747105u, 2940502u}, + {11636604106355339886u, 9766010264479010434u, 15102318697297938773u, 6251195788382759745u, 3296597u}, + {8195357764545733561u, 8921803290997976794u, 2055160940386104476u, 10220932246772193451u, 1146684u}, + {10710576775791030400u, 3559911636060332137u, 4748833781088044250u, 17531147947718838258u, 3310257u}, + {5342141252433127707u, 816699529230561887u, 17018294072266660863u, 10293241834614120418u, 1424062u}, + {8688022718307086734u, 361752144423701757u, 1983110044432250672u, 9249641354407112614u, 3558614u}, + {5352873197177776392u, 11662342984800894893u, 13309931605346444009u, 14260990876436564588u, 763576u}, + {4518708180202523974u, 1493169367972265279u, 392978454796771962u, 18316714390947513465u, 1369146u}, + {16853272395691949186u, 13123345371095101537u, 12993026926086895821u, 8672167588729609848u, 3147972u}, + {10764853432747015814u, 17310008142857948319u, 6444049081796576236u, 5894734959579534009u, 3128536u}, + {1327299601671400855u, 11163844019072351261u, 6531036264900422048u, 11298695978728879961u, 103655u}, + {15422380553902290993u, 1041516168073313194u, 5564210236962627082u, 8072362640803585174u, 39373u}, + {2335085873252875163u, 10286372195291206981u, 18066039105169387851u, 10377019853188399590u, 3124676u}, + {12184977117548003546u, 11199268235477407524u, 1728017326595319504u, 8632493799375706704u, 3516611u}, + {2129537674618381672u, 7693192195899043106u, 7260639944879622739u, 6477995901131871923u, 3462113u}, + {6384389828735004419u, 15086980199313029885u, 106927131132963645u, 3306456450650015818u, 1134976u}, + {14194616629148774672u, 14497491515188313324u, 13003793054384815824u, 17963277530552315086u, 1267812u}, + {4065914685712153858u, 16597440876239160179u, 11173179579900447249u, 1248366120105630296u, 3463057u}, + {9293812980754742599u, 3430846803661716073u, 14688780908458203414u, 2585897918767512258u, 2492956u}, + {16036147935599921762u, 14396139354653812728u, 13391029334171269354u, 10926683623632034923u, 3326615u}, + {2102812994886253924u, 16732236584640185088u, 12563980796395890922u, 1214286731070293899u, 801405u}, + {7584210298554637732u, 9743153081795138880u, 5222538505564190728u, 1167704818755524910u, 3223547u}, + {12497418241803029069u, 2163797924500942847u, 13625260694503721315u, 3590286055544747886u, 3865385u}, + {15870192580507650138u, 6759913610525423646u, 13244025237335997763u, 5835911294465876730u, 1167352u}, + {45174727047645818u, 2654079820493613161u, 17781140587612084527u, 18035932358905828286u, 3121401u}, + {15074504105245640436u, 14183047749872637717u, 545328237004852612u, 3660459405330750227u, 2988584u}, + {12983528417096963245u, 9796839782221799523u, 17293858928180602158u, 7188831457606108255u, 248480u}, + {2127909621125219587u, 3124493250973490623u, 18292749472437718416u, 2310426663369960758u, 3203817u}, + {17860479967416761472u, 1024364229820274695u, 16596148833186007372u, 7985435338740499537u, 1066835u}, + {4838357395409577923u, 3325411599983509207u, 4404250497900033237u, 7009266261878321060u, 3109988u}, + {14407622989202785655u, 14747963903216767041u, 16407671757375063225u, 3155845703348475330u, 874833u}, + {5117412542073610295u, 11905221556971513473u, 9543523745270462592u, 4843996624155252963u, 2051570u}, + {10500864280181587413u, 11671010014579956001u, 17784323034645923480u, 3064263741176270240u, 844782u}, + {4048650687834465992u, 9239123944651255293u, 11243990621541380169u, 4555211904805800211u, 3316872u}, + {11646479618687886540u, 9187525908734753656u, 12792178086487083589u, 17571180844680953500u, 741098u}, + {10667370040509458646u, 14878374125538662858u, 17791291941104464184u, 15145765610675585405u, 1686846u}, + {12505968273870865041u, 7193057728571774276u, 18093093093808227910u, 17613169776853942656u, 3891533u}, + {7167547723819835487u, 10632003311128622297u, 7061597821801941368u, 16284744789452350529u, 1751031u}, + {7130201270533265895u, 13398928484181271219u, 6051761077562241650u, 5652793171965255507u, 2866339u}, + {11539795275495867513u, 15930064865054550218u, 8018971781462254948u, 3799869517586538406u, 1808532u}, + {17744919149540528849u, 5286129176565578564u, 7189177965605301192u, 8752330409342263856u, 2419593u}, + {15336816731439814314u, 14572003567851605809u, 8586519307974351827u, 16689937844347222740u, 354484u}, + {3193930988617815057u, 17027606016944983305u, 779723294015835794u, 78596686354090637u, 0u}, + {17968307127445206903u, 13090827613750355578u, 6531819360415513378u, 78596686u, 0u}, + {3112136228011837709u, 18060431523858526409u, 1449852958215529843u, 0u, 0u}, + {4711348190406322506u, 3975823872128231611u, 1449852958u, 0u, 0u}, + {8107560571435377403u, 8298322391003035699u, 1u, 0u, 0u}, + {13144915838084412048u, 26745066464u, 0u, 0u, 0u}, + {13744050392456646824u, 26u, 0u, 0u, 0u}, + {493359396309u, 0u, 0u, 0u, 0u}, + {494u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3244596u}, + {7458203391589413994u, 15076372225419554348u, 6180897705302832355u, 17209559613061430484u, 965515u}, + {10368844237154028195u, 3332115437533064359u, 14572055736138614789u, 5350072584120554554u, 1123694u}, + {8475205883582359594u, 6443678606174432439u, 260911832661759909u, 11982289111281272941u, 3778044u}, + {14537194694100801109u, 3088992691564660225u, 9348663152967806232u, 5978415333859593792u, 2639611u}, + {10993074186927631250u, 10967654100977255642u, 2033848876248514149u, 7975027578721636837u, 3026176u}, + {6486627743787095443u, 3284719439112513188u, 14623421225820388344u, 9927713485365156886u, 656711u}, + {7493218048446065375u, 5325525875238454628u, 13216204154070094728u, 9451659008643662974u, 795120u}, + {1616538734751148021u, 13356465254608735113u, 5987386909073757475u, 18245238676195314755u, 1063051u}, + {8716154626483189788u, 1275847134035882751u, 13839765135401583161u, 16664914070740892904u, 3229981u}, + {7416774060704609149u, 2298065143765046264u, 18061063251805012188u, 10579991379072337177u, 1044577u}, + {1911207688590927065u, 12180649492904546481u, 6838643555366030244u, 8161777181450131449u, 1707026u}, + {5130183874582210771u, 6369507337708840697u, 9352231128784274856u, 8894573146576081430u, 2227429u}, + {5757126580232534362u, 15930467255300352972u, 7794795200203031575u, 16109932292057861667u, 1238738u}, + {6069911694748864702u, 4610172940175209133u, 11207545803560538069u, 17028442891921304010u, 3530432u}, + {4369448343495501595u, 18268681734506646544u, 12028792030782994632u, 16206026057097935115u, 255579u}, + {381775295458467121u, 11254423067456160864u, 10890972083160544724u, 8075165148857569502u, 3256712u}, + {2320742666144733337u, 11146493595836845340u, 2213906181635240558u, 1285054839505718842u, 1428279u}, + {5506851244200010277u, 9373776727256032842u, 3288458751403202858u, 4998321087080936228u, 579995u}, + {10844745993282669625u, 10643218417197322639u, 8678421056835829894u, 12692835575002668994u, 2471806u}, + {2514969754678621137u, 9736813815211702278u, 17421243278002833687u, 12151272583746588534u, 717357u}, + {3806888629695969990u, 12083473731216703942u, 10425868187456780501u, 4408746149453360742u, 1599540u}, + {5926417754169685270u, 9706119891806086721u, 11902159928088760109u, 13648391582592787429u, 3773640u}, + {13997775480963944188u, 14001359391969262911u, 17579556540834337124u, 1654878453789119486u, 692396u}, + {8880737190466337955u, 16270306390126839162u, 9035794898474779023u, 2246557868640304668u, 2207340u}, + {2271229141686152919u, 4829533799620115003u, 5614563708022836246u, 12434624412833824902u, 908328u}, + {16916840094883402147u, 12421732096664149669u, 8007417091025423316u, 5132844883278492318u, 2673467u}, + {14760231739486975337u, 5212075087908220275u, 2004515268309624780u, 9705034367753696361u, 1279210u}, + {336994930719860969u, 131413060466679742u, 5098674917336238770u, 10544005998729043019u, 3360069u}, + {16723957450479830933u, 1843898500553139850u, 2174216696249528059u, 11014736637222057450u, 2268071u}, + {13514527631448784731u, 15994962140911052997u, 12272806732948316191u, 5229985307023550525u, 2161284u}, + {18147916370196670620u, 2733514092254225339u, 10669328734868276314u, 10344104605472283429u, 2352338u}, + {11454731446631604283u, 2310117233229550989u, 12941527980341050429u, 5087424570059921904u, 1291179u}, + {13072670016817126855u, 12130466693637318000u, 3798501311420582103u, 7157519863408638459u, 2983147u}, + {1656452403204743115u, 1182692329616247967u, 3380439845196256294u, 6612270413852216467u, 3433823u}, + {5376237725509502153u, 12993762084968179243u, 9424892296830090858u, 16276301519221473567u, 2125534u}, + {7256502472959318602u, 14114390362275778559u, 5645377205052890300u, 15891879886338415597u, 1454964u}, + {11754234617195346037u, 14696754110696905528u, 7301911605629600019u, 6944368392077422486u, 1520193u}, + {10553285930532428039u, 6706653298125050077u, 8802866965334688042u, 2622116003523418832u, 1494622u}, + {17417612278114461795u, 3097396235217621819u, 18056189321835934775u, 9323000543035755664u, 516960u}, + {3281143839371687949u, 11115667805507308761u, 15479825557904375553u, 16006322114559347224u, 467155u}, + {15493077850092579677u, 7773775561369589913u, 2665918008776084139u, 14492193906357591036u, 552925u}, + {14944403809534200371u, 10262054984562483568u, 3410209660818427308u, 14493776082082664896u, 1720755u}, + {16362600542972016811u, 1211370466188308443u, 10582066532292204724u, 4931658736171431809u, 3765781u}, + {16785764333988812600u, 9351488438793850146u, 3052639254435130969u, 7707571371296657981u, 1874553u}, + {14576836220470183249u, 6317224632042024272u, 7509404417300714437u, 10699103324764510360u, 1616986u}, + {7788954707999483192u, 15806052322845964731u, 14644127387924033603u, 11414927995604488525u, 2426269u}, + {10848984042781987490u, 6131285774771709124u, 12807375735140251149u, 8619610465225327579u, 75701u}, + {7227453302181294140u, 5985958662828932134u, 18303051236646639059u, 8432134948030302863u, 2817512u}, + {2138618817300904332u, 987512120581278335u, 4113665544148167462u, 3366623256965425550u, 610335u}, + {9877823540758381769u, 11388171647696768270u, 2785032423923145884u, 13558086376041302744u, 3477152u}, + {3377677617371237182u, 12437412831809620617u, 15900731395416963440u, 15196236894572340250u, 841963u}, + {15419605796709101618u, 6058566880036843283u, 14381127037861631013u, 3186065628845598793u, 216665u}, + {7483747037802999102u, 8440210745557288583u, 15614789478590898496u, 1877494211976922244u, 884459u}, + {18254319582059776302u, 1173343977198037860u, 5343246789156421896u, 16013101267114185080u, 3444285u}, + {1713658934598946678u, 7161766429107534321u, 1879716585626383563u, 6909007293528171890u, 1872064u}, + {8399380201370797853u, 13149263218207957182u, 10415535560263758730u, 10626999815982018883u, 276212u}, + {2186279744923050894u, 15893868368435546891u, 12045308377637612457u, 5553529963621538350u, 357116u}, + {11111081575084586603u, 16388215711188978526u, 15798489034376619044u, 3609467334906553623u, 172798u}, + {16636412460507049019u, 17895144014782482201u, 123504490700092560u, 6128083057315790758u, 562264u}, + {7997389507309035779u, 54489338705640595u, 11909391041463290557u, 11755759774420196852u, 1093519u}, + {1689504886779109833u, 12196194949273511263u, 10953188837177837615u, 6577412934339940745u, 136031u}, + {16164468607967189801u, 13086169529339171743u, 6563662213995992644u, 7424441521527081126u, 847781u}, + {471271512354752572u, 14550264087760779456u, 16706205638375533450u, 10536047536099473734u, 887754u}, + {1138292204009998687u, 16190659658551939223u, 7098015640819788341u, 881067309829594717u, 1348591u}, + {16673196014533743516u, 17484921796545655061u, 13889803811380044569u, 17751045247248447603u, 1596969u}, + {9167676850610632775u, 8498375923592220035u, 3377589759541194373u, 3776453786159945788u, 1623690u}, + {8284993018734899115u, 2729756962605170403u, 430340923033179211u, 11847397219881676752u, 3847654u}, + {8216959654820943380u, 1585214811938210735u, 18357934364619330453u, 11960479716727691510u, 1080754u}, + {1267566680629594114u, 1719761119316169101u, 8760173831906517415u, 3694873700339442345u, 741686u}, + {16119663642906011791u, 406783008793929797u, 15482479979740334647u, 590142447823350530u, 3782335u}, + {13608775348284262217u, 16855175357698667891u, 13555661655882390714u, 5474091319180771864u, 2644594u}, + {3794862784053010632u, 9558951569443548734u, 2345240988466174109u, 12010344764466996533u, 1376969u}, + {10563217169966995512u, 8911221795668380531u, 850919474204475396u, 17175107987777625300u, 3841466u}, + {7090980138720807420u, 12008732485578596647u, 3426194131678179574u, 13473575048399560820u, 78991u}, + {13824176088236389628u, 18273078873843312161u, 10906826995749067963u, 2451415337524251263u, 2349092u}, + {9421669550403685601u, 18195073742185717401u, 10126966160429826688u, 3502097615201554783u, 3419937u}, + {9191031380587114436u, 3730010769537733145u, 489262542025362755u, 5899751823161470454u, 3839599u}, + {10763397608042477641u, 9879385538850959150u, 15434620207564833178u, 13329425408977163167u, 3668335u}, + {3804901259524872671u, 14329556428664107196u, 81950174044164880u, 15343878786291779169u, 400082u}, + {16140362644734735490u, 9204766222389731013u, 2239650207047814741u, 439725789833944267u, 2475784u}, + {3422529313875754795u, 18132812171839355829u, 6862395604107413765u, 9701387755351854142u, 568672u}, + {11414751766581778368u, 9314013249493508318u, 9009908055290147409u, 18385176636218895993u, 697857u}, + {18240711330653885126u, 11091508664412910586u, 14406591783487127802u, 12190606600274044546u, 3376083u}, + {11317519528343015476u, 10965131811875597013u, 7792728800986255286u, 1503429632021766884u, 86841u}, + {11622626214982017854u, 17612772798740842628u, 3572247784350086467u, 17943942850649590707u, 3292560u}, + {13831672203923548687u, 10184195419737025299u, 16940893322290964737u, 15409004559689926339u, 813313u}, + {5115546358186698609u, 7623897093004800728u, 4489755768712439925u, 7076647207888763224u, 1038157u}, + {4507210010789404718u, 11871153143661428030u, 15970728674314022101u, 4126433483725869646u, 648485u}, + {11085024499936989925u, 4514180175133494878u, 5636797538696323997u, 3398669360739686014u, 2301640u}, + {9668858224095251218u, 8821425991951842833u, 2234569481222672505u, 4365913409704158373u, 228140u}, + {8529321435764448659u, 8602180023476112978u, 14938774956789040269u, 16361282291168530978u, 3754920u}, + {10847976242553375244u, 2497029445274145237u, 13327434995883888967u, 12607287427217996624u, 3131422u}, + {9989069923124689765u, 18070500281135737051u, 13991386403214799904u, 3876817036838251746u, 3736726u}, + {12185966866808518408u, 17064243560016876401u, 14943725133871293075u, 13111354952937349850u, 3226764u}, + {7617873421409766764u, 14144208144635605996u, 10108824511093250357u, 3734460598739939016u, 199409u}, + {2807200949691886806u, 16892231744333682986u, 13247233380868396702u, 17297501019626159586u, 621290u}, + {6150632836084572846u, 1551111426441159057u, 17518212946226701665u, 10892157494650174362u, 1095492u}, + {1460163119798300694u, 17891995306752692360u, 14187195976310346278u, 9027407526191945718u, 2703620u}, + {1490617490535160657u, 10296922495373250971u, 2434889767219207268u, 10714396912853304672u, 48271u}, + {1518560083532892118u, 9451185573326220229u, 11425186627548034471u, 17294713022600283586u, 3462621u}, + {9968565103378748428u, 3183827295174643555u, 17089600927390629814u, 5972596811816056015u, 1963344u}, + {1920583562412830240u, 17215772885477652778u, 13355810167150520517u, 4359672952544926177u, 3579931u}, + {3470425403646391099u, 11943567396641152859u, 6846410810507429598u, 17576033426534700509u, 3097316u}, + {14685480021924155578u, 6981248483940331586u, 1987879532174345383u, 8487873915581007712u, 3059716u}, + {4297477513110520642u, 289880831771979095u, 245503439220254854u, 13315039109456848434u, 1797656u}, + {6060767033509323378u, 14114919771126812770u, 3258811585081391893u, 10337396860903302375u, 3671615u}, + {1990715404695385197u, 12992066454738407229u, 4793980712672573125u, 16424803199189231428u, 1380806u}, + {16584371364002904926u, 3609553912915028033u, 5864476798290729503u, 6006251696470264478u, 1382113u}, + {12160907156047126160u, 11863331314331462378u, 18131472363030248806u, 2907799252315316065u, 2048739u}, + {15139457925596747474u, 5015924843975497801u, 7074848210342186577u, 14521368968538142021u, 2053399u}, + {16467082182177542953u, 11359162947630907932u, 2156144091015294777u, 13512648625448104120u, 2942615u}, + {18407624522741375722u, 943553497933344610u, 12481435239439737957u, 8268847399648892161u, 1426132u}, + {12422550481596326444u, 15258931332979034035u, 16862564877194831136u, 5070339082943130469u, 3360405u}, + {8701062728773201245u, 3512605409942289803u, 13674478224199139183u, 4457501772402957124u, 1998402u}, + {11489817734708756567u, 408500918968870511u, 14231197396934000572u, 6810277854273117071u, 85177u}, + {12040242091132514747u, 17827395010778135813u, 13855591195682039431u, 8216136965454028916u, 372732u}, + {16733408227234129487u, 13521195558685802008u, 866329729693305899u, 16003661576448220666u, 2111155u}, + {3941873099502147728u, 638143634294331625u, 16419394253867615256u, 17837169679356794056u, 3355540u}, + {16792711180918803436u, 2779481463114451443u, 3437489826512749661u, 14977820771297347780u, 60987u}, + {9788020451830054640u, 4387174628242238114u, 13313988673011931028u, 4756926233061887871u, 3204044u}, + {14151990874024313170u, 3636012419823195217u, 12171585567092644306u, 17424984347566463455u, 1641346u}, + {18425202146152961140u, 14633753414798933270u, 5039255566765161020u, 10334513454447086073u, 1179910u}, + {4573192072295847759u, 13511390539167917501u, 9118606212344359779u, 2543781299462001851u, 885725u}, + {7544442016940918588u, 7531189405321218196u, 1237471261296841306u, 1097202655507386732u, 3697965u}, + {5816758763471318940u, 23745726414024615u, 10128151114259533835u, 10300393768431504909u, 1435225u}, + {11624235687901688247u, 725960157616515356u, 11982608521432987752u, 7088119454280521287u, 701843u}, + {13208860981870511335u, 14372798207057115470u, 2127824101018773973u, 3687884021223368723u, 2795930u}, + {9223552938836023586u, 15558987856398669387u, 16105697355573646677u, 1780958065756161231u, 3222836u}, + {13244851001432749616u, 9633907828208799666u, 4575976956482406825u, 16632697461387921142u, 547171u}, + {4091466339890039605u, 12906509344438885963u, 8396948277728158375u, 11251078209951011206u, 826269u}, + {5418010232325478779u, 1680589432703453253u, 8397177611471454054u, 6644540635519488239u, 2817931u}, + {101617160221740344u, 15187496114376444921u, 264060261425150309u, 13814982119863148842u, 279172u}, + {15901652862940262191u, 4489447079143713261u, 14884507972614354890u, 10309385775675222610u, 2409332u}, + {9549531388140649057u, 2643419205015276921u, 1647351851401769053u, 16041230217521986349u, 1227804u}, + {1464507257639581551u, 17767565599600891562u, 15390443484846601010u, 10398942543663529883u, 3470366u}, + {4674465934678415321u, 9430987097012426175u, 8613547393358696213u, 14187305395276921121u, 2031472u}, + {2620940537827651456u, 6119172049817855868u, 9543974114732897847u, 8035866996474213181u, 1057602u}, + {12135440507999479686u, 11293776582796996114u, 12588021511762897676u, 7009095943140720157u, 2857532u}, + {879758330469517260u, 7089230963838065471u, 10866826955934255036u, 2286497583671297361u, 190050u}, + {12297633780227549817u, 15413236268819211571u, 17633577682244909984u, 12037124010331671395u, 1026828u}, + {15041857401877841651u, 10718957913604846248u, 14728349826592751084u, 4774742851864086817u, 51364u}, + {12196317358407808390u, 6873687399589817226u, 5041329905693013919u, 9944895480571400037u, 3104334u}, + {12275855620830919569u, 4996743637796849589u, 14346102618304590893u, 17134914651751131379u, 342768u}, + {6808631065907778648u, 7502282795440746216u, 6261645224331850079u, 11391422828700185815u, 2646015u}, + {5850015217034378222u, 16622821504607295473u, 16959863735224836195u, 7182512182666485071u, 1560925u}, + {17380499564157200014u, 15858992976010093972u, 9641926297217123760u, 3775788881148019936u, 1192152u}, + {17702771038397441574u, 15307728944267771085u, 9705525074101882522u, 15946719608998823726u, 3379648u}, + {12410458474130459685u, 5444948079252811662u, 12889383774694096809u, 494689081889511563u, 3401026u}, + {17282791981959407014u, 14882583595006729253u, 7081143894385014321u, 17860963584072921375u, 2785933u}, + {17221621236871002268u, 9287101291314144876u, 6182225269214728905u, 5383653369725132720u, 2301776u}, + {8097179365123521146u, 3644159484583507925u, 11171398687512515397u, 8257025998494444950u, 177033u}, + {11485021174817339099u, 10823528306578724180u, 10066024445508079304u, 9947213667934682189u, 2032710u}, + {14865581513735225362u, 4946909264569474152u, 11068812898061273973u, 1406591177813914594u, 959015u}, + {15342356728527669425u, 15300351508551544639u, 8428923058741623210u, 10610157029249846335u, 450903u}, + {7841911012909254648u, 6321613210639743213u, 3729112311101472438u, 13194857411794037175u, 3821079u}, + {15294464934051696786u, 8280342425687156632u, 10576456195208761572u, 10230607238941122407u, 1075783u}, + {7396206261235382560u, 14281309373768646372u, 9356884692649562204u, 2613918089275860417u, 1418437u}, + {5061209936002363065u, 16147548326110640127u, 9987152271906671664u, 10042171118209581548u, 1978472u}, + {7774158030106756339u, 15303943967820306415u, 3954839899461112574u, 8755465255272451658u, 3504063u}, + {1911386972853963417u, 295842071462790484u, 15433790624055927670u, 5180727738827503623u, 1343546u}, + {15197894433561128094u, 7937549378444740099u, 1161664520415068905u, 4204124508593804200u, 727953u}, + {10439707320019154111u, 17463268336016037856u, 15150795099037765990u, 12479392135454346525u, 1263021u}, + {4825426829135689313u, 5107330975217859676u, 847415048357882461u, 2977659993181158223u, 1722938u}, + {10988315710454841491u, 17502244163591255185u, 11498335769185561303u, 2625855984683934676u, 411047u}, + {12602468781804839709u, 14649521502585187128u, 13780393501901302659u, 4619268499864509978u, 2752696u}, + {4065840528208829698u, 8142623119491189702u, 14013377468254302368u, 11219705359122822567u, 3013621u}, + {8690267741124788683u, 6025865373291896816u, 14266418632729804927u, 16628838135265287291u, 3827660u}, + {5873773592265284672u, 457297429497527698u, 11137883082990346982u, 16283566539583798837u, 3773029u}, + {13220952411031996229u, 5612196797712241104u, 7525601994848248559u, 18011941032073306879u, 2334257u}, + {13666206608281154986u, 5077710085623684951u, 16598678996282753970u, 9122316308272126004u, 214634u}, + {6582210749916518697u, 8747880244292786437u, 3203729955671864056u, 12830211046341005492u, 1034260u}, + {14407538836900174746u, 17816265508122035807u, 3603933973417427403u, 4198419196555706175u, 3425037u}, + {4318143123517195163u, 10523499960491896042u, 1732443811287885790u, 15123217939107343762u, 1616180u}, + {14031099614758546231u, 1355158003457372062u, 4391997141051646277u, 17683923813252610162u, 2169077u}, + {4472202047056289020u, 9539072955148076419u, 6330712166926210524u, 14379473639526752770u, 121115u}, + {11651246958756359248u, 787312285480313551u, 16062034045681272751u, 1083098102356880011u, 927187u}, + {12271488704114535834u, 16227135886032203287u, 7213861285192233101u, 1025909898911559744u, 351487u}, + {9203968269523266836u, 17856715333091936943u, 1483353168472631999u, 9806316580918345144u, 2889454u}, + {6712138837810951394u, 1991689939534003498u, 12422089259176724203u, 2503259225546622763u, 883631u}, + {12373040146676767271u, 8537816264413688064u, 6467805886601662079u, 160415305491711142u, 439913u}, + {15733569814114114411u, 4043726991623727864u, 8702446136390264497u, 9159429405502960967u, 3718273u}, + {5111437403186409638u, 4153702380119910575u, 2192213564732539201u, 1005338762079676809u, 2725619u}, + {7917636215266486340u, 1046000656781210716u, 8222213982416631207u, 12948588129929879460u, 1878919u}, + {14595514240952960852u, 839965685593801890u, 17389055074197064900u, 18193173648434658278u, 3158307u}, + {14232403335302111278u, 6985913691306459168u, 4986752430553294328u, 5894925616200541857u, 648068u}, + {9608760247683498379u, 9687349125575162421u, 16550783018880697535u, 14855819122246441233u, 120424u}, + {6345350382988481036u, 1867869482183795193u, 5354101389260964274u, 15710776945832441569u, 2703825u}, + {1959111391568477142u, 2038530836881068700u, 4253316865463652807u, 8768845662095154930u, 1968885u}, + {10975330380352255246u, 15275126136524690611u, 11596049264307802964u, 10340555473898106140u, 2446117u}, + {1365891149714770017u, 7128588498253223955u, 3106085136181080901u, 13447835395668501757u, 210780u}, + {16533024297846587922u, 14203363780784821230u, 17674235700375173618u, 8578741908677116278u, 957323u}, + {9409796582990651764u, 2687158510963295225u, 13997393958704085599u, 18320288386589313501u, 170770u}, + {17468892971117287988u, 2575060974571834351u, 13259110523843008856u, 7857427918939900790u, 509401u}, + {17231678881541435621u, 17544391189684876399u, 4475969756867866956u, 17735564931065591894u, 2925444u}, + {13350661016938839483u, 15619856636330513998u, 10760159185171555936u, 846598468922741392u, 2610855u}, + {7020450915557062388u, 13580498315347121764u, 5665605186516368208u, 15252314116847957916u, 1585770u}, + {10638634066900286678u, 14660394618363040122u, 9482774511116486104u, 821885843019287808u, 503509u}, + {5870947442341094252u, 15384269796893286886u, 11878012585750858418u, 16366361949093336737u, 164778u}, + {6777823244459088516u, 12334824552160228215u, 10874687408021958929u, 75097227999267597u, 2038108u}, + {6497671528547613304u, 3761492733430183698u, 15204731119472794541u, 16466727897393246662u, 3162173u}, + {10380994405538574013u, 9333208031561575501u, 6557231480349254966u, 12091950016848487563u, 2343367u}, + {11705992363176879423u, 3815139496203497074u, 12732286521307377583u, 4726971115877042387u, 2878905u}, + {7068156924205129544u, 1945405716445917089u, 10553435184116780326u, 7835326584570711000u, 2347238u}, + {13326318129893328190u, 10280644482160209713u, 1600210934335914473u, 17409179069642045021u, 3228438u}, + {8486334327624156543u, 10843072490987351858u, 776623219454220162u, 7049140808632027579u, 1859622u}, + {10895827391785495892u, 7645575135450034979u, 7881864506184863477u, 1403398264877611496u, 582962u}, + {2695806064576352769u, 8829602034778563636u, 9348405699381722141u, 2965115107777141508u, 505438u}, + {5459084950322704983u, 9328459401983254195u, 2339587942644041713u, 11106193170237144860u, 1705211u}, + {3084841988696041184u, 16753935982688499671u, 8445211561922971936u, 7597502975997300788u, 53550u}, + {18169238176478534752u, 7561581323315659737u, 8971345027706409107u, 9368475055673281802u, 489396u}, + {11632538542868256182u, 17572768983224860795u, 7303909704933399839u, 13123509887034056567u, 1746875u}, + {18411366384601951844u, 8685872873196388057u, 244540506048893314u, 8751193047766551516u, 263906u}, + {9636257282173382139u, 10818098715416525973u, 12826456719215860174u, 11822313637412890944u, 205760u}, + {6294076698632410538u, 17561526120243565911u, 13897760469676542862u, 11100665095723822258u, 3184180u}, + {4528746345866318002u, 1681934850637486035u, 14544467051673254580u, 12740874315320606311u, 1904379u}, + {8602781419933724412u, 9361150401088365825u, 9546794664726175843u, 683647951114572661u, 2369886u}, + {6324141274877242798u, 1157718313063204440u, 10249166652079571430u, 3214250818878344369u, 2341061u}, + {3336079652529017666u, 7146573948927218502u, 9113594458550372864u, 331415332493905119u, 1023231u}, + {4406871195123771899u, 12245492976012125038u, 12977218333390759771u, 4918791675295800878u, 488372u}, + {5524221622843147405u, 6549853167142158550u, 8072480240475577427u, 12835260616966729964u, 2043480u}, + {11420678947362026514u, 7627841778016668673u, 9278595029643052205u, 4000863237501041091u, 2654350u}, + {10795367588639294937u, 9642829993877272834u, 15365597167056595172u, 8912048185798050313u, 685445u}, + {4254838081654957465u, 18382344655116654194u, 7479775343069456362u, 3111120781034553277u, 2363901u}, + {5872406499626552398u, 7968105247497721838u, 14926501974267125692u, 12581627642473167727u, 2152915u}, + {13905385571959313077u, 10437477046090621218u, 14582674483983041445u, 760290224978357401u, 428767u}, + {8980085801484981504u, 11243405132984378713u, 5461986358351206808u, 2385809959128164336u, 1974510u}, + {6919274412205189835u, 5083191153874770532u, 16407871499777629213u, 13295020586005530429u, 1664452u}, + {10715646419401748349u, 13025515115078796898u, 11287283449852214244u, 9902594116558121828u, 277141u}, + {2563859584643187684u, 13385245060755786752u, 7425398967594609388u, 13119594473904810407u, 1620748u}, + {14250968679908560125u, 4352807893470078974u, 4931537349527049686u, 2696028516086904714u, 1306608u}, + {10789351241230176521u, 329620410093858033u, 16690304912286752427u, 7013689287755699797u, 1475192u}, + {10403604491807679154u, 15738281155847352314u, 11496196663692175660u, 4855071296838444740u, 2072727u}, + {4769363373830303973u, 9452775983254637832u, 11636604106355339885u, 9766010264479010434u, 3183175u}, + {7668287461656151864u, 7053186927967496019u, 8195357764545733560u, 8921803290997976794u, 1576946u}, + {5850876662395532780u, 8146562543219004318u, 10710576775791030399u, 3559911636060332137u, 1304620u}, + {2902043517520806252u, 2321347708668394184u, 5342141252433127706u, 816699529230561887u, 79373u}, + {12867318990114752752u, 3502744985108009917u, 8688022718307086733u, 361752144423701757u, 3310630u}, + {15567818237494298639u, 10718541982955725035u, 5352873197177776391u, 11662342984800894893u, 2819873u}, + {5801488243155829141u, 9133694437190831744u, 4518708180202523973u, 1493169367972265279u, 480478u}, + {14716860832063417937u, 14787293843129724539u, 16853272395691949185u, 13123345371095101537u, 877421u}, + {1525298323434380085u, 15095301864700175238u, 10764853432747015813u, 17310008142857948319u, 3630696u}, + {2528626663206935818u, 3659883716401067405u, 1327299601671400854u, 11163844019072351261u, 1773204u}, + {5571511970773425785u, 8489443498224601800u, 15422380553902290992u, 1041516168073313194u, 2937854u}, + {1047046791502184450u, 5127603089430814245u, 2335085873252875162u, 10286372195291206981u, 1644797u}, + {15741574896506115832u, 2031002945245250323u, 12184977117548003545u, 11199268235477407524u, 2986284u}, + {11072518891514720821u, 5025480302913583201u, 2129537674618381671u, 7693192195899043106u, 1460585u}, + {6671081146631395571u, 8555650210683059348u, 6384389828735004418u, 15086980199313029885u, 754339u}, + {7248041930424987359u, 6540406788726353934u, 14194616629148774671u, 14497491515188313324u, 1311572u}, + {16907262310529471978u, 2639269519753135298u, 4065914685712153857u, 16597440876239160179u, 2392827u}, + {10041039221839818878u, 5867526208952099162u, 9293812980754742598u, 3430846803661716073u, 3072528u}, + {14098678750886643208u, 16483038993910995545u, 16036147935599921761u, 14396139354653812728u, 806362u}, + {9558505874903487231u, 15491082811029414995u, 2102812994886253923u, 16732236584640185088u, 833636u}, + {644576231351073347u, 6292002663264052607u, 7584210298554637731u, 9743153081795138880u, 112220u}, + {6527828702347924434u, 9087975358169224018u, 12497418241803029068u, 2163797924500942847u, 3174401u}, + {12946449512178183884u, 11615134012306704327u, 15870192580507650137u, 6759913610525423646u, 3252955u}, + {7116236906580928816u, 16757290783639395395u, 45174727047645817u, 2654079820493613161u, 3239559u}, + {14071378323049257778u, 8305681529418524225u, 15074504105245640435u, 14183047749872637717u, 3743998u}, + {6980272782433851794u, 12550836231779428050u, 12983528417096963244u, 9796839782221799523u, 1410368u}, + {11810925796442483120u, 17052506333964968733u, 2127909621125219586u, 3124493250973490623u, 843396u}, + {9255314670511410023u, 5623691570835588789u, 17860479967416761471u, 1024364229820274695u, 583424u}, + {9000493854078769175u, 15097256878366992851u, 4838357395409577922u, 3325411599983509207u, 2613725u}, + {16933885926154442613u, 1386088991985091092u, 14407622989202785654u, 14747963903216767041u, 852103u}, + {3764057038369675511u, 13395396107912682258u, 5117412542073610294u, 11905221556971513473u, 3780470u}, + {10321048682671412246u, 3128512136022921606u, 10500864280181587412u, 11671010014579956001u, 853912u}, + {10569541753379317172u, 16248831122525237015u, 4048650687834465991u, 9239123944651255293u, 1963027u}, + {10076741874085839104u, 4445790609851837623u, 11646479618687886539u, 9187525908734753656u, 1870777u}, + {609812014496830389u, 18218298621869087232u, 10667370040509458645u, 14878374125538662858u, 3217690u}, + {17554641822040458954u, 3733506888731527827u, 12505968273870865040u, 7193057728571774276u, 2143304u}, + {16210753496961623962u, 1482854069884619317u, 7167547723819835486u, 10632003311128622297u, 3701118u}, + {3377909739084846625u, 13972029669411353335u, 7130201270533265894u, 13398928484181271219u, 289296u}, + {14358652637610790136u, 7570189124720868512u, 11539795275495867512u, 15930064865054550218u, 1405386u}, + {9557685493114271033u, 8415807088165198619u, 17744919149540528848u, 5286129176565578564u, 887396u}, + {9166279133696657281u, 6915626217512197656u, 15336816731439814313u, 14572003567851605809u, 1193371u}, + {3697424513315754320u, 12621443688982178219u, 3193930988617815056u, 17027606016944983305u, 2623936u}, + {11365582302569594084u, 8644084370536988167u, 17968307127445206902u, 13090827613750355578u, 2495454u}, + {13704421010576090101u, 13658743604454386271u, 3112136228011837708u, 18060431523858526409u, 686093u}, + {446765969623473669u, 7359255881693518806u, 4711348190406322505u, 3975823872128231611u, 634208u}, + {12538600037407819103u, 1194292559855789406u, 8107560571435377402u, 8298322391003035699u, 1u}, + {14721455074199063390u, 6174649904959823932u, 13144915838084412047u, 26745066464u, 0u}, + {8204253414812225781u, 11861586107333232857u, 13744050392456646823u, 26u, 0u}, + {9364428412479326651u, 16694097514458123647u, 493359396308u, 0u, 0u}, + {10772112255944664687u, 6629691731406190229u, 493u, 0u, 0u}, + {3968575659478005945u, 9100874520070u, 0u, 0u, 0u}, + {16132047922581137899u, 9100u, 0u, 0u, 0u}, + {167881503118680u, 0u, 0u, 0u, 0u}, + {167882u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 885526u}, + {1231196499947842422u, 4017439948505761794u, 7458203391589413993u, 15076372225419554348u, 946839u}, + {8044088549777804044u, 14377907829329804291u, 10368844237154028194u, 3332115437533064359u, 1656267u}, + {4277462955169850970u, 14721923844698772288u, 8475205883582359593u, 6443678606174432439u, 3392129u}, + {2550102697451106437u, 16890961206966577867u, 14537194694100801108u, 3088992691564660225u, 807720u}, + {7221219899252233379u, 18404593796900920561u, 10993074186927631249u, 10967654100977255642u, 2283747u}, + {529513961877749242u, 10364383474895258230u, 6486627743787095442u, 3284719439112513188u, 3541086u}, + {15091637091137503702u, 18182742879073742336u, 7493218048446065374u, 5325525875238454628u, 1399182u}, + {15232512565900793389u, 13421356891727054250u, 1616538734751148020u, 13356465254608735113u, 2757561u}, + {1204863013251883507u, 15625488792108064701u, 8716154626483189787u, 1275847134035882751u, 3484611u}, + {13219848165816089322u, 9807562341038709790u, 7416774060704609148u, 2298065143765046264u, 158082u}, + {16471444853678109576u, 810903457809788608u, 1911207688590927064u, 12180649492904546481u, 1541684u}, + {3271847952237711996u, 4462678090551301063u, 5130183874582210770u, 6369507337708840697u, 311110u}, + {8834233823374304185u, 16439798865166680405u, 5757126580232534361u, 15930467255300352972u, 3824225u}, + {14822154647354712827u, 6287733460444813764u, 6069911694748864701u, 4610172940175209133u, 2065971u}, + {247375353856153720u, 14700900359088952249u, 4369448343495501594u, 18268681734506646544u, 728496u}, + {10930076475590757536u, 9303926658635812491u, 381775295458467120u, 11254423067456160864u, 2690128u}, + {2328478706201970166u, 15003285054111823046u, 2320742666144733336u, 11146493595836845340u, 340954u}, + {17669247866020732790u, 4659127369839439182u, 5506851244200010276u, 9373776727256032842u, 2751276u}, + {4260062427811441172u, 13503031497796754415u, 10844745993282669624u, 10643218417197322639u, 489984u}, + {16138186575025241511u, 18088156943720027601u, 2514969754678621136u, 9736813815211702278u, 2702673u}, + {13164540193436925073u, 9312364165868895677u, 3806888629695969989u, 12083473731216703942u, 2732313u}, + {1669723673512770671u, 1542479652353624642u, 5926417754169685269u, 9706119891806086721u, 1202713u}, + {16497512969196212179u, 10998991668070833347u, 13997775480963944187u, 14001359391969262911u, 3108826u}, + {7102329467052964873u, 9975427707482969586u, 8880737190466337954u, 16270306390126839162u, 90801u}, + {8653604102445016940u, 3762029033261241811u, 2271229141686152918u, 4829533799620115003u, 1508446u}, + {4302726731019003587u, 12333587944602262258u, 16916840094883402146u, 12421732096664149669u, 1297156u}, + {13078041203477296370u, 16374001255388051954u, 14760231739486975336u, 5212075087908220275u, 3217666u}, + {14711021374929485549u, 3319886963057022811u, 336994930719860968u, 131413060466679742u, 2301688u}, + {3741735719501115381u, 16605053762553799264u, 16723957450479830932u, 1843898500553139850u, 3807385u}, + {3391322040637173810u, 12833973414851528599u, 13514527631448784730u, 15994962140911052997u, 3652845u}, + {15444998219555553155u, 1988009347899954681u, 18147916370196670619u, 2733514092254225339u, 231706u}, + {1872144299519597592u, 9516534686978181286u, 11454731446631604282u, 2310117233229550989u, 1343917u}, + {16553824312014777825u, 4911734458260408948u, 13072670016817126854u, 12130466693637318000u, 1613879u}, + {6386200022155244175u, 17698040137050044768u, 1656452403204743114u, 1182692329616247967u, 1268254u}, + {10295691016126582985u, 5501291521593956130u, 5376237725509502152u, 12993762084968179243u, 3423884u}, + {18215230694371856782u, 16060177084912928059u, 7256502472959318601u, 14114390362275778559u, 3743886u}, + {3734783809246730224u, 5000505786650196043u, 11754234617195346036u, 14696754110696905528u, 287153u}, + {260912135419137236u, 208522959240410391u, 10553285930532428038u, 6706653298125050077u, 3847686u}, + {9571288089649739881u, 3929032636468946567u, 17417612278114461794u, 3097396235217621819u, 1019059u}, + {8864564409001595336u, 4812962173186968347u, 3281143839371687948u, 11115667805507308761u, 3448467u}, + {15686903883084010830u, 7475241916033498730u, 15493077850092579676u, 7773775561369589913u, 1619615u}, + {9975141695404018935u, 16903462244583999648u, 14944403809534200370u, 10262054984562483568u, 3168524u}, + {1363916849036604420u, 11390074998666243746u, 16362600542972016810u, 1211370466188308443u, 3038954u}, + {4766315815095686923u, 5278862741280537474u, 16785764333988812599u, 9351488438793850146u, 2613683u}, + {1774134099692893799u, 3097226468404120914u, 14576836220470183248u, 6317224632042024272u, 1379063u}, + {8799210593770572419u, 10591244746386583866u, 7788954707999483191u, 15806052322845964731u, 346417u}, + {5635895190591696341u, 8623698631823259841u, 10848984042781987489u, 6131285774771709124u, 280719u}, + {9540081110885929981u, 6453570124573220169u, 7227453302181294139u, 5985958662828932134u, 2751889u}, + {2143261551502235581u, 1305348193273332064u, 2138618817300904331u, 987512120581278335u, 166522u}, + {15197431863238610332u, 6530511228531895238u, 9877823540758381768u, 11388171647696768270u, 2358500u}, + {7706117132493380216u, 7994488469996382613u, 3377677617371237181u, 12437412831809620617u, 310568u}, + {5321708381314030352u, 7488847960942632087u, 15419605796709101617u, 6058566880036843283u, 513491u}, + {6122938169872153842u, 6811457323673792175u, 7483747037802999101u, 8440210745557288583u, 1107104u}, + {10306369743773871223u, 7835856893653828210u, 18254319582059776301u, 1173343977198037860u, 1521386u}, + {15447278446952296170u, 14870954843720547861u, 1713658934598946677u, 7161766429107534321u, 1885487u}, + {3797255291704385712u, 10210244912851919993u, 8399380201370797852u, 13149263218207957182u, 2233330u}, + {3758514830103307358u, 11229131614041976414u, 2186279744923050893u, 15893868368435546891u, 1688203u}, + {16349693972147051765u, 2961261684999597300u, 11111081575084586602u, 16388215711188978526u, 1347700u}, + {14421280619538159383u, 3254666383042858718u, 16636412460507049018u, 17895144014782482201u, 2953872u}, + {13971559806884734356u, 512698957478014299u, 7997389507309035778u, 54489338705640595u, 1000803u}, + {12308467418539888323u, 2514041559525017257u, 1689504886779109832u, 12196194949273511263u, 2371421u}, + {923811350653107351u, 3950551319138769571u, 16164468607967189800u, 13086169529339171743u, 3615146u}, + {7184951385167740208u, 16356526240515620649u, 471271512354752571u, 14550264087760779456u, 2697418u}, + {15575985195709172611u, 3474888368003294844u, 1138292204009998686u, 16190659658551939223u, 2547009u}, + {10948846772437385721u, 2135545585985659385u, 16673196014533743515u, 17484921796545655061u, 3666631u}, + {9636243697907224276u, 14462188824404888172u, 9167676850610632774u, 8498375923592220035u, 3449171u}, + {4037644234204081795u, 2736801577216548171u, 8284993018734899114u, 2729756962605170403u, 3903417u}, + {14645216830710522634u, 14681127456586107760u, 8216959654820943379u, 1585214811938210735u, 3384687u}, + {16964768382369469772u, 5849746843227346211u, 1267566680629594113u, 1719761119316169101u, 2520501u}, + {13666911775710676652u, 16905902027776437474u, 16119663642906011790u, 406783008793929797u, 3564637u}, + {13783468022904643838u, 6231221878887851789u, 13608775348284262216u, 16855175357698667891u, 2566802u}, + {3586613985498222173u, 1702778073690483248u, 3794862784053010631u, 9558951569443548734u, 2609551u}, + {9169495446682045550u, 197030247003136079u, 10563217169966995511u, 8911221795668380531u, 2557192u}, + {8873677542894072981u, 564012133283007507u, 7090980138720807419u, 12008732485578596647u, 2304340u}, + {6172341136597687503u, 18416454723418717476u, 13824176088236389627u, 18273078873843312161u, 1981923u}, + {4222462159614675232u, 15124516677895144736u, 9421669550403685600u, 18195073742185717401u, 2985538u}, + {5908828599643536005u, 16537117662561913673u, 9191031380587114435u, 3730010769537733145u, 406313u}, + {18286482474901550447u, 16601119361961268821u, 10763397608042477640u, 9879385538850959150u, 3369310u}, + {6101799652974494539u, 11359125014263542830u, 3804901259524872670u, 14329556428664107196u, 2897626u}, + {16607600412142063853u, 2440593940380585068u, 16140362644734735489u, 9204766222389731013u, 2512967u}, + {11933063211214855735u, 15719438140928424864u, 3422529313875754794u, 18132812171839355829u, 1007419u}, + {12474138750278765707u, 10302811357991808547u, 11414751766581778367u, 9314013249493508318u, 3615639u}, + {2622595218570736018u, 7907762047290085045u, 18240711330653885125u, 11091508664412910586u, 670986u}, + {10166106121679798512u, 6377181787713170857u, 11317519528343015475u, 10965131811875597013u, 1665326u}, + {14046337498208364783u, 7251657473522790997u, 11622626214982017853u, 17612772798740842628u, 1305089u}, + {7073691005107819765u, 3726321354439342745u, 13831672203923548686u, 10184195419737025299u, 3136039u}, + {16358639225938683396u, 17490181780920214667u, 5115546358186698608u, 7623897093004800728u, 2911501u}, + {9399023038641177734u, 16960499365913920562u, 4507210010789404717u, 11871153143661428030u, 2526697u}, + {2501183449922202833u, 17060324234533766639u, 11085024499936989924u, 4514180175133494878u, 1647961u}, + {14521484407855939494u, 16027527171118234109u, 9668858224095251217u, 8821425991951842833u, 1481363u}, + {15048906901136436679u, 8402747853282762504u, 8529321435764448658u, 8602180023476112978u, 2551737u}, + {14743931954747839426u, 5515948704843823097u, 10847976242553375243u, 2497029445274145237u, 3041283u}, + {17044541124300757041u, 17099509792974769787u, 9989069923124689764u, 18070500281135737051u, 3179496u}, + {13212758692079871231u, 4875849977703308716u, 12185966866808518407u, 17064243560016876401u, 1134059u}, + {3698187548484098800u, 9701370106253899790u, 7617873421409766763u, 14144208144635605996u, 1667217u}, + {4428314428666922726u, 3871865540441325234u, 2807200949691886805u, 16892231744333682986u, 2054668u}, + {1450619824156657166u, 2504492107752338101u, 6150632836084572845u, 1551111426441159057u, 1177009u}, + {1596947124357393609u, 12720396225640070950u, 1460163119798300693u, 17891995306752692360u, 3509786u}, + {1605185016131925900u, 8538438703050092u, 1490617490535160656u, 10296922495373250971u, 631046u}, + {1803412362897185179u, 17491991661050479691u, 1518560083532892117u, 9451185573326220229u, 720623u}, + {13002895824896299898u, 660195503320138631u, 9968565103378748427u, 3183827295174643555u, 3581418u}, + {9776391989511054257u, 7181463474534667358u, 1920583562412830239u, 17215772885477652778u, 2930835u}, + {7455371715470027125u, 17566193308878275850u, 3470425403646391098u, 11943567396641152859u, 3454238u}, + {2213538645270715602u, 1036924152686417671u, 14685480021924155577u, 6981248483940331586u, 89471u}, + {9026865054110351293u, 18326440478876542323u, 4297477513110520641u, 289880831771979095u, 3452584u}, + {10025505893304481536u, 1246824028004463347u, 6060767033509323377u, 14114919771126812770u, 1176333u}, + {10348145055962500841u, 16213406823427880401u, 1990715404695385196u, 12992066454738407229u, 361809u}, + {10691021292317557827u, 2160135219254897115u, 16584371364002904925u, 3609553912915028033u, 2487479u}, + {1822190548707503346u, 6783156987669980893u, 12160907156047126159u, 11863331314331462378u, 2382580u}, + {12777282737054132676u, 4631340791213409460u, 15139457925596747473u, 5015924843975497801u, 2500207u}, + {8110176641405613217u, 6650333127899824504u, 16467082182177542952u, 11359162947630907932u, 368887u}, + {14815883989577447336u, 1747469960207662460u, 18407624522741375721u, 943553497933344610u, 2969575u}, + {9912707619304372789u, 10813789087893902666u, 12422550481596326443u, 15258931332979034035u, 2918720u}, + {3113858998278770084u, 7202223598042766262u, 8701062728773201244u, 3512605409942289803u, 2613629u}, + {12149382004260985614u, 17924825111958993936u, 11489817734708756566u, 408500918968870511u, 1581270u}, + {15730212506469041130u, 3921435842253837357u, 12040242091132514746u, 17827395010778135813u, 2516729u}, + {16577679489288270561u, 14085675118360647900u, 16733408227234129486u, 13521195558685802008u, 3343835u}, + {520144408750569908u, 11447093365271458780u, 3941873099502147727u, 638143634294331625u, 2238492u}, + {8572652883785110801u, 15852543029875505141u, 16792711180918803435u, 2779481463114451443u, 3454213u}, + {9748513162507797038u, 4631044988294829496u, 9788020451830054639u, 4387174628242238114u, 1796128u}, + {11051016272271442885u, 3349730075429769783u, 14151990874024313169u, 3636012419823195217u, 328612u}, + {6629523546797388978u, 610825434995740045u, 18425202146152961139u, 14633753414798933270u, 1985198u}, + {16307755505280666626u, 14824794995397550780u, 4573192072295847758u, 13511390539167917501u, 2016595u}, + {11824884715264958893u, 15978416512815732373u, 7544442016940918587u, 7531189405321218196u, 1287258u}, + {14579412026618036063u, 6341086203104570452u, 5816758763471318939u, 23745726414024615u, 291879u}, + {15162981990821297860u, 16600457482587872663u, 11624235687901688246u, 725960157616515356u, 1807202u}, + {13266410012319028201u, 5903136205054801591u, 13208860981870511334u, 14372798207057115470u, 3610671u}, + {17014444263742797985u, 13533598233586245893u, 9223552938836023585u, 15558987856398669387u, 2723939u}, + {11260336594289864686u, 14330319223632511854u, 13244851001432749615u, 9633907828208799666u, 444523u}, + {8953717506352138030u, 9672833592922150718u, 4091466339890039604u, 12906509344438885963u, 1261185u}, + {835354726906110228u, 17368369044417379209u, 5418010232325478778u, 1680589432703453253u, 3003314u}, + {1840766815962431921u, 18314864812813597071u, 101617160221740343u, 15187496114376444921u, 1185913u}, + {12523317151144424544u, 3776085552818565963u, 15901652862940262190u, 4489447079143713261u, 2675042u}, + {2258336217833527284u, 7989711313929188375u, 9549531388140649056u, 2643419205015276921u, 2244161u}, + {2262863997794926507u, 5774048722214823332u, 1464507257639581550u, 17767565599600891562u, 3442334u}, + {4401054972537603770u, 16816495473775672395u, 4674465934678415320u, 9430987097012426175u, 3595981u}, + {1998913006974821145u, 555661253520072199u, 2620940537827651455u, 6119172049817855868u, 2861855u}, + {17680823584979045382u, 7720792923161539229u, 12135440507999479685u, 11293776582796996114u, 1495480u}, + {5911300716615447468u, 9262456803004759718u, 879758330469517259u, 7089230963838065471u, 3521962u}, + {12480292098464646802u, 5300949855935855041u, 12297633780227549816u, 15413236268819211571u, 2950872u}, + {8624966773580398431u, 17562927071151838997u, 15041857401877841650u, 10718957913604846248u, 1529590u}, + {16865030317577302100u, 2559697120583723921u, 12196317358407808389u, 6873687399589817226u, 1342765u}, + {12639137963421037111u, 13216380917154828981u, 12275855620830919568u, 4996743637796849589u, 449565u}, + {3025869120131506215u, 7342210573218214429u, 6808631065907778647u, 7502282795440746216u, 2687459u}, + {8857752794633006525u, 9367146096634687142u, 5850015217034378221u, 16622821504607295473u, 342731u}, + {1389776637459874139u, 3164334657521403343u, 17380499564157200013u, 15858992976010093972u, 1708648u}, + {1815937904822010397u, 4971955600377520753u, 17702771038397441573u, 15307728944267771085u, 2202476u}, + {12413422407294413908u, 14241439629283755923u, 12410458474130459684u, 5444948079252811662u, 2098973u}, + {8936727115429389587u, 10157518196254895219u, 17282791981959407013u, 14882583595006729253u, 3454769u}, + {1086543100156875042u, 7815212629198166660u, 17221621236871002267u, 9287101291314144876u, 2237781u}, + {3274359129017052471u, 5444390850962060803u, 8097179365123521145u, 3644159484583507925u, 807145u}, + {10518551938893610403u, 5381488299850116844u, 11485021174817339098u, 10823528306578724180u, 2547488u}, + {14473509839433603036u, 7751995281993396729u, 14865581513735225361u, 4946909264569474152u, 1308717u}, + {1681049016452306149u, 17508117388188059729u, 15342356728527669424u, 15300351508551544639u, 2851588u}, + {8048538476747301590u, 18366467107635842008u, 7841911012909254647u, 6321613210639743213u, 3565762u}, + {12324572988166461697u, 13580609717981193367u, 15294464934051696785u, 8280342425687156632u, 753832u}, + {260866322296647320u, 2042303410671067350u, 7396206261235382559u, 14281309373768646372u, 360348u}, + {443056371286928211u, 1517547210260978794u, 5061209936002363064u, 16147548326110640127u, 1503464u}, + {1701838944161525188u, 3286137670687025309u, 7774158030106756338u, 15303943967820306415u, 412630u}, + {5953395875464762845u, 10667055884097541424u, 1911386972853963416u, 295842071462790484u, 607914u}, + {6169796313098717234u, 2668290993120956462u, 15197894433561128093u, 7937549378444740099u, 1373173u}, + {8548551443539210081u, 13581377787812758371u, 10439707320019154110u, 17463268336016037856u, 3431466u}, + {1002838858711929729u, 2826113184869056710u, 4825426829135689312u, 5107330975217859676u, 3486057u}, + {5514178769243529820u, 4176245462305246484u, 10988315710454841490u, 17502244163591255185u, 1183401u}, + {12739929836437546057u, 11902066286166219234u, 12602468781804839708u, 14649521502585187128u, 6233u}, + {6471237700740231508u, 7409020473081226988u, 4065840528208829697u, 8142623119491189702u, 2444066u}, + {18403737119686413984u, 9701294440242879928u, 8690267741124788682u, 6025865373291896816u, 1352643u}, + {15915818781652626295u, 8694347945188418262u, 5873773592265284671u, 457297429497527698u, 3456548u}, + {17691311070963945027u, 2910131181708746233u, 13220952411031996228u, 5612196797712241104u, 1825715u}, + {4258592203884085652u, 9872906469663326483u, 13666206608281154985u, 5077710085623684951u, 1567288u}, + {10279945223745794094u, 13549818441173284893u, 6582210749916518696u, 8747880244292786437u, 977938u}, + {10175378053204405297u, 11208400649882681084u, 14407538836900174745u, 17816265508122035807u, 167575u}, + {6603403048547098402u, 30032362024812001u, 4318143123517195162u, 10523499960491896042u, 3150762u}, + {10255978293852837803u, 8961954113924697701u, 14031099614758546230u, 1355158003457372062u, 1489181u}, + {15931084653264226914u, 6791278745399316702u, 4472202047056289019u, 9539072955148076419u, 3617784u}, + {8043148149464814485u, 10392261547985194507u, 11651246958756359247u, 787312285480313551u, 768549u}, + {3182724104684022006u, 3715266629684942307u, 12271488704114535833u, 16227135886032203287u, 3170727u}, + {838398968862857040u, 4632828518055063778u, 9203968269523266835u, 17856715333091936943u, 2500977u}, + {4239754242855892840u, 3350099084100003799u, 6712138837810951393u, 1991689939534003498u, 1898447u}, + {2068811335670644354u, 9232835090787479376u, 12373040146676767270u, 8537816264413688064u, 460879u}, + {2142487205054983700u, 9878388590070319839u, 15733569814114114410u, 4043726991623727864u, 2516407u}, + {2564116889703112644u, 11896327878721912795u, 5111437403186409637u, 4153702380119910575u, 2016309u}, + {17830701241320826822u, 2320318937501168737u, 7917636215266486339u, 1046000656781210716u, 2565881u}, + {10068351601166000687u, 7742764989366344950u, 14595514240952960851u, 839965685593801890u, 3707140u}, + {14902376457959133135u, 61075904545476228u, 14232403335302111277u, 6985913691306459168u, 1714748u}, + {17079262526938685422u, 4653741883305142750u, 9608760247683498378u, 9687349125575162421u, 3601157u}, + {3289741552851444967u, 530810710078420786u, 6345350382988481035u, 1867869482183795193u, 1133978u}, + {9834598301092504966u, 1570092611669495161u, 1959111391568477141u, 2038530836881068700u, 3847497u}, + {15715768721991286922u, 13518179389091983655u, 10975330380352255245u, 15275126136524690611u, 3629056u}, + {16313477140976254293u, 12562198730365056192u, 1365891149714770016u, 7128588498253223955u, 434643u}, + {4417749068613995173u, 17096470163979298027u, 16533024297846587921u, 14203363780784821230u, 1139904u}, + {11015311394747649163u, 3241753805453679027u, 9409796582990651763u, 2687158510963295225u, 2875585u}, + {16689134527799281823u, 16863775896703588734u, 17468892971117287987u, 2575060974571834351u, 1864602u}, + {11146595906914189594u, 10531794353544709193u, 17231678881541435620u, 17544391189684876399u, 3004124u}, + {6468925639584931045u, 12621095325836514350u, 13350661016938839482u, 15619856636330513998u, 1825288u}, + {1126955837224130904u, 8899808373897006493u, 7020450915557062387u, 13580498315347121764u, 1772834u}, + {3188880034519643603u, 9968976805194233767u, 10638634066900286677u, 14660394618363040122u, 1951686u}, + {14145592153074604752u, 12579547668256248557u, 5870947442341094251u, 15384269796893286886u, 703428u}, + {16948530469378265598u, 5572266932272307426u, 6777823244459088515u, 12334824552160228215u, 785929u}, + {16031897755550704u, 46791629208013033u, 6497671528547613303u, 3761492733430183698u, 2047971u}, + {12782468115007093780u, 7823726197305826672u, 10380994405538574012u, 9333208031561575501u, 3694126u}, + {2206570319236991924u, 12769594121679002109u, 11705992363176879422u, 3815139496203497074u, 3898155u}, + {9659355024519088162u, 3931272083760566069u, 7068156924205129543u, 1945405716445917089u, 2627354u}, + {5107651184444321889u, 13814080255832116630u, 13326318129893328189u, 10280644482160209713u, 1866637u}, + {16475579129847712379u, 10680072120158078279u, 8486334327624156542u, 10843072490987351858u, 404958u}, + {15919056238649636552u, 7442484968537766351u, 10895827391785495891u, 7645575135450034979u, 2091185u}, + {12490611235553979521u, 12268695493918132742u, 2695806064576352768u, 8829602034778563636u, 1790547u}, + {3711742399774753859u, 6952485177207599181u, 5459084950322704982u, 9328459401983254195u, 1982689u}, + {14301121633503812248u, 13414828061260276674u, 3084841988696041183u, 16753935982688499671u, 3664144u}, + {7299568527299845935u, 4921465580826185954u, 18169238176478534751u, 7561581323315659737u, 3402965u}, + {901626719372099068u, 12366453421319926765u, 11632538542868256181u, 17572768983224860795u, 2112111u}, + {8153760401264773356u, 3727985846165397653u, 18411366384601951843u, 8685872873196388057u, 512806u}, + {13823125030715338068u, 4672698462158471428u, 9636257282173382138u, 10818098715416525973u, 2793488u}, + {16655092484818358157u, 16699893382023475174u, 6294076698632410537u, 17561526120243565911u, 1334120u}, + {18323905413796892974u, 12039293970590689869u, 4528746345866318001u, 1681934850637486035u, 3562730u}, + {7878835457674778122u, 3295242274660536229u, 8602781419933724411u, 9361150401088365825u, 260035u}, + {535637469911097129u, 13422009098369767795u, 6324141274877242797u, 1157718313063204440u, 697800u}, + {10742852243027084538u, 6855080116205485365u, 3336079652529017665u, 7146573948927218502u, 3673254u}, + {7076623001094386201u, 14975338400412003196u, 4406871195123771898u, 12245492976012125038u, 3505751u}, + {6806674949520225794u, 9422906092150340885u, 5524221622843147404u, 6549853167142158550u, 3349881u}, + {17665707552929558622u, 12623124319001781549u, 11420678947362026513u, 7627841778016668673u, 3207611u}, + {15413101415249765271u, 13693824205913513369u, 10795367588639294936u, 9642829993877272834u, 415150u}, + {18411522779878771626u, 12227481138923947519u, 4254838081654957464u, 18382344655116654194u, 2264350u}, + {7631665357202960508u, 2420739821282872045u, 5872406499626552397u, 7968105247497721838u, 3316764u}, + {1233354278574041807u, 3681803895922318127u, 13905385571959313076u, 10437477046090621218u, 131213u}, + {11306843218395326063u, 17798848161088539195u, 8980085801484981503u, 11243405132984378713u, 2122844u}, + {2501939196487978820u, 2402366998884032870u, 6919274412205189834u, 5083191153874770532u, 2989589u}, + {11314475578471152381u, 6152009995805305754u, 10715646419401748348u, 13025515115078796898u, 2959338u}, + {7738823427214039851u, 1239836001793286138u, 2563859584643187683u, 13385245060755786752u, 1591188u}, + {6320282971469571789u, 13400243266472957558u, 14250968679908560124u, 4352807893470078974u, 2243758u}, + {6056937768163587839u, 2914101460694881988u, 10789351241230176520u, 329620410093858033u, 1611431u}, + {14109518533335599403u, 17979329112089651052u, 10403604491807679153u, 15738281155847352314u, 717262u}, + {18115297343734258322u, 7619834389885140628u, 4769363373830303972u, 9452775983254637832u, 3447779u}, + {9231133633219550888u, 6386202079256590507u, 7668287461656151863u, 7053186927967496019u, 219790u}, + {170754490911970870u, 11198701178664411577u, 5850876662395532779u, 8146562543219004318u, 840511u}, + {12075779252656107038u, 5949161361072528756u, 2902043517520806251u, 2321347708668394184u, 2384186u}, + {9749379701813785913u, 16628677458853861283u, 12867318990114752751u, 3502744985108009917u, 2928325u}, + {6337291332684690113u, 1439211724185795629u, 15567818237494298638u, 10718541982955725035u, 2951067u}, + {1969293772928176879u, 129657553847297735u, 5801488243155829140u, 9133694437190831744u, 839555u}, + {6232205167644092623u, 4871222927023959763u, 14716860832063417936u, 14787293843129724539u, 1911703u}, + {7140458138918251766u, 9053524162176152102u, 1525298323434380084u, 15095301864700175238u, 3090193u}, + {5263285937400198795u, 12992331474049118605u, 2528626663206935817u, 3659883716401067405u, 3182404u}, + {9910006729718222553u, 14020125415575611810u, 5571511970773425784u, 8489443498224601800u, 624170u}, + {3346163273614871268u, 8567149495658141300u, 1047046791502184449u, 5127603089430814245u, 725890u}, + {17694652686083242004u, 4640282335678298609u, 15741574896506115831u, 2031002945245250323u, 2900583u}, + {12603740875982499695u, 11159664914979470628u, 11072518891514720820u, 5025480302913583201u, 2865227u}, + {16567644291365004271u, 6274920992367123739u, 6671081146631395570u, 8555650210683059348u, 2993662u}, + {11116389824540601810u, 5026623581014957545u, 7248041930424987358u, 6540406788726353934u, 2450087u}, + {8683213178285973309u, 18156048737960869940u, 16907262310529471977u, 2639269519753135298u, 1672983u}, + {3648718541437204907u, 18415509935672786825u, 10041039221839818877u, 5867526208952099162u, 2922334u}, + {12935985759743958644u, 5279881949362788937u, 14098678750886643207u, 16483038993910995545u, 3835781u}, + {11985896398117544094u, 16917528604167862089u, 9558505874903487230u, 15491082811029414995u, 1246397u}, + {2895109521685727083u, 10966463598836762488u, 644576231351073346u, 6292002663264052607u, 472631u}, + {6902860032074824953u, 16705315993205147971u, 6527828702347924433u, 9087975358169224018u, 751426u}, + {581470950236935256u, 15631287215796945147u, 12946449512178183883u, 11615134012306704327u, 2164553u}, + {9656790741000302428u, 8244688955432790364u, 7116236906580928815u, 16757290783639395395u, 1033147u}, + {2667661810563825234u, 13415748204593621159u, 14071378323049257777u, 8305681529418524225u, 694695u}, + {1094760970798694753u, 16428325276007064284u, 6980272782433851793u, 12550836231779428050u, 2543220u}, + {15860836915466385520u, 11182580689740984438u, 11810925796442483119u, 17052506333964968733u, 173430u}, + {15202206595298736528u, 4517971533754391948u, 9255314670511410022u, 5623691570835588789u, 2017685u}, + {12370756337570045344u, 14562642028933481306u, 9000493854078769174u, 15097256878366992851u, 921284u}, + {4120006698724930590u, 9025916147497558983u, 16933885926154442612u, 1386088991985091092u, 3509628u}, + {17073063284896160757u, 15239697419077829725u, 3764057038369675510u, 13395396107912682258u, 1628232u}, + {16218034389472450437u, 16667190930909625543u, 10321048682671412245u, 3128512136022921606u, 1944650u}, + {3207671120609311570u, 12136812830677605553u, 10569541753379317171u, 16248831122525237015u, 2725541u}, + {12701034597550460713u, 17996295016112066792u, 10076741874085839103u, 4445790609851837623u, 3240947u}, + {8649103508318106561u, 12336752700696557925u, 609812014496830388u, 18218298621869087232u, 3175063u}, + {16319966809155184542u, 3274648090066432657u, 17554641822040458953u, 3733506888731527827u, 2260680u}, + {4559409751376636994u, 2059163281726618483u, 16210753496961623961u, 1482854069884619317u, 3518996u}, + {9218897359363993613u, 17056014691281930529u, 3377909739084846624u, 13972029669411353335u, 224524u}, + {15449926199275443686u, 10884186434933509252u, 14358652637610790135u, 7570189124720868512u, 3096816u}, + {9891697959030080537u, 13876187351028206658u, 9557685493114271032u, 8415807088165198619u, 3803098u}, + {50275540953437067u, 11779722287187490591u, 9166279133696657280u, 6915626217512197656u, 616083u}, + {16486013359554933880u, 4451498636741688955u, 3697424513315754319u, 12621443688982178219u, 3753002u}, + {12623275128197691393u, 17302993095669286874u, 11365582302569594083u, 8644084370536988167u, 2160724u}, + {3588128923195082675u, 3087544079611866304u, 13704421010576090100u, 13658743604454386271u, 508560u}, + {13616985077649476007u, 1298971685436602764u, 446765969623473668u, 7359255881693518806u, 2242729u}, + {16469713774717881436u, 4753128053225006062u, 12538600037407819102u, 1194292559855789406u, 2697192u}, + {11149176384829751923u, 3398457500510694029u, 14721455074199063389u, 6174649904959823932u, 2392871u}, + {1391070106999002169u, 2583792594016471168u, 8204253414812225780u, 11861586107333232857u, 2645089u}, + {13224640242731020610u, 12411195867605827779u, 9364428412479326650u, 16694097514458123647u, 21308u}, + {18370783696805845120u, 10804159326302085902u, 10772112255944664686u, 6629691731406190229u, 493u}, + {1465402542290963205u, 1167172695119103206u, 3968575659478005944u, 9100874520070u, 0u}, + {7707614699232230932u, 6842617981716540779u, 16132047922581137898u, 9100u, 0u}, + {1577815458933222097u, 9238931835430079649u, 167881503118679u, 0u, 0u}, + {2846607708445570504u, 9280901519454760074u, 167881u, 0u, 0u}, + {12720981153790019807u, 3096867122739952u, 0u, 0u, 0u}, + {2264152494884375982u, 3096867u, 0u, 0u, 0u}, + {57127115243469173u, 0u, 0u, 0u, 0u}, + {57127116u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2942106u}, + {11038512764241864209u, 9849940344168403204u, 1231196499947842421u, 4017439948505761794u, 2084195u}, + {8586891567119094086u, 12306550613241569700u, 8044088549777804043u, 14377907829329804291u, 1202090u}, + {1380988276270904354u, 13461167265404936411u, 4277462955169850969u, 14721923844698772288u, 1598341u}, + {1691366820722532549u, 3745848862564352584u, 2550102697451106436u, 16890961206966577867u, 1621278u}, + {14030567718713148587u, 5603203607436489509u, 7221219899252233378u, 18404593796900920561u, 3260603u}, + {3023632785845392014u, 14305042767549301526u, 529513961877749241u, 10364383474895258230u, 1313466u}, + {15188410779077639089u, 6268488044004932786u, 15091637091137503701u, 18182742879073742336u, 1010714u}, + {4243351815022135782u, 16370715423034822540u, 15232512565900793388u, 13421356891727054250u, 3309444u}, + {12034939401281364353u, 12945036833466417779u, 1204863013251883506u, 15625488792108064701u, 419019u}, + {904760327863503205u, 12452880170017874230u, 13219848165816089321u, 9807562341038709790u, 990414u}, + {13401562337466360634u, 4548833269901400835u, 16471444853678109575u, 810903457809788608u, 3641014u}, + {3857838197226010954u, 14188432872871341049u, 3271847952237711995u, 4462678090551301063u, 578282u}, + {10224612775649910538u, 4594685421043769685u, 8834233823374304184u, 16439798865166680405u, 1014963u}, + {11081209257811347712u, 5563626414023087404u, 14822154647354712826u, 6287733460444813764u, 62405u}, + {18370549513246398392u, 12098613099032018485u, 247375353856153719u, 14700900359088952249u, 460624u}, + {1472973215185787938u, 9493554997700354690u, 10930076475590757535u, 9303926658635812491u, 829712u}, + {9995259405128970725u, 5836064002516587840u, 2328478706201970165u, 15003285054111823046u, 2571800u}, + {13356775607300764733u, 7744926397885206563u, 17669247866020732789u, 4659127369839439182u, 1532054u}, + {12403239557852146906u, 10635682902167617884u, 4260062427811441171u, 13503031497796754415u, 92202u}, + {13267183389304576041u, 2997446928261601687u, 16138186575025241510u, 18088156943720027601u, 918022u}, + {14657609731543661340u, 16540360846297419094u, 13164540193436925072u, 9312364165868895677u, 1586739u}, + {5613294466971915420u, 4891543212623474844u, 1669723673512770670u, 1542479652353624642u, 2506533u}, + {18085665371001742770u, 1231028528787850434u, 16497512969196212178u, 10998991668070833347u, 1706519u}, + {5748417534822680179u, 8714843154827759201u, 7102329467052964872u, 9975427707482969586u, 815002u}, + {5361276128885603678u, 2788755903815601768u, 8653604102445016939u, 3762029033261241811u, 636392u}, + {13977526692343276399u, 4274853399710875075u, 4302726731019003586u, 12333587944602262258u, 917636u}, + {4700812490967966350u, 17088151153730055605u, 13078041203477296369u, 16374001255388051954u, 283932u}, + {10450265082131730946u, 6365584476468371358u, 14711021374929485548u, 3319886963057022811u, 1724268u}, + {4539741328913456153u, 1000041020408559160u, 3741735719501115380u, 16605053762553799264u, 418592u}, + {15520058483508498452u, 7041416550183416981u, 3391322040637173809u, 12833973414851528599u, 2301452u}, + {12344514313363287277u, 16964989163845487720u, 15444998219555553154u, 1988009347899954681u, 267379u}, + {16394169412736158304u, 7318957386150755510u, 1872144299519597591u, 9516534686978181286u, 640658u}, + {7885070916410557792u, 10271770884211288214u, 16553824312014777824u, 4911734458260408948u, 2381428u}, + {3446876960209167493u, 2956588072303953740u, 6386200022155244174u, 17698040137050044768u, 1350610u}, + {7252663795821939248u, 4364083160208571770u, 10295691016126582984u, 5501291521593956130u, 3436444u}, + {2318405581221947280u, 11988382697052128288u, 18215230694371856781u, 16060177084912928059u, 1546711u}, + {15398702664688520793u, 670932831033001933u, 3734783809246730223u, 5000505786650196043u, 3491552u}, + {17122553807595795047u, 9588717606878269487u, 260912135419137235u, 208522959240410391u, 2055786u}, + {17235656294365293416u, 3922949297035257352u, 9571288089649739880u, 3929032636468946567u, 3098702u}, + {1291935742460120683u, 8437029104344069798u, 8864564409001595335u, 4812962173186968347u, 2889926u}, + {12205289804081850909u, 304119358469422054u, 15686903883084010829u, 7475241916033498730u, 2276024u}, + {5071528348470004930u, 14764579399091499057u, 9975141695404018934u, 16903462244583999648u, 269702u}, + {12847066699347337415u, 10181795034316240444u, 1363916849036604419u, 11390074998666243746u, 1011472u}, + {17781344866458998249u, 712435162593673410u, 4766315815095686922u, 5278862741280537474u, 3838483u}, + {4750373712562757376u, 13562159764966727119u, 1774134099692893798u, 3097226468404120914u, 3840028u}, + {5257258590511238289u, 14424460872322420849u, 8799210593770572418u, 10591244746386583866u, 2647889u}, + {11861141650564129586u, 5062086495415512205u, 5635895190591696340u, 8623698631823259841u, 2192487u}, + {15505382943774386182u, 14603926986412690814u, 9540081110885929980u, 6453570124573220169u, 450567u}, + {7242313302887198655u, 15767698285129723881u, 2143261551502235580u, 1305348193273332064u, 2457223u}, + {4984202397846035170u, 1412978036728527817u, 15197431863238610331u, 6530511228531895238u, 3694588u}, + {15471765516710542347u, 13484847856387618849u, 7706117132493380215u, 7994488469996382613u, 3627511u}, + {350352993578418928u, 3851658759405532657u, 5321708381314030351u, 7488847960942632087u, 2062341u}, + {15083313827798564615u, 16984128284821502095u, 6122938169872153841u, 6811457323673792175u, 2907653u}, + {7884305172306458450u, 15425746805204666489u, 10306369743773871222u, 7835856893653828210u, 1468577u}, + {6897311274893392844u, 8138273580929019103u, 15447278446952296169u, 14870954843720547861u, 2717235u}, + {11419205736413157500u, 3428026804542512651u, 3797255291704385711u, 10210244912851919993u, 3263694u}, + {15117277578227561763u, 10328753758207761975u, 3758514830103307357u, 11229131614041976414u, 374067u}, + {10401523223788745138u, 841244091134351211u, 16349693972147051764u, 2961261684999597300u, 654568u}, + {3692661177849541056u, 6412449280537694876u, 14421280619538159382u, 3254666383042858718u, 449716u}, + {15863593599498660883u, 2543698395872070426u, 13971559806884734355u, 512698957478014299u, 3473966u}, + {8188749259601804755u, 12732791958081464140u, 12308467418539888322u, 2514041559525017257u, 3222316u}, + {5500373048697235255u, 13616975678954661449u, 923811350653107350u, 3950551319138769571u, 3876564u}, + {3785525882644723948u, 16279275086030628591u, 7184951385167740207u, 16356526240515620649u, 874075u}, + {6404326720897720510u, 6217699990580082051u, 15575985195709172610u, 3474888368003294844u, 2486908u}, + {6128344911642776452u, 14931874937704655647u, 10948846772437385720u, 2135545585985659385u, 2746827u}, + {6852499077374515886u, 15841178234144147217u, 9636243697907224275u, 14462188824404888172u, 3831060u}, + {11980677144052818326u, 15305883144591196892u, 4037644234204081794u, 2736801577216548171u, 2896764u}, + {14255487329966697282u, 3119427706772917047u, 14645216830710522633u, 14681127456586107760u, 709161u}, + {1936553798488078363u, 10570191126909322993u, 16964768382369469771u, 5849746843227346211u, 2408285u}, + {11873422161282127306u, 16644676250823043048u, 13666911775710676651u, 16905902027776437474u, 1857714u}, + {8820180678065412762u, 5296174960508082919u, 13783468022904643837u, 6231221878887851789u, 2464034u}, + {8207892785495997616u, 13002341872664528997u, 3586613985498222172u, 1702778073690483248u, 2868531u}, + {9886049429625468743u, 5785675119721302662u, 9169495446682045549u, 197030247003136079u, 3231409u}, + {5484795033278704741u, 317666165050454448u, 8873677542894072980u, 564012133283007507u, 2264261u}, + {870689572390842843u, 1210628601984251321u, 6172341136597687502u, 18416454723418717476u, 3495441u}, + {10582283629483688124u, 2968096138320171456u, 4222462159614675231u, 15124516677895144736u, 1947694u}, + {5997999281411953909u, 8134111558733225866u, 5908828599643536004u, 16537117662561913673u, 1510983u}, + {11185791759391801288u, 15192790447059586130u, 18286482474901550446u, 16601119361961268821u, 2498150u}, + {16664099473909895048u, 12937099751715897794u, 6101799652974494538u, 11359125014263542830u, 3398612u}, + {592731424429833293u, 10313701722614777919u, 16607600412142063852u, 2440593940380585068u, 589949u}, + {8212196476447921095u, 13783213196228799560u, 11933063211214855734u, 15719438140928424864u, 3829022u}, + {12792363233425557268u, 6757263544444465730u, 12474138750278765706u, 10302811357991808547u, 2899389u}, + {16551924086934475791u, 7571061058204978490u, 2622595218570736017u, 7907762047290085045u, 1957717u}, + {11865423833687833796u, 12081228133107882226u, 10166106121679798511u, 6377181787713170857u, 2488139u}, + {8441310121970706406u, 11661548439912883990u, 14046337498208364782u, 7251657473522790997u, 2785535u}, + {10464703149544536232u, 15828319042473525938u, 7073691005107819764u, 3726321354439342745u, 2832154u}, + {16830980230847885037u, 17494927291722150432u, 16358639225938683395u, 17490181780920214667u, 1461762u}, + {6738128112675275342u, 5345511147318351630u, 9399023038641177733u, 16960499365913920562u, 2967029u}, + {5116802408343877475u, 17930053526115325205u, 2501183449922202832u, 17060324234533766639u, 1666488u}, + {1441564152158664464u, 6722509772075972823u, 14521484407855939493u, 16027527171118234109u, 2388873u}, + {8882151969393603854u, 10491377711605386178u, 15048906901136436678u, 8402747853282762504u, 2145178u}, + {3084648651794471653u, 2003359028875045286u, 14743931954747839425u, 5515948704843823097u, 1185033u}, + {4902976454251159683u, 14179130878265769882u, 17044541124300757040u, 17099509792974769787u, 2601606u}, + {5802190370910664964u, 7891169739827680961u, 13212758692079871230u, 4875849977703308716u, 2474827u}, + {6065439410820466128u, 9547562466901458544u, 3698187548484098799u, 9701370106253899790u, 2863001u}, + {15593454537928624688u, 17476424961327790218u, 4428314428666922725u, 3871865540441325234u, 2956289u}, + {5057128159351445334u, 13101756701320293000u, 1450619824156657165u, 2504492107752338101u, 2074061u}, + {13449472262220455060u, 16975084925363416519u, 1596947124357393608u, 12720396225640070950u, 462869u}, + {15870635450891425777u, 10200608096044271246u, 1605185016131925899u, 8538438703050092u, 2930268u}, + {13336333927517835834u, 8969264070709594540u, 1803412362897185178u, 17491991661050479691u, 633019u}, + {15701782016754710418u, 12342375167029473282u, 13002895824896299897u, 660195503320138631u, 2589165u}, + {14594794788824743833u, 1491453083583679524u, 9776391989511054256u, 7181463474534667358u, 3046497u}, + {14593879275809378400u, 5505881165993372455u, 7455371715470027124u, 17566193308878275850u, 1524270u}, + {15892393165309844323u, 14892754594794327649u, 2213538645270715601u, 1036924152686417671u, 1290829u}, + {12365934008871226836u, 11165057166779105221u, 9026865054110351292u, 18326440478876542323u, 1184215u}, + {4279312983454848760u, 7687907498835619430u, 10025505893304481535u, 1246824028004463347u, 24295u}, + {15224864202954115975u, 1446663904702899148u, 10348145055962500840u, 16213406823427880401u, 3819914u}, + {4924199482341666221u, 11852284682394216216u, 10691021292317557826u, 2160135219254897115u, 528177u}, + {14170476388290244689u, 14789518025121514166u, 1822190548707503345u, 6783156987669980893u, 1065487u}, + {4379261595168166075u, 6352975755660476277u, 12777282737054132675u, 4631340791213409460u, 1140281u}, + {1392113300499943802u, 3580128803827688428u, 8110176641405613216u, 6650333127899824504u, 980536u}, + {3887753952610427424u, 5966269103715587578u, 14815883989577447335u, 1747469960207662460u, 279181u}, + {9549711065860772151u, 12829345835547669088u, 9912707619304372788u, 10813789087893902666u, 3714573u}, + {7033182743835322327u, 814042506377107110u, 3113858998278770083u, 7202223598042766262u, 2956716u}, + {9089047391442247730u, 12811041864120863451u, 12149382004260985613u, 17924825111958993936u, 1643962u}, + {6217084526220579112u, 13385231649758371914u, 15730212506469041129u, 3921435842253837357u, 1867228u}, + {15951276990243993759u, 4982908475572647233u, 16577679489288270560u, 14085675118360647900u, 3360674u}, + {4066889062937531631u, 14885753317025619236u, 520144408750569907u, 11447093365271458780u, 3899329u}, + {4103836311459537670u, 18178738925560193152u, 8572652883785110800u, 15852543029875505141u, 1049451u}, + {2500665423159938195u, 12519423594764014704u, 9748513162507797037u, 4631044988294829496u, 1901731u}, + {11169607726342327239u, 7000408582629971758u, 11051016272271442884u, 3349730075429769783u, 1862913u}, + {16412665851163495842u, 7658968980437898249u, 6629523546797388977u, 610825434995740045u, 2872497u}, + {11178946681142804233u, 17446512346438567829u, 16307755505280666625u, 14824794995397550780u, 2910444u}, + {2829828928572136993u, 1744574440926823712u, 11824884715264958892u, 15978416512815732373u, 971u}, + {7372799986872355747u, 12616603313506417277u, 14579412026618036062u, 6341086203104570452u, 1475103u}, + {5657982933137520003u, 15566588669517349851u, 15162981990821297859u, 16600457482587872663u, 3603404u}, + {16260164933740803478u, 1633781855294162718u, 13266410012319028200u, 5903136205054801591u, 3189080u}, + {10207249329024256316u, 10377211010358654657u, 17014444263742797984u, 13533598233586245893u, 3410661u}, + {1684764481590395921u, 6401822415960702902u, 11260336594289864685u, 14330319223632511854u, 927859u}, + {434475242515641866u, 6420821912745192566u, 8953717506352138029u, 9672833592922150718u, 134922u}, + {10189556229300732551u, 2410339190679317973u, 835354726906110227u, 17368369044417379209u, 663310u}, + {2220229263633690497u, 8812772068800702487u, 1840766815962431920u, 18314864812813597071u, 1577007u}, + {9509533705112570658u, 5662059277636156347u, 12523317151144424543u, 3776085552818565963u, 3435618u}, + {16728793107590596003u, 1839335168981575872u, 2258336217833527283u, 7989711313929188375u, 511808u}, + {878344834851477791u, 12028452767344524406u, 2262863997794926506u, 5774048722214823332u, 1467796u}, + {15260008346066568905u, 16091131650332977618u, 4401054972537603769u, 16816495473775672395u, 2778706u}, + {9735601573594944311u, 12516116331271664264u, 1998913006974821144u, 555661253520072199u, 576273u}, + {6951864331055960493u, 13509071191024404768u, 17680823584979045381u, 7720792923161539229u, 2118789u}, + {1953525552048775174u, 17451288214329353443u, 5911300716615447467u, 9262456803004759718u, 2208817u}, + {12334296537573862183u, 13607412467270232978u, 12480292098464646801u, 5300949855935855041u, 2869434u}, + {16930125726729516268u, 4039448864701237495u, 8624966773580398430u, 17562927071151838997u, 2042708u}, + {6701930417366717985u, 17716814346852265218u, 16865030317577302099u, 2559697120583723921u, 1617695u}, + {13109010780419064369u, 15717038345481120100u, 12639137963421037110u, 13216380917154828981u, 3490782u}, + {3665753007210428858u, 15052893631107944798u, 3025869120131506214u, 7342210573218214429u, 3887757u}, + {13669028470953887227u, 6060081397234263784u, 8857752794633006524u, 9367146096634687142u, 3570175u}, + {15048524001217242753u, 4214210266795458555u, 1389776637459874138u, 3164334657521403343u, 3905253u}, + {8299294563935164396u, 3071471326177939974u, 1815937904822010396u, 4971955600377520753u, 2498739u}, + {1478034714987197784u, 2066980329132349100u, 12413422407294413907u, 14241439629283755923u, 3765164u}, + {1606372801863919649u, 2345582075722159746u, 8936727115429389586u, 10157518196254895219u, 1788525u}, + {15767870749189258882u, 6933317413771911199u, 1086543100156875041u, 7815212629198166660u, 2172269u}, + {6029603115541591697u, 17128009681944626427u, 3274359129017052470u, 5444390850962060803u, 2668565u}, + {13454895661290832846u, 12544537839645461034u, 10518551938893610402u, 5381488299850116844u, 2267756u}, + {14486539995194316680u, 8877367245571994683u, 14473509839433603035u, 7751995281993396729u, 3804445u}, + {13726210971879700169u, 1058640555011622103u, 1681049016452306148u, 17508117388188059729u, 3460676u}, + {7981728919656529682u, 322494614031457432u, 8048538476747301589u, 18366467107635842008u, 1831327u}, + {5454921673045144182u, 7848510910877572484u, 12324572988166461696u, 13580609717981193367u, 1338489u}, + {9015656465164410997u, 16847831070688609441u, 260866322296647319u, 2042303410671067350u, 235149u}, + {17665894309975542374u, 1653784989340101693u, 443056371286928210u, 1517547210260978794u, 2360630u}, + {17028883014344120665u, 5916545866245071519u, 1701838944161525187u, 3286137670687025309u, 137258u}, + {14986924109562228263u, 10392935812499843859u, 5953395875464762844u, 10667055884097541424u, 117094u}, + {2235696162360589035u, 8174359059759710588u, 6169796313098717233u, 2668290993120956462u, 1872965u}, + {3574876218462628556u, 6385282638746249272u, 8548551443539210080u, 13581377787812758371u, 860152u}, + {5024098403518662672u, 13283296171513146645u, 1002838858711929728u, 2826113184869056710u, 3738470u}, + {8411087615275057826u, 3135677330924396376u, 5514178769243529819u, 4176245462305246484u, 681056u}, + {12312330253422171280u, 4896236253825327849u, 12739929836437546056u, 11902066286166219234u, 3206304u}, + {9913196031243658661u, 18386733573507053725u, 6471237700740231507u, 7409020473081226988u, 2470725u}, + {1954675395908453412u, 10847971548491048585u, 18403737119686413983u, 9701294440242879928u, 2571546u}, + {18362027348165483675u, 3497661458349544952u, 15915818781652626294u, 8694347945188418262u, 1508527u}, + {17059728240081017140u, 12206634795291478934u, 17691311070963945026u, 2910131181708746233u, 55082u}, + {15711528579070378057u, 10079798040047343975u, 4258592203884085651u, 9872906469663326483u, 162129u}, + {4554700776621526632u, 3458432537847244417u, 10279945223745794093u, 13549818441173284893u, 2139866u}, + {12279902515244425610u, 3280496602949938034u, 10175378053204405296u, 11208400649882681084u, 1628057u}, + {13483052611674545842u, 14898661018660416000u, 6603403048547098401u, 30032362024812001u, 1453506u}, + {5845383024910962415u, 16849380622687695225u, 10255978293852837802u, 8961954113924697701u, 968458u}, + {15089072906793406769u, 8100471997887973243u, 15931084653264226913u, 6791278745399316702u, 865627u}, + {6289944153797369307u, 777350544179819446u, 8043148149464814484u, 10392261547985194507u, 2186257u}, + {3105842408616453921u, 12066900521745377430u, 3182724104684022005u, 3715266629684942307u, 1146137u}, + {3988910180333716863u, 1036441192980531094u, 838398968862857039u, 4632828518055063778u, 1921735u}, + {1667427874803447135u, 6792431456064225818u, 4239754242855892839u, 3350099084100003799u, 512993u}, + {163857153505384741u, 2618143275674279660u, 2068811335670644353u, 9232835090787479376u, 352268u}, + {16647885697184373432u, 14596874959730065096u, 2142487205054983699u, 9878388590070319839u, 369976u}, + {1037790964272133672u, 4721233479998768859u, 2564116889703112643u, 11896327878721912795u, 784741u}, + {1954421522941105954u, 601958935041238659u, 17830701241320826821u, 2320318937501168737u, 1767381u}, + {17100645370978420167u, 16217871008635829314u, 10068351601166000686u, 7742764989366344950u, 3310931u}, + {16588257978961956978u, 10628376099972733920u, 14902376457959133134u, 61075904545476228u, 2279853u}, + {15058643887935309321u, 4034552892930853802u, 17079262526938685421u, 4653741883305142750u, 1431556u}, + {13387435170925810766u, 571387108507711084u, 3289741552851444966u, 530810710078420786u, 3083641u}, + {11860055422169525779u, 11586887648288177211u, 9834598301092504965u, 1570092611669495161u, 2353223u}, + {11978925925858481128u, 6481407961444091680u, 15715768721991286921u, 13518179389091983655u, 1310657u}, + {4866073419584587672u, 14100875514738517796u, 16313477140976254292u, 12562198730365056192u, 1020254u}, + {17568398743944106289u, 13862550875389567057u, 4417749068613995172u, 17096470163979298027u, 3860825u}, + {6081181726405225642u, 3911964209872964362u, 11015311394747649162u, 3241753805453679027u, 124623u}, + {17710380936217827432u, 5849239012040577814u, 16689134527799281822u, 16863775896703588734u, 617215u}, + {2371209249016705422u, 11846333139969314116u, 11146595906914189593u, 10531794353544709193u, 597198u}, + {5468109687494777239u, 7424736453340251800u, 6468925639584931044u, 12621095325836514350u, 1990828u}, + {16180199865964645591u, 5739634549692912226u, 1126955837224130903u, 8899808373897006493u, 1356815u}, + {13947057883934260743u, 13308333991938976751u, 3188880034519643602u, 9968976805194233767u, 2251145u}, + {17835017864603992146u, 2847775048587817450u, 14145592153074604751u, 12579547668256248557u, 1291945u}, + {1022628073872069915u, 13671708136413776686u, 16948530469378265597u, 5572266932272307426u, 2536579u}, + {17277708933348577799u, 10924439237813140973u, 16031897755550703u, 46791629208013033u, 2250047u}, + {12594314958278771836u, 6487728442490594668u, 12782468115007093779u, 7823726197305826672u, 834834u}, + {6702905378795434988u, 7069789105349251517u, 2206570319236991923u, 12769594121679002109u, 2177186u}, + {1269144207775235331u, 3180087399899743213u, 9659355024519088161u, 3931272083760566069u, 2769041u}, + {4768494209455322716u, 16069684848081963094u, 5107651184444321888u, 13814080255832116630u, 842869u}, + {8868936411671479135u, 10754511430919199669u, 16475579129847712378u, 10680072120158078279u, 1114168u}, + {12344141830055828862u, 14539167520318557671u, 15919056238649636551u, 7442484968537766351u, 1024815u}, + {13213502091165642432u, 12089819120832508553u, 12490611235553979520u, 12268695493918132742u, 1894976u}, + {2252637465877021132u, 11338026509324449142u, 3711742399774753858u, 6952485177207599181u, 656786u}, + {17670384480527737237u, 12228729796674499222u, 14301121633503812247u, 13414828061260276674u, 1168183u}, + {14180117075317719921u, 13114193970542438731u, 7299568527299845934u, 4921465580826185954u, 2418033u}, + {9845224097737939033u, 13440918404370077309u, 901626719372099067u, 12366453421319926765u, 2875767u}, + {12422602917127327575u, 11689481460379677097u, 8153760401264773355u, 3727985846165397653u, 3307491u}, + {3997141624918256564u, 13103598529142133103u, 13823125030715338067u, 4672698462158471428u, 2959284u}, + {8623945221303934070u, 7617088956088919853u, 16655092484818358156u, 16699893382023475174u, 307683u}, + {14301267441481173670u, 1316281967030964094u, 18323905413796892973u, 12039293970590689869u, 2854191u}, + {9375462910393096331u, 2296312924479407574u, 7878835457674778121u, 3295242274660536229u, 1046071u}, + {15437566382840533847u, 2107790669014012771u, 535637469911097128u, 13422009098369767795u, 520887u}, + {315252860962158586u, 13997118607035596379u, 10742852243027084537u, 6855080116205485365u, 3220971u}, + {9279480152006713632u, 11968766900205782840u, 7076623001094386200u, 14975338400412003196u, 3004262u}, + {14787983068974336265u, 1818413782050341733u, 6806674949520225793u, 9422906092150340885u, 707190u}, + {9139882475346774995u, 16277676165795989771u, 17665707552929558621u, 12623124319001781549u, 156197u}, + {12088394215133993889u, 4174214802828943296u, 15413101415249765270u, 13693824205913513369u, 2696830u}, + {8603461097778768109u, 2992136676030378893u, 18411522779878771625u, 12227481138923947519u, 2322318u}, + {7420488460085109628u, 6944965555623577475u, 7631665357202960507u, 2420739821282872045u, 372239u}, + {17462581710791065322u, 2178656608033431701u, 1233354278574041806u, 3681803895922318127u, 33742u}, + {16681205127519491793u, 810428003799127085u, 11306843218395326062u, 17798848161088539195u, 1326325u}, + {2932080417066588201u, 6388003839727839628u, 2501939196487978819u, 2402366998884032870u, 1469880u}, + {6515248560132736843u, 11963488651927881264u, 11314475578471152380u, 6152009995805305754u, 805394u}, + {15200231345491223502u, 9100599891209643128u, 7738823427214039850u, 1239836001793286138u, 3772393u}, + {17901048521224587085u, 16629242946944879379u, 6320282971469571788u, 13400243266472957558u, 1723756u}, + {317848689251693133u, 2848809139488010416u, 6056937768163587838u, 2914101460694881988u, 2005134u}, + {548222771941142775u, 10844758755771526527u, 14109518533335599402u, 17979329112089651052u, 2915799u}, + {11912091516093191401u, 6520790818515384921u, 18115297343734258321u, 7619834389885140628u, 2446708u}, + {5935468528127445232u, 15384584877589206119u, 9231133633219550887u, 6386202079256590507u, 1614057u}, + {256719192691867774u, 3499295549263183769u, 170754490911970869u, 11198701178664411577u, 2192183u}, + {11831301749628099848u, 2871747597273488624u, 12075779252656107037u, 5949161361072528756u, 3004911u}, + {1388512411275075483u, 13592246314476539464u, 9749379701813785912u, 16628677458853861283u, 3801073u}, + {16357995484225564560u, 15310087911633170401u, 6337291332684690112u, 1439211724185795629u, 3122500u}, + {4653693273984684033u, 13996219452144764723u, 1969293772928176878u, 129657553847297735u, 2350774u}, + {10181371136473284548u, 10105745896133795141u, 6232205167644092622u, 4871222927023959763u, 2511278u}, + {15193814040488751778u, 13438829344488769775u, 7140458138918251765u, 9053524162176152102u, 1190700u}, + {9214512578932077142u, 17244160202806060908u, 5263285937400198794u, 12992331474049118605u, 2220021u}, + {4199248337192632805u, 9562331898790552707u, 9910006729718222552u, 14020125415575611810u, 3488604u}, + {12686366079696017421u, 4623767464766378841u, 3346163273614871267u, 8567149495658141300u, 1550209u}, + {7875364734033258483u, 16587429799909889881u, 17694652686083242003u, 4640282335678298609u, 3404147u}, + {12021026372470895538u, 17580709651491654580u, 12603740875982499694u, 11159664914979470628u, 320398u}, + {3630818414621700711u, 5875546812876555986u, 16567644291365004270u, 6274920992367123739u, 2962560u}, + {1779816581175814479u, 3237474684563233198u, 11116389824540601809u, 5026623581014957545u, 3772624u}, + {6532013587183958754u, 13700859341995718789u, 8683213178285973308u, 18156048737960869940u, 2213043u}, + {18020987416295965534u, 17782974083749380918u, 3648718541437204906u, 18415509935672786825u, 1066723u}, + {8036066225143891266u, 3107221129761552902u, 12935985759743958643u, 5279881949362788937u, 3038563u}, + {4826419224669725644u, 3054938781183026052u, 11985896398117544093u, 16917528604167862089u, 743182u}, + {8917100676038419053u, 10310307862311191791u, 2895109521685727082u, 10966463598836762488u, 3253244u}, + {10768350595445826099u, 10408961886976242871u, 6902860032074824952u, 16705315993205147971u, 3623777u}, + {2232964933214462085u, 7791635384680400330u, 581470950236935255u, 15631287215796945147u, 1632983u}, + {8383587888948368883u, 7419207701832246260u, 9656790741000302427u, 8244688955432790364u, 706667u}, + {3591690062898825065u, 15692789130867930417u, 2667661810563825233u, 13415748204593621159u, 3862547u}, + {11720333666887216129u, 1453725363232684944u, 1094760970798694752u, 16428325276007064284u, 740163u}, + {4996922815868683798u, 11486511277713415280u, 15860836915466385519u, 11182580689740984438u, 2732227u}, + {8383770403798192048u, 17744473568384144396u, 15202206595298736527u, 4517971533754391948u, 379906u}, + {5520116082565513668u, 4444330367086605221u, 12370756337570045343u, 14562642028933481306u, 1014644u}, + {17329241596069684148u, 16467362377524895041u, 4120006698724930589u, 9025916147497558983u, 1926902u}, + {3363105342640467271u, 6620286123757896140u, 17073063284896160756u, 15239697419077829725u, 1186480u}, + {11006314713694072478u, 10534220477528537774u, 16218034389472450436u, 16667190930909625543u, 1687941u}, + {7512438269018472539u, 1406195680207981071u, 3207671120609311569u, 12136812830677605553u, 2924857u}, + {7170205433478725185u, 7481944223491265350u, 12701034597550460712u, 17996295016112066792u, 807953u}, + {8943110329271718698u, 12257974928831482733u, 8649103508318106560u, 12336752700696557925u, 1737778u}, + {805340232527355050u, 11198061469898452253u, 16319966809155184541u, 3274648090066432657u, 2252465u}, + {18325507294755757585u, 12948642078402273694u, 4559409751376636993u, 2059163281726618483u, 2733409u}, + {1351926731993475843u, 5764405082966667996u, 9218897359363993612u, 17056014691281930529u, 189178u}, + {15302029845072620424u, 9638454110724902980u, 15449926199275443685u, 10884186434933509252u, 2229623u}, + {17501478689247127331u, 9484504247834382699u, 9891697959030080536u, 13876187351028206658u, 1861274u}, + {9784013377004154664u, 14858756585362317374u, 50275540953437066u, 11779722287187490591u, 3034974u}, + {17291078256770872248u, 10657500629813931380u, 16486013359554933879u, 4451498636741688955u, 497135u}, + {364346898366232545u, 17463785696120280366u, 12623275128197691392u, 17302993095669286874u, 3313599u}, + {11770334024640264547u, 17051615361139158026u, 3588128923195082674u, 3087544079611866304u, 104896u}, + {4932228645606147009u, 5222614787338570082u, 13616985077649476006u, 1298971685436602764u, 3761338u}, + {11849727413748842603u, 6220809491831694750u, 16469713774717881435u, 4753128053225006062u, 637000u}, + {6363056474081854241u, 5852222682969625248u, 11149176384829751922u, 3398457500510694029u, 3348927u}, + {15895375202385745186u, 8761474757579860025u, 1391070106999002168u, 2583792594016471168u, 937276u}, + {6127554920872124248u, 580030427404089928u, 13224640242731020609u, 12411195867605827779u, 3663400u}, + {10761585083246550702u, 3432420221126816754u, 18370783696805845119u, 10804159326302085902u, 772558u}, + {7109012476887268999u, 11931117933536870650u, 1465402542290963204u, 1167172695119103206u, 3751564u}, + {14117396437805280660u, 401424848594428419u, 7707614699232230931u, 6842617981716540779u, 843498u}, + {11960450997417167964u, 13434632423806518699u, 1577815458933222096u, 9238931835430079649u, 3118679u}, + {2000902901710936367u, 15223572239048000945u, 2846607708445570503u, 9280901519454760074u, 167881u}, + {2421779192851126973u, 17561204874600995783u, 12720981153790019806u, 3096867122739952u, 0u}, + {15782893870612014700u, 1464343845945506043u, 2264152494884375981u, 3096867u, 0u}, + {2264332150786822556u, 16025849700849910943u, 57127115243469172u, 0u, 0u}, + {5325443952227635996u, 4491213521747821201u, 57127115u, 0u, 0u}, + {9472200929306994925u, 1053809274565587553u, 0u, 0u, 0u}, + {10433248850938837861u, 1053809274u, 0u, 0u, 0u}, + {992605916703362311u, 1u, 0u, 0u, 0u}, + {19439349991u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2716336u}, + {11471459323391353282u, 7997497643933127476u, 11038512764241864208u, 9849940344168403204u, 3076945u}, + {7282319822637085214u, 3285804012460170484u, 8586891567119094085u, 12306550613241569700u, 3168839u}, + {12936568588256568778u, 10196416926761211302u, 1380988276270904353u, 13461167265404936411u, 3844123u}, + {16838748304823142158u, 7379944953174269591u, 1691366820722532548u, 3745848862564352584u, 2969026u}, + {2911426741582931363u, 8852041816149070396u, 14030567718713148586u, 5603203607436489509u, 2040422u}, + {16664467404392824241u, 13772699989491162958u, 3023632785845392013u, 14305042767549301526u, 3877917u}, + {12661945757400881646u, 10233795796125593828u, 15188410779077639088u, 6268488044004932786u, 739511u}, + {15904603967170758768u, 3271701257491188799u, 4243351815022135781u, 16370715423034822540u, 2533102u}, + {9445886401210591232u, 9739455363144796252u, 12034939401281364352u, 12945036833466417779u, 3196986u}, + {2700543648173142234u, 6858809951940915333u, 904760327863503204u, 12452880170017874230u, 498995u}, + {14314883641441363770u, 5907488704577345829u, 13401562337466360633u, 4548833269901400835u, 3531487u}, + {1841001103091696947u, 6907845691948237837u, 3857838197226010953u, 14188432872871341049u, 2984645u}, + {10153588750665595454u, 2069526518606473521u, 10224612775649910537u, 4594685421043769685u, 823542u}, + {12030234251520952414u, 14247686800729329318u, 11081209257811347711u, 5563626414023087404u, 3523380u}, + {9165984191178211498u, 9382638564656980189u, 18370549513246398391u, 12098613099032018485u, 2927897u}, + {6571724841321548675u, 690059187446130960u, 1472973215185787937u, 9493554997700354690u, 3873663u}, + {15262353486334039607u, 9993529228879151256u, 9995259405128970724u, 5836064002516587840u, 1884551u}, + {9979798796881805399u, 8753651903387875972u, 13356775607300764732u, 7744926397885206563u, 2342775u}, + {10831836117702607843u, 3044652458058842684u, 12403239557852146905u, 10635682902167617884u, 2335673u}, + {2390869154782621737u, 1308193969072665570u, 13267183389304576040u, 2997446928261601687u, 2123508u}, + {13330201109503324060u, 4358225542553523788u, 14657609731543661339u, 16540360846297419094u, 3452338u}, + {11510571377885230395u, 17011612679619299098u, 5613294466971915419u, 4891543212623474844u, 327940u}, + {11691422922922855781u, 6130664046915009174u, 18085665371001742769u, 1231028528787850434u, 3682594u}, + {8713836194422657939u, 9432576143250266184u, 5748417534822680178u, 8714843154827759201u, 2741260u}, + {15499497599164084062u, 16361774160219175103u, 5361276128885603677u, 2788755903815601768u, 1271517u}, + {15043404201463774164u, 5688229109153463894u, 13977526692343276398u, 4274853399710875075u, 569280u}, + {18268126885324884696u, 24336389316304498u, 4700812490967966349u, 17088151153730055605u, 1329025u}, + {4842118373339204966u, 9147453151924931304u, 10450265082131730945u, 6365584476468371358u, 3431082u}, + {5183519299141575283u, 10839691718174283631u, 4539741328913456152u, 1000041020408559160u, 2809706u}, + {4200891772037910383u, 8490125924254672613u, 15520058483508498451u, 7041416550183416981u, 1705155u}, + {14047797810291001576u, 7086232387445001103u, 12344514313363287276u, 16964989163845487720u, 2230224u}, + {1906067823580460901u, 436983820643693533u, 16394169412736158303u, 7318957386150755510u, 2146315u}, + {10194814124682398639u, 4588574148554653248u, 7885070916410557791u, 10271770884211288214u, 120710u}, + {3400643408231626536u, 16618033022079957006u, 3446876960209167492u, 2956588072303953740u, 2202422u}, + {3075139202169013229u, 7872291270594572455u, 7252663795821939247u, 4364083160208571770u, 1454028u}, + {7131286488394713707u, 4507726356359516834u, 2318405581221947279u, 11988382697052128288u, 1215091u}, + {3197753459379006686u, 699928190650653362u, 15398702664688520792u, 670932831033001933u, 274173u}, + {14182459871129426308u, 7735096251959399447u, 17122553807595795046u, 9588717606878269487u, 1726007u}, + {9633316387323780406u, 13478523636311738703u, 17235656294365293415u, 3922949297035257352u, 341014u}, + {6170221901611162299u, 5796532043655786551u, 1291935742460120682u, 8437029104344069798u, 861343u}, + {968341157519498186u, 3836178594578697189u, 12205289804081850908u, 304119358469422054u, 3514453u}, + {2838972895611892999u, 2578185946400661202u, 5071528348470004929u, 14764579399091499057u, 1174964u}, + {9435679343480374823u, 590639383545264438u, 12847066699347337414u, 10181795034316240444u, 3464937u}, + {16378485508400509556u, 13462677138138202381u, 17781344866458998248u, 712435162593673410u, 831154u}, + {17781150385967647938u, 17067463176332702228u, 4750373712562757375u, 13562159764966727119u, 701590u}, + {13360056848135510874u, 10249872837856869690u, 5257258590511238288u, 14424460872322420849u, 978758u}, + {16536628194890202035u, 1098170102706423967u, 11861141650564129585u, 5062086495415512205u, 2617968u}, + {419094085457685449u, 1819665659466307235u, 15505382943774386181u, 14603926986412690814u, 3206136u}, + {13687867260432736406u, 2972427563564924032u, 7242313302887198654u, 15767698285129723881u, 2378942u}, + {16647553152806222703u, 14427196735239748658u, 4984202397846035169u, 1412978036728527817u, 546317u}, + {11296921597169248033u, 12494809749906784458u, 15471765516710542346u, 13484847856387618849u, 1767589u}, + {13395610173841746190u, 9774042667017972753u, 350352993578418927u, 3851658759405532657u, 2742689u}, + {7849914573600744752u, 14823578921404452784u, 15083313827798564614u, 16984128284821502095u, 293909u}, + {16718649259811588063u, 2103327989874734732u, 7884305172306458449u, 15425746805204666489u, 3676694u}, + {8601387024292351547u, 14175605926934181832u, 6897311274893392843u, 8138273580929019103u, 2239955u}, + {9390679734560083365u, 15012657093330847115u, 11419205736413157499u, 3428026804542512651u, 1329113u}, + {8682635313855410194u, 8551357958472189105u, 15117277578227561762u, 10328753758207761975u, 2635183u}, + {10184485504304190972u, 1870865287625606678u, 10401523223788745137u, 841244091134351211u, 3869572u}, + {13830848481575540550u, 3792077719788340049u, 3692661177849541055u, 6412449280537694876u, 1175416u}, + {14901263661885383487u, 1236418242031609177u, 15863593599498660882u, 2543698395872070426u, 2746035u}, + {56485882163090049u, 1445233371695237790u, 8188749259601804754u, 12732791958081464140u, 3802730u}, + {4401654600194085657u, 9867714484504930530u, 5500373048697235254u, 13616975678954661449u, 3595020u}, + {18216872891422238285u, 2151553676885650650u, 3785525882644723947u, 16279275086030628591u, 1124691u}, + {3398861202521747928u, 7290837615839959026u, 6404326720897720509u, 6217699990580082051u, 864812u}, + {16270828459275115101u, 1532024183365072107u, 6128344911642776451u, 14931874937704655647u, 3283242u}, + {11972818434667377817u, 14985624926773746215u, 6852499077374515885u, 15841178234144147217u, 1608587u}, + {11786035775677069138u, 1847279637575366014u, 11980677144052818325u, 15305883144591196892u, 1135764u}, + {2293603790774264178u, 1138315024008425990u, 14255487329966697281u, 3119427706772917047u, 2698709u}, + {4259791909380700220u, 16043235461665448194u, 1936553798488078362u, 10570191126909322993u, 3872207u}, + {12201976402879187366u, 7647806901535211626u, 11873422161282127305u, 16644676250823043048u, 1949969u}, + {880732761345002788u, 10196211581968185657u, 8820180678065412761u, 5296174960508082919u, 1733365u}, + {12220092411899340231u, 2846135332841727072u, 8207892785495997615u, 13002341872664528997u, 1142076u}, + {14516197451596114782u, 1162687638040717840u, 9886049429625468742u, 5785675119721302662u, 1595717u}, + {12744250736984414170u, 2815055898904679875u, 5484795033278704740u, 317666165050454448u, 3128308u}, + {8982752184945981017u, 8024133638385975545u, 870689572390842842u, 1210628601984251321u, 744564u}, + {17788913580134870838u, 6475780465007003318u, 10582283629483688123u, 2968096138320171456u, 3451071u}, + {2943577185397539468u, 14079115772317030660u, 5997999281411953908u, 8134111558733225866u, 3290320u}, + {454409791544685091u, 796148280431663244u, 11185791759391801287u, 15192790447059586130u, 2102832u}, + {5169142714079556719u, 15807582400958826292u, 16664099473909895047u, 12937099751715897794u, 513140u}, + {10541461044487254249u, 10329475554789433679u, 592731424429833292u, 10313701722614777919u, 1095734u}, + {17780065453324672321u, 13815303447383103707u, 8212196476447921094u, 13783213196228799560u, 3030740u}, + {3790326512495646673u, 3212823201592647336u, 12792363233425557267u, 6757263544444465730u, 271792u}, + {137858425211261579u, 2429917639293950895u, 16551924086934475790u, 7571061058204978490u, 2580939u}, + {2438628557705473244u, 12290195150676729822u, 11865423833687833795u, 12081228133107882226u, 3267557u}, + {4155842440635035408u, 3769481538628531987u, 8441310121970706405u, 11661548439912883990u, 2586144u}, + {7263127509192531661u, 13713307869511451502u, 10464703149544536231u, 15828319042473525938u, 3089408u}, + {16413951511531976885u, 12695235357547692799u, 16830980230847885036u, 17494927291722150432u, 718239u}, + {6444741041034449742u, 5469997021098472718u, 6738128112675275341u, 5345511147318351630u, 3240149u}, + {12501516332433486978u, 14369208715212081413u, 5116802408343877474u, 17930053526115325205u, 1146734u}, + {6504497973276711496u, 2083439078894972362u, 1441564152158664463u, 6722509772075972823u, 2332475u}, + {8462489192415687956u, 9338295826366491678u, 8882151969393603853u, 10491377711605386178u, 3133560u}, + {14766859443264123466u, 18218573741502707752u, 3084648651794471652u, 2003359028875045286u, 3027225u}, + {10534703126287055631u, 8740868465543792355u, 4902976454251159682u, 14179130878265769882u, 1999918u}, + {13928199126186168149u, 7877674723614391146u, 5802190370910664963u, 7891169739827680961u, 1949398u}, + {4968578473470090846u, 3625733879069080277u, 6065439410820466127u, 9547562466901458544u, 2086395u}, + {9199787750397908104u, 247451103437643676u, 15593454537928624687u, 17476424961327790218u, 3216403u}, + {14214292943764115255u, 8323719587814185135u, 5057128159351445333u, 13101756701320293000u, 2252447u}, + {2317976830511071197u, 12624327506784802751u, 13449472262220455059u, 16975084925363416519u, 2194822u}, + {230478621842547944u, 17750943875686278693u, 15870635450891425776u, 10200608096044271246u, 1849779u}, + {3135519801123933421u, 8336591614205103917u, 13336333927517835833u, 8969264070709594540u, 1112748u}, + {4279801296433553792u, 15511010451570914570u, 15701782016754710417u, 12342375167029473282u, 2726833u}, + {6407576207594300230u, 18000941200916109638u, 14594794788824743832u, 1491453083583679524u, 1599416u}, + {2679165086238511535u, 18431328369049022629u, 14593879275809378399u, 5505881165993372455u, 2650344u}, + {1247850610558378039u, 3092717359435208979u, 15892393165309844322u, 14892754594794327649u, 3696461u}, + {3175447078712574934u, 18043356617249980235u, 12365934008871226835u, 11165057166779105221u, 2699800u}, + {830623149719677374u, 13922177821281257662u, 4279312983454848759u, 7687907498835619430u, 298807u}, + {17384347347037398948u, 6140563821074123873u, 15224864202954115974u, 1446663904702899148u, 1888640u}, + {11425521948964519870u, 3445833020324041026u, 4924199482341666220u, 11852284682394216216u, 960128u}, + {17111822022876108252u, 14512010105704099616u, 14170476388290244688u, 14789518025121514166u, 645505u}, + {13730531441774717932u, 8823856600289056955u, 4379261595168166074u, 6352975755660476277u, 2672921u}, + {9301790395574499493u, 6942666082572789135u, 1392113300499943801u, 3580128803827688428u, 3119596u}, + {2989529805732201927u, 9539461154017871642u, 3887753952610427423u, 5966269103715587578u, 167731u}, + {9807944821641119172u, 15598194303165177583u, 9549711065860772150u, 12829345835547669088u, 1160582u}, + {13835234840238566893u, 12404434669301869021u, 7033182743835322326u, 814042506377107110u, 3081721u}, + {13899142297837138493u, 9542645750036293224u, 9089047391442247729u, 12811041864120863451u, 2958611u}, + {13359416151938334706u, 5140778511417966880u, 6217084526220579111u, 13385231649758371914u, 592759u}, + {2896638813483189580u, 10749641608682042527u, 15951276990243993758u, 4982908475572647233u, 2270804u}, + {11518978710870934186u, 8563032289790869963u, 4066889062937531630u, 14885753317025619236u, 1096411u}, + {15061174683919222635u, 13515955622640093573u, 4103836311459537669u, 18178738925560193152u, 2898062u}, + {13714666151462780030u, 2985966599967601268u, 2500665423159938194u, 12519423594764014704u, 586659u}, + {8240645002940098472u, 3605699511074958789u, 11169607726342327238u, 7000408582629971758u, 1131040u}, + {16908781566917241696u, 2781444457905867048u, 16412665851163495841u, 7658968980437898249u, 464829u}, + {2504540875533840942u, 6417571519032050690u, 11178946681142804232u, 17446512346438567829u, 823569u}, + {15520803619253411422u, 1401442688013300109u, 2829828928572136992u, 1744574440926823712u, 353686u}, + {4413540498501137038u, 14865906387708273047u, 7372799986872355746u, 12616603313506417277u, 116462u}, + {2916021591745555722u, 10710438800815907675u, 5657982933137520002u, 15566588669517349851u, 2629991u}, + {6849052853434342148u, 3086253077635313446u, 16260164933740803477u, 1633781855294162718u, 49736u}, + {5684827981202152390u, 7925300134427653531u, 10207249329024256315u, 10377211010358654657u, 3293488u}, + {18411333912384671553u, 12845031546714433119u, 1684764481590395920u, 6401822415960702902u, 417203u}, + {15547562279199342724u, 5985288148842342637u, 434475242515641865u, 6420821912745192566u, 1758499u}, + {8313683356853089451u, 540361679174826835u, 10189556229300732550u, 2410339190679317973u, 1178831u}, + {149988621255864277u, 5526918532960214225u, 2220229263633690496u, 8812772068800702487u, 2253348u}, + {6772217402341337878u, 17851175746699640538u, 9509533705112570657u, 5662059277636156347u, 2054309u}, + {249996665032578750u, 15920302243800435954u, 16728793107590596002u, 1839335168981575872u, 3626231u}, + {17702229683115351594u, 18282706233486950934u, 878344834851477790u, 12028452767344524406u, 1208244u}, + {17153061643990977354u, 14068615067293717634u, 15260008346066568904u, 16091131650332977618u, 2718775u}, + {4432396706585308746u, 2058398250703616504u, 9735601573594944310u, 12516116331271664264u, 1859466u}, + {11831804077091648547u, 3852370626279631576u, 6951864331055960492u, 13509071191024404768u, 723729u}, + {2817150611150342330u, 9911527902163857552u, 1953525552048775173u, 17451288214329353443u, 3284307u}, + {16938781778081982254u, 498247545019858797u, 12334296537573862182u, 13607412467270232978u, 228961u}, + {3966454585224104048u, 5043927285262210311u, 16930125726729516267u, 4039448864701237495u, 3399180u}, + {18297616595640674191u, 9658056044532262647u, 6701930417366717984u, 17716814346852265218u, 459855u}, + {11832706044508352464u, 17308748798621490915u, 13109010780419064368u, 15717038345481120100u, 3518998u}, + {8997831290510049460u, 8142154076788854785u, 3665753007210428857u, 15052893631107944798u, 392670u}, + {17419553833266253232u, 12221889279607493445u, 13669028470953887226u, 6060081397234263784u, 1890296u}, + {8882427911769448083u, 9293343242572880178u, 15048524001217242752u, 4214210266795458555u, 2442294u}, + {12576933191685388736u, 11220005123388095090u, 8299294563935164395u, 3071471326177939974u, 2676228u}, + {17926284734405279873u, 854644065175162226u, 1478034714987197783u, 2066980329132349100u, 2154259u}, + {17386853538782914712u, 3898433196492342342u, 1606372801863919648u, 2345582075722159746u, 855890u}, + {123613973714534532u, 2793667602863234010u, 15767870749189258881u, 6933317413771911199u, 2730015u}, + {9765796517323971039u, 11921361560637997492u, 6029603115541591696u, 17128009681944626427u, 353258u}, + {10428702743389188099u, 3288526460661408751u, 13454895661290832845u, 12544537839645461034u, 774292u}, + {11007382621220840998u, 281367102286917902u, 14486539995194316679u, 8877367245571994683u, 2701519u}, + {7066922541180083453u, 13000823811292919285u, 13726210971879700168u, 1058640555011622103u, 1857468u}, + {6642858288275810260u, 764101488743878627u, 7981728919656529681u, 322494614031457432u, 3593629u}, + {591655323593052261u, 6156667557237978948u, 5454921673045144181u, 7848510910877572484u, 3166502u}, + {12044099460440861666u, 6204105578625377973u, 9015656465164410996u, 16847831070688609441u, 3714363u}, + {4339206462087344743u, 501016895659990268u, 17665894309975542373u, 1653784989340101693u, 424094u}, + {6978887846496858041u, 13230911046468128296u, 17028883014344120664u, 5916545866245071519u, 902179u}, + {17587925805250562994u, 17142706707307834449u, 14986924109562228262u, 10392935812499843859u, 1726642u}, + {5195152437442818390u, 11587601922790030844u, 2235696162360589034u, 8174359059759710588u, 2396865u}, + {5076118887509586480u, 16967032643359926416u, 3574876218462628555u, 6385282638746249272u, 1338928u}, + {4294343291002571813u, 3272660402682538175u, 5024098403518662671u, 13283296171513146645u, 2016658u}, + {1000757987939230844u, 9257038067484975017u, 8411087615275057825u, 3135677330924396376u, 3706749u}, + {5127987825683274095u, 13590048133051030409u, 12312330253422171279u, 4896236253825327849u, 653074u}, + {6031120939897581743u, 6241289979360220052u, 9913196031243658660u, 18386733573507053725u, 2132215u}, + {10747679115810615218u, 3797876550392055707u, 1954675395908453411u, 10847971548491048585u, 2108607u}, + {14969597666868399342u, 18139025878386718924u, 18362027348165483674u, 3497661458349544952u, 1566748u}, + {4043312850204310415u, 8928061707786135774u, 17059728240081017139u, 12206634795291478934u, 3458196u}, + {6044000400184938555u, 9499480310087207691u, 15711528579070378056u, 10079798040047343975u, 3888253u}, + {5385240552661759654u, 9922836130863032665u, 4554700776621526631u, 3458432537847244417u, 2054827u}, + {8819545236584124081u, 9082302692849486619u, 12279902515244425609u, 3280496602949938034u, 2970532u}, + {10664412120717049011u, 1509001689321855831u, 13483052611674545841u, 14898661018660416000u, 3250503u}, + {1239023076741103958u, 6440942804631234975u, 5845383024910962414u, 16849380622687695225u, 1627466u}, + {4547032671998508954u, 2778937622008469509u, 15089072906793406768u, 8100471997887973243u, 3077757u}, + {10874958420254909957u, 9500103600973590177u, 6289944153797369306u, 777350544179819446u, 1804238u}, + {9258703041313877912u, 10991392299999619688u, 3105842408616453920u, 12066900521745377430u, 1498089u}, + {5254522444811346501u, 13554453278974010617u, 3988910180333716862u, 1036441192980531094u, 1030947u}, + {630232739831648171u, 16889720791387358850u, 1667427874803447134u, 6792431456064225818u, 1304831u}, + {6323525016525423703u, 16170654904813220866u, 163857153505384740u, 2618143275674279660u, 2235677u}, + {15302243057512222643u, 10655411463572505798u, 16647885697184373431u, 14596874959730065096u, 2032329u}, + {7717653873915841954u, 4732135723165796592u, 1037790964272133671u, 4721233479998768859u, 1382259u}, + {6139439762519468436u, 7102345467061443606u, 1954421522941105953u, 601958935041238659u, 266299u}, + {15926606388429146136u, 345880904149721323u, 17100645370978420166u, 16217871008635829314u, 1946672u}, + {7853016469934711522u, 17686111434748462490u, 16588257978961956977u, 10628376099972733920u, 3869800u}, + {5349844333199587404u, 9747268754266043142u, 15058643887935309320u, 4034552892930853802u, 3631207u}, + {14001179218263619432u, 4070472281429609253u, 13387435170925810765u, 571387108507711084u, 3126438u}, + {6310229852699893275u, 9725054064632198524u, 11860055422169525778u, 11586887648288177211u, 3701579u}, + {7842592149902049498u, 5940548482557146284u, 11978925925858481127u, 6481407961444091680u, 2691243u}, + {3791789569170891496u, 13984768423477285279u, 4866073419584587671u, 14100875514738517796u, 1490388u}, + {1514961716361093822u, 5840809837749132670u, 17568398743944106288u, 13862550875389567057u, 1130504u}, + {2026903411016644035u, 16651400397903178144u, 6081181726405225641u, 3911964209872964362u, 681632u}, + {18111407060900450445u, 12615927974665960653u, 17710380936217827431u, 5849239012040577814u, 1566006u}, + {5858496100478298110u, 8571087634306007890u, 2371209249016705421u, 11846333139969314116u, 152019u}, + {14059520736254192399u, 3199523960868258400u, 5468109687494777238u, 7424736453340251800u, 2552462u}, + {3529706278368970910u, 10719231614179699643u, 16180199865964645590u, 5739634549692912226u, 2696231u}, + {3453767571081840395u, 3898260821533561076u, 13947057883934260742u, 13308333991938976751u, 2034444u}, + {6918809751642398934u, 3322827177119190943u, 17835017864603992145u, 2847775048587817450u, 2863533u}, + {11041778859432644605u, 363869279747169050u, 1022628073872069914u, 13671708136413776686u, 2371287u}, + {16295522459126721081u, 17069848880644947226u, 17277708933348577798u, 10924439237813140973u, 137963u}, + {15160019998841492750u, 9843999734883266513u, 12594314958278771835u, 6487728442490594668u, 441535u}, + {14101684376251273851u, 80801969315420430u, 6702905378795434987u, 7069789105349251517u, 517883u}, + {14593354686808299836u, 13405324679223443853u, 1269144207775235330u, 3180087399899743213u, 45611u}, + {4755288715205998591u, 8063757218353084295u, 4768494209455322715u, 16069684848081963094u, 971982u}, + {5101013044898354903u, 17760680357795717485u, 8868936411671479134u, 10754511430919199669u, 3013600u}, + {10630705377676807336u, 5181613652716858627u, 12344141830055828861u, 14539167520318557671u, 3046657u}, + {8742200737153159517u, 2084072364878171822u, 13213502091165642431u, 12089819120832508553u, 1354398u}, + {5576268008777804024u, 6275537455031730489u, 2252637465877021131u, 11338026509324449142u, 2764520u}, + {3024322611832472747u, 15260543546849572060u, 17670384480527737236u, 12228729796674499222u, 3890629u}, + {13914088558497764618u, 4748668087191412723u, 14180117075317719920u, 13114193970542438731u, 2071146u}, + {8146166959653245248u, 10404107399350677543u, 9845224097737939032u, 13440918404370077309u, 875559u}, + {8705277215221849997u, 15458819431118821321u, 12422602917127327574u, 11689481460379677097u, 3316249u}, + {15955534187669749360u, 6172554885606411462u, 3997141624918256563u, 13103598529142133103u, 2766969u}, + {16609954964409366675u, 2272599676722415011u, 8623945221303934069u, 7617088956088919853u, 1043288u}, + {3126696038836679684u, 9003373310058983947u, 14301267441481173669u, 1316281967030964094u, 3389623u}, + {16899470346371158951u, 11750034774931979124u, 9375462910393096330u, 2296312924479407574u, 982311u}, + {17791862613686420724u, 14960138454210917847u, 15437566382840533846u, 2107790669014012771u, 972820u}, + {18278957654048548714u, 11378831706209993983u, 315252860962158585u, 13997118607035596379u, 390653u}, + {13858969757800387741u, 5815849213695666231u, 9279480152006713631u, 11968766900205782840u, 920158u}, + {16131982723231231434u, 10896733732991584348u, 14787983068974336264u, 1818413782050341733u, 3508343u}, + {13332781785846861448u, 4812833016052665329u, 9139882475346774994u, 16277676165795989771u, 3628387u}, + {9554508833631698881u, 2573254431710138259u, 12088394215133993888u, 4174214802828943296u, 2047804u}, + {8904992809805591997u, 16152021649840459751u, 8603461097778768108u, 2992136676030378893u, 1487337u}, + {5377566045905302237u, 13310098193614341212u, 7420488460085109627u, 6944965555623577475u, 917711u}, + {15720372489899474433u, 5092342567229686827u, 17462581710791065321u, 2178656608033431701u, 964640u}, + {6060855958238653634u, 14022476555888281628u, 16681205127519491792u, 810428003799127085u, 2544382u}, + {16396453629877659255u, 8696742299996879730u, 2932080417066588200u, 6388003839727839628u, 104519u}, + {9724502242609214852u, 18372896453216941352u, 6515248560132736842u, 11963488651927881264u, 1157008u}, + {8672064831772907139u, 4802482813683486652u, 15200231345491223501u, 9100599891209643128u, 3035566u}, + {7565890991158241203u, 5968673619581205554u, 17901048521224587084u, 16629242946944879379u, 2090502u}, + {13470050751441573467u, 1924077685335148597u, 317848689251693132u, 2848809139488010416u, 1958050u}, + {1409117370703925833u, 18276041373963406968u, 548222771941142774u, 10844758755771526527u, 1930278u}, + {5072636064655458755u, 11690166116121095797u, 11912091516093191400u, 6520790818515384921u, 1968767u}, + {17937711243631602u, 265051832552332924u, 5935468528127445231u, 15384584877589206119u, 2197191u}, + {2683090362520317694u, 5869820944647162796u, 256719192691867773u, 3499295549263183769u, 3333999u}, + {6962589482368832899u, 9534771916814513241u, 11831301749628099847u, 2871747597273488624u, 2462149u}, + {3644450202945597780u, 14998958610327852687u, 1388512411275075482u, 13592246314476539464u, 1836528u}, + {8922621324189109457u, 16471357417890310636u, 16357995484225564559u, 15310087911633170401u, 924076u}, + {7900480986896793336u, 4203961911835424129u, 4653693273984684032u, 13996219452144764723u, 958582u}, + {1190921823745913713u, 14813506421721060329u, 10181371136473284547u, 10105745896133795141u, 1957898u}, + {12472326697419519756u, 12102205814604438239u, 15193814040488751777u, 13438829344488769775u, 1214047u}, + {10644737638797551108u, 101099403693275046u, 9214512578932077141u, 17244160202806060908u, 2750050u}, + {5081925817313111006u, 13142885839679615438u, 4199248337192632804u, 9562331898790552707u, 654936u}, + {16227467027829683980u, 5825558013566874807u, 12686366079696017420u, 4623767464766378841u, 768871u}, + {17507591553776966311u, 5647667198709610394u, 7875364734033258482u, 16587429799909889881u, 3833429u}, + {6963543083181480432u, 10190328267646897398u, 12021026372470895537u, 17580709651491654580u, 2107780u}, + {4339311548107776289u, 17827385372912812612u, 3630818414621700710u, 5875546812876555986u, 3628854u}, + {16471776111427648634u, 4010792755893162224u, 1779816581175814478u, 3237474684563233198u, 537573u}, + {3291201095528558598u, 13624741823274670263u, 6532013587183958753u, 13700859341995718789u, 3079456u}, + {6494664558203023908u, 6971388239745506415u, 18020987416295965533u, 17782974083749380918u, 474044u}, + {13145625298248590904u, 12799773012577997051u, 8036066225143891265u, 3107221129761552902u, 1546063u}, + {17801201218779658915u, 13572720003080685549u, 4826419224669725643u, 3054938781183026052u, 329159u}, + {8691382952773125485u, 6476120204241195192u, 8917100676038419052u, 10310307862311191791u, 1770954u}, + {5230827084972512430u, 6995970714237647545u, 10768350595445826098u, 10408961886976242871u, 510400u}, + {4633277734682307209u, 5524763590773132510u, 2232964933214462084u, 7791635384680400330u, 3758555u}, + {15422695793617744748u, 16637145122701850629u, 8383587888948368882u, 7419207701832246260u, 3051553u}, + {10432482136418653062u, 11335823271653099422u, 3591690062898825064u, 15692789130867930417u, 681609u}, + {17826742780825158809u, 12895042241282029116u, 11720333666887216128u, 1453725363232684944u, 1591274u}, + {13637307722260143088u, 15453217083647594277u, 4996922815868683797u, 11486511277713415280u, 992339u}, + {1404012197555295538u, 15860729366860147832u, 8383770403798192047u, 17744473568384144396u, 2646381u}, + {13373441863045232631u, 17680774751862554558u, 5520116082565513667u, 4444330367086605221u, 2072503u}, + {2851883138558140440u, 11571553495791644537u, 17329241596069684147u, 16467362377524895041u, 3417679u}, + {11045064921461520464u, 14800764063918575934u, 3363105342640467270u, 6620286123757896140u, 748736u}, + {10995431769561841927u, 2035582100880292662u, 11006314713694072477u, 10534220477528537774u, 2011270u}, + {4143920097136071252u, 146179030285148671u, 7512438269018472538u, 1406195680207981071u, 3253259u}, + {4381978292481577211u, 16179055904255727909u, 7170205433478725184u, 7481944223491265350u, 443652u}, + {12986711576561796753u, 90538406980253459u, 8943110329271718697u, 12257974928831482733u, 1579378u}, + {7368842414108920674u, 7764596007771524873u, 805340232527355049u, 11198061469898452253u, 2728543u}, + {6265159063846214513u, 9834595778363421322u, 18325507294755757584u, 12948642078402273694u, 3895275u}, + {14648226142532502071u, 5294538155649598124u, 1351926731993475842u, 5764405082966667996u, 2970394u}, + {6873662611095050390u, 7201443645737334816u, 15302029845072620423u, 9638454110724902980u, 2437255u}, + {12626201307151009117u, 3450083169666247605u, 17501478689247127330u, 9484504247834382699u, 807308u}, + {11484142228884736928u, 17324063463810952447u, 9784013377004154663u, 14858756585362317374u, 3525516u}, + {15462590961258446438u, 188937897360213973u, 17291078256770872247u, 10657500629813931380u, 1401219u}, + {10848984530070969660u, 4632847957396988735u, 364346898366232544u, 17463785696120280366u, 2494920u}, + {15339225039216422845u, 10337694103055114978u, 11770334024640264546u, 17051615361139158026u, 1868514u}, + {17226007077458168287u, 13437179246569836515u, 4932228645606147008u, 5222614787338570082u, 1293258u}, + {6639278412599486279u, 547188881948630059u, 11849727413748842602u, 6220809491831694750u, 843377u}, + {10240169175963127050u, 9282134398903183498u, 6363056474081854240u, 5852222682969625248u, 2304248u}, + {18145299087532902032u, 7853149667229195788u, 15895375202385745185u, 8761474757579860025u, 193512u}, + {6477424781001411091u, 5784328151766592259u, 6127554920872124247u, 580030427404089928u, 2478123u}, + {13344647441403532364u, 14237657936880553574u, 10761585083246550701u, 3432420221126816754u, 2255949u}, + {14200091795770805943u, 15662704453457032186u, 7109012476887268998u, 11931117933536870650u, 2230034u}, + {8602045459856761072u, 15565526877974568269u, 14117396437805280659u, 401424848594428419u, 1730383u}, + {12504133687767177824u, 2710258576718969624u, 11960450997417167963u, 13434632423806518699u, 1052754u}, + {11960484439750910849u, 5718220808141165280u, 2000902901710936366u, 15223572239048000945u, 2776073u}, + {12473615748218209122u, 16353145138562019914u, 2421779192851126972u, 17561204874600995783u, 1257238u}, + {7349883126738027275u, 9638070133889004698u, 15782893870612014699u, 1464343845945506043u, 1575553u}, + {7874331729475391869u, 4142499641144801759u, 2264332150786822555u, 16025849700849910943u, 1281672u}, + {13929242692731534649u, 17741910127696673785u, 5325443952227635995u, 4491213521747821201u, 2439615u}, + {11720054024584611322u, 1244717150992298333u, 9472200929306994924u, 1053809274565587553u, 0u}, + {108885331262778290u, 9733066128393698032u, 10433248850938837860u, 1053809274u, 0u}, + {15578694775529861532u, 4820588837754324463u, 992605916703362310u, 1u, 0u}, + {3994252831058917359u, 7616917522213233179u, 19439349990u, 0u, 0u}, + {11203021625095453991u, 8104576831933768287u, 19u, 0u, 0u}, + {7659991875046142561u, 358592714232u, 0u, 0u, 0u}, + {10933647754209300153u, 358u, 0u, 0u, 0u}, + {6614868026143u, 0u, 0u, 0u, 0u}, + {6615u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3857716u}, + {17544800409680346599u, 11532802864003829972u, 11471459323391353281u, 7997497643933127476u, 2342542u}, + {15574009688905935858u, 9623955067885085422u, 7282319822637085213u, 3285804012460170484u, 1967619u}, + {935599653485233342u, 12020463305803379961u, 12936568588256568777u, 10196416926761211302u, 1630117u}, + {15318879783222750377u, 4835872281101439257u, 16838748304823142157u, 7379944953174269591u, 3307648u}, + {10119479332398635571u, 15179211444960551851u, 2911426741582931362u, 8852041816149070396u, 525812u}, + {2532018013465347960u, 14104261921373140658u, 16664467404392824240u, 13772699989491162958u, 87681u}, + {16469133613531796206u, 9403004673861390266u, 12661945757400881645u, 10233795796125593828u, 1578030u}, + {13902333974577414567u, 13684152132053690037u, 15904603967170758767u, 3271701257491188799u, 633183u}, + {10227185221048973259u, 12850968526372944094u, 9445886401210591231u, 9739455363144796252u, 723082u}, + {16058845788119022142u, 12616869308215610180u, 2700543648173142233u, 6858809951940915333u, 3839354u}, + {11078611648485353167u, 17504295965550624084u, 14314883641441363769u, 5907488704577345829u, 3381315u}, + {17948314019147223013u, 5875621392986432307u, 1841001103091696946u, 6907845691948237837u, 2814257u}, + {13986616282732402450u, 2857764617153805227u, 10153588750665595453u, 2069526518606473521u, 2837399u}, + {16263781389351599437u, 17882242957189433079u, 12030234251520952413u, 14247686800729329318u, 821355u}, + {5841043006873237325u, 451450524458814155u, 9165984191178211497u, 9382638564656980189u, 2251933u}, + {7917646177237891746u, 12763143011202989100u, 6571724841321548674u, 690059187446130960u, 2687805u}, + {13743881783988543458u, 9770762836190000456u, 15262353486334039606u, 9993529228879151256u, 1880170u}, + {17763565378908738004u, 16057832102182261268u, 9979798796881805398u, 8753651903387875972u, 988440u}, + {8395886311859423340u, 10211099090523130372u, 10831836117702607842u, 3044652458058842684u, 604837u}, + {15782460544121086308u, 17284559694351143068u, 2390869154782621736u, 1308193969072665570u, 1884880u}, + {15584747315507973438u, 14994770487749889521u, 13330201109503324059u, 4358225542553523788u, 326371u}, + {5598856330439769054u, 13175986212523805025u, 11510571377885230394u, 17011612679619299098u, 312713u}, + {9668589099059791700u, 6779416238795356547u, 11691422922922855780u, 6130664046915009174u, 3528477u}, + {11085271340980819321u, 8172156219755884914u, 8713836194422657938u, 9432576143250266184u, 254804u}, + {5555587661487744029u, 1140855608160854220u, 15499497599164084061u, 16361774160219175103u, 3672017u}, + {13625835015766761345u, 3887231854161651529u, 15043404201463774163u, 5688229109153463894u, 1319278u}, + {9867674190549731119u, 17014827282557566331u, 18268126885324884695u, 24336389316304498u, 3696929u}, + {10745393033100857718u, 4402722923441967798u, 4842118373339204965u, 9147453151924931304u, 1683365u}, + {1105603809022255786u, 1088757627248919681u, 5183519299141575282u, 10839691718174283631u, 3219398u}, + {987061978252036821u, 10791280093415288833u, 4200891772037910382u, 8490125924254672613u, 1332927u}, + {4308186627556886163u, 17236908877296856801u, 14047797810291001575u, 7086232387445001103u, 251440u}, + {5099753832807293254u, 2489031425293859546u, 1906067823580460900u, 436983820643693533u, 2653353u}, + {249552760910725434u, 5548267726588639131u, 10194814124682398638u, 4588574148554653248u, 2427875u}, + {2883654561494955731u, 9392775982610012273u, 3400643408231626535u, 16618033022079957006u, 976514u}, + {2776753579293086277u, 5371555654452013068u, 3075139202169013228u, 7872291270594572455u, 2176835u}, + {13609973764563588842u, 519686623143512896u, 7131286488394713706u, 4507726356359516834u, 2786933u}, + {13384958694085245135u, 14689546253216328666u, 3197753459379006685u, 699928190650653362u, 1351658u}, + {4393613530206875886u, 39360293688222166u, 14182459871129426307u, 7735096251959399447u, 203480u}, + {13328274164620128736u, 14846853463815474931u, 9633316387323780405u, 13478523636311738703u, 1730631u}, + {7807738565072577730u, 6778868353720490551u, 6170221901611162298u, 5796532043655786551u, 928408u}, + {2256810519809100328u, 5270617779938145608u, 968341157519498185u, 3836178594578697189u, 3044990u}, + {3356399696289569815u, 6465787621181086038u, 2838972895611892998u, 2578185946400661202u, 768625u}, + {10272787351187424142u, 9036385330745321399u, 9435679343480374822u, 590639383545264438u, 3250690u}, + {9740502886954852017u, 16759074894807223680u, 16378485508400509555u, 13462677138138202381u, 3354032u}, + {8654990377900329632u, 18083303442589581352u, 17781150385967647937u, 17067463176332702228u, 959219u}, + {7727520698632223187u, 9527028502374686533u, 13360056848135510873u, 10249872837856869690u, 938170u}, + {7714728341858237776u, 5868009520534589335u, 16536628194890202034u, 1098170102706423967u, 988023u}, + {1903461218522799978u, 15561197269771821115u, 419094085457685448u, 1819665659466307235u, 979371u}, + {16455559336468927280u, 11553221359219287460u, 13687867260432736405u, 2972427563564924032u, 849902u}, + {7757127509310167091u, 13068585317481887113u, 16647553152806222702u, 14427196735239748658u, 1563743u}, + {8810705854343794599u, 14956506439195307569u, 11296921597169248032u, 12494809749906784458u, 2508164u}, + {10465964519826948150u, 464100616089296920u, 13395610173841746189u, 9774042667017972753u, 2806573u}, + {8644367857944433767u, 5673578836686402814u, 7849914573600744751u, 14823578921404452784u, 740388u}, + {10623619783907265500u, 11568481215452460443u, 16718649259811588062u, 2103327989874734732u, 2836137u}, + {13939857320955716653u, 7520745797667722283u, 8601387024292351546u, 14175605926934181832u, 1337771u}, + {4666709478652396066u, 15375299101217104963u, 9390679734560083364u, 15012657093330847115u, 2632543u}, + {15649205965123170470u, 6424702360355270718u, 8682635313855410193u, 8551357958472189105u, 3763560u}, + {6558725962211605466u, 5037754770813928952u, 10184485504304190971u, 1870865287625606678u, 2443945u}, + {8649788540463719204u, 3805868398144270351u, 13830848481575540549u, 3792077719788340049u, 620117u}, + {12168905914597320830u, 5247546858427270811u, 14901263661885383486u, 1236418242031609177u, 221258u}, + {15472373860621308658u, 8051914621860913826u, 56485882163090048u, 1445233371695237790u, 3679874u}, + {66569481787444321u, 17068684345379619285u, 4401654600194085656u, 9867714484504930530u, 3354708u}, + {10243577131571059664u, 15503694905878487788u, 18216872891422238284u, 2151553676885650650u, 705849u}, + {15951449987836409613u, 11606595980121395556u, 3398861202521747927u, 7290837615839959026u, 1019947u}, + {9913906658804729908u, 14088641307152628313u, 16270828459275115100u, 1532024183365072107u, 3778605u}, + {7535085169604661037u, 7419075574101452201u, 11972818434667377816u, 14985624926773746215u, 2484979u}, + {2734380822511395686u, 4247006439295195765u, 11786035775677069137u, 1847279637575366014u, 3114431u}, + {18046997911938073596u, 5079666951763321849u, 2293603790774264177u, 1138315024008425990u, 2518037u}, + {10327012584653615639u, 8581349513604463343u, 4259791909380700219u, 16043235461665448194u, 525942u}, + {18342072517349109262u, 8619670524990453095u, 12201976402879187365u, 7647806901535211626u, 1956487u}, + {1898700198291696013u, 13583998854736083146u, 880732761345002787u, 10196211581968185657u, 1945555u}, + {13947598137893191880u, 9161623031944813761u, 12220092411899340230u, 2846135332841727072u, 529423u}, + {17188699772109316756u, 16261883491262582578u, 14516197451596114781u, 1162687638040717840u, 260736u}, + {6431368240713658926u, 2773206726507798628u, 12744250736984414169u, 2815055898904679875u, 1395406u}, + {7837090150348786980u, 2366962701360042904u, 8982752184945981016u, 8024133638385975545u, 3396512u}, + {15466248891620978742u, 1218466625590467045u, 17788913580134870837u, 6475780465007003318u, 1511645u}, + {5522485998199373844u, 13752745825198406893u, 2943577185397539467u, 14079115772317030660u, 190534u}, + {4194844745202074354u, 17038215845447160348u, 454409791544685090u, 796148280431663244u, 1462009u}, + {11201916609985798482u, 17621482840856698248u, 5169142714079556718u, 15807582400958826292u, 1368241u}, + {8577581495548496721u, 8157399019806424612u, 10541461044487254248u, 10329475554789433679u, 2835350u}, + {18029655893869906961u, 9191996199378131135u, 17780065453324672320u, 13815303447383103707u, 2292494u}, + {15957729912941221686u, 16154258287284650654u, 3790326512495646672u, 3212823201592647336u, 2819849u}, + {7482488730587623268u, 14361376736424735594u, 137858425211261578u, 2429917639293950895u, 2190314u}, + {11309479393499802125u, 1663805608722623788u, 2438628557705473243u, 12290195150676729822u, 1219003u}, + {9943495969526752383u, 10523202730398920534u, 4155842440635035407u, 3769481538628531987u, 1212409u}, + {5064697147942834974u, 3721333690154750266u, 7263127509192531660u, 13713307869511451502u, 710087u}, + {15172478180688287922u, 16794202913551272696u, 16413951511531976884u, 12695235357547692799u, 3560382u}, + {17013595438720314408u, 6901411386268321785u, 6444741041034449741u, 5469997021098472718u, 1612615u}, + {13844165026930764746u, 9968241774231475748u, 12501516332433486977u, 14369208715212081413u, 3568458u}, + {3096881393728036316u, 1236950731922204932u, 6504497973276711495u, 2083439078894972362u, 2323781u}, + {1272635342718881247u, 3589434295653134335u, 8462489192415687955u, 9338295826366491678u, 3255861u}, + {11722283079588382887u, 9416753298405859475u, 14766859443264123465u, 18218573741502707752u, 1187178u}, + {16184865478070173824u, 14966984684239432565u, 10534703126287055630u, 8740868465543792355u, 1268352u}, + {12630797747023290415u, 1519860869167616940u, 13928199126186168148u, 7877674723614391146u, 1238927u}, + {3866719362942789753u, 11088481675043470985u, 4968578473470090845u, 3625733879069080277u, 1695601u}, + {1033945783029034803u, 14059620114094503046u, 9199787750397908103u, 247451103437643676u, 2010993u}, + {6254654097929942135u, 14691435748304988153u, 14214292943764115254u, 8323719587814185135u, 772415u}, + {16259126567113565532u, 1444927095411655422u, 2317976830511071196u, 12624327506784802751u, 1343095u}, + {9981104052595746021u, 12725728643336637231u, 230478621842547943u, 17750943875686278693u, 2708786u}, + {16059262850309703472u, 17046972808979838269u, 3135519801123933420u, 8336591614205103917u, 1009811u}, + {11605599284647916901u, 4755720205450244852u, 4279801296433553791u, 15511010451570914570u, 3176727u}, + {11014669326114525770u, 4592933487432888674u, 6407576207594300229u, 18000941200916109638u, 3070562u}, + {2943901472384111028u, 10609340653330462555u, 2679165086238511534u, 18431328369049022629u, 3594043u}, + {13800338537314476826u, 16085313767193946396u, 1247850610558378038u, 3092717359435208979u, 1569822u}, + {16990258166272619632u, 2763671548979296215u, 3175447078712574933u, 18043356617249980235u, 816521u}, + {285277419903906412u, 3895016529357525491u, 830623149719677373u, 13922177821281257662u, 849381u}, + {48026227608388754u, 9571423381704880860u, 17384347347037398947u, 6140563821074123873u, 3205232u}, + {4165093517290886566u, 15684630211903320657u, 11425521948964519869u, 3445833020324041026u, 1541394u}, + {17974320029114635797u, 2621790537911244120u, 17111822022876108251u, 14512010105704099616u, 1779724u}, + {14848694411468758660u, 11053396983488129140u, 13730531441774717931u, 8823856600289056955u, 1362682u}, + {13705546947977229219u, 4321928318260002213u, 9301790395574499492u, 6942666082572789135u, 1510225u}, + {15079723440674228037u, 1607251017299674415u, 2989529805732201926u, 9539461154017871642u, 1829807u}, + {3540089859394544352u, 16482984682436167353u, 9807944821641119171u, 15598194303165177583u, 570750u}, + {704306598175888123u, 5059117327994675800u, 13835234840238566892u, 12404434669301869021u, 1682862u}, + {5944762115711203702u, 14327990110804540307u, 13899142297837138492u, 9542645750036293224u, 1338411u}, + {9418276263951912757u, 4412920373112797635u, 13359416151938334705u, 5140778511417966880u, 707989u}, + {10878678432429545965u, 6222728155319850940u, 2896638813483189579u, 10749641608682042527u, 3265410u}, + {7562745897287263620u, 1241469036776617583u, 11518978710870934185u, 8563032289790869963u, 2232672u}, + {17200570282429384759u, 6849918483672192486u, 15061174683919222634u, 13515955622640093573u, 1713323u}, + {9587782428823602087u, 7176058123542191597u, 13714666151462780029u, 2985966599967601268u, 152862u}, + {11062568158205247210u, 2866922670570331728u, 8240645002940098471u, 3605699511074958789u, 2344906u}, + {14796233487724855311u, 8502005305870723263u, 16908781566917241695u, 2781444457905867048u, 240999u}, + {5173894369887095038u, 16592400020724371729u, 2504540875533840941u, 6417571519032050690u, 1753610u}, + {9004622895403831726u, 13071586829142787203u, 15520803619253411421u, 1401442688013300109u, 1194900u}, + {18178761646067761541u, 17637152737238131063u, 4413540498501137037u, 14865906387708273047u, 2489050u}, + {12620304687585738378u, 5419428173301134934u, 2916021591745555721u, 10710438800815907675u, 3243614u}, + {8129498830902594827u, 8895951650571616663u, 6849052853434342147u, 3086253077635313446u, 3850131u}, + {7585355902728533152u, 8328181421132258254u, 5684827981202152389u, 7925300134427653531u, 1018055u}, + {3041080318687649125u, 13376593108812769583u, 18411333912384671552u, 12845031546714433119u, 244370u}, + {11835512147960308884u, 6060577723654010491u, 15547562279199342723u, 5985288148842342637u, 1949315u}, + {424580806526877277u, 11487650018278681805u, 8313683356853089450u, 540361679174826835u, 2739854u}, + {16198306391693874836u, 6974201753461280864u, 149988621255864276u, 5526918532960214225u, 2870426u}, + {10089007212082933592u, 8256801982824962205u, 6772217402341337877u, 17851175746699640538u, 3666313u}, + {9319243705051339260u, 6386798001960859287u, 249996665032578749u, 15920302243800435954u, 2826240u}, + {6370541293299510404u, 11864684828508370832u, 17702229683115351593u, 18282706233486950934u, 942400u}, + {12757499328006448801u, 13353512029655413535u, 17153061643990977353u, 14068615067293717634u, 2210992u}, + {16619297443874670534u, 4185533943429336225u, 4432396706585308745u, 2058398250703616504u, 1806180u}, + {14923143864328493412u, 3880776013289365585u, 11831804077091648546u, 3852370626279631576u, 2148754u}, + {1357351307280635959u, 3062181397955033001u, 2817150611150342329u, 9911527902163857552u, 3572553u}, + {3668058783127750858u, 1983274556986531413u, 16938781778081982253u, 498247545019858797u, 3900596u}, + {5679138393406271862u, 2168894032705611397u, 3966454585224104047u, 5043927285262210311u, 126767u}, + {5430931698521438457u, 18219099724793823713u, 18297616595640674190u, 9658056044532262647u, 809152u}, + {15549184435999294381u, 14609951447929760551u, 11832706044508352463u, 17308748798621490915u, 3887056u}, + {14967451577464369293u, 9688868978890177181u, 8997831290510049459u, 8142154076788854785u, 2393695u}, + {1246273204867433479u, 16921234116739399599u, 17419553833266253231u, 12221889279607493445u, 3793146u}, + {7526043415542322551u, 1602854709617613385u, 8882427911769448082u, 9293343242572880178u, 2768946u}, + {11604121396766488152u, 16269310806950676375u, 12576933191685388735u, 11220005123388095090u, 3361597u}, + {1127614188208573281u, 5209534071206389569u, 17926284734405279872u, 854644065175162226u, 396987u}, + {2932444392667059699u, 16362633884950432339u, 17386853538782914711u, 3898433196492342342u, 3007524u}, + {1696266129926013333u, 10426732988207090686u, 123613973714534531u, 2793667602863234010u, 1727055u}, + {13399025394438897309u, 17198577815572482333u, 9765796517323971038u, 11921361560637997492u, 2490126u}, + {15419872989371613004u, 1781984382320139930u, 10428702743389188098u, 3288526460661408751u, 3534191u}, + {17843256827616168517u, 9438678930583724071u, 11007382621220840997u, 281367102286917902u, 1651071u}, + {6893956892016493007u, 16623099056255024642u, 7066922541180083452u, 13000823811292919285u, 2359524u}, + {1166452899255144626u, 10642018094809768688u, 6642858288275810259u, 764101488743878627u, 1722367u}, + {14770178411055317143u, 4286245673982202516u, 591655323593052260u, 6156667557237978948u, 387737u}, + {9312641675368762032u, 13387674709571953743u, 12044099460440861665u, 6204105578625377973u, 3722680u}, + {1134370564188506715u, 3999957189324786792u, 4339206462087344742u, 501016895659990268u, 2405375u}, + {6333063717709612294u, 17007784223549228991u, 6978887846496858040u, 13230911046468128296u, 3526742u}, + {12887733617830521765u, 474832638694753742u, 17587925805250562993u, 17142706707307834449u, 3165158u}, + {6084211064483089173u, 11706905614676318868u, 5195152437442818389u, 11587601922790030844u, 1815932u}, + {3914277866523325499u, 4769945904864708769u, 5076118887509586479u, 16967032643359926416u, 1630025u}, + {9268251659381559781u, 9261024336589612858u, 4294343291002571812u, 3272660402682538175u, 1825039u}, + {9662345414815814484u, 17025595777698571575u, 1000757987939230843u, 9257038067484975017u, 2342985u}, + {5111466893458959100u, 16407354615125549217u, 5127987825683274094u, 13590048133051030409u, 2403507u}, + {8844787613326861982u, 8602477337236277578u, 6031120939897581742u, 6241289979360220052u, 2758300u}, + {5770605712075518039u, 10493809898244728274u, 10747679115810615217u, 3797876550392055707u, 2849813u}, + {4215759608540733736u, 4953789327930183122u, 14969597666868399341u, 18139025878386718924u, 3522444u}, + {1518154977311431501u, 3030781406606010138u, 4043312850204310414u, 8928061707786135774u, 3249109u}, + {13734998674193381129u, 14702311476413406754u, 6044000400184938554u, 9499480310087207691u, 2761774u}, + {6662145269763409341u, 12678450057361473653u, 5385240552661759653u, 9922836130863032665u, 165115u}, + {5594089166339686397u, 144875815352697195u, 8819545236584124080u, 9082302692849486619u, 3678145u}, + {2427142513496767995u, 18295102687983474357u, 10664412120717049010u, 1509001689321855831u, 1507959u}, + {6768363437059636076u, 1864969717963393835u, 1239023076741103957u, 6440942804631234975u, 2209010u}, + {15347781594267880075u, 2148900270768599428u, 4547032671998508953u, 2778937622008469509u, 3282898u}, + {2176073647990814709u, 11965756970020545464u, 10874958420254909956u, 9500103600973590177u, 2094570u}, + {6122046248203811179u, 6205114086379721161u, 9258703041313877911u, 10991392299999619688u, 413384u}, + {7382776745676142215u, 11883776655040654091u, 5254522444811346500u, 13554453278974010617u, 1531098u}, + {2262792946061195106u, 2374322131252539627u, 630232739831648170u, 16889720791387358850u, 1612958u}, + {4135286218966941189u, 11708086079069317256u, 6323525016525423702u, 16170654904813220866u, 3412262u}, + {8690101314669201366u, 16969466654467448400u, 15302243057512222642u, 10655411463572505798u, 2623341u}, + {10984395928777805286u, 4827267710043540417u, 7717653873915841953u, 4732135723165796592u, 2206419u}, + {828698608719416106u, 908883795145604104u, 6139439762519468435u, 7102345467061443606u, 3125241u}, + {14860758564947343286u, 7168342527084654930u, 15926606388429146135u, 345880904149721323u, 1734772u}, + {3979978942690929508u, 15447342878291318420u, 7853016469934711521u, 17686111434748462490u, 1056747u}, + {2108114355715940172u, 7029851138626033678u, 5349844333199587403u, 9747268754266043142u, 1910744u}, + {13678561451585636493u, 17740014985884868658u, 14001179218263619431u, 4070472281429609253u, 3758737u}, + {15076410940367182443u, 14790845698520461567u, 6310229852699893274u, 9725054064632198524u, 1725278u}, + {1069327940644186460u, 6664676311680121905u, 7842592149902049497u, 5940548482557146284u, 303315u}, + {5610370626001206592u, 2221376868951124197u, 3791789569170891495u, 13984768423477285279u, 224685u}, + {498506680579448994u, 14191886691330293435u, 1514961716361093821u, 5840809837749132670u, 330474u}, + {5923588850423879592u, 16061555821702336355u, 2026903411016644034u, 16651400397903178144u, 317075u}, + {2396456428846628135u, 5075362249827574445u, 18111407060900450444u, 12615927974665960653u, 3702091u}, + {4744470351692656334u, 2700053403132115177u, 5858496100478298109u, 8571087634306007890u, 1571541u}, + {8453956446270181170u, 2514697878419770215u, 14059520736254192398u, 3199523960868258400u, 2965710u}, + {1560814866554256827u, 8798000414312924556u, 3529706278368970909u, 10719231614179699643u, 387642u}, + {1671366141554624369u, 8844674206430830336u, 3453767571081840394u, 3898260821533561076u, 443322u}, + {11668934524276879378u, 15337287889276700059u, 6918809751642398933u, 3322827177119190943u, 194143u}, + {11155427262172533965u, 13601061657000024076u, 11041778859432644604u, 363869279747169050u, 3483362u}, + {11270541751527537504u, 16216984231307076597u, 16295522459126721080u, 17069848880644947226u, 2394294u}, + {17538765033671596133u, 11982458205004364209u, 15160019998841492749u, 9843999734883266513u, 474033u}, + {2748548079537637076u, 1484036975597297259u, 14101684376251273850u, 80801969315420430u, 141607u}, + {17956961088122407460u, 3631029840665284172u, 14593354686808299835u, 13405324679223443853u, 3543404u}, + {10757873388807397623u, 6193540572366404585u, 4755288715205998590u, 8063757218353084295u, 1870911u}, + {12987943013785076404u, 10529876084404992886u, 5101013044898354902u, 17760680357795717485u, 3552088u}, + {7763303512651916874u, 17595994820487761410u, 10630705377676807335u, 5181613652716858627u, 3602789u}, + {619121180026933627u, 12756833909832931403u, 8742200737153159516u, 2084072364878171822u, 353817u}, + {2999922471299731788u, 15710195797508158211u, 5576268008777804023u, 6275537455031730489u, 3056973u}, + {1929809288664283818u, 3754040362880240727u, 3024322611832472746u, 15260543546849572060u, 3519562u}, + {10095703347466448983u, 14064240001579601922u, 13914088558497764617u, 4748668087191412723u, 1507792u}, + {15879202908695482748u, 9463920120844126460u, 8146166959653245247u, 10404107399350677543u, 2086780u}, + {3928106883841543330u, 5274964813204399252u, 8705277215221849996u, 15458819431118821321u, 2583620u}, + {10946476575536964617u, 638357921874005163u, 15955534187669749359u, 6172554885606411462u, 2104125u}, + {8722062943472496061u, 7796109651131618690u, 16609954964409366674u, 2272599676722415011u, 3698845u}, + {9117026750459343924u, 18263065608012598308u, 3126696038836679683u, 9003373310058983947u, 251911u}, + {2642627512280701127u, 12261190188657907619u, 16899470346371158950u, 11750034774931979124u, 2396980u}, + {17605008869432363232u, 6999178276775742293u, 17791862613686420723u, 14960138454210917847u, 3566452u}, + {17773454257992667085u, 2807328582095437656u, 18278957654048548713u, 11378831706209993983u, 2777817u}, + {14761179515607352624u, 16206327850056610767u, 13858969757800387740u, 5815849213695666231u, 869369u}, + {896946511161048838u, 7901815948155626074u, 16131982723231231433u, 10896733732991584348u, 3091700u}, + {6552757392733832844u, 2092838481743129781u, 13332781785846861447u, 4812833016052665329u, 2777652u}, + {16168337817399902885u, 4301124440267995553u, 9554508833631698880u, 2573254431710138259u, 602848u}, + {6187195605918631278u, 11591972939743690350u, 8904992809805591996u, 16152021649840459751u, 2791868u}, + {15074551427286210380u, 5383487102951805731u, 5377566045905302236u, 13310098193614341212u, 2618943u}, + {13516532735539958715u, 12368760242468597887u, 15720372489899474432u, 5092342567229686827u, 2347477u}, + {4946190120944765015u, 16515985660091125934u, 6060855958238653633u, 14022476555888281628u, 2701344u}, + {719597419339335485u, 4732721486937687362u, 16396453629877659254u, 8696742299996879730u, 3809212u}, + {12701075048772140657u, 10210929664300446808u, 9724502242609214851u, 18372896453216941352u, 2530614u}, + {424693498551986469u, 3017032647676645124u, 8672064831772907138u, 4802482813683486652u, 3249945u}, + {10436359165856342671u, 3584325785256651643u, 7565890991158241202u, 5968673619581205554u, 2741960u}, + {13050644566481257222u, 5737126046912894091u, 13470050751441573466u, 1924077685335148597u, 2464938u}, + {2259409376144086826u, 12045464635328251338u, 1409117370703925832u, 18276041373963406968u, 912674u}, + {11043423031519278036u, 6205105896105060099u, 5072636064655458754u, 11690166116121095797u, 2649738u}, + {16380307402686693168u, 3590017420648203531u, 17937711243631601u, 265051832552332924u, 1797381u}, + {7613404185343417097u, 13149457532638280630u, 2683090362520317693u, 5869820944647162796u, 1256021u}, + {4540856247288410262u, 17678854184838792528u, 6962589482368832898u, 9534771916814513241u, 595175u}, + {12201071147641578481u, 500001856595338932u, 3644450202945597779u, 14998958610327852687u, 2289074u}, + {6963283827333748112u, 12669624401371282509u, 8922621324189109456u, 16471357417890310636u, 1334731u}, + {16288482347406215167u, 6452220398802016684u, 7900480986896793335u, 4203961911835424129u, 2260542u}, + {4369434168167879565u, 17253331068422672961u, 1190921823745913712u, 14813506421721060329u, 3718141u}, + {3457047366124385696u, 17203040108237254828u, 12472326697419519755u, 12102205814604438239u, 1574359u}, + {12435476948768424961u, 5420034960066582907u, 10644737638797551107u, 101099403693275046u, 1539769u}, + {4879344948511713106u, 3776400979247396544u, 5081925817313111005u, 13142885839679615438u, 3304132u}, + {2631882279620083511u, 12158156881271718270u, 16227467027829683979u, 5825558013566874807u, 1473152u}, + {17292633088783225981u, 8283536319239366448u, 17507591553776966310u, 5647667198709610394u, 1637552u}, + {13037562234674176699u, 14319446061789362950u, 6963543083181480431u, 10190328267646897398u, 1580747u}, + {641840564237254507u, 5036205215312992904u, 4339311548107776288u, 17827385372912812612u, 2581760u}, + {6713403704043213879u, 12289217955462456708u, 16471776111427648633u, 4010792755893162224u, 317484u}, + {17032053021020464825u, 12228334133412053672u, 3291201095528558597u, 13624741823274670263u, 2919713u}, + {8750179864256846153u, 8894756824873380308u, 6494664558203023907u, 6971388239745506415u, 2470835u}, + {6783650315536788753u, 8439870701113223766u, 13145625298248590903u, 12799773012577997051u, 1403625u}, + {6195104176886944904u, 11691607627100565157u, 17801201218779658914u, 13572720003080685549u, 3414929u}, + {11491286867794316392u, 732017028573771272u, 8691382952773125484u, 6476120204241195192u, 346082u}, + {652026744088017112u, 3417649452130382275u, 5230827084972512429u, 6995970714237647545u, 2623034u}, + {14136469055001681371u, 6160708060926455956u, 4633277734682307208u, 5524763590773132510u, 3463944u}, + {16571825653270408341u, 18422501959104400942u, 15422695793617744747u, 16637145122701850629u, 1234960u}, + {4766861484993296055u, 645875333719716352u, 10432482136418653061u, 11335823271653099422u, 3729140u}, + {73432803575484469u, 14322916384774056722u, 17826742780825158808u, 12895042241282029116u, 1783076u}, + {7385918459950954465u, 4650957675143706027u, 13637307722260143087u, 15453217083647594277u, 436861u}, + {12644899720666372137u, 11856171322341120220u, 1404012197555295537u, 15860729366860147832u, 1445469u}, + {12807383093391908893u, 10973689755278143522u, 13373441863045232630u, 17680774751862554558u, 2295171u}, + {16034191569670754609u, 4020972105141197306u, 2851883138558140439u, 11571553495791644537u, 1569777u}, + {10001027642775061761u, 13997897485823802053u, 11045064921461520463u, 14800764063918575934u, 974126u}, + {14324801798947494737u, 11118171113365588692u, 10995431769561841926u, 2035582100880292662u, 111881u}, + {15013700902493453843u, 12964232546990463776u, 4143920097136071251u, 146179030285148671u, 2068378u}, + {8648443412340839244u, 2200917111783183252u, 4381978292481577210u, 16179055904255727909u, 1001846u}, + {5293959738356270523u, 2641129740426270714u, 12986711576561796752u, 90538406980253459u, 2950843u}, + {14691348135951721731u, 16275449847523193797u, 7368842414108920673u, 7764596007771524873u, 1884505u}, + {15103694764222885903u, 15867054018355492652u, 6265159063846214512u, 9834595778363421322u, 1861238u}, + {8417878812632134432u, 9483718182957769622u, 14648226142532502070u, 5294538155649598124u, 3672292u}, + {6168608160777412539u, 17551110496909358607u, 6873662611095050389u, 7201443645737334816u, 3435633u}, + {4224534891115296482u, 17526707067433967597u, 12626201307151009116u, 3450083169666247605u, 1639362u}, + {10076981933668207498u, 11138510589143790794u, 11484142228884736927u, 17324063463810952447u, 2429843u}, + {7506035255647202583u, 7039696050948875734u, 15462590961258446437u, 188937897360213973u, 1147191u}, + {9688557424725600109u, 3224433704664241247u, 10848984530070969659u, 4632847957396988735u, 1813770u}, + {8854183909719754242u, 7684259444340235093u, 15339225039216422844u, 10337694103055114978u, 1868446u}, + {350830905206298988u, 10039542111761281892u, 17226007077458168286u, 13437179246569836515u, 2319418u}, + {3594577486822437690u, 204373959495876111u, 6639278412599486278u, 547188881948630059u, 3185514u}, + {17777972257434256793u, 5481634579828368759u, 10240169175963127049u, 9282134398903183498u, 3845096u}, + {5381672447583042020u, 5721803574440025300u, 18145299087532902031u, 7853149667229195788u, 1069057u}, + {17844712376365848101u, 2272868187078400616u, 6477424781001411090u, 5784328151766592259u, 2293733u}, + {1501969485648718181u, 2869517993431104210u, 13344647441403532363u, 14237657936880553574u, 1420659u}, + {17172351240494642645u, 6063028824265729532u, 14200091795770805942u, 15662704453457032186u, 58902u}, + {17685904663573866543u, 1887098788857023423u, 8602045459856761071u, 15565526877974568269u, 2392161u}, + {11338514080813146903u, 9460047288535686222u, 12504133687767177823u, 2710258576718969624u, 1391621u}, + {2736669495405305668u, 9701149782926880714u, 11960484439750910848u, 5718220808141165280u, 3693274u}, + {8561507769060670199u, 12819569821239990727u, 12473615748218209121u, 16353145138562019914u, 2949578u}, + {10794535379367982426u, 572876802557144501u, 7349883126738027274u, 9638070133889004698u, 1909105u}, + {12168535911949437203u, 3084777475545807273u, 7874331729475391868u, 4142499641144801759u, 853375u}, + {5051476055095598028u, 456527625479499827u, 13929242692731534648u, 17741910127696673785u, 1070001u}, + {12783683133287696891u, 13452337258335430503u, 11720054024584611321u, 1244717150992298333u, 286822u}, + {2232694284600745156u, 4890237050927824104u, 108885331262778289u, 9733066128393698032u, 3512144u}, + {3415465285345756026u, 6277789768395806964u, 15578694775529861531u, 4820588837754324463u, 2757676u}, + {6930974567663968855u, 9868639058597205323u, 3994252831058917358u, 7616917522213233179u, 1849990u}, + {10996574817944278986u, 5804638111240956235u, 11203021625095453990u, 8104576831933768287u, 19u}, + {1434141594051545771u, 12947279836299239107u, 7659991875046142560u, 358592714232u, 0u}, + {8674726375057733525u, 3466908247767529467u, 10933647754209300152u, 358u, 0u}, + {16009492869409670771u, 4220221762948002169u, 6614868026142u, 0u, 0u}, + {13546323010668832218u, 16012256094983687480u, 6614u, 0u, 0u}, + {17673377328473429567u, 122022777559609u, 0u, 0u, 0u}, + {14343443126950043463u, 122022u, 0u, 0u, 0u}, + {2250922948805314u, 0u, 0u, 0u, 0u}, + {2250923u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 194496u}, + {11441047283241672767u, 1020956744130485816u, 17544800409680346598u, 11532802864003829972u, 2184399u}, + {8920050759752291038u, 15466788673429930224u, 15574009688905935857u, 9623955067885085422u, 3193121u}, + {6061747390345693918u, 9530915892817289020u, 935599653485233341u, 12020463305803379961u, 434411u}, + {7445392724187780459u, 10728861245192681656u, 15318879783222750376u, 4835872281101439257u, 2554201u}, + {11752301859773913370u, 7785749840623118213u, 10119479332398635570u, 15179211444960551851u, 2874820u}, + {16520592420212427260u, 3420297636869848682u, 2532018013465347959u, 14104261921373140658u, 1925404u}, + {11503176708565770053u, 13923224474916940961u, 16469133613531796205u, 9403004673861390266u, 3538123u}, + {15801107346241565636u, 7380600406611504187u, 13902333974577414566u, 13684152132053690037u, 1339899u}, + {5719306375227263710u, 15782062130327296423u, 10227185221048973258u, 12850968526372944094u, 368105u}, + {9406074037669603327u, 1887840579048748738u, 16058845788119022141u, 12616869308215610180u, 3597285u}, + {10411121630868158962u, 5747451702445388175u, 11078611648485353166u, 17504295965550624084u, 2111823u}, + {2163436793260180385u, 13239545474553376554u, 17948314019147223012u, 5875621392986432307u, 2575980u}, + {17821602698000438742u, 1992335386482400u, 13986616282732402449u, 2857764617153805227u, 648333u}, + {15869233373586745771u, 17292017167815458947u, 16263781389351599436u, 17882242957189433079u, 1035681u}, + {11026407048972493468u, 12707346552501252030u, 5841043006873237324u, 451450524458814155u, 485119u}, + {14840809934062348890u, 17902289689459957764u, 7917646177237891745u, 12763143011202989100u, 2330364u}, + {4266204858718155194u, 9126108442235195282u, 13743881783988543457u, 9770762836190000456u, 3309322u}, + {15978795545954368821u, 12102414146444608735u, 17763565378908738003u, 16057832102182261268u, 2763540u}, + {15221693016433143055u, 4417281900609265483u, 8395886311859423339u, 10211099090523130372u, 3404108u}, + {39655110084154956u, 8370500461167967061u, 15782460544121086307u, 17284559694351143068u, 368136u}, + {17475671254750519238u, 14024141082671186629u, 15584747315507973437u, 14994770487749889521u, 3334143u}, + {8794882320782886586u, 14822541443874357627u, 5598856330439769053u, 13175986212523805025u, 325390u}, + {3023294356642930341u, 13338975186626447781u, 9668589099059791699u, 6779416238795356547u, 1607226u}, + {5701377492268866491u, 13012383218269900428u, 11085271340980819320u, 8172156219755884914u, 3252156u}, + {8376668481821244842u, 13197529000800226497u, 5555587661487744028u, 1140855608160854220u, 3696011u}, + {12085899439808763268u, 4074250547001046690u, 13625835015766761344u, 3887231854161651529u, 500635u}, + {10034729545101531803u, 17337297269314063499u, 9867674190549731118u, 17014827282557566331u, 390837u}, + {6037104220031607450u, 3667225393657190695u, 10745393033100857717u, 4402722923441967798u, 427919u}, + {1314306153139988403u, 12354879305644542699u, 1105603809022255785u, 1088757627248919681u, 2965216u}, + {11365635426809408008u, 15324167369363318134u, 987061978252036820u, 10791280093415288833u, 820952u}, + {14319969362107345051u, 10056557248560826917u, 4308186627556886162u, 17236908877296856801u, 2118163u}, + {18354639734677162146u, 9394961926291036376u, 5099753832807293253u, 2489031425293859546u, 3897196u}, + {13936179730447969647u, 2990161237875016534u, 249552760910725433u, 5548267726588639131u, 1370906u}, + {7613981695116005050u, 4554690470616966160u, 2883654561494955730u, 9392775982610012273u, 2130115u}, + {10027435513555428565u, 6041979006480719082u, 2776753579293086276u, 5371555654452013068u, 828518u}, + {16580233047920873107u, 3038296297635179834u, 13609973764563588841u, 519686623143512896u, 3353148u}, + {3051646253753065627u, 10044109465607737009u, 13384958694085245134u, 14689546253216328666u, 2133725u}, + {13004748875373714208u, 11466920216908221332u, 4393613530206875885u, 39360293688222166u, 162039u}, + {938757253886045687u, 8768012787356370215u, 13328274164620128735u, 14846853463815474931u, 295689u}, + {10373911237636980818u, 7302704708066940670u, 7807738565072577729u, 6778868353720490551u, 564512u}, + {2331663702030827545u, 7983891351253808093u, 2256810519809100327u, 5270617779938145608u, 2854799u}, + {11537694592375704048u, 5629581035300642981u, 3356399696289569814u, 6465787621181086038u, 1582180u}, + {5464054973186652707u, 18243116042426163171u, 10272787351187424141u, 9036385330745321399u, 2261270u}, + {11809788018198542979u, 14874791186599328238u, 9740502886954852016u, 16759074894807223680u, 3735343u}, + {11583586872929004830u, 15809012867806665005u, 8654990377900329631u, 18083303442589581352u, 836249u}, + {11815772627710932174u, 687381169354860405u, 7727520698632223186u, 9527028502374686533u, 1699183u}, + {8107620678031993986u, 8527025194527420312u, 7714728341858237775u, 5868009520534589335u, 3730444u}, + {9576485080257590542u, 4069713288924452914u, 1903461218522799977u, 15561197269771821115u, 1301384u}, + {9332341575360681638u, 579724372781401544u, 16455559336468927279u, 11553221359219287460u, 1418179u}, + {14311215605247824922u, 8022881231355247656u, 7757127509310167090u, 13068585317481887113u, 2200088u}, + {7534876485986264107u, 16135363839563157204u, 8810705854343794598u, 14956506439195307569u, 1721444u}, + {2087799919253153219u, 10080012395142209525u, 10465964519826948149u, 464100616089296920u, 2877825u}, + {11396675726942244689u, 15682205609264349434u, 8644367857944433766u, 5673578836686402814u, 2128623u}, + {4137137672463269976u, 7732622005159070204u, 10623619783907265499u, 11568481215452460443u, 1450446u}, + {16730333792729980266u, 11944280870325284916u, 13939857320955716652u, 7520745797667722283u, 1465384u}, + {1155885175240062946u, 12429694419497384584u, 4666709478652396065u, 15375299101217104963u, 627562u}, + {7439042538315008173u, 5689281086142419662u, 15649205965123170469u, 6424702360355270718u, 3565983u}, + {7640821110950304897u, 3505840702619649158u, 6558725962211605465u, 5037754770813928952u, 3191539u}, + {15032097796780695543u, 4325073074748643789u, 8649788540463719203u, 3805868398144270351u, 3220085u}, + {8588491438779447874u, 6326314186370952995u, 12168905914597320829u, 5247546858427270811u, 2901416u}, + {17554552750692006435u, 402565165368029175u, 15472373860621308657u, 8051914621860913826u, 3420232u}, + {15688428552065179413u, 9240513950888996679u, 66569481787444320u, 17068684345379619285u, 613234u}, + {14606361137153279216u, 5680999214287162479u, 10243577131571059663u, 15503694905878487788u, 288578u}, + {6667190178437770261u, 1997314560987290306u, 15951449987836409612u, 11606595980121395556u, 2028025u}, + {12219551872744205737u, 14932316659217859266u, 9913906658804729907u, 14088641307152628313u, 3751392u}, + {2430246719768210471u, 4640840503625648077u, 7535085169604661036u, 7419075574101452201u, 3668180u}, + {7584308527794263960u, 12352639558292960216u, 2734380822511395685u, 4247006439295195765u, 1931797u}, + {6359978556780760622u, 3496918978405246153u, 18046997911938073595u, 5079666951763321849u, 352139u}, + {332269419890245610u, 11769686122780735726u, 10327012584653615638u, 8581349513604463343u, 2429525u}, + {13555009585222662670u, 7925944764582742356u, 18342072517349109261u, 8619670524990453095u, 2015053u}, + {7565709627653453244u, 5120962795956358210u, 1898700198291696012u, 13583998854736083146u, 558829u}, + {14473185579613433058u, 16345751646046530966u, 13947598137893191879u, 9161623031944813761u, 2652220u}, + {17869961735343132656u, 11392930056029053395u, 17188699772109316755u, 16261883491262582578u, 1898337u}, + {16016330127402338429u, 16480532843233289286u, 6431368240713658925u, 2773206726507798628u, 3313305u}, + {15890500069621730732u, 12393700565147948194u, 7837090150348786979u, 2366962701360042904u, 3553208u}, + {13643854801837053223u, 14802971475923559383u, 15466248891620978741u, 1218466625590467045u, 3350345u}, + {10510428667255831043u, 111156054754193091u, 5522485998199373843u, 13752745825198406893u, 1768531u}, + {9618415767871793280u, 9731654859104777786u, 4194844745202074353u, 17038215845447160348u, 2137498u}, + {1416767692788260043u, 3456436710470790305u, 11201916609985798481u, 17621482840856698248u, 807236u}, + {3975829426401278041u, 4085268795941925189u, 8577581495548496720u, 8157399019806424612u, 2205362u}, + {13959170206802872806u, 9745355573497083864u, 18029655893869906960u, 9191996199378131135u, 724096u}, + {2987557207812059607u, 11280458793518468364u, 15957729912941221685u, 16154258287284650654u, 1188042u}, + {4706560946599966604u, 17653307213315137136u, 7482488730587623267u, 14361376736424735594u, 351332u}, + {10712558210870167020u, 17529988189904555031u, 11309479393499802124u, 1663805608722623788u, 151463u}, + {7664061226298339474u, 11935110948303377862u, 9943495969526752382u, 10523202730398920534u, 2515153u}, + {11984439487445422054u, 7936307555272966849u, 5064697147942834973u, 3721333690154750266u, 259314u}, + {15196314461557523311u, 4520670030911685489u, 15172478180688287921u, 16794202913551272696u, 3032510u}, + {12543235552922394142u, 16863998992905332403u, 17013595438720314407u, 6901411386268321785u, 1316969u}, + {17815225318465818709u, 10110030136865949651u, 13844165026930764745u, 9968241774231475748u, 648983u}, + {8837492492151790491u, 3031219927762371170u, 3096881393728036315u, 1236950731922204932u, 3177373u}, + {8546550122048861363u, 15686954642690357196u, 1272635342718881246u, 3589434295653134335u, 2670719u}, + {3740717766658424613u, 9495894472712356300u, 11722283079588382886u, 9416753298405859475u, 2768115u}, + {3443208673431804610u, 11032442872600304553u, 16184865478070173823u, 14966984684239432565u, 360572u}, + {15998006556258800048u, 554540405119356931u, 12630797747023290414u, 1519860869167616940u, 3451546u}, + {7123538795019646754u, 15631336138858197110u, 3866719362942789752u, 11088481675043470985u, 454783u}, + {9168438931398892718u, 2015224902140417382u, 1033945783029034802u, 14059620114094503046u, 3455577u}, + {6520433023791011427u, 16117791907872742925u, 6254654097929942134u, 14691435748304988153u, 204654u}, + {2214166774418230795u, 5520439166575242121u, 16259126567113565531u, 1444927095411655422u, 2363132u}, + {4649592622420245984u, 1904952377332453187u, 9981104052595746020u, 12725728643336637231u, 2243247u}, + {16044113862236027695u, 16631565052786718571u, 16059262850309703471u, 17046972808979838269u, 3901858u}, + {14904012561007024917u, 9455458343650423908u, 11605599284647916900u, 4755720205450244852u, 2889673u}, + {6904281107460190281u, 16286475768418283779u, 11014669326114525769u, 4592933487432888674u, 914759u}, + {7518116117402094511u, 11853915703004793257u, 2943901472384111027u, 10609340653330462555u, 892856u}, + {9451446573529312768u, 9585080289064798310u, 13800338537314476825u, 16085313767193946396u, 1381434u}, + {18136524265736220975u, 8082637660006466441u, 16990258166272619631u, 2763671548979296215u, 211769u}, + {12502321415376879109u, 9968228235502551919u, 285277419903906411u, 3895016529357525491u, 3242901u}, + {803139650199037029u, 9279149891153793310u, 48026227608388753u, 9571423381704880860u, 2609257u}, + {14458163060986068086u, 514787854354660603u, 4165093517290886565u, 15684630211903320657u, 1502549u}, + {1647628865731179038u, 10817532668903539177u, 17974320029114635796u, 2621790537911244120u, 1549601u}, + {11466103737172294275u, 5009448965848670828u, 14848694411468758659u, 11053396983488129140u, 3823453u}, + {11940420653053669968u, 17866159870372548576u, 13705546947977229218u, 4321928318260002213u, 1191752u}, + {11651900368346412720u, 16861547821345051791u, 15079723440674228036u, 1607251017299674415u, 2919390u}, + {2175049093682335580u, 17595694624506377598u, 3540089859394544351u, 16482984682436167353u, 817799u}, + {4828078983053484603u, 2262348242167983994u, 704306598175888122u, 5059117327994675800u, 3284400u}, + {1657925957770248148u, 3100294878350083188u, 5944762115711203701u, 14327990110804540307u, 943642u}, + {3120787476417609287u, 5071979602065285160u, 9418276263951912756u, 4412920373112797635u, 1397269u}, + {10929445728944057308u, 3690355643105432992u, 10878678432429545964u, 6222728155319850940u, 893921u}, + {2412551384077493261u, 2557161085229387052u, 7562745897287263619u, 1241469036776617583u, 241075u}, + {12855156018239795784u, 16522434097052117498u, 17200570282429384758u, 6849918483672192486u, 2296140u}, + {14759746899650801953u, 3437033786208799256u, 9587782428823602086u, 7176058123542191597u, 3072439u}, + {3709249324582327677u, 9117008519791169941u, 11062568158205247209u, 2866922670570331728u, 3863381u}, + {4669738460692179326u, 125666479317538953u, 14796233487724855310u, 8502005305870723263u, 1038307u}, + {9555928338818615653u, 7517847138648141123u, 5173894369887095037u, 16592400020724371729u, 1580891u}, + {8191621208432231260u, 6652751794082299353u, 9004622895403831725u, 13071586829142787203u, 2986965u}, + {1389319508028851956u, 14172131966852668359u, 18178761646067761540u, 17637152737238131063u, 819039u}, + {1774607605789525543u, 14423880575257322296u, 12620304687585738377u, 5419428173301134934u, 1781755u}, + {15430810476583611304u, 4469221846816753685u, 8129498830902594826u, 8895951650571616663u, 2252869u}, + {3484266285936283396u, 11832470262843951633u, 7585355902728533151u, 8328181421132258254u, 2490315u}, + {5562315236790653069u, 1763882384080316384u, 3041080318687649124u, 13376593108812769583u, 419576u}, + {14523042515155257158u, 15325700855053912761u, 11835512147960308883u, 6060577723654010491u, 1653005u}, + {6746990092241044358u, 1994786997759012264u, 424580806526877276u, 11487650018278681805u, 3072234u}, + {4626038034785581797u, 17870040933183786582u, 16198306391693874835u, 6974201753461280864u, 2289632u}, + {11976404672984701340u, 13048770237143097508u, 10089007212082933591u, 8256801982824962205u, 2479013u}, + {4126586319900277796u, 17815492796760422181u, 9319243705051339259u, 6386798001960859287u, 2560853u}, + {5142341387946808419u, 9270024220920817461u, 6370541293299510403u, 11864684828508370832u, 1239087u}, + {16559569350812546943u, 9237310166139222007u, 12757499328006448800u, 13353512029655413535u, 335749u}, + {5077629963914801311u, 2621501932152890889u, 16619297443874670533u, 4185533943429336225u, 3346039u}, + {6040105242080883381u, 11488317085998799498u, 14923143864328493411u, 3880776013289365585u, 1938686u}, + {12112834801319564430u, 10603476034456444265u, 1357351307280635958u, 3062181397955033001u, 2044779u}, + {8011085841325305987u, 2329893847846984352u, 3668058783127750857u, 1983274556986531413u, 388481u}, + {12018746779314219840u, 208496190344147499u, 5679138393406271861u, 2168894032705611397u, 3284375u}, + {14838356315178700440u, 16905323310880106405u, 5430931698521438456u, 18219099724793823713u, 2944554u}, + {8051557631613664783u, 282591002032773160u, 15549184435999294380u, 14609951447929760551u, 1797139u}, + {5681007624813503773u, 4099220342012187120u, 14967451577464369292u, 9688868978890177181u, 3239439u}, + {5660454850491836942u, 16972055499815375209u, 1246273204867433478u, 16921234116739399599u, 953427u}, + {17400378218103326829u, 13862639164377883816u, 7526043415542322550u, 1602854709617613385u, 3054856u}, + {14517332152897862611u, 5680362105262469912u, 11604121396766488151u, 16269310806950676375u, 1159407u}, + {3064679355993586446u, 12549813320301733284u, 1127614188208573280u, 5209534071206389569u, 301410u}, + {310635573207389837u, 609106779497219845u, 2932444392667059698u, 16362633884950432339u, 2734327u}, + {12869341285629401513u, 535317762119826989u, 1696266129926013332u, 10426732988207090686u, 2649271u}, + {13070793467850606368u, 3101091074990762159u, 13399025394438897308u, 17198577815572482333u, 2851566u}, + {9393337970190743576u, 11422916276740619902u, 15419872989371613003u, 1781984382320139930u, 3859310u}, + {4788453613114014287u, 3753824679261251394u, 17843256827616168516u, 9438678930583724071u, 2702505u}, + {5101172332566596283u, 14632225471105120168u, 6893956892016493006u, 16623099056255024642u, 2686206u}, + {8487885450767936761u, 1656340801962652626u, 1166452899255144625u, 10642018094809768688u, 1889093u}, + {15625308710058945708u, 5456433285162876192u, 14770178411055317142u, 4286245673982202516u, 3091050u}, + {12025096008664660947u, 10024916239559733640u, 9312641675368762031u, 13387674709571953743u, 1994363u}, + {9088909894403835564u, 9143742009059274119u, 1134370564188506714u, 3999957189324786792u, 118830u}, + {2659001783076356628u, 16138670235091789682u, 6333063717709612293u, 17007784223549228991u, 2303228u}, + {4525988978267337204u, 17765906439147176860u, 12887733617830521764u, 474832638694753742u, 1820125u}, + {7464435075198383533u, 1199422738916547106u, 6084211064483089172u, 11706905614676318868u, 766785u}, + {15841330117167410280u, 4151786922711224543u, 3914277866523325498u, 4769945904864708769u, 2041135u}, + {8126970172892740225u, 4185358929966583836u, 9268251659381559780u, 9261024336589612858u, 1084396u}, + {4299205191708466283u, 366700689804318556u, 9662345414815814483u, 17025595777698571575u, 2725725u}, + {18217744057255413884u, 16964276707021157049u, 5111466893458959099u, 16407354615125549217u, 1497480u}, + {10279320225122240520u, 10329709091726101148u, 8844787613326861981u, 8602477337236277578u, 2464324u}, + {13412043159634303792u, 10135079738872601046u, 5770605712075518038u, 10493809898244728274u, 2920457u}, + {16514832628949337563u, 16551603332291238633u, 4215759608540733735u, 4953789327930183122u, 236489u}, + {3776273006831810817u, 9053235353184570437u, 1518154977311431500u, 3030781406606010138u, 138902u}, + {12117584226912157972u, 2755497531393740067u, 13734998674193381128u, 14702311476413406754u, 3706404u}, + {7681274474894354231u, 10565553744212470752u, 6662145269763409340u, 12678450057361473653u, 41233u}, + {7857828350221238966u, 995161934588008546u, 5594089166339686396u, 144875815352697195u, 3498254u}, + {6965010696490221561u, 14930819372892731783u, 2427142513496767994u, 18295102687983474357u, 3443960u}, + {10615216497092338468u, 6026268441438103623u, 6768363437059636075u, 1864969717963393835u, 3210867u}, + {15345208424890403242u, 6298009651539401015u, 15347781594267880074u, 2148900270768599428u, 227485u}, + {14224179722203513522u, 830544034756907805u, 2176073647990814708u, 11965756970020545464u, 442408u}, + {10511048589117497047u, 1241661043543496705u, 6122046248203811178u, 6205114086379721161u, 3595823u}, + {8915572940825607866u, 795158747348606587u, 7382776745676142214u, 11883776655040654091u, 3712260u}, + {4074809534404756252u, 5568220350474189210u, 2262792946061195105u, 2374322131252539627u, 1884118u}, + {778111892622311198u, 9871556410462893071u, 4135286218966941188u, 11708086079069317256u, 1947880u}, + {2265225031982184415u, 13085016476382717842u, 8690101314669201365u, 16969466654467448400u, 3874206u}, + {7111305767614152520u, 13243281002906099733u, 10984395928777805285u, 4827267710043540417u, 2395689u}, + {2119766816590491920u, 13950946805136217253u, 828698608719416105u, 908883795145604104u, 1877877u}, + {13326115136973150983u, 11680608982818620825u, 14860758564947343285u, 7168342527084654930u, 1464635u}, + {7847806184470601008u, 13227583265016823180u, 3979978942690929507u, 15447342878291318420u, 2182743u}, + {11450442660568076995u, 10156777945848104964u, 2108114355715940171u, 7029851138626033678u, 750639u}, + {2723237720180891522u, 1667294271203989022u, 13678561451585636492u, 17740014985884868658u, 1032101u}, + {7684556417971881760u, 11607371614979806261u, 15076410940367182442u, 14790845698520461567u, 1917826u}, + {17969493257579771856u, 3721434539588770120u, 1069327940644186459u, 6664676311680121905u, 3233581u}, + {13278743379086013158u, 7047373357054348715u, 5610370626001206591u, 2221376868951124197u, 3718719u}, + {11520929279971392799u, 9900437778161978321u, 498506680579448993u, 14191886691330293435u, 3511185u}, + {5645333267004543708u, 12525806178381961135u, 5923588850423879591u, 16061555821702336355u, 1698438u}, + {1028766049752215507u, 11410879176914685091u, 2396456428846628134u, 5075362249827574445u, 1838938u}, + {17768568030952691932u, 16512694870670959526u, 4744470351692656333u, 2700053403132115177u, 3509545u}, + {2364940602716788242u, 13013806904257740868u, 8453956446270181169u, 2514697878419770215u, 378058u}, + {4823435827079558976u, 2928071198042209943u, 1560814866554256826u, 8798000414312924556u, 2908249u}, + {8997093192376901976u, 2745610918995294983u, 1671366141554624368u, 8844674206430830336u, 3311042u}, + {17310434221626310685u, 1493162404633017424u, 11668934524276879377u, 15337287889276700059u, 2940029u}, + {2494563253426952985u, 4545221386452050740u, 11155427262172533964u, 13601061657000024076u, 218226u}, + {9101507609123096830u, 930413856868955662u, 11270541751527537503u, 16216984231307076597u, 1132860u}, + {10836877427512220739u, 3591810088409338660u, 17538765033671596132u, 11982458205004364209u, 2324805u}, + {5029533485667565368u, 997488430976841139u, 2748548079537637075u, 1484036975597297259u, 1526022u}, + {14838250202517575169u, 8780016552871047150u, 17956961088122407459u, 3631029840665284172u, 3721257u}, + {18385050760774199447u, 13324998267066713899u, 10757873388807397622u, 6193540572366404585u, 513226u}, + {2856650022046068844u, 5472670065624980584u, 12987943013785076403u, 10529876084404992886u, 755790u}, + {3365934745114133489u, 944665498673103088u, 7763303512651916873u, 17595994820487761410u, 143101u}, + {3589059625963237234u, 3088362914222970674u, 619121180026933626u, 12756833909832931403u, 88920u}, + {14932185135524358783u, 7478280425099232761u, 2999922471299731787u, 15710195797508158211u, 381935u}, + {14116362228921960793u, 17356506881892971187u, 1929809288664283817u, 3754040362880240727u, 705228u}, + {13055835483943602153u, 3778642455056264913u, 10095703347466448982u, 14064240001579601922u, 1321387u}, + {5682427457262390975u, 9029024634450908353u, 15879202908695482747u, 9463920120844126460u, 800165u}, + {7028783283740179359u, 7683665612559605165u, 3928106883841543329u, 5274964813204399252u, 3355452u}, + {17260890212679248694u, 1361234561029602451u, 10946476575536964616u, 638357921874005163u, 752951u}, + {7130133876223763049u, 16970353010173338626u, 8722062943472496060u, 7796109651131618690u, 1761520u}, + {13618237725794550281u, 9256063742607438359u, 9117026750459343923u, 18263065608012598308u, 617951u}, + {5207155619161428674u, 5479721679966358936u, 2642627512280701126u, 12261190188657907619u, 519964u}, + {16631908386889621696u, 15170067634374736383u, 17605008869432363231u, 6999178276775742293u, 3748087u}, + {6509971089480285027u, 7407168183436554939u, 17773454257992667084u, 2807328582095437656u, 3546793u}, + {14936187510060198934u, 910896319057202215u, 14761179515607352623u, 16206327850056610767u, 2577050u}, + {7188226434122962762u, 2728031704831453039u, 896946511161048837u, 7901815948155626074u, 171751u}, + {16661620762464401297u, 10058343194385675590u, 6552757392733832843u, 2092838481743129781u, 2695673u}, + {10165447679189112994u, 11443231590712527982u, 16168337817399902884u, 4301124440267995553u, 3402112u}, + {130603806757538696u, 9681987694547921082u, 6187195605918631277u, 11591972939743690350u, 2776920u}, + {14558624840195693704u, 5923847150917880686u, 15074551427286210379u, 5383487102951805731u, 2543086u}, + {10267357083656206963u, 11697355113529075439u, 13516532735539958714u, 12368760242468597887u, 802126u}, + {6697415680772373371u, 16553177726566716971u, 4946190120944765014u, 16515985660091125934u, 2655095u}, + {8223274785386536065u, 1286525348634311250u, 719597419339335484u, 4732721486937687362u, 2754356u}, + {2022638309134186572u, 3363114679096996394u, 12701075048772140656u, 10210929664300446808u, 3397417u}, + {15954931507411478289u, 10529245387394686863u, 424693498551986468u, 3017032647676645124u, 2900440u}, + {4826294255897491544u, 18080529949941525540u, 10436359165856342670u, 3584325785256651643u, 2416476u}, + {4214656086472444827u, 8160780824963016746u, 13050644566481257221u, 5737126046912894091u, 642196u}, + {12910912964211654240u, 5743498054954498400u, 2259409376144086825u, 12045464635328251338u, 441964u}, + {4317524510458057440u, 5240510017796590633u, 11043423031519278035u, 6205105896105060099u, 3208984u}, + {11722850541374467508u, 14992936629537240157u, 16380307402686693167u, 3590017420648203531u, 1896021u}, + {7151544084194874369u, 12131793433047406735u, 7613404185343417096u, 13149457532638280630u, 1341355u}, + {11635195859121356246u, 1825822880077085560u, 4540856247288410261u, 17678854184838792528u, 3667654u}, + {7719668881890942345u, 15476444419505994814u, 12201071147641578480u, 500001856595338932u, 3227965u}, + {17826197935079384469u, 11113418661721681760u, 6963283827333748111u, 12669624401371282509u, 2119318u}, + {15617514711771698875u, 17593391487420413579u, 16288482347406215166u, 6452220398802016684u, 1711201u}, + {17589004339674947435u, 14925171476070937387u, 4369434168167879564u, 17253331068422672961u, 2891172u}, + {9236434913345392756u, 2519843185629135872u, 3457047366124385695u, 17203040108237254828u, 851933u}, + {1099546376374837366u, 7857062122651218003u, 12435476948768424960u, 5420034960066582907u, 1594107u}, + {17971552756183615191u, 5307911600403646124u, 4879344948511713105u, 3776400979247396544u, 2845005u}, + {11475098736394696343u, 9834060525180694158u, 2631882279620083510u, 12158156881271718270u, 3738903u}, + {17432920733880956167u, 5769783652361890157u, 17292633088783225980u, 8283536319239366448u, 2821226u}, + {6995607121422011186u, 16804448975128023892u, 13037562234674176698u, 14319446061789362950u, 3481981u}, + {803356375488444748u, 2785056860103082907u, 641840564237254506u, 5036205215312992904u, 2137340u}, + {9800929762491386958u, 2589081883671557488u, 6713403704043213878u, 12289217955462456708u, 2743071u}, + {17595884323761813569u, 1871890404124994790u, 17032053021020464824u, 12228334133412053672u, 1716983u}, + {8085753489112016684u, 16180672689312523630u, 8750179864256846152u, 8894756824873380308u, 495057u}, + {7907543322028545203u, 11798479824309839339u, 6783650315536788752u, 8439870701113223766u, 990819u}, + {16746465086811219371u, 3289369402955719246u, 6195104176886944903u, 11691607627100565157u, 620222u}, + {9620973138472488423u, 3601760854817463497u, 11491286867794316391u, 732017028573771272u, 1677398u}, + {14824135459520087074u, 7676860308095644752u, 652026744088017111u, 3417649452130382275u, 1941403u}, + {3606737226054250107u, 688732791054476692u, 14136469055001681370u, 6160708060926455956u, 2592082u}, + {18265818780376227034u, 15155801729373879770u, 16571825653270408340u, 18422501959104400942u, 3762971u}, + {12712071539395581756u, 14927592092284187944u, 4766861484993296054u, 645875333719716352u, 3009353u}, + {13472690374984237410u, 1222444604723615606u, 73432803575484468u, 14322916384774056722u, 2128920u}, + {11154293213490870373u, 5149496046965375321u, 7385918459950954464u, 4650957675143706027u, 2099335u}, + {132053186874999663u, 15397974242489628615u, 12644899720666372136u, 11856171322341120220u, 1134913u}, + {8437148912155932432u, 3427607683330114558u, 12807383093391908892u, 10973689755278143522u, 3133584u}, + {825885200999767277u, 628641946136048918u, 16034191569670754608u, 4020972105141197306u, 1015043u}, + {5182197881060366000u, 18056294976611763964u, 10001027642775061760u, 13997897485823802053u, 1154763u}, + {13388848661260756827u, 16803034712439892052u, 14324801798947494736u, 11118171113365588692u, 3573704u}, + {14261690012176165488u, 9233961075051930161u, 15013700902493453842u, 12964232546990463776u, 2124455u}, + {11716050491157253310u, 230074036320763516u, 8648443412340839243u, 2200917111783183252u, 2550930u}, + {5592285356524343929u, 1310245576240476977u, 5293959738356270522u, 2641129740426270714u, 3387654u}, + {8504430428252480250u, 17343786868008677696u, 14691348135951721730u, 16275449847523193797u, 779721u}, + {9330618168776796597u, 12893009748134463247u, 15103694764222885902u, 15867054018355492652u, 2394642u}, + {16651975921361342140u, 6327791908266402319u, 8417878812632134431u, 9483718182957769622u, 2228856u}, + {7677708723799297870u, 7211162811947912436u, 6168608160777412538u, 17551110496909358607u, 905943u}, + {14953236305695508189u, 12707121897971068039u, 4224534891115296481u, 17526707067433967597u, 2257368u}, + {4407670485714898314u, 15057911935696072518u, 10076981933668207497u, 11138510589143790794u, 2716437u}, + {6300398484831604374u, 17335011820940712643u, 7506035255647202582u, 7039696050948875734u, 2921901u}, + {5953302133709939794u, 16815804396516658039u, 9688557424725600108u, 3224433704664241247u, 2502039u}, + {15177116670714459395u, 17920348613294719490u, 8854183909719754241u, 7684259444340235093u, 1275918u}, + {16974451927415887146u, 11111048349785834645u, 350830905206298987u, 10039542111761281892u, 3266634u}, + {1293383387333588820u, 10473979447959876708u, 3594577486822437689u, 204373959495876111u, 285006u}, + {15836476735737077461u, 10929913564173702626u, 17777972257434256792u, 5481634579828368759u, 1585843u}, + {3451624348428406908u, 14510923599962238668u, 5381672447583042019u, 5721803574440025300u, 2118681u}, + {17458705990552082612u, 5436926124413928171u, 17844712376365848100u, 2272868187078400616u, 3213132u}, + {15470637510784938601u, 17636632217825942496u, 1501969485648718180u, 2869517993431104210u, 552451u}, + {5704825920606604835u, 13017870926015301240u, 17172351240494642644u, 6063028824265729532u, 737330u}, + {8882849131455643328u, 12857728095264800795u, 17685904663573866542u, 1887098788857023423u, 1111441u}, + {3058648943700711109u, 410185614110012869u, 11338514080813146902u, 9460047288535686222u, 2462883u}, + {4724301567828370364u, 4382380114174000342u, 2736669495405305667u, 9701149782926880714u, 3544022u}, + {8684275353864393322u, 3024445576634580199u, 8561507769060670198u, 12819569821239990727u, 3711963u}, + {1414192471041197555u, 13454744450324503109u, 10794535379367982425u, 572876802557144501u, 3163622u}, + {13199100596456883583u, 1123400695458344040u, 12168535911949437202u, 3084777475545807273u, 1310912u}, + {12621319714698733197u, 2718095311008421544u, 5051476055095598027u, 456527625479499827u, 2690164u}, + {2849214594914827320u, 341029442967573703u, 12783683133287696890u, 13452337258335430503u, 3381531u}, + {13086380108022536858u, 11069132478177355988u, 2232694284600745155u, 4890237050927824104u, 475915u}, + {14064014112084015021u, 5769762642755462155u, 3415465285345756025u, 6277789768395806964u, 3729995u}, + {1380621837177002659u, 3059070965198542947u, 6930974567663968854u, 9868639058597205323u, 2170062u}, + {6729572405089810090u, 3155335757605106407u, 10996574817944278985u, 5804638111240956235u, 2654696u}, + {13563594724758614155u, 13894126765017550372u, 1434141594051545770u, 12947279836299239107u, 441472u}, + {18019653926645202282u, 15526549127339171182u, 8674726375057733524u, 3466908247767529467u, 2216180u}, + {13790365264866545990u, 10325754569527572083u, 16009492869409670770u, 4220221762948002169u, 838642u}, + {16819957068657652757u, 14517746717949551509u, 13546323010668832217u, 16012256094983687480u, 6614u}, + {16285324422251421923u, 12771970013669484198u, 17673377328473429566u, 122022777559609u, 0u}, + {11873128005403154483u, 10619932800403367179u, 14343443126950043462u, 122022u, 0u}, + {15384322680921279599u, 15814965812331833428u, 2250922948805313u, 0u, 0u}, + {8123378609811325612u, 17502368800501852004u, 2250922u, 0u, 0u}, + {15577204655558080553u, 41522199566251251u, 0u, 0u, 0u}, + {10445491924192074469u, 41522199u, 0u, 0u, 0u}, + {765949388776130595u, 0u, 0u, 0u, 0u}, + {765949389u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 658676u}, + {15057813325141876643u, 8282445237509481868u, 11441047283241672766u, 1020956744130485816u, 2518794u}, + {13651462127579899856u, 4716011329564280478u, 8920050759752291037u, 15466788673429930224u, 1046985u}, + {7596571657774520372u, 15310671797547100545u, 6061747390345693917u, 9530915892817289020u, 3487733u}, + {14557032358692522283u, 12392882118837024803u, 7445392724187780458u, 10728861245192681656u, 191344u}, + {11067461530974930073u, 4223814053921402091u, 11752301859773913369u, 7785749840623118213u, 1820956u}, + {12419327625152301583u, 501152163653991255u, 16520592420212427259u, 3420297636869848682u, 873261u}, + {15216103944567246319u, 5631336936492792058u, 11503176708565770052u, 13923224474916940961u, 1665649u}, + {4802698563645380251u, 15926696961434445223u, 15801107346241565635u, 7380600406611504187u, 78552u}, + {389858050402262434u, 15946722148353669905u, 5719306375227263709u, 15782062130327296423u, 777542u}, + {3973007516252948606u, 13832372760247331887u, 9406074037669603326u, 1887840579048748738u, 2976231u}, + {11763935240111380869u, 4526208800843090503u, 10411121630868158961u, 5747451702445388175u, 2873448u}, + {18067473253487123404u, 15836899630577792665u, 2163436793260180384u, 13239545474553376554u, 108004u}, + {5384889006636675751u, 5856573264941779416u, 17821602698000438741u, 1992335386482400u, 3808379u}, + {13614893513816182606u, 15727453549792336168u, 15869233373586745770u, 17292017167815458947u, 1366636u}, + {11552000035241351543u, 11872991130004256685u, 11026407048972493467u, 12707346552501252030u, 1735068u}, + {1369522539436301987u, 18387953482116147088u, 14840809934062348889u, 17902289689459957764u, 2539829u}, + {9167679104256480366u, 9857507235422136418u, 4266204858718155193u, 9126108442235195282u, 3729435u}, + {14497714143023237831u, 15278299316365738379u, 15978795545954368820u, 12102414146444608735u, 1180081u}, + {9855066690397457159u, 1928469052751985295u, 15221693016433143054u, 4417281900609265483u, 640739u}, + {4082337356452825690u, 9387908990033806071u, 39655110084154955u, 8370500461167967061u, 2437711u}, + {5636130068267113647u, 3100763893943718001u, 17475671254750519237u, 14024141082671186629u, 2750331u}, + {14678911618140558187u, 14334109576384967058u, 8794882320782886585u, 14822541443874357627u, 451043u}, + {7728519079338901735u, 7054227255427610536u, 3023294356642930340u, 13338975186626447781u, 2277707u}, + {6729899527550366423u, 11103202772644467952u, 5701377492268866490u, 13012383218269900428u, 595730u}, + {4586838998759763614u, 13393092857164752664u, 8376668481821244841u, 13197529000800226497u, 2115564u}, + {15835214465227057276u, 8011700930839957813u, 12085899439808763267u, 4074250547001046690u, 2356768u}, + {719571586339912562u, 10449130795149526985u, 10034729545101531802u, 17337297269314063499u, 3488186u}, + {10660561871300522556u, 14562874390052993013u, 6037104220031607449u, 3667225393657190695u, 1790599u}, + {23007177250917972u, 6528721723146830872u, 1314306153139988402u, 12354879305644542699u, 2599777u}, + {1722417504240807863u, 4996951772065267578u, 11365635426809408007u, 15324167369363318134u, 2198310u}, + {3527123611181083898u, 15440882383623456811u, 14319969362107345050u, 10056557248560826917u, 1489406u}, + {9361695670241629367u, 2081310325700539948u, 18354639734677162145u, 9394961926291036376u, 1940715u}, + {15314493653970208253u, 1449486140259115094u, 13936179730447969646u, 2990161237875016534u, 816515u}, + {7431344172769335445u, 6481898653145794920u, 7613981695116005049u, 4554690470616966160u, 3317588u}, + {14274974392069854786u, 1276657418841497915u, 10027435513555428564u, 6041979006480719082u, 643872u}, + {14717440418788955966u, 16180795986754679319u, 16580233047920873106u, 3038296297635179834u, 1523515u}, + {4826523437008372223u, 4843611229356271233u, 3051646253753065626u, 10044109465607737009u, 529240u}, + {7243611998331360521u, 15181589396300088624u, 13004748875373714207u, 11466920216908221332u, 2658675u}, + {3668122670088738805u, 14255044666650072725u, 938757253886045686u, 8768012787356370215u, 1349165u}, + {6137530243757147187u, 15543177982038822707u, 10373911237636980817u, 7302704708066940670u, 3120117u}, + {17377152624093469327u, 15404209861122778810u, 2331663702030827544u, 7983891351253808093u, 492699u}, + {17021726212310357811u, 10865419601304827862u, 11537694592375704047u, 5629581035300642981u, 680052u}, + {13384196441138383757u, 2220749204238015445u, 5464054973186652706u, 18243116042426163171u, 1676545u}, + {17004202004361562365u, 17061145708647850984u, 11809788018198542978u, 14874791186599328238u, 1539554u}, + {6201543465848282681u, 107105686969358844u, 11583586872929004829u, 15809012867806665005u, 2106757u}, + {17315000544305511094u, 12171366517246630092u, 11815772627710932173u, 687381169354860405u, 1313462u}, + {4507965380265189163u, 1632856452535738853u, 8107620678031993985u, 8527025194527420312u, 1869599u}, + {6938034229947197964u, 1710830755409822768u, 9576485080257590541u, 4069713288924452914u, 176921u}, + {3064797850298218034u, 760126517700650416u, 9332341575360681637u, 579724372781401544u, 1327513u}, + {4621306367461506760u, 6370872108648611123u, 14311215605247824921u, 8022881231355247656u, 3606076u}, + {212814390955774689u, 9910396547421574354u, 7534876485986264106u, 16135363839563157204u, 3469816u}, + {12491135457867568425u, 10107300657425480772u, 2087799919253153218u, 10080012395142209525u, 2477819u}, + {5898407009167302650u, 8655029374684099224u, 11396675726942244688u, 15682205609264349434u, 1217528u}, + {13375218067632996788u, 18137406941643730777u, 4137137672463269975u, 7732622005159070204u, 2969513u}, + {10397637341620582415u, 12437912136580699007u, 16730333792729980265u, 11944280870325284916u, 1940084u}, + {2067478011166879726u, 5397643227433630007u, 1155885175240062945u, 12429694419497384584u, 3729045u}, + {11233287786466224791u, 12538071340226799770u, 7439042538315008172u, 5689281086142419662u, 2552005u}, + {13167471763546964280u, 2103874121894273396u, 7640821110950304896u, 3505840702619649158u, 87681u}, + {10060366425268376040u, 16803466793020653770u, 15032097796780695542u, 4325073074748643789u, 3106429u}, + {8943070265833751592u, 7730277646469491788u, 8588491438779447873u, 6326314186370952995u, 2291851u}, + {2880012168337398916u, 652698367831987581u, 17554552750692006434u, 402565165368029175u, 929265u}, + {6689069148880973390u, 10460467400381719290u, 15688428552065179412u, 9240513950888996679u, 3280084u}, + {15642229685238014293u, 6893640135591213912u, 14606361137153279215u, 5680999214287162479u, 2805889u}, + {13836521266664320039u, 4729001101077067947u, 6667190178437770260u, 1997314560987290306u, 888758u}, + {10628586187559639658u, 11038834258826581919u, 12219551872744205736u, 14932316659217859266u, 1580467u}, + {16085653500898797440u, 15685442552639505481u, 2430246719768210470u, 4640840503625648077u, 1669182u}, + {9899743783794717365u, 10798758934568289674u, 7584308527794263959u, 12352639558292960216u, 2068357u}, + {5179177715407500560u, 429270631916447684u, 6359978556780760621u, 3496918978405246153u, 1317213u}, + {6013063698876178458u, 11737404944773394170u, 332269419890245609u, 11769686122780735726u, 3885076u}, + {5937369883480326879u, 15368157393125395236u, 13555009585222662669u, 7925944764582742356u, 264199u}, + {14489160790394319113u, 6134902110935512362u, 7565709627653453243u, 5120962795956358210u, 3292472u}, + {3541327026588773181u, 13701869525492110698u, 14473185579613433057u, 16345751646046530966u, 424475u}, + {7300426363926455117u, 5359880677543367688u, 17869961735343132655u, 11392930056029053395u, 2786475u}, + {11023089670183190901u, 13512730261575886067u, 16016330127402338428u, 16480532843233289286u, 3895103u}, + {12805626795713585030u, 480068632824557794u, 15890500069621730731u, 12393700565147948194u, 1689441u}, + {13822342542930341777u, 12712542891261147107u, 13643854801837053222u, 14802971475923559383u, 2119531u}, + {1459456285130593998u, 9448667410708338534u, 10510428667255831042u, 111156054754193091u, 210317u}, + {3198682653099657381u, 12538393073941213522u, 9618415767871793279u, 9731654859104777786u, 3780059u}, + {3620351833892398635u, 16180586645917922445u, 1416767692788260042u, 3456436710470790305u, 2712865u}, + {914800550206842420u, 8664885107181086752u, 3975829426401278040u, 4085268795941925189u, 953034u}, + {14323731491323366943u, 813334811323002588u, 13959170206802872805u, 9745355573497083864u, 2139896u}, + {8833228357746962037u, 7626725264648344973u, 2987557207812059606u, 11280458793518468364u, 3862701u}, + {3140343264367076731u, 9083886730913729266u, 4706560946599966603u, 17653307213315137136u, 1083813u}, + {4242606849661395580u, 5038545659178529546u, 10712558210870167019u, 17529988189904555031u, 2472410u}, + {2319064643484155828u, 10386920254592430673u, 7664061226298339473u, 11935110948303377862u, 540594u}, + {6010988455754517135u, 791537420824523655u, 11984439487445422053u, 7936307555272966849u, 2878513u}, + {12221652236814980658u, 17167369493632920504u, 15196314461557523310u, 4520670030911685489u, 136717u}, + {11426907202048039979u, 2340033808267267067u, 12543235552922394141u, 16863998992905332403u, 1190831u}, + {1878141737828239171u, 9307624314571265094u, 17815225318465818708u, 10110030136865949651u, 260261u}, + {3208348747412966638u, 3491133762824066341u, 8837492492151790490u, 3031219927762371170u, 2735265u}, + {13495622121781097394u, 13379369062257654106u, 8546550122048861362u, 15686954642690357196u, 3054720u}, + {10286302847987595787u, 18202553799780176444u, 3740717766658424612u, 9495894472712356300u, 413676u}, + {14932416722646703355u, 2462228399354124858u, 3443208673431804609u, 11032442872600304553u, 2717945u}, + {5958314768342827497u, 10899999873250166400u, 15998006556258800047u, 554540405119356931u, 3626430u}, + {3108925117473958434u, 11087094987331357021u, 7123538795019646753u, 15631336138858197110u, 3776810u}, + {13475231976226310763u, 18000551896405262607u, 9168438931398892717u, 2015224902140417382u, 2653500u}, + {14881126273361701949u, 14941457424291245232u, 6520433023791011426u, 16117791907872742925u, 2388606u}, + {13326323136773941515u, 1298624271312631863u, 2214166774418230794u, 5520439166575242121u, 1705175u}, + {16780448643393278754u, 17239093478811362253u, 4649592622420245983u, 1904952377332453187u, 3161448u}, + {13459933588528672894u, 1320684753294761244u, 16044113862236027694u, 16631565052786718571u, 862673u}, + {4185476445034480033u, 16743562060769248908u, 14904012561007024916u, 9455458343650423908u, 79120u}, + {5746801475461169854u, 16673255004379817021u, 6904281107460190280u, 16286475768418283779u, 1977057u}, + {1304347087765683198u, 11672954601321263615u, 7518116117402094510u, 11853915703004793257u, 76993u}, + {15990480688366234587u, 10274460700552393387u, 9451446573529312767u, 9585080289064798310u, 660665u}, + {5175235154227595744u, 9693025542503327260u, 18136524265736220974u, 8082637660006466441u, 1316235u}, + {8772089050336373121u, 3750735714895985774u, 12502321415376879108u, 9968228235502551919u, 3023723u}, + {15901834479806139751u, 5083939272534754478u, 803139650199037028u, 9279149891153793310u, 562955u}, + {3717365118353596364u, 5898133694799910383u, 14458163060986068085u, 514787854354660603u, 482121u}, + {11180315675112189781u, 15709813740132947397u, 1647628865731179037u, 10817532668903539177u, 2031522u}, + {15593781954304065223u, 6721165315807408863u, 11466103737172294274u, 5009448965848670828u, 3682717u}, + {425744357114340387u, 375543876981620564u, 11940420653053669967u, 17866159870372548576u, 3838u}, + {4746692942575153305u, 10856589775524119696u, 11651900368346412719u, 16861547821345051791u, 739516u}, + {12762188636300090008u, 16920317905022467389u, 2175049093682335579u, 17595694624506377598u, 1548393u}, + {2363984742772741440u, 16425426521254403118u, 4828078983053484602u, 2262348242167983994u, 98572u}, + {12087039534813555148u, 11030410269693842693u, 1657925957770248147u, 3100294878350083188u, 1515065u}, + {17968571515074379854u, 15489077902750391074u, 3120787476417609286u, 5071979602065285160u, 835830u}, + {4075879878889143675u, 6967267478791448739u, 10929445728944057307u, 3690355643105432992u, 1905230u}, + {16039615217291571255u, 5712721616628872480u, 2412551384077493260u, 2557161085229387052u, 1151697u}, + {1738289541580293371u, 6323730629017358146u, 12855156018239795783u, 16522434097052117498u, 2728224u}, + {5309475915075812262u, 1824506496165178769u, 14759746899650801952u, 3437033786208799256u, 2046522u}, + {14151560820601178242u, 14952113188276122228u, 3709249324582327676u, 9117008519791169941u, 2906143u}, + {10212318012571761671u, 1750163266931180410u, 4669738460692179325u, 125666479317538953u, 1293310u}, + {15515389286214625921u, 9120747876042225158u, 9555928338818615652u, 7517847138648141123u, 1271397u}, + {3458019096407911612u, 14385591032467020763u, 8191621208432231259u, 6652751794082299353u, 2647813u}, + {4922877484660778719u, 11604504247352541536u, 1389319508028851955u, 14172131966852668359u, 670132u}, + {7306640815132021291u, 2744917791263158396u, 1774607605789525542u, 14423880575257322296u, 89501u}, + {1340379907734694574u, 8165992383763109010u, 15430810476583611303u, 4469221846816753685u, 814498u}, + {2851981484564479504u, 6342089329234874649u, 3484266285936283395u, 11832470262843951633u, 1870255u}, + {16378994982441383482u, 5052814139190770187u, 5562315236790653068u, 1763882384080316384u, 2682908u}, + {9289867898593243076u, 9410120607016840386u, 14523042515155257157u, 15325700855053912761u, 2668869u}, + {12631975029781821052u, 10813337445474652608u, 6746990092241044357u, 1994786997759012264u, 3893110u}, + {8513660577284099751u, 7886557552381370150u, 4626038034785581796u, 17870040933183786582u, 344001u}, + {8403834377441581478u, 10180274093389341245u, 11976404672984701339u, 13048770237143097508u, 936049u}, + {8976086449634529711u, 11009968928278522721u, 4126586319900277795u, 17815492796760422181u, 2529019u}, + {3322701356955689799u, 11793260921646033893u, 5142341387946808418u, 9270024220920817461u, 755587u}, + {11085027579358741581u, 549345267793440233u, 16559569350812546942u, 9237310166139222007u, 1486904u}, + {11680933642648398889u, 10126016935962544088u, 5077629963914801310u, 2621501932152890889u, 1689167u}, + {5253320309815781598u, 13224933591590227567u, 6040105242080883380u, 11488317085998799498u, 596837u}, + {14032967403871418731u, 17847904113655718765u, 12112834801319564429u, 10603476034456444265u, 1303798u}, + {16824627378671348533u, 13358330694125567229u, 8011085841325305986u, 2329893847846984352u, 3490101u}, + {17308941777177817326u, 10780570073649618723u, 12018746779314219839u, 208496190344147499u, 2376913u}, + {11585424856667430787u, 3109079761351783645u, 14838356315178700439u, 16905323310880106405u, 3600538u}, + {8073342937963879126u, 11764673846880164444u, 8051557631613664782u, 282591002032773160u, 3469180u}, + {745587814955188785u, 1328486964247013731u, 5681007624813503772u, 4099220342012187120u, 2088222u}, + {1476973890522044219u, 10458583066150378456u, 5660454850491836941u, 16972055499815375209u, 1495174u}, + {13325620228633604503u, 8847759979440063121u, 17400378218103326828u, 13862639164377883816u, 3245546u}, + {16664317867052812165u, 452839167871455958u, 14517332152897862610u, 5680362105262469912u, 639243u}, + {2284137074167871117u, 16687076137299344715u, 3064679355993586445u, 12549813320301733284u, 1769744u}, + {7391794137530760775u, 16081145676107994986u, 310635573207389836u, 609106779497219845u, 1675884u}, + {1356100333799927619u, 408345628399054217u, 12869341285629401512u, 535317762119826989u, 141734u}, + {12729826126275183205u, 18396392579364062600u, 13070793467850606367u, 3101091074990762159u, 2050032u}, + {16696292843891831767u, 16754659362378539294u, 9393337970190743575u, 11422916276740619902u, 370243u}, + {12498730441608050870u, 7576244105224996702u, 4788453613114014286u, 3753824679261251394u, 245782u}, + {9569381575547308084u, 8431002888749877022u, 5101172332566596282u, 14632225471105120168u, 3852914u}, + {14701912738132109619u, 5883968185118355402u, 8487885450767936760u, 1656340801962652626u, 2825091u}, + {12464770352708852953u, 8546798449164057333u, 15625308710058945707u, 5456433285162876192u, 483048u}, + {14971606334547676812u, 5679196653102796301u, 12025096008664660946u, 10024916239559733640u, 3495747u}, + {6242713737342875305u, 6436084102433111506u, 9088909894403835563u, 9143742009059274119u, 3785316u}, + {4345568018893962569u, 8172681711810980542u, 2659001783076356627u, 16138670235091789682u, 2154217u}, + {7626238145009823733u, 8295365990867432330u, 4525988978267337203u, 17765906439147176860u, 2520836u}, + {9847085865723187387u, 3911450923651928509u, 7464435075198383532u, 1199422738916547106u, 2412570u}, + {17352211633691189655u, 5777681619914439300u, 15841330117167410279u, 4151786922711224543u, 326262u}, + {16257844658625208770u, 3652072359518458555u, 8126970172892740224u, 4185358929966583836u, 347634u}, + {18106841044804546736u, 2717469267936719653u, 4299205191708466282u, 366700689804318556u, 1666533u}, + {1549867213214740723u, 11795859524637941771u, 18217744057255413883u, 16964276707021157049u, 1380901u}, + {6990934877306480363u, 9794426484541168246u, 10279320225122240519u, 10329709091726101148u, 2548773u}, + {18153902867080574753u, 12588780816892912078u, 13412043159634303791u, 10135079738872601046u, 2732964u}, + {7175323290349255688u, 3699120270580719900u, 16514832628949337562u, 16551603332291238633u, 2495621u}, + {4348416971874803973u, 5131011046821132562u, 3776273006831810816u, 9053235353184570437u, 938320u}, + {14814805404689697869u, 15576078884668382642u, 12117584226912157971u, 2755497531393740067u, 2447316u}, + {2894450330115162079u, 17037566669453051421u, 7681274474894354230u, 10565553744212470752u, 3166586u}, + {7943445975020229986u, 17898851405162279158u, 7857828350221238965u, 995161934588008546u, 807590u}, + {15365772834065260054u, 2713522361481255582u, 6965010696490221560u, 14930819372892731783u, 2465916u}, + {5822813029591129379u, 12786666578209016463u, 10615216497092338467u, 6026268441438103623u, 1572037u}, + {6290770927600493092u, 11069874658477310680u, 15345208424890403241u, 6298009651539401015u, 2055132u}, + {12516268009047821656u, 12943816041089522990u, 14224179722203513521u, 830544034756907805u, 904330u}, + {14332690090397255151u, 1296453438025652266u, 10511048589117497046u, 1241661043543496705u, 136892u}, + {9385524723873012002u, 8182183901244878773u, 8915572940825607865u, 795158747348606587u, 1072580u}, + {11997595688593511130u, 4116924741663731277u, 4074809534404756251u, 5568220350474189210u, 3888145u}, + {4141120159089007167u, 3350089786425086873u, 778111892622311197u, 9871556410462893071u, 2308914u}, + {4894060387580300342u, 6848957262840620379u, 2265225031982184414u, 13085016476382717842u, 3075951u}, + {11460878183651013502u, 767601161984188107u, 7111305767614152519u, 13243281002906099733u, 2376091u}, + {4829719073908163136u, 13801292084232834709u, 2119766816590491919u, 13950946805136217253u, 394581u}, + {18201268772591607776u, 4210334742733991381u, 13326115136973150982u, 11680608982818620825u, 2224975u}, + {15495764817754481143u, 9730063185891556445u, 7847806184470601007u, 13227583265016823180u, 3725035u}, + {4566218443790041198u, 10825671861219481079u, 11450442660568076994u, 10156777945848104964u, 540453u}, + {2915560570870343518u, 9185157514402933930u, 2723237720180891521u, 1667294271203989022u, 330626u}, + {16760172912680642409u, 1256269932420540390u, 7684556417971881759u, 11607371614979806261u, 2520620u}, + {6208334191713131991u, 18291279619832336243u, 17969493257579771855u, 3721434539588770120u, 3132625u}, + {10223750835436818380u, 1671971857126749374u, 13278743379086013157u, 7047373357054348715u, 1547557u}, + {15293000135826875554u, 12137950020561042525u, 11520929279971392798u, 9900437778161978321u, 3244063u}, + {18031432561847296789u, 13917981015078385478u, 5645333267004543707u, 12525806178381961135u, 1397499u}, + {2108013761225215779u, 6171107570972293869u, 1028766049752215506u, 11410879176914685091u, 623732u}, + {3156273570676012524u, 4985165335262221150u, 17768568030952691931u, 16512694870670959526u, 2354885u}, + {13651669051253378975u, 9797960578747091627u, 2364940602716788241u, 13013806904257740868u, 2481057u}, + {7703986845601753204u, 9699665521343135186u, 4823435827079558975u, 2928071198042209943u, 402366u}, + {3824152647515666671u, 9540319557563597081u, 8997093192376901975u, 2745610918995294983u, 2819496u}, + {195246707226999972u, 1634209592369474784u, 17310434221626310684u, 1493162404633017424u, 303195u}, + {7778110074137888718u, 12065457987215672391u, 2494563253426952984u, 4545221386452050740u, 3562836u}, + {16943427245049768067u, 17321456541660342483u, 9101507609123096829u, 930413856868955662u, 3306165u}, + {4335646356060911026u, 2877191466632730190u, 10836877427512220738u, 3591810088409338660u, 3292706u}, + {15583225263207637475u, 12487251018951880037u, 5029533485667565367u, 997488430976841139u, 3309401u}, + {10639838297362936859u, 3338747187012394326u, 14838250202517575168u, 8780016552871047150u, 3599603u}, + {17310360122698111698u, 12431658103691985429u, 18385050760774199446u, 13324998267066713899u, 3705288u}, + {7622400478890777228u, 5694317287084179012u, 2856650022046068843u, 5472670065624980584u, 429169u}, + {6521164361860519264u, 17233919558876005288u, 3365934745114133488u, 944665498673103088u, 3357989u}, + {17004654514577402454u, 10294125857633136412u, 3589059625963237233u, 3088362914222970674u, 3054644u}, + {11606420368618773451u, 9875429050852656866u, 14932185135524358782u, 7478280425099232761u, 3398123u}, + {15881776009643553367u, 8661625266050199499u, 14116362228921960792u, 17356506881892971187u, 1715617u}, + {10050791073622155058u, 6138289424503003299u, 13055835483943602152u, 3778642455056264913u, 1183156u}, + {3562140723296442909u, 16238423398741651080u, 5682427457262390974u, 9029024634450908353u, 2469847u}, + {5912254233144678727u, 10356124883854032139u, 7028783283740179358u, 7683665612559605165u, 3480173u}, + {16442614448504459059u, 12088850275203970617u, 17260890212679248693u, 1361234561029602451u, 1995930u}, + {5467623094904262054u, 16883079796034523744u, 7130133876223763048u, 16970353010173338626u, 1772220u}, + {904958310200330023u, 2284352274102996941u, 13618237725794550280u, 9256063742607438359u, 181307u}, + {16556417609669706146u, 2911660207468276273u, 5207155619161428673u, 5479721679966358936u, 2058514u}, + {14516281591532160169u, 16111490187398949794u, 16631908386889621695u, 15170067634374736383u, 3105891u}, + {7536101829613170324u, 1264596615154304818u, 6509971089480285026u, 7407168183436554939u, 2504788u}, + {5425815846397695950u, 13963590874075184119u, 14936187510060198933u, 910896319057202215u, 3355645u}, + {3048929645939145441u, 1540256898130945644u, 7188226434122962761u, 2728031704831453039u, 2295127u}, + {1320602337498820152u, 7893337754573045991u, 16661620762464401296u, 10058343194385675590u, 3151327u}, + {10715941617048487848u, 1912131354436749542u, 10165447679189112993u, 11443231590712527982u, 1424104u}, + {12409183889361857302u, 4976328879423336215u, 130603806757538695u, 9681987694547921082u, 819897u}, + {15482803133452027949u, 3675462830202569526u, 14558624840195693703u, 5923847150917880686u, 1302391u}, + {16947332336241145070u, 17129159095310004685u, 10267357083656206962u, 11697355113529075439u, 2818312u}, + {1190479332295924918u, 17516081096789516914u, 6697415680772373370u, 16553177726566716971u, 3336428u}, + {15730979326661282564u, 10547251969414275975u, 8223274785386536064u, 1286525348634311250u, 2627312u}, + {6147395021148301501u, 883642143272095677u, 2022638309134186571u, 3363114679096996394u, 479036u}, + {10178587487392775377u, 3432859585980776084u, 15954931507411478288u, 10529245387394686863u, 3584992u}, + {6003471692105164443u, 14594459746789954689u, 4826294255897491543u, 18080529949941525540u, 990564u}, + {11968944128529196127u, 17016482556504016329u, 4214656086472444826u, 8160780824963016746u, 2761903u}, + {2420183485669816029u, 6581191958038347740u, 12910912964211654239u, 5743498054954498400u, 2838617u}, + {15883074540559641194u, 9217192218150578402u, 4317524510458057439u, 5240510017796590633u, 268723u}, + {11726471298313549323u, 8868476151408794016u, 11722850541374467507u, 14992936629537240157u, 1415839u}, + {1382282134039814073u, 12793975534854111378u, 7151544084194874368u, 12131793433047406735u, 1321806u}, + {15809900105810613236u, 2494325654846824918u, 11635195859121356245u, 1825822880077085560u, 3042233u}, + {2833031896716840828u, 591078932479192498u, 7719668881890942344u, 15476444419505994814u, 897132u}, + {15532598615316584920u, 17196164768697802257u, 17826197935079384468u, 11113418661721681760u, 614663u}, + {12376642859955054745u, 5225740440692456983u, 15617514711771698874u, 17593391487420413579u, 501416u}, + {14177413533659279502u, 12081035270053270975u, 17589004339674947434u, 14925171476070937387u, 3788472u}, + {1019453846727982012u, 15619781626405754376u, 9236434913345392755u, 2519843185629135872u, 150941u}, + {9826234213017804023u, 11288337532913984282u, 1099546376374837365u, 7857062122651218003u, 2586214u}, + {18073644554439049687u, 18340634668396864844u, 17971552756183615190u, 5307911600403646124u, 1855489u}, + {2014284341995895496u, 12289839956083563500u, 11475098736394696342u, 9834060525180694158u, 280598u}, + {15429189303167114150u, 14821707225032811133u, 17432920733880956166u, 5769783652361890157u, 814754u}, + {3401239556894231786u, 17550632657788862277u, 6995607121422011185u, 16804448975128023892u, 2540734u}, + {11807754483962529970u, 15544506058673997417u, 803356375488444747u, 2785056860103082907u, 3635660u}, + {8581656326579984814u, 7275274480192804133u, 9800929762491386957u, 2589081883671557488u, 3819132u}, + {10388937778534882955u, 5406072129934080603u, 17595884323761813568u, 1871890404124994790u, 2156024u}, + {8293771161378051765u, 6163152238057901076u, 8085753489112016683u, 16180672689312523630u, 2878122u}, + {12202104242849597425u, 2008267426443672818u, 7907543322028545202u, 11798479824309839339u, 2535822u}, + {17562173749918511234u, 4190064618449291351u, 16746465086811219370u, 3289369402955719246u, 3845597u}, + {10136381827982252568u, 17033357092622672561u, 9620973138472488422u, 3601760854817463497u, 2100931u}, + {8566489411931208164u, 965043462391320393u, 14824135459520087073u, 7676860308095644752u, 2180029u}, + {14868320280462573182u, 2136474764421551303u, 3606737226054250106u, 688732791054476692u, 1285158u}, + {3796408548678956129u, 18364737710007289114u, 18265818780376227033u, 15155801729373879770u, 632638u}, + {16702958787290378020u, 2371075898158153348u, 12712071539395581755u, 14927592092284187944u, 3768854u}, + {18124794468046607201u, 2348098654639767066u, 13472690374984237409u, 1222444604723615606u, 1810990u}, + {9269108653981508707u, 15662358306861673818u, 11154293213490870372u, 5149496046965375321u, 2694606u}, + {2754307753510347250u, 13863566480892772003u, 132053186874999662u, 15397974242489628615u, 2217234u}, + {8470540104095771606u, 8255364508735639042u, 8437148912155932431u, 3427607683330114558u, 2828748u}, + {12396363178624298767u, 16043045651785979207u, 825885200999767276u, 628641946136048918u, 2271212u}, + {10759096383932142583u, 12896551115867504643u, 5182197881060365999u, 18056294976611763964u, 738086u}, + {139045424820942439u, 8261282832010024134u, 13388848661260756826u, 16803034712439892052u, 574032u}, + {9921015612329963385u, 10725369588864544630u, 14261690012176165487u, 9233961075051930161u, 753588u}, + {17436174000111712460u, 14158979036572361621u, 11716050491157253309u, 230074036320763516u, 716055u}, + {16315103665908614837u, 17395671576744932169u, 5592285356524343928u, 1310245576240476977u, 2708570u}, + {7885744204043438370u, 12338412482787454650u, 8504430428252480249u, 17343786868008677696u, 3618958u}, + {12423047942868625925u, 8611306000221245058u, 9330618168776796596u, 12893009748134463247u, 3186536u}, + {10298265339085893368u, 8087240103232338612u, 16651975921361342139u, 6327791908266402319u, 292919u}, + {13511043293321985917u, 837845719019114340u, 7677708723799297869u, 7211162811947912436u, 1354458u}, + {9621412721148343129u, 13684999197976395825u, 14953236305695508188u, 12707121897971068039u, 3791041u}, + {11659212083529156969u, 2587615341524151769u, 4407670485714898313u, 15057911935696072518u, 2232873u}, + {4371361719167103434u, 6149784562338757703u, 6300398484831604373u, 17335011820940712643u, 1430332u}, + {2393910555251300201u, 5389564063750051713u, 5953302133709939793u, 16815804396516658039u, 2714044u}, + {894914442360108181u, 16503727883908670127u, 15177116670714459394u, 17920348613294719490u, 768637u}, + {16621826554411567522u, 15856096375902826109u, 16974451927415887145u, 11111048349785834645u, 1389313u}, + {13594807621747764846u, 15624266679301176853u, 1293383387333588819u, 10473979447959876708u, 2668051u}, + {9260466626554150041u, 18430902080863548753u, 15836476735737077460u, 10929913564173702626u, 1482494u}, + {2129680172791840587u, 10940253691606958338u, 3451624348428406907u, 14510923599962238668u, 1767605u}, + {1949539316512726824u, 12842204032797768477u, 17458705990552082611u, 5436926124413928171u, 2958748u}, + {8921934476425358069u, 5572282427799985707u, 15470637510784938600u, 17636632217825942496u, 2575196u}, + {14516205915353486680u, 11316293729530888572u, 5704825920606604834u, 13017870926015301240u, 1706336u}, + {4148945989866703860u, 708242274140450146u, 8882849131455643327u, 12857728095264800795u, 2704956u}, + {5071686465903860954u, 12048564365833281497u, 3058648943700711108u, 410185614110012869u, 3194302u}, + {13830960688006941887u, 1305681291726065278u, 4724301567828370363u, 4382380114174000342u, 3799273u}, + {7848433761655578232u, 13320292864114056806u, 8684275353864393321u, 3024445576634580199u, 2820658u}, + {10846295448339467450u, 6188937123285097095u, 1414192471041197554u, 13454744450324503109u, 2305923u}, + {4116281580148968868u, 16499239884108630021u, 13199100596456883582u, 1123400695458344040u, 2816992u}, + {16783762813117008003u, 4587937216990788194u, 12621319714698733196u, 2718095311008421544u, 2862243u}, + {4398196737851257586u, 13200565842959147152u, 2849214594914827319u, 341029442967573703u, 2402624u}, + {3647388526904474008u, 13998162537822246850u, 13086380108022536857u, 11069132478177355988u, 279459u}, + {15446557393960961794u, 9601452256189808288u, 14064014112084015020u, 5769762642755462155u, 1770069u}, + {12024290845000580356u, 5069496658367377158u, 1380621837177002658u, 3059070965198542947u, 3082344u}, + {7358065733024918454u, 708131292281305638u, 6729572405089810089u, 3155335757605106407u, 3202121u}, + {9035408392071455854u, 1186346581301426280u, 13563594724758614154u, 13894126765017550372u, 1852164u}, + {10395989508079412339u, 3243049950015894646u, 18019653926645202281u, 15526549127339171182u, 1166526u}, + {16497126703101574535u, 10530402237935716681u, 13790365264866545989u, 10325754569527572083u, 1852376u}, + {12093844977110602257u, 7004257752046346931u, 16819957068657652756u, 14517746717949551509u, 963631u}, + {14856511600771143578u, 13233657976078129315u, 16285324422251421922u, 12771970013669484198u, 1488960u}, + {17842718643294456652u, 17677729763637980005u, 11873128005403154482u, 10619932800403367179u, 1862264u}, + {15581634263485096387u, 11858713204467529116u, 15384322680921279598u, 15814965812331833428u, 3492813u}, + {18104134556284585749u, 17741432346294634197u, 8123378609811325611u, 17502368800501852004u, 2250922u}, + {3839127337373226248u, 5706066927584958480u, 15577204655558080552u, 41522199566251251u, 0u}, + {1978634076377550905u, 14151459714393501252u, 10445491924192074468u, 41522199u, 0u}, + {9322122698735294048u, 10927815269159542505u, 765949388776130594u, 0u, 0u}, + {6627590658330963970u, 14317082446221989348u, 765949388u, 0u, 0u}, + {4641207382613804086u, 14129272348167540396u, 0u, 0u, 0u}, + {3090574811661158850u, 14129272348u, 0u, 0u, 0u}, + {2384653922454093620u, 14u, 0u, 0u, 0u}, + {260639070955u, 0u, 0u, 0u, 0u}, + {261u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3679756u}, + {666543139591118944u, 13179917069563933527u, 15057813325141876642u, 8282445237509481868u, 1749236u}, + {18257005716327609694u, 708778264599879190u, 13651462127579899855u, 4716011329564280478u, 1868181u}, + {14141514091090123242u, 12324893935726839956u, 7596571657774520371u, 15310671797547100545u, 3850735u}, + {15942258643245203756u, 6175439602757476740u, 14557032358692522282u, 12392882118837024803u, 2410918u}, + {8292293822538741452u, 2219706644913221604u, 11067461530974930072u, 4223814053921402091u, 3730013u}, + {7878975181729524880u, 6408178565515188489u, 12419327625152301582u, 501152163653991255u, 587887u}, + {744382080227931151u, 9512121400112435862u, 15216103944567246318u, 5631336936492792058u, 106722u}, + {7122087002560677263u, 13579003938501975317u, 4802698563645380250u, 15926696961434445223u, 1192289u}, + {8915181349953449573u, 13967383979693003895u, 389858050402262433u, 15946722148353669905u, 3760679u}, + {12375804153671582201u, 13202658248072130715u, 3973007516252948605u, 13832372760247331887u, 3178770u}, + {1858357974692964103u, 16456656154277258931u, 11763935240111380868u, 4526208800843090503u, 3051299u}, + {3183832231309227712u, 14697721165150491470u, 18067473253487123403u, 15836899630577792665u, 1079222u}, + {8540434282865003438u, 6544670077231532124u, 5384889006636675750u, 5856573264941779416u, 1024465u}, + {2992697572096903587u, 17050012807775382964u, 13614893513816182605u, 15727453549792336168u, 3011138u}, + {8441209799703707312u, 17395778128029735687u, 11552000035241351542u, 11872991130004256685u, 719205u}, + {13076502103523989483u, 8893488597939012697u, 1369522539436301986u, 18387953482116147088u, 3126537u}, + {11036379909428331793u, 17734774765819255224u, 9167679104256480365u, 9857507235422136418u, 113265u}, + {12596269034083914939u, 5375301790687012639u, 14497714143023237830u, 15278299316365738379u, 2980016u}, + {2671126905250341351u, 5647868968746032407u, 9855066690397457158u, 1928469052751985295u, 1107066u}, + {16822736834296369837u, 8424479970543085598u, 4082337356452825689u, 9387908990033806071u, 123997u}, + {8475609486349840883u, 12495751708443447598u, 5636130068267113646u, 3100763893943718001u, 3616137u}, + {10703201989151541928u, 14661817783583580207u, 14678911618140558186u, 14334109576384967058u, 3504175u}, + {17846598284567753338u, 11622421182765936826u, 7728519079338901734u, 7054227255427610536u, 343328u}, + {9147690118174819999u, 12527063602413728951u, 6729899527550366422u, 11103202772644467952u, 3384768u}, + {7991003052554554452u, 16706829882158389170u, 4586838998759763613u, 13393092857164752664u, 721427u}, + {17835772312033807961u, 4193615465361346232u, 15835214465227057275u, 8011700930839957813u, 42265u}, + {17579891004684749937u, 4984696214136190536u, 719571586339912561u, 10449130795149526985u, 392502u}, + {6111130808630380530u, 13192617602503146546u, 10660561871300522555u, 14562874390052993013u, 2360213u}, + {9374805091309291216u, 18014752534140120162u, 23007177250917971u, 6528721723146830872u, 1354048u}, + {540193319131183031u, 17391240045484902127u, 1722417504240807862u, 4996951772065267578u, 1114411u}, + {14543873145390234351u, 18077925903729610915u, 3527123611181083897u, 15440882383623456811u, 3453058u}, + {748960900813317152u, 11919786519126266177u, 9361695670241629366u, 2081310325700539948u, 451801u}, + {11894305940421309876u, 2243448569511124546u, 15314493653970208252u, 1449486140259115094u, 3728180u}, + {9153014728005915770u, 4315251196837925374u, 7431344172769335444u, 6481898653145794920u, 2801487u}, + {10593646924349138732u, 4928254951223170111u, 14274974392069854785u, 1276657418841497915u, 2162708u}, + {11522745396133841197u, 10704982668256366648u, 14717440418788955965u, 16180795986754679319u, 853940u}, + {10688869794390609201u, 11767585894389031288u, 4826523437008372222u, 4843611229356271233u, 2683110u}, + {10493870294971218057u, 17663549012132684443u, 7243611998331360520u, 15181589396300088624u, 3236269u}, + {6729120100038371189u, 6535212305383560568u, 3668122670088738804u, 14255044666650072725u, 2753616u}, + {81854998585988506u, 18200245773211005296u, 6137530243757147186u, 15543177982038822707u, 3032639u}, + {219549606272283930u, 4947492078378456399u, 17377152624093469326u, 15404209861122778810u, 3078076u}, + {7399038319437871638u, 7105039116186675251u, 17021726212310357810u, 10865419601304827862u, 3199555u}, + {7669133561096255645u, 3678001897525817367u, 13384196441138383756u, 2220749204238015445u, 3011562u}, + {9293627114964674777u, 3688373871102128523u, 17004202004361562364u, 17061145708647850984u, 1899960u}, + {10600709463372555631u, 440771450313001651u, 6201543465848282680u, 107105686969358844u, 3561101u}, + {10625101225433422646u, 12480101169192954641u, 17315000544305511093u, 12171366517246630092u, 2579825u}, + {4384571210203247101u, 13979218727062262447u, 4507965380265189162u, 1632856452535738853u, 2900571u}, + {16771997812056479008u, 672697171860767913u, 6938034229947197963u, 1710830755409822768u, 2144041u}, + {10156944523491505109u, 2094161954614323370u, 3064797850298218033u, 760126517700650416u, 1615669u}, + {9008427227757435221u, 12119406689757553128u, 4621306367461506759u, 6370872108648611123u, 2087423u}, + {10910470085711906107u, 3760358000199815666u, 212814390955774688u, 9910396547421574354u, 1042866u}, + {4178387395630978097u, 13076964171335440033u, 12491135457867568424u, 10107300657425480772u, 440082u}, + {8072935700234670453u, 4631523069785408968u, 5898407009167302649u, 8655029374684099224u, 2762050u}, + {117075884898571817u, 9461213900268820043u, 13375218067632996787u, 18137406941643730777u, 2385567u}, + {12994461676671558234u, 11450594497331955413u, 10397637341620582414u, 12437912136580699007u, 3544325u}, + {11661585740142634575u, 9515105940772025409u, 2067478011166879725u, 5397643227433630007u, 2709u}, + {15893833963770171945u, 8571378167424346781u, 11233287786466224790u, 12538071340226799770u, 769994u}, + {15552729689312234737u, 18262357327602412672u, 13167471763546964279u, 2103874121894273396u, 761510u}, + {3316633694450911830u, 9784720773506771916u, 10060366425268376039u, 16803466793020653770u, 1090440u}, + {11820752926749231322u, 11961772739190861735u, 8943070265833751591u, 7730277646469491788u, 226599u}, + {10232903746523730320u, 12093669617826083609u, 2880012168337398915u, 652698367831987581u, 656824u}, + {1352339838734403020u, 11976651073612925461u, 6689069148880973389u, 10460467400381719290u, 2611230u}, + {1742855852367768128u, 14002866419443639869u, 15642229685238014292u, 6893640135591213912u, 2453413u}, + {9150058424202468915u, 16089165561430527159u, 13836521266664320038u, 4729001101077067947u, 760154u}, + {15243566273283295181u, 204696414631908003u, 10628586187559639657u, 11038834258826581919u, 2653294u}, + {18300778747786901171u, 14561985671019319527u, 16085653500898797439u, 15685442552639505481u, 3370644u}, + {12603669856623941975u, 13246651187631847515u, 9899743783794717364u, 10798758934568289674u, 3739557u}, + {6575160329482033860u, 15961885387748957456u, 5179177715407500559u, 429270631916447684u, 3473497u}, + {414978256405235582u, 13963069897379599113u, 6013063698876178457u, 11737404944773394170u, 1078231u}, + {13287450243181033138u, 7582931010266638802u, 5937369883480326878u, 15368157393125395236u, 542459u}, + {7634157931478359827u, 757027784163016719u, 14489160790394319112u, 6134902110935512362u, 592335u}, + {3995065660445244453u, 3176268567075586614u, 3541327026588773180u, 13701869525492110698u, 1497213u}, + {7053308689467416254u, 14466550539635095703u, 7300426363926455116u, 5359880677543367688u, 2057825u}, + {10817319910695913847u, 14175993081115279324u, 11023089670183190900u, 13512730261575886067u, 2587072u}, + {11323308588825300030u, 52056799738977730u, 12805626795713585029u, 480068632824557794u, 1648331u}, + {7020816675571203473u, 12712759418715072477u, 13822342542930341776u, 12712542891261147107u, 494536u}, + {8787596141566821914u, 17275765137828686073u, 1459456285130593997u, 9448667410708338534u, 20150u}, + {7744591186603431253u, 1221236105527287718u, 3198682653099657380u, 12538393073941213522u, 2151359u}, + {5986844569326377448u, 4899042684214028574u, 3620351833892398634u, 16180586645917922445u, 974362u}, + {1988990486476618300u, 2868668412812219940u, 914800550206842419u, 8664885107181086752u, 1122218u}, + {16240020661268206505u, 8270838604347204452u, 14323731491323366942u, 813334811323002588u, 3289355u}, + {3515081185338999839u, 14845940192194607956u, 8833228357746962036u, 7626725264648344973u, 250986u}, + {16258670173478864971u, 7103546378661190640u, 3140343264367076730u, 9083886730913729266u, 3608857u}, + {10305780657137609312u, 17235464050826293859u, 4242606849661395579u, 5038545659178529546u, 576075u}, + {3859828081306948470u, 17412935334197679742u, 2319064643484155827u, 10386920254592430673u, 3846829u}, + {13557302592825559724u, 18194879976725823616u, 6010988455754517134u, 791537420824523655u, 957465u}, + {15848934867291640855u, 3167539400750318709u, 12221652236814980657u, 17167369493632920504u, 1853486u}, + {240908977875103573u, 7497692727177168979u, 11426907202048039978u, 2340033808267267067u, 661075u}, + {9100077301674199337u, 13461427562601702640u, 1878141737828239170u, 9307624314571265094u, 1754740u}, + {16464554068309604509u, 14953530537047202694u, 3208348747412966637u, 3491133762824066341u, 2640800u}, + {11019769332794828u, 3204725063635771859u, 13495622121781097393u, 13379369062257654106u, 2387418u}, + {13209525477319062655u, 16976414925714099340u, 10286302847987595786u, 18202553799780176444u, 665168u}, + {8879128283106723078u, 4993421075697252772u, 14932416722646703354u, 2462228399354124858u, 1046427u}, + {11008439046257623810u, 2133210893787247117u, 5958314768342827496u, 10899999873250166400u, 3376373u}, + {7005432588760950154u, 2768099675942087320u, 3108925117473958433u, 11087094987331357021u, 3155623u}, + {4440349567423201795u, 17282228000010482693u, 13475231976226310762u, 18000551896405262607u, 1384279u}, + {14181153307936025642u, 16853570710753884962u, 14881126273361701948u, 14941457424291245232u, 86062u}, + {8195266271239677163u, 3577250402829765818u, 13326323136773941514u, 1298624271312631863u, 939380u}, + {3125237243453897966u, 15794460183215886609u, 16780448643393278753u, 17239093478811362253u, 1281963u}, + {17003593915630957405u, 15377163983082951015u, 13459933588528672893u, 1320684753294761244u, 1420318u}, + {6632126462125743334u, 1877993024127773705u, 4185476445034480032u, 16743562060769248908u, 1515214u}, + {11388931419389546488u, 10426227846529479436u, 5746801475461169853u, 16673255004379817021u, 3885886u}, + {16076158833357195850u, 11767838540717109992u, 1304347087765683197u, 11672954601321263615u, 2292130u}, + {18000116392213490245u, 8772834618984203625u, 15990480688366234586u, 10274460700552393387u, 2022467u}, + {11453039326649922928u, 1818478748287037057u, 5175235154227595743u, 9693025542503327260u, 202790u}, + {11929106250329275435u, 9935603465243582884u, 8772089050336373120u, 3750735714895985774u, 2163400u}, + {5858282831487761143u, 15771861120303026247u, 15901834479806139750u, 5083939272534754478u, 3332218u}, + {5119811606378032360u, 16155024018211015259u, 3717365118353596363u, 5898133694799910383u, 68209u}, + {1355075301300001269u, 3719372659317583639u, 11180315675112189780u, 15709813740132947397u, 1073851u}, + {2655051810927506756u, 2522968348017328633u, 15593781954304065222u, 6721165315807408863u, 827024u}, + {16282266159280024506u, 2391155034113408317u, 425744357114340386u, 375543876981620564u, 2599411u}, + {12640770352114843659u, 16757469209770841409u, 4746692942575153304u, 10856589775524119696u, 3189771u}, + {1641849978610839043u, 8736352479772514841u, 12762188636300090007u, 16920317905022467389u, 3705405u}, + {1077795609928756688u, 783254499043466965u, 2363984742772741439u, 16425426521254403118u, 303488u}, + {14306989318798783582u, 4121715685742137572u, 12087039534813555147u, 11030410269693842693u, 3727095u}, + {4938437859091501086u, 17673776709504762127u, 17968571515074379853u, 15489077902750391074u, 2696326u}, + {17423289479349226722u, 14487447339413951278u, 4075879878889143674u, 6967267478791448739u, 1093509u}, + {8407555758713664250u, 14181764661528470221u, 16039615217291571254u, 5712721616628872480u, 2966374u}, + {11802349888103154452u, 4115090052944484959u, 1738289541580293370u, 6323730629017358146u, 1250445u}, + {8714798542725166258u, 5523973919671944490u, 5309475915075812261u, 1824506496165178769u, 1961930u}, + {9166836648799910055u, 12000032130689215882u, 14151560820601178241u, 14952113188276122228u, 1126540u}, + {1079266357911996147u, 11542882785708291435u, 10212318012571761670u, 1750163266931180410u, 2249233u}, + {13522125331625964613u, 15359081539506375756u, 15515389286214625920u, 9120747876042225158u, 2500702u}, + {8355001091626966032u, 4313279695733936562u, 3458019096407911611u, 14385591032467020763u, 175185u}, + {17935707031908293432u, 11511395108224920480u, 4922877484660778718u, 11604504247352541536u, 364791u}, + {1201066048835410041u, 15900108162448051774u, 7306640815132021290u, 2744917791263158396u, 1273084u}, + {8843964091420778522u, 18281452592739507552u, 1340379907734694573u, 8165992383763109010u, 55351u}, + {4800074803076660394u, 4365528791526260687u, 2851981484564479503u, 6342089329234874649u, 476103u}, + {15825291426847466575u, 1820661454872252912u, 16378994982441383481u, 5052814139190770187u, 2311160u}, + {606710476930546786u, 9232680874477585535u, 9289867898593243075u, 9410120607016840386u, 254697u}, + {14838178403366817282u, 15620992191137237169u, 12631975029781821051u, 10813337445474652608u, 1749891u}, + {3487858161562707752u, 2578612723609620069u, 8513660577284099750u, 7886557552381370150u, 1092514u}, + {6563628485882495229u, 5190960528969963328u, 8403834377441581477u, 10180274093389341245u, 3101611u}, + {15701099996960111787u, 2011414772051849285u, 8976086449634529710u, 11009968928278522721u, 2595205u}, + {4632274463635899206u, 11519352053639017951u, 3322701356955689798u, 11793260921646033893u, 2436316u}, + {1701543597531379117u, 10814348052457962233u, 11085027579358741580u, 549345267793440233u, 2057478u}, + {8107363372731424855u, 984614824445218681u, 11680933642648398888u, 10126016935962544088u, 2081336u}, + {8813907324021510903u, 16953116962430055043u, 5253320309815781597u, 13224933591590227567u, 2693070u}, + {2687765643261536772u, 261755423096055947u, 14032967403871418730u, 17847904113655718765u, 1500307u}, + {5660467151476892125u, 4493810623081864491u, 16824627378671348532u, 13358330694125567229u, 2384624u}, + {17667899135659771961u, 7378571089313285621u, 17308941777177817325u, 10780570073649618723u, 574801u}, + {13053971370219514415u, 10688854239641180756u, 11585424856667430786u, 3109079761351783645u, 1045497u}, + {12309463707822976866u, 4282683515514684978u, 8073342937963879125u, 11764673846880164444u, 1704922u}, + {2350955530279594349u, 2984813447868793430u, 745587814955188784u, 1328486964247013731u, 554674u}, + {9050832521441113451u, 16262159337696651247u, 1476973890522044218u, 10458583066150378456u, 3075529u}, + {4599169081520725178u, 11058626409265721640u, 13325620228633604502u, 8847759979440063121u, 1110960u}, + {17099231707391078994u, 8860262611324200513u, 16664317867052812164u, 452839167871455958u, 2264460u}, + {781930658371152353u, 8083253540726037705u, 2284137074167871116u, 16687076137299344715u, 666903u}, + {8734483310560219522u, 17742471816547728067u, 7391794137530760774u, 16081145676107994986u, 2605210u}, + {4176096178713828079u, 9855060698450390876u, 1356100333799927618u, 408345628399054217u, 1176690u}, + {9766181431138295268u, 1513609410063065377u, 12729826126275183204u, 18396392579364062600u, 2021903u}, + {16720677241431086328u, 8815063909834434454u, 16696292843891831766u, 16754659362378539294u, 552765u}, + {5861966023881553425u, 1374406219959160096u, 12498730441608050869u, 7576244105224996702u, 14332u}, + {6378109048151727993u, 2092021136879302130u, 9569381575547308083u, 8431002888749877022u, 2564304u}, + {1303127334338604874u, 334665610783974913u, 14701912738132109618u, 5883968185118355402u, 2385372u}, + {9530698944943320857u, 18091844988094318465u, 12464770352708852952u, 8546798449164057333u, 3182367u}, + {830114136618959299u, 4468713292197350000u, 14971606334547676811u, 5679196653102796301u, 1244568u}, + {3628470132910205250u, 8050532388101893130u, 6242713737342875304u, 6436084102433111506u, 1635713u}, + {17872164487101747014u, 14733361520673371569u, 4345568018893962568u, 8172681711810980542u, 473941u}, + {8766146352196236553u, 16976290218806053447u, 7626238145009823732u, 8295365990867432330u, 1102679u}, + {10666372714410780273u, 3173940087683912839u, 9847085865723187386u, 3911450923651928509u, 708748u}, + {2653415225104584658u, 2464946512064772249u, 17352211633691189654u, 5777681619914439300u, 2666739u}, + {18176315859706797016u, 3505996260788088176u, 16257844658625208769u, 3652072359518458555u, 2783054u}, + {15400805609370833960u, 2212691991108589099u, 18106841044804546735u, 2717469267936719653u, 2736076u}, + {8794369462329283668u, 4747133803098718523u, 1549867213214740722u, 11795859524637941771u, 3613173u}, + {4093938660314036989u, 11673146620000949730u, 6990934877306480362u, 9794426484541168246u, 2751675u}, + {11142602616948893378u, 772082913961549642u, 18153902867080574752u, 12588780816892912078u, 1310961u}, + {608143009499134113u, 4242050456598384002u, 7175323290349255687u, 3699120270580719900u, 808916u}, + {11942040819727703150u, 6931470767459392738u, 4348416971874803972u, 5131011046821132562u, 630928u}, + {12003098078206053679u, 5711763732513560253u, 14814805404689697868u, 15576078884668382642u, 1733339u}, + {7919213750817842508u, 5609266094948740876u, 2894450330115162078u, 17037566669453051421u, 1548678u}, + {11576980831731218140u, 3653628213085451915u, 7943445975020229985u, 17898851405162279158u, 2569091u}, + {11990185523010093668u, 17708059134347436465u, 15365772834065260053u, 2713522361481255582u, 1760334u}, + {18344305054660546972u, 13421239846661222818u, 5822813029591129378u, 12786666578209016463u, 2442857u}, + {9684202454435972263u, 7676674872796950742u, 6290770927600493091u, 11069874658477310680u, 2466923u}, + {312209050202912213u, 8083766488154907608u, 12516268009047821655u, 12943816041089522990u, 3874631u}, + {17894575912775981582u, 3568453123364465436u, 14332690090397255150u, 1296453438025652266u, 2150828u}, + {17117195381426393071u, 16622408570307375812u, 9385524723873012001u, 8182183901244878773u, 522687u}, + {10998215721356088485u, 2223966063907042328u, 11997595688593511129u, 4116924741663731277u, 1921231u}, + {10064194565216272499u, 8161339431857237006u, 4141120159089007166u, 3350089786425086873u, 188967u}, + {14026033185351265197u, 7023595711297426806u, 4894060387580300341u, 6848957262840620379u, 2549242u}, + {704933447472200173u, 15694474314330428089u, 11460878183651013501u, 767601161984188107u, 2075793u}, + {5295617963577778530u, 7078551059736592394u, 4829719073908163135u, 13801292084232834709u, 1680203u}, + {4558056653227737479u, 2453572788529112049u, 18201268772591607775u, 4210334742733991381u, 124032u}, + {9435580747352384603u, 16851839745695073215u, 15495764817754481142u, 9730063185891556445u, 923347u}, + {6296160036813930613u, 14807376618206732626u, 4566218443790041197u, 10825671861219481079u, 1834636u}, + {2013717756920931063u, 8646078926925890942u, 2915560570870343517u, 9185157514402933930u, 1696279u}, + {7861642208890921698u, 63578944152151815u, 16760172912680642408u, 1256269932420540390u, 3291005u}, + {1636068727345522179u, 13672098190033019170u, 6208334191713131990u, 18291279619832336243u, 794025u}, + {3277271021905589446u, 1669450237932924070u, 10223750835436818379u, 1671971857126749374u, 1749589u}, + {3351825458182072559u, 16576213733836899478u, 15293000135826875553u, 12137950020561042525u, 589012u}, + {4003096169494240327u, 15706801692651695846u, 18031432561847296788u, 13917981015078385478u, 2505161u}, + {6519032836963497816u, 14987124605901484090u, 2108013761225215778u, 6171107570972293869u, 715104u}, + {3770990162927949862u, 5277419914343117815u, 3156273570676012523u, 4985165335262221150u, 3804757u}, + {1699787319060325077u, 5950681957158731518u, 13651669051253378974u, 9797960578747091627u, 2382421u}, + {7602523598478692393u, 11003726010898809135u, 7703986845601753203u, 9699665521343135186u, 1556759u}, + {11510585004301423356u, 7979044768097367390u, 3824152647515666670u, 9540319557563597081u, 2653179u}, + {3624092177819662629u, 11339549136363006923u, 195246707226999971u, 1634209592369474784u, 1726038u}, + {17707428292564067712u, 8311037462355607851u, 7778110074137888717u, 12065457987215672391u, 1498040u}, + {9942050913334199097u, 3469257269968377341u, 16943427245049768066u, 17321456541660342483u, 3629111u}, + {1447565842061782519u, 11458494106575380088u, 4335646356060911025u, 2877191466632730190u, 1153984u}, + {11827697976449962526u, 10998663990025122425u, 15583225263207637474u, 12487251018951880037u, 1306347u}, + {4117962485343855958u, 7932810125447120855u, 10639838297362936858u, 3338747187012394326u, 2046536u}, + {12058826514332135217u, 14864092894829754098u, 17310360122698111697u, 12431658103691985429u, 95808u}, + {2564485594693253186u, 16541036949781110590u, 7622400478890777227u, 5694317287084179012u, 658901u}, + {11986845380494915916u, 3416899183517692207u, 6521164361860519263u, 17233919558876005288u, 3358180u}, + {8370022402918116285u, 17206657113532051838u, 17004654514577402453u, 10294125857633136412u, 191831u}, + {12784595936843242608u, 11663141764110935559u, 11606420368618773450u, 9875429050852656866u, 797646u}, + {1254940700535515451u, 10654866726712496015u, 15881776009643553366u, 8661625266050199499u, 726086u}, + {1621488561796913231u, 15949699945637426382u, 10050791073622155057u, 6138289424503003299u, 1380446u}, + {11458627732941681332u, 13143777718710691689u, 3562140723296442908u, 16238423398741651080u, 2812904u}, + {11212179740016150884u, 12839236636409363364u, 5912254233144678726u, 10356124883854032139u, 2994136u}, + {9589481257283935752u, 1182203251799391648u, 16442614448504459058u, 12088850275203970617u, 1171089u}, + {17501929005450906140u, 7362496113600501830u, 5467623094904262053u, 16883079796034523744u, 2741234u}, + {3004871436022866633u, 11293263875235535495u, 904958310200330022u, 2284352274102996941u, 1591416u}, + {8540987851028950592u, 2442318932246544657u, 16556417609669706145u, 2911660207468276273u, 2311883u}, + {17442348990970126750u, 16912804353279533908u, 14516281591532160168u, 16111490187398949794u, 2147669u}, + {15702696536644923707u, 9172151643580897502u, 7536101829613170323u, 1264596615154304818u, 3061528u}, + {4608911016632100018u, 8561520928024676901u, 5425815846397695949u, 13963590874075184119u, 1466243u}, + {2426069244047893276u, 3718163762797954067u, 3048929645939145440u, 1540256898130945644u, 2117447u}, + {8691723648761034925u, 5356546658376011882u, 1320602337498820151u, 7893337754573045991u, 2094348u}, + {13414667871473979053u, 10729406563666619423u, 10715941617048487847u, 1912131354436749542u, 236079u}, + {3670129368420365024u, 17601306615983548776u, 12409183889361857301u, 4976328879423336215u, 28489u}, + {185765652468156268u, 7426672555566225536u, 15482803133452027948u, 3675462830202569526u, 2792325u}, + {5142999471600817340u, 582126935426752964u, 16947332336241145069u, 17129159095310004685u, 329908u}, + {6222075639371810712u, 10247020179974486857u, 1190479332295924917u, 17516081096789516914u, 1455174u}, + {6566919461546438785u, 15149043349965649970u, 15730979326661282563u, 10547251969414275975u, 1027336u}, + {8412018457970582342u, 8796687406150847455u, 6147395021148301500u, 883642143272095677u, 2501941u}, + {10331621125090571042u, 3849865528279222827u, 10178587487392775376u, 3432859585980776084u, 2104748u}, + {9103079998978253631u, 4698758491227929847u, 6003471692105164442u, 14594459746789954689u, 590367u}, + {1482345959688682099u, 17423617886494291605u, 11968944128529196126u, 17016482556504016329u, 1298380u}, + {12567853899766411754u, 12023127927337746050u, 2420183485669816028u, 6581191958038347740u, 3571241u}, + {8795051085136599600u, 14851487759079160247u, 15883074540559641193u, 9217192218150578402u, 292305u}, + {12675066420529004941u, 1532645993774958852u, 11726471298313549322u, 8868476151408794016u, 2156553u}, + {380334760625881072u, 12867532712722193227u, 1382282134039814072u, 12793975534854111378u, 2405164u}, + {5605502345083720724u, 1513734371319892700u, 15809900105810613235u, 2494325654846824918u, 792453u}, + {4555699344112442517u, 5894145929436083172u, 2833031896716840827u, 591078932479192498u, 2518460u}, + {10876695642386718226u, 16072562432191055871u, 15532598615316584919u, 17196164768697802257u, 2037956u}, + {12585692242721431900u, 10429902876418645482u, 12376642859955054744u, 5225740440692456983u, 2570484u}, + {6771259235549620804u, 9397767123035671016u, 14177413533659279501u, 12081035270053270975u, 3000058u}, + {5957047653331246900u, 18090529135562410054u, 1019453846727982011u, 15619781626405754376u, 2567003u}, + {10317115912814864280u, 554140117831043697u, 9826234213017804022u, 11288337532913984282u, 2060297u}, + {4885951352635445966u, 1248220447205286873u, 18073644554439049686u, 18340634668396864844u, 2171058u}, + {10224961641501945688u, 8486941822168638336u, 2014284341995895495u, 12289839956083563500u, 2705108u}, + {2352642851875514495u, 7652239665026574466u, 15429189303167114149u, 14821707225032811133u, 2202952u}, + {261904845569322958u, 10578713158269307290u, 3401239556894231785u, 17550632657788862277u, 2825611u}, + {14957480045540837488u, 1501952968546772992u, 11807754483962529969u, 15544506058673997417u, 3768419u}, + {11178606503280155149u, 396861501063053259u, 8581656326579984813u, 7275274480192804133u, 95007u}, + {1551721436107307318u, 3457176858295210469u, 10388937778534882954u, 5406072129934080603u, 2073902u}, + {1711715682535391747u, 2634355802110759134u, 8293771161378051764u, 6163152238057901076u, 3399645u}, + {12559619439461974196u, 12125482070118190995u, 12202104242849597424u, 2008267426443672818u, 581358u}, + {2184536402641116064u, 13141618394365437595u, 17562173749918511233u, 4190064618449291351u, 1505138u}, + {11915062402756064103u, 6084573266556861235u, 10136381827982252567u, 17033357092622672561u, 1533860u}, + {8108762273335029350u, 12959968558617483893u, 8566489411931208163u, 965043462391320393u, 2537279u}, + {4091441597670148032u, 17579405389271205779u, 14868320280462573181u, 2136474764421551303u, 3366926u}, + {18284802675675323306u, 15824227394535137445u, 3796408548678956128u, 18364737710007289114u, 3536281u}, + {9738221659914247976u, 16098464124217587350u, 16702958787290378019u, 2371075898158153348u, 2290683u}, + {12772870744956334305u, 15905757390173973971u, 18124794468046607200u, 2348098654639767066u, 1401895u}, + {18082516574288169048u, 7186758830580772382u, 9269108653981508706u, 15662358306861673818u, 1545444u}, + {2066885933707225103u, 14641274082121554771u, 2754307753510347249u, 13863566480892772003u, 2211706u}, + {931304149599849654u, 15588569276824674784u, 8470540104095771605u, 8255364508735639042u, 2507747u}, + {1402117243064320152u, 2097636635137407554u, 12396363178624298766u, 16043045651785979207u, 3810936u}, + {15726577195867170428u, 14514453375608466061u, 10759096383932142582u, 12896551115867504643u, 2532539u}, + {2765014305568429037u, 13518926144683192256u, 139045424820942438u, 8261282832010024134u, 3298450u}, + {15608940650065055046u, 6948633608975703719u, 9921015612329963384u, 10725369588864544630u, 1934791u}, + {10027249412349427864u, 4828456666465234247u, 17436174000111712459u, 14158979036572361621u, 1614995u}, + {12127326512110782603u, 16399611397636029784u, 16315103665908614836u, 17395671576744932169u, 897930u}, + {3225193770947940764u, 6375859219995167454u, 7885744204043438369u, 12338412482787454650u, 1976083u}, + {8726389564233469611u, 1406741644333969395u, 12423047942868625924u, 8611306000221245058u, 910164u}, + {17379082893982201615u, 13211160321408317038u, 10298265339085893367u, 8087240103232338612u, 2450957u}, + {14765302546980896081u, 17252386601885038954u, 13511043293321985916u, 837845719019114340u, 3584043u}, + {10648876998226947012u, 906767504856866667u, 9621412721148343128u, 13684999197976395825u, 3556158u}, + {13254839398265153334u, 17481838721584491609u, 11659212083529156968u, 2587615341524151769u, 1349239u}, + {2219211670508891552u, 2011574219551756550u, 4371361719167103433u, 6149784562338757703u, 3106353u}, + {17836675827786746873u, 13358789854642720113u, 2393910555251300200u, 5389564063750051713u, 137631u}, + {4007680919304426395u, 90742203788513753u, 894914442360108180u, 16503727883908670127u, 185706u}, + {7020316521683505316u, 15874001544051034016u, 16621826554411567521u, 15856096375902826109u, 3243193u}, + {6679927297146484690u, 666456400427741831u, 13594807621747764845u, 15624266679301176853u, 3047453u}, + {14214382278825803777u, 14793013358343004591u, 9260466626554150040u, 18430902080863548753u, 3228590u}, + {10910884607703941486u, 10418941100387479318u, 2129680172791840586u, 10940253691606958338u, 864775u}, + {4687775565121879292u, 7863426312595977934u, 1949539316512726823u, 12842204032797768477u, 1292785u}, + {8181163725901948468u, 14924903047767955665u, 8921934476425358068u, 5572282427799985707u, 176262u}, + {6672698259112518079u, 1692821784311773013u, 14516205915353486679u, 11316293729530888572u, 3237640u}, + {15369505254756666361u, 12367119124191414998u, 4148945989866703859u, 708242274140450146u, 810233u}, + {10692442821883982158u, 3709069189733820127u, 5071686465903860953u, 12048564365833281497u, 468624u}, + {3945295757696850614u, 156182110973998091u, 13830960688006941886u, 1305681291726065278u, 3344523u}, + {17363537301461358705u, 3999007334794194814u, 7848433761655578231u, 13320292864114056806u, 3471703u}, + {10020594843413154163u, 12637980491151365148u, 10846295448339467449u, 6188937123285097095u, 3800586u}, + {15668481951037110852u, 9561614961475948273u, 4116281580148968867u, 16499239884108630021u, 2618824u}, + {10838610007622830103u, 12796147528981465045u, 16783762813117008002u, 4587937216990788194u, 760358u}, + {2627250031441278996u, 178762871715424661u, 4398196737851257585u, 13200565842959147152u, 1029411u}, + {16517022597174231159u, 15823388935722856681u, 3647388526904474007u, 13998162537822246850u, 964519u}, + {3570415607112747211u, 11404022008931235944u, 15446557393960961793u, 9601452256189808288u, 1380464u}, + {3033650150627259359u, 12930259750564830076u, 12024290845000580355u, 5069496658367377158u, 3231624u}, + {10040173723627756414u, 13267861768844906901u, 7358065733024918453u, 708131292281305638u, 1811977u}, + {14056811338006555784u, 10092914174207068430u, 9035408392071455853u, 1186346581301426280u, 24840u}, + {16817475963399440822u, 9645643346174514821u, 10395989508079412338u, 3243049950015894646u, 541749u}, + {7487767876006615740u, 11483777367753145065u, 16497126703101574534u, 10530402237935716681u, 795323u}, + {5751232774071591867u, 8542711504827359870u, 12093844977110602256u, 7004257752046346931u, 2554286u}, + {8432363813915647688u, 12274337487033535566u, 14856511600771143577u, 13233657976078129315u, 1280400u}, + {7496333225850505072u, 8017490255881295449u, 17842718643294456651u, 17677729763637980005u, 2237130u}, + {15038878284802125152u, 13142493706710487372u, 15581634263485096386u, 11858713204467529116u, 827474u}, + {14045438537902192859u, 5096650675013288690u, 18104134556284585748u, 17741432346294634197u, 732757u}, + {7898020749762499907u, 3996713856043979070u, 3839127337373226247u, 5706066927584958480u, 1527168u}, + {6403780387790984321u, 1899397323298370982u, 1978634076377550904u, 14151459714393501252u, 2554302u}, + {8298329624554669110u, 12740388566454389619u, 9322122698735294047u, 10927815269159542505u, 2693094u}, + {5008237067584057288u, 11835744439060993282u, 6627590658330963969u, 14317082446221989348u, 324388u}, + {16889756274376740456u, 9535846334942265874u, 4641207382613804085u, 14129272348167540396u, 0u}, + {16812248380322825356u, 6288200303739878675u, 3090574811661158849u, 14129272348u, 0u}, + {2917303652857386417u, 1635732146479711369u, 2384653922454093619u, 14u, 0u}, + {7589176033746562485u, 7153946983884285527u, 260639070954u, 0u, 0u}, + {620681128765399396u, 11788778340533356454u, 260u, 0u, 0u}, + {309473905502093825u, 4807942237505u, 0u, 0u, 0u}, + {17381214111695097915u, 4807u, 0u, 0u, 0u}, + {88690879976434u, 0u, 0u, 0u, 0u}, + {88691u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3547236u}, + {7141757613572319068u, 6130510054930613241u, 666543139591118943u, 13179917069563933527u, 3266696u}, + {3461938412407388786u, 5183866228345761219u, 18257005716327609693u, 708778264599879190u, 165089u}, + {1930700635799941405u, 4758159019174379338u, 14141514091090123241u, 12324893935726839956u, 2740001u}, + {13141010859101332611u, 11085452667564633805u, 15942258643245203755u, 6175439602757476740u, 3143038u}, + {15482414535073198153u, 18315014464965350699u, 8292293822538741451u, 2219706644913221604u, 3638056u}, + {672404405088769878u, 13278391618468792797u, 7878975181729524879u, 6408178565515188489u, 28134u}, + {9415094748729162360u, 9318856215934711323u, 744382080227931150u, 9512121400112435862u, 1744278u}, + {1711745020721842258u, 2738103912204819457u, 7122087002560677262u, 13579003938501975317u, 3267152u}, + {9909564963539604440u, 9685146543191463574u, 8915181349953449572u, 13967383979693003895u, 873787u}, + {16418528225170077974u, 13438411820462806080u, 12375804153671582200u, 13202658248072130715u, 1492117u}, + {11454563893125794634u, 8045731761053617263u, 1858357974692964102u, 16456656154277258931u, 3796310u}, + {3365302085730551344u, 1235451470875104175u, 3183832231309227711u, 14697721165150491470u, 3224775u}, + {9880332004031184357u, 2581910175407719373u, 8540434282865003437u, 6544670077231532124u, 2408046u}, + {13034420027323104003u, 2377615548297361029u, 2992697572096903586u, 17050012807775382964u, 1620771u}, + {10567298613566581362u, 1323110909554089815u, 8441209799703707311u, 17395778128029735687u, 1648232u}, + {17158876069034823609u, 3172347361700665373u, 13076502103523989482u, 8893488597939012697u, 466566u}, + {2388120171967565270u, 8689116146892261976u, 11036379909428331792u, 17734774765819255224u, 2333193u}, + {14795043590270676763u, 2317515822404748323u, 12596269034083914938u, 5375301790687012639u, 1484090u}, + {3866532665610265582u, 4400002290694945285u, 2671126905250341350u, 5647868968746032407u, 3566974u}, + {6390287531253525459u, 9511421749995031931u, 16822736834296369836u, 8424479970543085598u, 1614807u}, + {12926531326532405572u, 4062437838705946201u, 8475609486349840882u, 12495751708443447598u, 1849984u}, + {1781731639207539548u, 447812314645583523u, 10703201989151541927u, 14661817783583580207u, 1146464u}, + {2679180964259314431u, 16098437084361104286u, 17846598284567753337u, 11622421182765936826u, 3312228u}, + {88873132105868464u, 12994774217391016220u, 9147690118174819998u, 12527063602413728951u, 3335312u}, + {10962516237030750204u, 15321664312853107323u, 7991003052554554451u, 16706829882158389170u, 773849u}, + {7204161244188995863u, 13871348626921197931u, 17835772312033807960u, 4193615465361346232u, 689673u}, + {3508904450070755442u, 10780512631001591125u, 17579891004684749936u, 4984696214136190536u, 329483u}, + {235765718139417753u, 3737556808614892548u, 6111130808630380529u, 13192617602503146546u, 19191u}, + {12595354286138173638u, 3238343653198323429u, 9374805091309291215u, 18014752534140120162u, 1374761u}, + {4880466104882902362u, 15495911085472060540u, 540193319131183030u, 17391240045484902127u, 3443826u}, + {14924966003522519029u, 9805199294546545816u, 14543873145390234350u, 18077925903729610915u, 1641671u}, + {6528060573754576662u, 11970202292510471089u, 748960900813317151u, 11919786519126266177u, 523840u}, + {4338701089570662509u, 11785997849168637448u, 11894305940421309875u, 2243448569511124546u, 3461486u}, + {7341211636255455082u, 3926570764029088254u, 9153014728005915769u, 4315251196837925374u, 1536236u}, + {297084045885052870u, 5706311554490002434u, 10593646924349138731u, 4928254951223170111u, 2193273u}, + {7179139903841287373u, 12854126527193546297u, 11522745396133841196u, 10704982668256366648u, 1203359u}, + {8054884900076511511u, 12547937754771803287u, 10688869794390609200u, 11767585894389031288u, 511660u}, + {16762061513924977195u, 9945517217406855246u, 10493870294971218056u, 17663549012132684443u, 2712068u}, + {18381104635205762811u, 11565720277092142641u, 6729120100038371188u, 6535212305383560568u, 2262300u}, + {8807771652068431189u, 12424949768969113304u, 81854998585988505u, 18200245773211005296u, 2579082u}, + {16638960064240782827u, 12649121189299695581u, 219549606272283929u, 4947492078378456399u, 2352442u}, + {495734514908641361u, 12216361163850451280u, 7399038319437871637u, 7105039116186675251u, 166132u}, + {10158260405703739883u, 17667100656451691381u, 7669133561096255644u, 3678001897525817367u, 728398u}, + {7721604995331751225u, 4797965020886598649u, 9293627114964674776u, 3688373871102128523u, 456768u}, + {15703275699347861970u, 16774586425618992405u, 10600709463372555630u, 440771450313001651u, 766390u}, + {5882109258650088281u, 4206549160228711270u, 10625101225433422645u, 12480101169192954641u, 2465u}, + {3289267091396715889u, 7579980037967158601u, 4384571210203247100u, 13979218727062262447u, 1310736u}, + {10675434967108016009u, 9208671243786606345u, 16771997812056479007u, 672697171860767913u, 243497u}, + {18151232723007149458u, 16813802271022277395u, 10156944523491505108u, 2094161954614323370u, 744353u}, + {18006511271716364804u, 17035180713472048992u, 9008427227757435220u, 12119406689757553128u, 724415u}, + {17637941432715926959u, 15450777173842591334u, 10910470085711906106u, 3760358000199815666u, 1872398u}, + {7048001648627262083u, 334141570590340935u, 4178387395630978096u, 13076964171335440033u, 1075368u}, + {8915456169472574344u, 2476239864201315751u, 8072935700234670452u, 4631523069785408968u, 1174683u}, + {4064104741244713238u, 11764064015334991783u, 117075884898571816u, 9461213900268820043u, 3550471u}, + {2605290171971202489u, 5880952625410710934u, 12994461676671558233u, 11450594497331955413u, 189926u}, + {16935263725520848371u, 13551861746128887708u, 11661585740142634574u, 9515105940772025409u, 3717841u}, + {10786223229521892638u, 13640113135717479948u, 15893833963770171944u, 8571378167424346781u, 1723124u}, + {12190930978669627323u, 10515171417387160470u, 15552729689312234736u, 18262357327602412672u, 3087025u}, + {17156185483908096920u, 3664834725696600232u, 3316633694450911829u, 9784720773506771916u, 11499u}, + {17545190759941131777u, 1026757381809530731u, 11820752926749231321u, 11961772739190861735u, 3255393u}, + {14056045547378096842u, 8253576692803438234u, 10232903746523730319u, 12093669617826083609u, 818055u}, + {9091398915612650732u, 8548784630914826222u, 1352339838734403019u, 11976651073612925461u, 1284409u}, + {6088801791203914124u, 14434346643478843327u, 1742855852367768127u, 14002866419443639869u, 1101662u}, + {10240875538136720915u, 13056352804752389677u, 9150058424202468914u, 16089165561430527159u, 3284114u}, + {15102761649670188781u, 11075754281719330720u, 15243566273283295180u, 204696414631908003u, 344325u}, + {3485312492698375006u, 7099510374861629670u, 18300778747786901170u, 14561985671019319527u, 3258649u}, + {873623156101402332u, 16288285871271312634u, 12603669856623941974u, 13246651187631847515u, 2014290u}, + {12223888032399581177u, 11279860350790159376u, 6575160329482033859u, 15961885387748957456u, 3033285u}, + {11361069591859585667u, 18232682809436025322u, 414978256405235581u, 13963069897379599113u, 915263u}, + {8597001674466128907u, 18232856252676628798u, 13287450243181033137u, 7582931010266638802u, 1976058u}, + {6996626276749420506u, 7780054840169469092u, 7634157931478359826u, 757027784163016719u, 310864u}, + {11242975375746842733u, 3060051319422632438u, 3995065660445244452u, 3176268567075586614u, 2983276u}, + {2649766883978521265u, 6576679907374975294u, 7053308689467416253u, 14466550539635095703u, 2857124u}, + {6645159422948129501u, 4311646873399850529u, 10817319910695913846u, 14175993081115279324u, 2822004u}, + {5409046408531434180u, 2456723618777205970u, 11323308588825300029u, 52056799738977730u, 1660069u}, + {13699060140984061253u, 6610615293486150706u, 7020816675571203472u, 12712759418715072477u, 2927354u}, + {5062066129484654099u, 1148194127220204575u, 8787596141566821913u, 17275765137828686073u, 3703341u}, + {5582054988521265061u, 14800567595670831559u, 7744591186603431252u, 1221236105527287718u, 3858886u}, + {10684834802991467787u, 8114382501077703852u, 5986844569326377447u, 4899042684214028574u, 3167076u}, + {8213671875577783837u, 17404054545970680350u, 1988990486476618299u, 2868668412812219940u, 3050559u}, + {10449029762534206223u, 15164058232035432815u, 16240020661268206504u, 8270838604347204452u, 112530u}, + {13044288039847056392u, 1887924953838137987u, 3515081185338999838u, 14845940192194607956u, 2271520u}, + {12474464059721730403u, 12761270391414820904u, 16258670173478864970u, 7103546378661190640u, 742628u}, + {3966325804039407763u, 16825009243448721381u, 10305780657137609311u, 17235464050826293859u, 2550865u}, + {12730498402026430946u, 14713951256590936802u, 3859828081306948469u, 17412935334197679742u, 1971419u}, + {11087535110028710187u, 6528074095006967943u, 13557302592825559723u, 18194879976725823616u, 3743904u}, + {7047785021961198189u, 7974295095957616739u, 15848934867291640854u, 3167539400750318709u, 200737u}, + {2307161202146242185u, 4439534923280281140u, 240908977875103572u, 7497692727177168979u, 3182950u}, + {1811472410167751722u, 16297676921551821978u, 9100077301674199336u, 13461427562601702640u, 2038764u}, + {13283377517080701476u, 1817852119915695446u, 16464554068309604508u, 14953530537047202694u, 1853493u}, + {10772687632258016866u, 12416020502071901596u, 11019769332794827u, 3204725063635771859u, 2324547u}, + {12936090009418688267u, 17136645309304507757u, 13209525477319062654u, 16976414925714099340u, 1162648u}, + {2121454330563139112u, 9472247814294887577u, 8879128283106723077u, 4993421075697252772u, 2360344u}, + {9774602533773998493u, 9974218964604051840u, 11008439046257623809u, 2133210893787247117u, 1621484u}, + {12748677655672604365u, 16617483498959646014u, 7005432588760950153u, 2768099675942087320u, 3277707u}, + {12052930187240385793u, 2709285585808014361u, 4440349567423201794u, 17282228000010482693u, 3477648u}, + {3521355822701837595u, 3964558928233361240u, 14181153307936025641u, 16853570710753884962u, 2516882u}, + {11503058304363068387u, 10828689336956066082u, 8195266271239677162u, 3577250402829765818u, 750652u}, + {17167998704338051548u, 14185700455185278888u, 3125237243453897965u, 15794460183215886609u, 1566479u}, + {13055613332856358944u, 15790256752699004539u, 17003593915630957404u, 15377163983082951015u, 243705u}, + {5709579478118678945u, 6381321374093014502u, 6632126462125743333u, 1877993024127773705u, 2706944u}, + {12132514599223611259u, 7053132470107535819u, 11388931419389546487u, 10426227846529479436u, 1217055u}, + {180204539441384354u, 8037193697620565521u, 16076158833357195849u, 11767838540717109992u, 2920067u}, + {10001084719593982862u, 17565551842655586897u, 18000116392213490244u, 8772834618984203625u, 923680u}, + {16962269674006833334u, 6695731371209429931u, 11453039326649922927u, 1818478748287037057u, 3453893u}, + {12388078551438340566u, 8606425244351077431u, 11929106250329275434u, 9935603465243582884u, 3431804u}, + {2282641869050737274u, 8281898226367145330u, 5858282831487761142u, 15771861120303026247u, 765606u}, + {10876041850610200337u, 682688734410507749u, 5119811606378032359u, 16155024018211015259u, 2408845u}, + {3888981648252693566u, 13408370532419805245u, 1355075301300001268u, 3719372659317583639u, 51638u}, + {15239710566469419782u, 8684299527783198845u, 2655051810927506755u, 2522968348017328633u, 718524u}, + {6933579130624213409u, 15567919874871125315u, 16282266159280024505u, 2391155034113408317u, 2174226u}, + {1371947875835204267u, 3621978240346382606u, 12640770352114843658u, 16757469209770841409u, 942366u}, + {7385474485013103496u, 16739599333508628109u, 1641849978610839042u, 8736352479772514841u, 3397811u}, + {17699819420223414450u, 14054480506358547822u, 1077795609928756687u, 783254499043466965u, 782405u}, + {427040925521086676u, 12384291874694076596u, 14306989318798783581u, 4121715685742137572u, 1066105u}, + {9893143873594668913u, 7009740864108705995u, 4938437859091501085u, 17673776709504762127u, 209843u}, + {11845975074264004202u, 14693011056305515551u, 17423289479349226721u, 14487447339413951278u, 3170002u}, + {8784952838646682176u, 8325659056038166763u, 8407555758713664249u, 14181764661528470221u, 423228u}, + {17497533864956631610u, 11624978614581413117u, 11802349888103154451u, 4115090052944484959u, 2580226u}, + {10720154389956508721u, 4087194385937345338u, 8714798542725166257u, 5523973919671944490u, 2085545u}, + {12398654561635772958u, 515874583749575475u, 9166836648799910054u, 12000032130689215882u, 740929u}, + {645402058029913863u, 14605357010360561015u, 1079266357911996146u, 11542882785708291435u, 586228u}, + {9597999565748771593u, 5176766509301751063u, 13522125331625964612u, 15359081539506375756u, 3354610u}, + {7583001804505323369u, 7957897138163146153u, 8355001091626966031u, 4313279695733936562u, 2940229u}, + {6634366071903140299u, 15432797842739681934u, 17935707031908293431u, 11511395108224920480u, 2571590u}, + {17545804177446739502u, 15899694239879184539u, 1201066048835410040u, 15900108162448051774u, 2758280u}, + {12590105817377616182u, 7814640398492432159u, 8843964091420778521u, 18281452592739507552u, 2280789u}, + {17054803525490481444u, 4152386762103487016u, 4800074803076660393u, 4365528791526260687u, 1042005u}, + {845946597199903239u, 2822164889678761113u, 15825291426847466574u, 1820661454872252912u, 504633u}, + {11814249284847684964u, 17883159409846159316u, 606710476930546785u, 9232680874477585535u, 3065683u}, + {13133174286273999821u, 16031803219451075527u, 14838178403366817281u, 15620992191137237169u, 3068125u}, + {4707603326912956788u, 3310681170425072245u, 3487858161562707751u, 2578612723609620069u, 152534u}, + {12658834425354825347u, 625690669881513687u, 6563628485882495228u, 5190960528969963328u, 3570263u}, + {11184248972612031733u, 12233257244147150213u, 15701099996960111786u, 2011414772051849285u, 3371576u}, + {338487526993858336u, 4211041233017235544u, 4632274463635899205u, 11519352053639017951u, 309482u}, + {3800533834866559264u, 715435076824650699u, 1701543597531379116u, 10814348052457962233u, 2594826u}, + {1049979434657300585u, 1531528014714319003u, 8107363372731424854u, 984614824445218681u, 1061562u}, + {11084577587211085588u, 7342129211391996467u, 8813907324021510902u, 16953116962430055043u, 2471039u}, + {2267209100294242014u, 4042293586179793211u, 2687765643261536771u, 261755423096055947u, 1422462u}, + {16079361455707830615u, 5274326181502940892u, 5660467151476892124u, 4493810623081864491u, 1555640u}, + {3913580294444584490u, 15280755587989692121u, 17667899135659771960u, 7378571089313285621u, 1318949u}, + {3710008452595026441u, 766743359923070791u, 13053971370219514414u, 10688854239641180756u, 1695988u}, + {12829079609880936662u, 3657152569378675832u, 12309463707822976865u, 4282683515514684978u, 1650811u}, + {8653483798506918349u, 11357515135517519331u, 2350955530279594348u, 2984813447868793430u, 2667174u}, + {12687590947956747196u, 2365288981514311424u, 9050832521441113450u, 16262159337696651247u, 1833088u}, + {13996192295914991260u, 13647541923517295199u, 4599169081520725177u, 11058626409265721640u, 3753298u}, + {9005148525751765932u, 2034257236120952628u, 17099231707391078993u, 8860262611324200513u, 694052u}, + {8484152645328133384u, 18367749823404635397u, 781930658371152352u, 8083253540726037705u, 883824u}, + {6330535432763395818u, 17574607414992159263u, 8734483310560219521u, 17742471816547728067u, 2993910u}, + {14371011811518848640u, 10862526729729354063u, 4176096178713828078u, 9855060698450390876u, 21680u}, + {16253220481179843658u, 8036319897609932232u, 9766181431138295267u, 1513609410063065377u, 1303072u}, + {12390846392443831123u, 2595223197406583983u, 16720677241431086327u, 8815063909834434454u, 287960u}, + {10005063878968764603u, 16302010336591585731u, 5861966023881553424u, 1374406219959160096u, 127443u}, + {9101321359858685211u, 3203379836172676389u, 6378109048151727992u, 2092021136879302130u, 2517259u}, + {9924068022480860113u, 11934843751335605899u, 1303127334338604873u, 334665610783974913u, 292132u}, + {15915265426190978132u, 16791674039172973841u, 9530698944943320856u, 18091844988094318465u, 61932u}, + {13508315486659086205u, 1376187777584920946u, 830114136618959298u, 4468713292197350000u, 2826485u}, + {13715100257138207440u, 3574452495891747062u, 3628470132910205249u, 8050532388101893130u, 1822128u}, + {16219104463291459227u, 10420597034937671288u, 17872164487101747013u, 14733361520673371569u, 2317786u}, + {7243243499117581052u, 14977076308630192439u, 8766146352196236552u, 16976290218806053447u, 184636u}, + {12485036030523281396u, 10843861702735489200u, 10666372714410780272u, 3173940087683912839u, 812518u}, + {13438904351329463614u, 2991772359504570029u, 2653415225104584657u, 2464946512064772249u, 2560438u}, + {13481226145362577474u, 15835916786519108979u, 18176315859706797015u, 3505996260788088176u, 2762773u}, + {2488467320104402777u, 7508136954298687386u, 15400805609370833959u, 2212691991108589099u, 3436389u}, + {14010409449627892615u, 8178185557231841670u, 8794369462329283667u, 4747133803098718523u, 3896296u}, + {382405556557450588u, 1406265609458729584u, 4093938660314036988u, 11673146620000949730u, 2792198u}, + {1534667281287753375u, 4820520797835380104u, 11142602616948893377u, 772082913961549642u, 3399516u}, + {9900080219408891534u, 7937083252193420259u, 608143009499134112u, 4242050456598384002u, 755783u}, + {11941494823841802631u, 4900034314104302051u, 11942040819727703149u, 6931470767459392738u, 1041582u}, + {10912887848050482593u, 10681239421209016678u, 12003098078206053678u, 5711763732513560253u, 3297674u}, + {7329308290920270394u, 10708812162738821000u, 7919213750817842507u, 5609266094948740876u, 2751082u}, + {13646739679581548881u, 4753606331368445607u, 11576980831731218139u, 3653628213085451915u, 2924559u}, + {10794284508733811887u, 15445655884237553338u, 11990185523010093667u, 17708059134347436465u, 1004369u}, + {5474161224098209212u, 18078221879792689424u, 18344305054660546971u, 13421239846661222818u, 2090878u}, + {9607253508869315671u, 2605034956834315781u, 9684202454435972262u, 7676674872796950742u, 721859u}, + {3399461727665448160u, 11951424828008843735u, 312209050202912212u, 8083766488154907608u, 2039981u}, + {12522213447111701266u, 10408189375869041028u, 17894575912775981581u, 3568453123364465436u, 2665074u}, + {6029411358391288184u, 4497572643767946696u, 17117195381426393070u, 16622408570307375812u, 3373941u}, + {3471552245563705517u, 12513779725946520690u, 10998215721356088484u, 2223966063907042328u, 1020847u}, + {748261075611071933u, 6071077388157023701u, 10064194565216272498u, 8161339431857237006u, 1843636u}, + {6330019801637155919u, 7645589002629583306u, 14026033185351265196u, 7023595711297426806u, 3142907u}, + {11235141670061430318u, 6508496171071552194u, 704933447472200172u, 15694474314330428089u, 916521u}, + {6227114373607686674u, 17078116901950851476u, 5295617963577778529u, 7078551059736592394u, 195947u}, + {1191706085396840862u, 14830371794639717972u, 4558056653227737478u, 2453572788529112049u, 3383813u}, + {16859737699461621184u, 10188512895851820089u, 9435580747352384602u, 16851839745695073215u, 1928244u}, + {8500676305740003815u, 7834577670669604246u, 6296160036813930612u, 14807376618206732626u, 3861127u}, + {421148140821085192u, 12297063358515377836u, 2013717756920931062u, 8646078926925890942u, 3446621u}, + {5630499620252538286u, 14637187247975817095u, 7861642208890921697u, 63578944152151815u, 2884678u}, + {13606863996854644853u, 14535589870421857889u, 1636068727345522178u, 13672098190033019170u, 657328u}, + {2584590757947458930u, 12505978755489718737u, 3277271021905589445u, 1669450237932924070u, 160847u}, + {1290177992906503584u, 16370559296030473374u, 3351825458182072558u, 16576213733836899478u, 3811175u}, + {18355614761198874842u, 9635653204604393282u, 4003096169494240326u, 15706801692651695846u, 3859902u}, + {13487670206726789062u, 1834801239963013097u, 6519032836963497815u, 14987124605901484090u, 933256u}, + {5824311401393901958u, 14238451290500148763u, 3770990162927949861u, 5277419914343117815u, 2274615u}, + {13490063714579281738u, 6282561507714032095u, 1699787319060325076u, 5950681957158731518u, 2763182u}, + {15569424469910517549u, 4330763436903502148u, 7602523598478692392u, 11003726010898809135u, 2857383u}, + {752061744177426831u, 890686284534570169u, 11510585004301423355u, 7979044768097367390u, 1436940u}, + {10598759966023792488u, 18284601529177188263u, 3624092177819662628u, 11339549136363006923u, 1323493u}, + {16262109594441830971u, 2546314857030149490u, 17707428292564067711u, 8311037462355607851u, 568813u}, + {4967228026563853186u, 10446882869451318665u, 9942050913334199096u, 3469257269968377341u, 72460u}, + {17991486865099669594u, 2594237793195473464u, 1447565842061782518u, 11458494106575380088u, 2488769u}, + {8568064458135558744u, 3201292056864129546u, 11827697976449962525u, 10998663990025122425u, 350998u}, + {4838414109855189071u, 7216078755436591738u, 4117962485343855957u, 7932810125447120855u, 1096590u}, + {16995128651148476737u, 10273779033561761752u, 12058826514332135216u, 14864092894829754098u, 2160159u}, + {16501128361892623491u, 6294750134555831203u, 2564485594693253185u, 16541036949781110590u, 1636725u}, + {559910405361851862u, 18405944032630672807u, 11986845380494915915u, 3416899183517692207u, 3087251u}, + {17986566708219524014u, 2732329592334746193u, 8370022402918116284u, 17206657113532051838u, 3353931u}, + {6126374774064456111u, 10765889295539532170u, 12784595936843242607u, 11663141764110935559u, 3382732u}, + {3610228116098486364u, 8827389498521188925u, 1254940700535515450u, 10654866726712496015u, 1353716u}, + {3662149112662197780u, 9439128595462669932u, 1621488561796913230u, 15949699945637426382u, 1588117u}, + {2708694742086743133u, 16582053003102878373u, 11458627732941681331u, 13143777718710691689u, 703912u}, + {8972452140208964114u, 11286024754891270250u, 11212179740016150883u, 12839236636409363364u, 1587366u}, + {9461650446808253450u, 4051126426141759025u, 9589481257283935751u, 1182203251799391648u, 684214u}, + {2488943057614488048u, 17937512539574121236u, 17501929005450906139u, 7362496113600501830u, 2834061u}, + {17956189737259360273u, 8588181204343030968u, 3004871436022866632u, 11293263875235535495u, 3492124u}, + {16549867317027571827u, 14536940000018350721u, 8540987851028950591u, 2442318932246544657u, 2782461u}, + {6579278937977568452u, 4344937240774588333u, 17442348990970126749u, 16912804353279533908u, 1129586u}, + {47146582464491358u, 443815624910328940u, 15702696536644923706u, 9172151643580897502u, 3183479u}, + {10646832235715196639u, 17655791259482203769u, 4608911016632100017u, 8561520928024676901u, 2343311u}, + {9477895665884866231u, 17887675833265072364u, 2426069244047893275u, 3718163762797954067u, 1316476u}, + {17843919465614806988u, 13397217279222946074u, 8691723648761034924u, 5356546658376011882u, 3517295u}, + {14031327187319215854u, 10744633639517118404u, 13414667871473979052u, 10729406563666619423u, 1043743u}, + {17490945449536383929u, 11996589659871072146u, 3670129368420365023u, 17601306615983548776u, 256975u}, + {8485996110736192398u, 18168062463710000470u, 185765652468156267u, 7426672555566225536u, 307164u}, + {1005445365140245482u, 8505668770757925479u, 5142999471600817339u, 582126935426752964u, 804577u}, + {12456641320067703624u, 2000388455457426527u, 6222075639371810711u, 10247020179974486857u, 918785u}, + {9104771567534832991u, 12719446623644540877u, 6566919461546438784u, 15149043349965649970u, 306879u}, + {11065901558163331960u, 3941997795478124400u, 8412018457970582341u, 8796687406150847455u, 1670378u}, + {11388588591084711692u, 17538610663988643374u, 10331621125090571041u, 3849865528279222827u, 813958u}, + {348719290499842063u, 1343150268438398197u, 9103079998978253630u, 4698758491227929847u, 3129968u}, + {6503562637412401085u, 9707595196316546327u, 1482345959688682098u, 17423617886494291605u, 3337570u}, + {11707157787696536477u, 5550029434759730311u, 12567853899766411753u, 12023127927337746050u, 413264u}, + {7166089747709671219u, 8866998231499933771u, 8795051085136599599u, 14851487759079160247u, 1053655u}, + {109947527126066356u, 2952962750733119023u, 12675066420529004940u, 1532645993774958852u, 2237846u}, + {6703041189687682280u, 4299448093260421467u, 380334760625881071u, 12867532712722193227u, 28454u}, + {1277132644083467358u, 11008185417393674187u, 5605502345083720723u, 1513734371319892700u, 3116041u}, + {2227416512040753775u, 13076705389210657379u, 4555699344112442516u, 5894145929436083172u, 201605u}, + {11384956842613226930u, 14499792910521930444u, 10876695642386718225u, 16072562432191055871u, 2906167u}, + {1568339462413620012u, 3385068180879129767u, 12585692242721431899u, 10429902876418645482u, 1641476u}, + {259081552157794248u, 12425355423137386155u, 6771259235549620803u, 9397767123035671016u, 220799u}, + {11889609140635847044u, 16935144145099083762u, 5957047653331246899u, 18090529135562410054u, 2696245u}, + {4707179105895928544u, 5511460712776806224u, 10317115912814864279u, 554140117831043697u, 1259916u}, + {10769221296002927693u, 16466049413135835036u, 4885951352635445965u, 1248220447205286873u, 3046788u}, + {10416131362093356113u, 10363123707910432073u, 10224961641501945687u, 8486941822168638336u, 766243u}, + {3070630437551261020u, 18095821913230883531u, 2352642851875514494u, 7652239665026574466u, 3160689u}, + {535576775314889604u, 12337269781479214975u, 261904845569322957u, 10578713158269307290u, 3296033u}, + {12007341648040026148u, 12900871505644488213u, 14957480045540837487u, 1501952968546772992u, 1982655u}, + {18268409025239429531u, 16304860147495693280u, 11178606503280155148u, 396861501063053259u, 3820183u}, + {17899383447385695446u, 8158776141721880631u, 1551721436107307317u, 3457176858295210469u, 2183714u}, + {7728512681539179987u, 10289645595591090788u, 1711715682535391746u, 2634355802110759134u, 1073700u}, + {4617711249279208189u, 12768088980508971250u, 12559619439461974195u, 12125482070118190995u, 1471060u}, + {320029800540887204u, 1943096561975719612u, 2184536402641116063u, 13141618394365437595u, 1720377u}, + {11907327773335171454u, 748172179222925042u, 11915062402756064102u, 6084573266556861235u, 3342553u}, + {16786270047022320578u, 8208008456956075348u, 8108762273335029349u, 12959968558617483893u, 3762725u}, + {18098711952601313873u, 16932783584829600479u, 4091441597670148031u, 17579405389271205779u, 2364335u}, + {10958047771096405844u, 12192535169021069681u, 18284802675675323305u, 15824227394535137445u, 1605738u}, + {15835565568478220962u, 16309116068899578769u, 9738221659914247975u, 16098464124217587350u, 2877835u}, + {6572540415440116899u, 10023653330972898047u, 12772870744956334304u, 15905757390173973971u, 2876226u}, + {4965044162183629754u, 18162046185284632287u, 18082516574288169047u, 7186758830580772382u, 736308u}, + {10457429687113726965u, 13008326784071162696u, 2066885933707225102u, 14641274082121554771u, 1308033u}, + {12757356332933277798u, 15462265396196474092u, 931304149599849653u, 15588569276824674784u, 431859u}, + {1614874253404027345u, 5398943283193322021u, 1402117243064320151u, 2097636635137407554u, 1673844u}, + {11148601255834926359u, 3541484866287594405u, 15726577195867170427u, 14514453375608466061u, 2393704u}, + {7700704687712626563u, 10439898416631348174u, 2765014305568429036u, 13518926144683192256u, 1686182u}, + {8119484900282117155u, 3342840093199884178u, 15608940650065055045u, 6948633608975703719u, 32410u}, + {12343659502289082067u, 6493326025611186392u, 10027249412349427863u, 4828456666465234247u, 2305965u}, + {5117519217530625071u, 15808049035494092594u, 12127326512110782602u, 16399611397636029784u, 1886020u}, + {3799971177057854666u, 6315402708926656798u, 3225193770947940763u, 6375859219995167454u, 2040867u}, + {4007622705790169191u, 9847218404268521553u, 8726389564233469610u, 1406741644333969395u, 1334686u}, + {7423174375213379642u, 4162041956004941265u, 17379082893982201614u, 13211160321408317038u, 1660001u}, + {3134280998771615136u, 16982192096427164664u, 14765302546980896080u, 17252386601885038954u, 2280964u}, + {4825644493410332764u, 12729532303714924847u, 10648876998226947011u, 906767504856866667u, 2379876u}, + {7068103735361617169u, 9230572533219295824u, 13254839398265153333u, 17481838721584491609u, 3578906u}, + {9545755312348467510u, 10306022763625479109u, 2219211670508891551u, 2011574219551756550u, 1525199u}, + {12429021941043651945u, 10043442254142317400u, 17836675827786746872u, 13358789854642720113u, 1012894u}, + {4913439788875534357u, 6938062920169709455u, 4007680919304426394u, 90742203788513753u, 1156348u}, + {3170632555961902214u, 14102977281874699000u, 7020316521683505315u, 15874001544051034016u, 972423u}, + {10114208550512951387u, 12838067980791261206u, 6679927297146484689u, 666456400427741831u, 1149611u}, + {14387870497625669727u, 16666212716116511361u, 14214382278825803776u, 14793013358343004591u, 2311928u}, + {8736956516037609749u, 4433121552460092160u, 10910884607703941485u, 10418941100387479318u, 495944u}, + {4162374106968470592u, 15121789239013537313u, 4687775565121879291u, 7863426312595977934u, 486865u}, + {8165350051105174686u, 10375298815909237235u, 8181163725901948467u, 14924903047767955665u, 1924302u}, + {105270761993807224u, 15868937388131779219u, 6672698259112518078u, 1692821784311773013u, 2454121u}, + {5293747204874624664u, 3292139923518607248u, 15369505254756666360u, 12367119124191414998u, 1850293u}, + {5776424955303458193u, 3574236265073667185u, 10692442821883982157u, 3709069189733820127u, 654149u}, + {16036922547759676948u, 11176667019671745619u, 3945295757696850613u, 156182110973998091u, 1942872u}, + {75521631910732032u, 12447075254590669126u, 17363537301461358704u, 3999007334794194814u, 1512545u}, + {5320120201252408827u, 10156660125713198171u, 10020594843413154162u, 12637980491151365148u, 2711185u}, + {10996126486665457182u, 2932454750319530986u, 15668481951037110851u, 9561614961475948273u, 2274297u}, + {17996012687553332324u, 5283450973029626928u, 10838610007622830102u, 12796147528981465045u, 1878254u}, + {11339045070651416656u, 10886726871861288666u, 2627250031441278995u, 178762871715424661u, 2318883u}, + {13343012751145572734u, 4903233480538416897u, 16517022597174231158u, 15823388935722856681u, 1025771u}, + {17949578084549275063u, 6412276955116547670u, 3570415607112747210u, 11404022008931235944u, 1732035u}, + {2492834978613831000u, 3402053215311666692u, 3033650150627259358u, 12930259750564830076u, 502227u}, + {15061015165897073536u, 6518612398171526872u, 10040173723627756413u, 13267861768844906901u, 262973u}, + {581034526877050495u, 8726732510945962572u, 14056811338006555783u, 10092914174207068430u, 3360123u}, + {836341951382764036u, 2173169441323033014u, 16817475963399440821u, 9645643346174514821u, 1443068u}, + {10140987871017905676u, 467229558482486610u, 7487767876006615739u, 11483777367753145065u, 2163818u}, + {6814824982370772575u, 13578459916527605707u, 5751232774071591866u, 8542711504827359870u, 1330668u}, + {5816745610213177350u, 4526358661938032476u, 8432363813915647687u, 12274337487033535566u, 1035267u}, + {18123778410496814102u, 17226327689504047054u, 7496333225850505071u, 8017490255881295449u, 1518511u}, + {5588872604597971139u, 7529272349605039155u, 15038878284802125151u, 13142493706710487372u, 2852486u}, + {14715452146239613468u, 3239209879198252223u, 14045438537902192858u, 5096650675013288690u, 1818542u}, + {10698392578723231107u, 3022186347404470534u, 7898020749762499906u, 3996713856043979070u, 1404035u}, + {11414474648421422294u, 13333343254733180642u, 6403780387790984320u, 1899397323298370982u, 3157848u}, + {3870484083937493742u, 4547084058275074412u, 8298329624554669109u, 12740388566454389619u, 991991u}, + {3630240949594675019u, 15867747382843369458u, 5008237067584057287u, 11835744439060993282u, 1314265u}, + {13530599749957657299u, 15154384684119896068u, 16889756274376740455u, 9535846334942265874u, 1040271u}, + {10094219004911860258u, 1376817307982635077u, 16812248380322825355u, 6288200303739878675u, 2735717u}, + {185684733025994541u, 17575838367680009460u, 2917303652857386416u, 1635732146479711369u, 1097493u}, + {10888572684869025952u, 11813083301331421626u, 7589176033746562484u, 7153946983884285527u, 2352204u}, + {16362554680310418445u, 9121419476716636736u, 620681128765399395u, 11788778340533356454u, 260u}, + {7231105984382388153u, 6273878214333135574u, 309473905502093824u, 4807942237505u, 0u}, + {2763551710075585616u, 15322823093701433607u, 17381214111695097914u, 4807u, 0u}, + {12005724387321570819u, 9402601097213106821u, 88690879976433u, 0u, 0u}, + {5352738760624668866u, 16232700059849421406u, 88690u, 0u, 0u}, + {18119211918537360453u, 1636057964597359u, 0u, 0u, 0u}, + {17793680633768346741u, 1636057u, 0u, 0u, 0u}, + {30179942562681662u, 0u, 0u, 0u, 0u}, + {30179943u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 304366u}, + {10184520009479717568u, 8264453021209748520u, 7141757613572319067u, 6130510054930613241u, 3674201u}, + {4163352376147751050u, 16504545040652536270u, 3461938412407388785u, 5183866228345761219u, 127817u}, + {3702551633254162542u, 10747815429275999958u, 1930700635799941404u, 4758159019174379338u, 3287343u}, + {1067702678883712973u, 7881427125407323960u, 13141010859101332610u, 11085452667564633805u, 671423u}, + {14468939981179885561u, 13424311385743560113u, 15482414535073198152u, 18315014464965350699u, 1073051u}, + {16792941554385862803u, 11555962690825707405u, 672404405088769877u, 13278391618468792797u, 1269957u}, + {10011537620629575542u, 5262989299724254023u, 9415094748729162359u, 9318856215934711323u, 3901660u}, + {15613320781351648473u, 6764924413397821189u, 1711745020721842257u, 2738103912204819457u, 1595346u}, + {11786360995415590984u, 9184975975933757106u, 9909564963539604439u, 9685146543191463574u, 1935264u}, + {2686746482070662064u, 15709697492038637161u, 16418528225170077973u, 13438411820462806080u, 2566242u}, + {11667581143019803869u, 11657818474996161130u, 11454563893125794633u, 8045731761053617263u, 567708u}, + {895872667754687611u, 9632972574383093211u, 3365302085730551343u, 1235451470875104175u, 3246881u}, + {1372800699669513544u, 8312414251839716676u, 9880332004031184356u, 2581910175407719373u, 3890797u}, + {16185010403788878580u, 15609848014059952616u, 13034420027323104002u, 2377615548297361029u, 1413486u}, + {6570426400471970546u, 2279509965616928254u, 10567298613566581361u, 1323110909554089815u, 98295u}, + {16435875392383903284u, 10220232631584768119u, 17158876069034823608u, 3172347361700665373u, 2287930u}, + {6776909790704230443u, 13996327913910062855u, 2388120171967565269u, 8689116146892261976u, 632784u}, + {724349763612044578u, 15710944164707978538u, 14795043590270676762u, 2317515822404748323u, 243352u}, + {16719789593511171830u, 13334362560712475354u, 3866532665610265581u, 4400002290694945285u, 3896456u}, + {2049171081288657071u, 13846053748483750841u, 6390287531253525458u, 9511421749995031931u, 1475196u}, + {12376291768038416371u, 6146848608257168571u, 12926531326532405571u, 4062437838705946201u, 838454u}, + {17177658767020596713u, 4226986758528838107u, 1781731639207539547u, 447812314645583523u, 1604273u}, + {14153082799535906574u, 2071831362810648301u, 2679180964259314430u, 16098437084361104286u, 1323121u}, + {13330281604409931300u, 11898422609385389729u, 88873132105868463u, 12994774217391016220u, 2464086u}, + {15129010705493696886u, 18130367648901852373u, 10962516237030750203u, 15321664312853107323u, 1967315u}, + {11011174206591547369u, 11204456648346550821u, 7204161244188995862u, 13871348626921197931u, 2381510u}, + {5360887793292120617u, 931208586156374479u, 3508904450070755441u, 10780512631001591125u, 3394610u}, + {17220694054698465290u, 12477665480042643241u, 235765718139417752u, 3737556808614892548u, 3675961u}, + {16890824260837344858u, 10905429848404396550u, 12595354286138173637u, 3238343653198323429u, 191273u}, + {6687003293576226676u, 14491916904947687947u, 4880466104882902361u, 15495911085472060540u, 290918u}, + {2613499492215735855u, 7933789853964872558u, 14924966003522519028u, 9805199294546545816u, 468466u}, + {16074998930207897214u, 7956157834314947571u, 6528060573754576661u, 11970202292510471089u, 2201473u}, + {4771677209951096022u, 12073046707348383637u, 4338701089570662508u, 11785997849168637448u, 1922327u}, + {11555591035620220204u, 17353896026565264988u, 7341211636255455081u, 3926570764029088254u, 746019u}, + {6239145082158592377u, 4242146267122171888u, 297084045885052869u, 5706311554490002434u, 1511095u}, + {1804519836258354472u, 4866076455560580175u, 7179139903841287372u, 12854126527193546297u, 537568u}, + {9847401170097920995u, 10043003898722947532u, 8054884900076511510u, 12547937754771803287u, 85068u}, + {1493088550971536543u, 15008498067832642458u, 16762061513924977194u, 9945517217406855246u, 1978952u}, + {16121552829532354478u, 14750548617339229470u, 18381104635205762810u, 11565720277092142641u, 1682876u}, + {259999900971229098u, 12028164845027491322u, 8807771652068431188u, 12424949768969113304u, 2116483u}, + {5721562451826603164u, 9145152319987190041u, 16638960064240782826u, 12649121189299695581u, 2094015u}, + {8102367703308377983u, 6630268258396524753u, 495734514908641360u, 12216361163850451280u, 704195u}, + {11503849176202752418u, 11587649910705672187u, 10158260405703739882u, 17667100656451691381u, 2285704u}, + {17478677753457334634u, 431406673435353857u, 7721604995331751224u, 4797965020886598649u, 3102152u}, + {15122769512039170440u, 3279302044116930960u, 15703275699347861969u, 16774586425618992405u, 1474986u}, + {1885884448754391812u, 13834653429230208937u, 5882109258650088280u, 4206549160228711270u, 755291u}, + {15807222948793542157u, 1380080185201405641u, 3289267091396715888u, 7579980037967158601u, 3109318u}, + {4622359929098213632u, 6871635595801108932u, 10675434967108016008u, 9208671243786606345u, 1321797u}, + {8578848189990993527u, 17644789590850975216u, 18151232723007149457u, 16813802271022277395u, 1603996u}, + {3962679100201348399u, 13507590605133489878u, 18006511271716364803u, 17035180713472048992u, 1650808u}, + {6643296893405407411u, 8086910999767604165u, 17637941432715926958u, 15450777173842591334u, 2488850u}, + {12558547006033342155u, 8586743584386533022u, 7048001648627262082u, 334141570590340935u, 1424732u}, + {3048375494433158292u, 9068287205854326956u, 8915456169472574343u, 2476239864201315751u, 1012438u}, + {17874141424084031828u, 7212080872247468110u, 4064104741244713237u, 11764064015334991783u, 2400830u}, + {18077418692537461577u, 6068850510357490703u, 2605290171971202488u, 5880952625410710934u, 272897u}, + {4614470148247619359u, 9250670715395522430u, 16935263725520848370u, 13551861746128887708u, 1150764u}, + {764133171863843598u, 1895160978435568222u, 10786223229521892637u, 13640113135717479948u, 3622334u}, + {2544233345801891896u, 10129972491086829412u, 12190930978669627322u, 10515171417387160470u, 3358588u}, + {9082751254946524230u, 10828810077061442074u, 17156185483908096919u, 3664834725696600232u, 973129u}, + {7325987063500126838u, 1395268474949347712u, 17545190759941131776u, 1026757381809530731u, 2114789u}, + {9410994025728415311u, 8497785150523606165u, 14056045547378096841u, 8253576692803438234u, 2493043u}, + {13662441790026449145u, 15898946069898030335u, 9091398915612650731u, 8548784630914826222u, 1237499u}, + {14509249062607987763u, 12922202992011608900u, 6088801791203914123u, 14434346643478843327u, 755053u}, + {142026440860150655u, 960479973604003508u, 10240875538136720914u, 13056352804752389677u, 2761592u}, + {15840785008557623528u, 17062996579900961475u, 15102761649670188780u, 11075754281719330720u, 2052728u}, + {2208786643255532799u, 11995627484018550397u, 3485312492698375005u, 7099510374861629670u, 177246u}, + {18199048815001868843u, 15645641065372867808u, 873623156101402331u, 16288285871271312634u, 2107454u}, + {2529908101404510617u, 5591427642194739230u, 12223888032399581176u, 11279860350790159376u, 114465u}, + {10632182018522058769u, 15905591303630041882u, 11361069591859585666u, 18232682809436025322u, 123867u}, + {9336926551549387232u, 13835544511828978736u, 8597001674466128906u, 18232856252676628798u, 3788867u}, + {3715719403962896512u, 10216301734212415529u, 6996626276749420505u, 7780054840169469092u, 1823214u}, + {16716205301895299336u, 13311405932706238787u, 11242975375746842732u, 3060051319422632438u, 1053782u}, + {13135485575974671276u, 9376279546763377943u, 2649766883978521264u, 6576679907374975294u, 3266095u}, + {16413354894360758964u, 7225233419526759435u, 6645159422948129500u, 4311646873399850529u, 366754u}, + {4374668302796458682u, 10752020299968058208u, 5409046408531434179u, 2456723618777205970u, 2893423u}, + {13056915365046727258u, 3789617707773313303u, 13699060140984061252u, 6610615293486150706u, 3649978u}, + {6930455762628345853u, 17702420093947301466u, 5062066129484654098u, 1148194127220204575u, 1559127u}, + {10161145962526935221u, 13821337569209999378u, 5582054988521265060u, 14800567595670831559u, 2381556u}, + {17746181348178379038u, 16156026301652992642u, 10684834802991467786u, 8114382501077703852u, 2069437u}, + {17836578961013841428u, 17678674977726685208u, 8213671875577783836u, 17404054545970680350u, 1732743u}, + {4099005122956323037u, 10378751477107655117u, 10449029762534206222u, 15164058232035432815u, 782116u}, + {12811382652555843779u, 2730231728337771019u, 13044288039847056391u, 1887924953838137987u, 383604u}, + {407398772202731756u, 17363197216072551766u, 12474464059721730402u, 12761270391414820904u, 1929328u}, + {8590123167795276975u, 6963513715820520748u, 3966325804039407762u, 16825009243448721381u, 769895u}, + {14258794458853677954u, 4069842027187831854u, 12730498402026430945u, 14713951256590936802u, 2325105u}, + {1852915799692584542u, 2523622635933348405u, 11087535110028710186u, 6528074095006967943u, 2599903u}, + {11520232903956782684u, 9475074947678601629u, 7047785021961198188u, 7974295095957616739u, 2386420u}, + {16467551242366624218u, 14944185744554502147u, 2307161202146242184u, 4439534923280281140u, 686336u}, + {11636213317053492928u, 2682703364755899300u, 1811472410167751721u, 16297676921551821978u, 889710u}, + {2197202102219415583u, 15061506974730691092u, 13283377517080701475u, 1817852119915695446u, 1198820u}, + {5621401540277486107u, 14969977969258050796u, 10772687632258016865u, 12416020502071901596u, 3198153u}, + {882114083854155444u, 12275141789949159841u, 12936090009418688266u, 17136645309304507757u, 1772832u}, + {11518209000013189851u, 6171117881059391847u, 2121454330563139111u, 9472247814294887577u, 1640993u}, + {11187453392277938541u, 18144758907457140299u, 9774602533773998492u, 9974218964604051840u, 2398085u}, + {11093624175790211889u, 6700478973417399476u, 12748677655672604364u, 16617483498959646014u, 2339415u}, + {8640158385361449198u, 1800424880896253726u, 12052930187240385792u, 2709285585808014361u, 75420u}, + {14178712309832792696u, 6403873685324913274u, 3521355822701837594u, 3964558928233361240u, 1086925u}, + {3708079984894460639u, 16462136988737422729u, 11503058304363068386u, 10828689336956066082u, 3383362u}, + {4584131179728620173u, 5481486358050755459u, 17167998704338051547u, 14185700455185278888u, 522783u}, + {10842182798824163545u, 11413675770058915933u, 13055613332856358943u, 15790256752699004539u, 2182124u}, + {278319117423787065u, 13841634533872301748u, 5709579478118678944u, 6381321374093014502u, 3444827u}, + {6257120021028600815u, 16409343410760406821u, 12132514599223611258u, 7053132470107535819u, 2103393u}, + {9225186114370848501u, 17930511403813811013u, 180204539441384353u, 8037193697620565521u, 3011723u}, + {8772604548649463895u, 14973498459446546398u, 10001084719593982861u, 17565551842655586897u, 3601324u}, + {2674152739303831517u, 2625454208147103675u, 16962269674006833333u, 6695731371209429931u, 1711497u}, + {10355534519139170554u, 10864421342970523417u, 12388078551438340565u, 8606425244351077431u, 3650102u}, + {4659488644674372250u, 2167263201836689669u, 2282641869050737273u, 8281898226367145330u, 1852380u}, + {7497970536634868289u, 14682793547494562758u, 10876041850610200336u, 682688734410507749u, 306723u}, + {8202862855126976870u, 7675531729328256662u, 3888981648252693565u, 13408370532419805245u, 2026820u}, + {12037702174100794873u, 10901461377102941590u, 15239710566469419781u, 8684299527783198845u, 188627u}, + {7615919044067124765u, 199487030471044168u, 6933579130624213408u, 15567919874871125315u, 1035333u}, + {14408281485403546513u, 5392855750152499134u, 1371947875835204266u, 3621978240346382606u, 1205498u}, + {1813859762993403348u, 933048311024732782u, 7385474485013103495u, 16739599333508628109u, 176164u}, + {3402655976522602034u, 16602298831173272459u, 17699819420223414449u, 14054480506358547822u, 3385057u}, + {63013103481011899u, 5596885924042343210u, 427040925521086675u, 12384291874694076596u, 1092563u}, + {4916725695031375402u, 4679340177337622483u, 9893143873594668912u, 7009740864108705995u, 3540975u}, + {15291919095976898813u, 10629317056849403013u, 11845975074264004201u, 14693011056305515551u, 2116131u}, + {6884683895686742221u, 4902800608984573414u, 8784952838646682175u, 8325659056038166763u, 1285103u}, + {9139318163095516973u, 15819211084955592532u, 17497533864956631609u, 11624978614581413117u, 2817251u}, + {12489551149732557579u, 3324216505570052641u, 10720154389956508720u, 4087194385937345338u, 621867u}, + {16141512051595874148u, 11768714292789998012u, 12398654561635772957u, 515874583749575475u, 2695490u}, + {666428564558445112u, 9841780641610296888u, 645402058029913862u, 14605357010360561015u, 3289324u}, + {2588226210882326102u, 4963278129515485248u, 9597999565748771592u, 5176766509301751063u, 1710968u}, + {10171515795365741494u, 6430328533098754865u, 7583001804505323368u, 7957897138163146153u, 676147u}, + {18331231181234052632u, 16269966445956017983u, 6634366071903140298u, 15432797842739681934u, 2549151u}, + {17617134077574568779u, 9225576402148062397u, 17545804177446739501u, 15899694239879184539u, 1757504u}, + {6720082124902720977u, 10388659307130266310u, 12590105817377616181u, 7814640398492432159u, 2445087u}, + {8605779885034009457u, 7577033287463958089u, 17054803525490481443u, 4152386762103487016u, 646115u}, + {9239500273611872913u, 16107562990931494553u, 845946597199903238u, 2822164889678761113u, 698014u}, + {16169055103283207888u, 2919385975963973582u, 11814249284847684963u, 17883159409846159316u, 1898293u}, + {1120352207693777527u, 6242087236968423622u, 13133174286273999820u, 16031803219451075527u, 3691135u}, + {2843510518104875493u, 10838274027646620916u, 4707603326912956787u, 3310681170425072245u, 2668759u}, + {721147644715122285u, 9344342308893807144u, 12658834425354825346u, 625690669881513687u, 3009954u}, + {13824568056731379389u, 11743687269083928740u, 11184248972612031732u, 12233257244147150213u, 1718502u}, + {7896120919369478079u, 17791605239557321250u, 338487526993858335u, 4211041233017235544u, 3627563u}, + {5301319804021917404u, 10065635022914145774u, 3800533834866559263u, 715435076824650699u, 993050u}, + {9908582364412604937u, 6713132601669357027u, 1049979434657300584u, 1531528014714319003u, 3486372u}, + {7040245098609557401u, 8960267313436209792u, 11084577587211085587u, 7342129211391996467u, 383174u}, + {16818011686724263255u, 9106559938982916977u, 2267209100294242013u, 4042293586179793211u, 765545u}, + {6979390588091904072u, 2660103680904505638u, 16079361455707830614u, 5274326181502940892u, 246420u}, + {9510568184832641541u, 846698287626207058u, 3913580294444584489u, 15280755587989692121u, 2502740u}, + {5813758845235714018u, 14425196423526898540u, 3710008452595026440u, 766743359923070791u, 2942138u}, + {11798886601543238939u, 2733948124125769934u, 12829079609880936661u, 3657152569378675832u, 2410879u}, + {3705786461930462475u, 5229854806475184591u, 8653483798506918348u, 11357515135517519331u, 3222572u}, + {10082610440594717475u, 15816092202028384287u, 12687590947956747195u, 2365288981514311424u, 1553480u}, + {5649367605388633295u, 2137521263063901586u, 13996192295914991259u, 13647541923517295199u, 902305u}, + {12496768065926564409u, 6498583604721291816u, 9005148525751765931u, 2034257236120952628u, 3530213u}, + {4669231165570926981u, 8805237979887386151u, 8484152645328133383u, 18367749823404635397u, 3502626u}, + {5606998675464900153u, 10691149790793868211u, 6330535432763395817u, 17574607414992159263u, 2921253u}, + {5680750456309813232u, 3226136195219745789u, 14371011811518848639u, 10862526729729354063u, 2056024u}, + {9238639398034411607u, 13784797893584374199u, 16253220481179843657u, 8036319897609932232u, 62331u}, + {4896582689781994183u, 8009474925730800171u, 12390846392443831122u, 2595223197406583983u, 921251u}, + {3387845402383192815u, 3564816808864643879u, 10005063878968764602u, 16302010336591585731u, 1780568u}, + {1030803601058133304u, 2548286836145332469u, 9101321359858685210u, 3203379836172676389u, 2457926u}, + {16437117203208578538u, 11619236819903425841u, 9924068022480860112u, 11934843751335605899u, 122223u}, + {472856198623797260u, 10408198746482842465u, 15915265426190978131u, 16791674039172973841u, 384538u}, + {13264623946974197702u, 1754700700260796675u, 13508315486659086204u, 1376187777584920946u, 2365208u}, + {2611728463788327802u, 130193210717199089u, 13715100257138207439u, 3574452495891747062u, 2401697u}, + {14838511073954460547u, 3556540798383900889u, 16219104463291459226u, 10420597034937671288u, 3315183u}, + {2956743785837420113u, 9739827046875976967u, 7243243499117581051u, 14977076308630192439u, 1909420u}, + {6682644553825201592u, 16958608253301361346u, 12485036030523281395u, 10843861702735489200u, 2028054u}, + {17845477068995651763u, 4611966776384053942u, 13438904351329463613u, 2991772359504570029u, 2998019u}, + {6482329733057300294u, 6136976104509017058u, 13481226145362577473u, 15835916786519108979u, 766919u}, + {10649568669059762012u, 4681075315518773931u, 2488467320104402776u, 7508136954298687386u, 1934077u}, + {4255865952535689716u, 11579107295362920646u, 14010409449627892614u, 8178185557231841670u, 2015061u}, + {14092999730470937716u, 3270057100537210566u, 382405556557450587u, 1406265609458729584u, 3508456u}, + {18357683908390956433u, 5233899624584335860u, 1534667281287753374u, 4820520797835380104u, 582645u}, + {16400070237030602405u, 11418212838749978432u, 9900080219408891533u, 7937083252193420259u, 6392u}, + {2795864106075215795u, 2898109478213262760u, 11941494823841802630u, 4900034314104302051u, 906149u}, + {17921133618915579985u, 13348248297607637385u, 10912887848050482592u, 10681239421209016678u, 2400870u}, + {15723797048246605816u, 9863491778435056307u, 7329308290920270393u, 10708812162738821000u, 3787265u}, + {10359817571014825041u, 14110177104352328917u, 13646739679581548880u, 4753606331368445607u, 1373183u}, + {12389954099092838808u, 6424710254296612269u, 10794284508733811886u, 15445655884237553338u, 3459871u}, + {12517159749202272021u, 2515919517770708481u, 5474161224098209211u, 18078221879792689424u, 594227u}, + {3750890725710571363u, 16092624222223680430u, 9607253508869315670u, 2605034956834315781u, 3356788u}, + {871208994076566049u, 9760745888552575907u, 3399461727665448159u, 11951424828008843735u, 1729076u}, + {1775371964558853258u, 2170602098303843791u, 12522213447111701265u, 10408189375869041028u, 1626401u}, + {11917004254202050922u, 14382047719574964633u, 6029411358391288183u, 4497572643767946696u, 2592108u}, + {14069193458588446819u, 11081663236340436647u, 3471552245563705516u, 12513779725946520690u, 988764u}, + {12441880396097621924u, 10380369176178931408u, 748261075611071932u, 6071077388157023701u, 405710u}, + {4068029787634909162u, 8775789619976645868u, 6330019801637155918u, 7645589002629583306u, 1263784u}, + {4774411319010499888u, 3002907070413806064u, 11235141670061430317u, 6508496171071552194u, 25322u}, + {3335822724727829083u, 10938267201649897767u, 6227114373607686673u, 17078116901950851476u, 3174815u}, + {6942148627466743634u, 4300905043539411572u, 1191706085396840861u, 14830371794639717972u, 1539140u}, + {11714228886307177181u, 3579986429804856825u, 16859737699461621183u, 10188512895851820089u, 2838306u}, + {3004463886318346049u, 6228885198043375329u, 8500676305740003814u, 7834577670669604246u, 2562640u}, + {82758903767688134u, 17992385831540270853u, 421148140821085191u, 12297063358515377836u, 514760u}, + {6087862455540296748u, 13550216862071268234u, 5630499620252538285u, 14637187247975817095u, 2819655u}, + {1739490968070061312u, 3748036867861473018u, 13606863996854644852u, 14535589870421857889u, 2169216u}, + {14095890775472770787u, 5509709900662919099u, 2584590757947458929u, 12505978755489718737u, 731047u}, + {6619273727178171211u, 15708552794106621113u, 1290177992906503583u, 16370559296030473374u, 2818556u}, + {16121199229021390716u, 12576132406904529812u, 18355614761198874841u, 9635653204604393282u, 1808524u}, + {5172226582633612625u, 18387151824215333095u, 13487670206726789061u, 1834801239963013097u, 2336741u}, + {582120937980483036u, 2549500702067949794u, 5824311401393901957u, 14238451290500148763u, 734591u}, + {9342847356051176559u, 11854384310354266708u, 13490063714579281737u, 6282561507714032095u, 396156u}, + {14451396914480003570u, 737139154610238960u, 15569424469910517548u, 4330763436903502148u, 1409200u}, + {6958982860522824055u, 12307370949284470448u, 752061744177426830u, 890686284534570169u, 2928985u}, + {15662657277853760636u, 5316759216714028263u, 10598759966023792487u, 18284601529177188263u, 1317254u}, + {1276252153054957142u, 18168886657555383370u, 16262109594441830970u, 2546314857030149490u, 3826655u}, + {16128564067803053607u, 38120030329766708u, 4967228026563853185u, 10446882869451318665u, 8912u}, + {5014176650304865102u, 17451758002536471517u, 17991486865099669593u, 2594237793195473464u, 1667390u}, + {2991117955428870131u, 8588937926192668145u, 8568064458135558743u, 3201292056864129546u, 559413u}, + {354469999227118159u, 7534395665879705188u, 4838414109855189070u, 7216078755436591738u, 2255177u}, + {16593868760786729251u, 16455333018996821383u, 16995128651148476736u, 10273779033561761752u, 1395338u}, + {10115023448855643711u, 13349172603723418217u, 16501128361892623490u, 6294750134555831203u, 1694475u}, + {9569972071888144607u, 5744374003785230277u, 559910405361851861u, 18405944032630672807u, 3588633u}, + {17579300940416263950u, 13243611561219258135u, 17986566708219524013u, 2732329592334746193u, 1588778u}, + {720921631495777544u, 16107008303003776381u, 6126374774064456110u, 10765889295539532170u, 1971243u}, + {3588618321859748767u, 11568001887241134567u, 3610228116098486363u, 8827389498521188925u, 3883686u}, + {8081271967759251462u, 2771549134284941631u, 3662149112662197779u, 9439128595462669932u, 477394u}, + {15580424626927760282u, 2347044829444797423u, 2708694742086743132u, 16582053003102878373u, 2441627u}, + {4874766395990589778u, 13521884215501955626u, 8972452140208964113u, 11286024754891270250u, 862003u}, + {4224063151235257743u, 17872948538958525973u, 9461650446808253449u, 4051126426141759025u, 3644503u}, + {3384067102696007938u, 656966364257504505u, 2488943057614488047u, 17937512539574121236u, 722485u}, + {12853407802828701975u, 12027158763958873023u, 17956189737259360272u, 8588181204343030968u, 2892846u}, + {17638481529782557632u, 6999586355414109471u, 16549867317027571826u, 14536940000018350721u, 1164519u}, + {2392120053751649468u, 11149518820716608847u, 6579278937977568451u, 4344937240774588333u, 621793u}, + {15605226785154544924u, 16571174830705793559u, 47146582464491357u, 443815624910328940u, 91112u}, + {12147060401776956685u, 3970430522287168161u, 10646832235715196638u, 17655791259482203769u, 942849u}, + {8476159692709650985u, 12055232922418347969u, 9477895665884866230u, 17887675833265072364u, 3608353u}, + {4875436116376664943u, 4240877365638910525u, 17843919465614806987u, 13397217279222946074u, 436506u}, + {18374001870534252214u, 11292641220714452754u, 14031327187319215853u, 10744633639517118404u, 1898928u}, + {11607298545686493824u, 14471025893884446957u, 17490945449536383928u, 11996589659871072146u, 517639u}, + {10587540593346422845u, 10941580156119934457u, 8485996110736192397u, 18168062463710000470u, 155727u}, + {9358729108813600527u, 15695604587151296865u, 1005445365140245481u, 8505668770757925479u, 2972525u}, + {734438401208240092u, 6096943065390866695u, 12456641320067703623u, 2000388455457426527u, 2022583u}, + {295058310077825220u, 17213249097100323976u, 9104771567534832990u, 12719446623644540877u, 2758628u}, + {4757220056565475530u, 381526461724713532u, 11065901558163331959u, 3941997795478124400u, 1551239u}, + {7397399312317848921u, 7436921881395191735u, 11388588591084711691u, 17538610663988643374u, 2499821u}, + {9330705365429001906u, 16311597114328391269u, 348719290499842062u, 1343150268438398197u, 2812290u}, + {12224659760394987025u, 521538428934137763u, 6503562637412401084u, 9707595196316546327u, 86448u}, + {15743282006273798030u, 11401264814132920291u, 11707157787696536476u, 5550029434759730311u, 212187u}, + {15682903012534069710u, 1383198199025308004u, 7166089747709671218u, 8866998231499933771u, 3830431u}, + {18006144418848641232u, 14597142676091861766u, 109947527126066355u, 2952962750733119023u, 2604798u}, + {3835888697758447145u, 5169209560776068653u, 6703041189687682279u, 4299448093260421467u, 3004927u}, + {3797189609684093556u, 14470855771887167548u, 1277132644083467357u, 11008185417393674187u, 1858369u}, + {196999350801224152u, 38347345858956146u, 2227416512040753774u, 13076705389210657379u, 879098u}, + {2127584041752533621u, 16363644134165186391u, 11384956842613226929u, 14499792910521930444u, 3817413u}, + {16706813361922963640u, 18297468628256904441u, 1568339462413620011u, 3385068180879129767u, 1704867u}, + {12716591414409748873u, 11483648562791103633u, 259081552157794247u, 12425355423137386155u, 87253u}, + {4906154229144448169u, 3841370196577686303u, 11889609140635847043u, 16935144145099083762u, 1901883u}, + {540829598205866633u, 7210427964964570431u, 4707179105895928543u, 5511460712776806224u, 2001327u}, + {7936915567010099041u, 14436212345836101645u, 10769221296002927692u, 16466049413135835036u, 3192311u}, + {1932609841393059351u, 3458039276066751309u, 10416131362093356112u, 10363123707910432073u, 507721u}, + {9413864278372675074u, 15447079473522386670u, 3070630437551261019u, 18095821913230883531u, 835984u}, + {2516581832659084974u, 10439562550220848678u, 535576775314889603u, 12337269781479214975u, 138895u}, + {4455638482677058547u, 17851289143748105648u, 12007341648040026147u, 12900871505644488213u, 1075739u}, + {7120581050979244165u, 1671170603911173250u, 18268409025239429530u, 16304860147495693280u, 881890u}, + {14330590181443193392u, 1931408232665097020u, 17899383447385695445u, 8158776141721880631u, 3115305u}, + {13740392256718551974u, 12189225180943572329u, 7728512681539179986u, 10289645595591090788u, 753240u}, + {12842255649587825282u, 17790239848900011328u, 4617711249279208188u, 12768088980508971250u, 3772975u}, + {3952560548831492106u, 15355988211240012465u, 320029800540887203u, 1943096561975719612u, 1495995u}, + {1927852717259999819u, 9140341689161751062u, 11907327773335171453u, 748172179222925042u, 3550780u}, + {1282217355184988408u, 126821466880815225u, 16786270047022320577u, 8208008456956075348u, 3865537u}, + {6833955999557125867u, 377693709281859047u, 18098711952601313872u, 16932783584829600479u, 802405u}, + {1362817844223739330u, 15190702194087048065u, 10958047771096405843u, 12192535169021069681u, 1306453u}, + {10598093079942795840u, 8483397644725494193u, 15835565568478220961u, 16309116068899578769u, 414585u}, + {15814079981212830102u, 12690390093625893876u, 6572540415440116898u, 10023653330972898047u, 191496u}, + {2539376812752576897u, 5777317822006756771u, 4965044162183629753u, 18162046185284632287u, 2057807u}, + {9102482464251973718u, 5568934373579209360u, 10457429687113726964u, 13008326784071162696u, 2273586u}, + {228621871602314343u, 16064253298912026659u, 12757356332933277797u, 15462265396196474092u, 3614801u}, + {8907347195319320733u, 17586585787506181962u, 1614874253404027344u, 5398943283193322021u, 578029u}, + {619892255073258369u, 5767623657063848474u, 11148601255834926358u, 3541484866287594405u, 3448027u}, + {11501597946520265529u, 9172314222037982482u, 7700704687712626562u, 10439898416631348174u, 1528224u}, + {2528397859769745148u, 315621771131636542u, 8119484900282117154u, 3342840093199884178u, 441409u}, + {6812586204110420878u, 4527390043029843579u, 12343659502289082066u, 6493326025611186392u, 1487305u}, + {7475621754940344516u, 2757006433639636051u, 5117519217530625070u, 15808049035494092594u, 2514916u}, + {11403090440007746432u, 6254085792361579941u, 3799971177057854665u, 6315402708926656798u, 2568779u}, + {7596746512213223377u, 219008182059207274u, 4007622705790169190u, 9847218404268521553u, 2968496u}, + {6057060329607677106u, 5283867184202715469u, 7423174375213379641u, 4162041956004941265u, 2637728u}, + {5682288066665394872u, 11928141553232024577u, 3134280998771615135u, 16982192096427164664u, 2569328u}, + {11705887064463000350u, 11339835747374776933u, 4825644493410332763u, 12729532303714924847u, 390339u}, + {15364863468685099484u, 14928195499913617075u, 7068103735361617168u, 9230572533219295824u, 96863u}, + {2098604092853391518u, 17139446947966365541u, 9545755312348467509u, 10306022763625479109u, 1487345u}, + {13034172538022883205u, 7040789690618966037u, 12429021941043651944u, 10043442254142317400u, 1113144u}, + {16914686005553882184u, 3164502206971468440u, 4913439788875534356u, 6938062920169709455u, 2805180u}, + {10014838757837030686u, 6150249918928392039u, 3170632555961902213u, 14102977281874699000u, 640559u}, + {9120275241830244064u, 12682692117416834565u, 10114208550512951386u, 12838067980791261206u, 1133451u}, + {1782589556574663547u, 17549770012109984216u, 14387870497625669726u, 16666212716116511361u, 2038750u}, + {13219546433001002198u, 3901469823963161987u, 8736956516037609748u, 4433121552460092160u, 3347587u}, + {8922351937513753233u, 6602033998715015744u, 4162374106968470591u, 15121789239013537313u, 3852325u}, + {7926228878487631446u, 8875717307499306039u, 8165350051105174685u, 10375298815909237235u, 881819u}, + {8846117368134921394u, 18164783920764907719u, 105270761993807223u, 15868937388131779219u, 2686012u}, + {10853579127787911199u, 18074647420019166613u, 5293747204874624663u, 3292139923518607248u, 2353486u}, + {13651707852453471543u, 12342219282700689712u, 5776424955303458192u, 3574236265073667185u, 419583u}, + {12828635293098132620u, 17224130782334449236u, 16036922547759676947u, 11176667019671745619u, 2882301u}, + {5617228159529683249u, 16784461994718738944u, 75521631910732031u, 12447075254590669126u, 3718648u}, + {12325064849719132771u, 14384238580195482718u, 5320120201252408826u, 10156660125713198171u, 2718690u}, + {14796479310298878256u, 15071281418054795008u, 10996126486665457181u, 2932454750319530986u, 1260201u}, + {7201188610555712863u, 18241860031510628744u, 17996012687553332323u, 5283450973029626928u, 326896u}, + {1912017869375058938u, 8208220925601260114u, 11339045070651416655u, 10886726871861288666u, 179819u}, + {1188488932021801264u, 8670105767589253793u, 13343012751145572733u, 4903233480538416897u, 3860230u}, + {11636915126599458971u, 7423397142757296819u, 17949578084549275062u, 6412276955116547670u, 831924u}, + {18419008206593279641u, 12656885289751558789u, 2492834978613830999u, 3402053215311666692u, 1812186u}, + {1436584134856779042u, 11462955958879324753u, 15061015165897073535u, 6518612398171526872u, 420867u}, + {13478183232244834425u, 17763311383408661271u, 581034526877050494u, 8726732510945962572u, 620251u}, + {2874764646032607800u, 8097425260763713840u, 836341951382764035u, 2173169441323033014u, 1891065u}, + {9137170847394953489u, 5254652806790437625u, 10140987871017905675u, 467229558482486610u, 1714787u}, + {15795130451221725291u, 15859907480426123499u, 6814824982370772574u, 13578459916527605707u, 3186894u}, + {14496696645694327433u, 15925124903239566091u, 5816745610213177349u, 4526358661938032476u, 247345u}, + {8718267935257920013u, 12581470562814640139u, 18123778410496814101u, 17226327689504047054u, 1912671u}, + {1695868128761702518u, 18009783903012719455u, 5588872604597971138u, 7529272349605039155u, 3722919u}, + {4017729766997771974u, 14703082196359808836u, 14715452146239613467u, 3239209879198252223u, 3676800u}, + {18208799452133525582u, 6018741597779226664u, 10698392578723231106u, 3022186347404470534u, 145736u}, + {7150749755434265273u, 14979967517767241721u, 11414474648421422293u, 13333343254733180642u, 404170u}, + {6693000449461723662u, 14694884515603868147u, 3870484083937493741u, 4547084058275074412u, 817309u}, + {14235063513915723067u, 11607345083142674437u, 3630240949594675018u, 15867747382843369458u, 1208339u}, + {13166439542090607443u, 4909614412948316053u, 13530599749957657298u, 15154384684119896068u, 418665u}, + {11565526903094940270u, 153650794612516668u, 10094219004911860257u, 1376817307982635077u, 3569357u}, + {11046131059748904272u, 12422931775989100365u, 185684733025994540u, 17575838367680009460u, 3669778u}, + {16235124332599118279u, 14109152113577313243u, 10888572684869025951u, 11813083301331421626u, 2285640u}, + {6830109093607413307u, 128489094407377140u, 16362554680310418444u, 9121419476716636736u, 263869u}, + {4663058067680465549u, 11305402249877143056u, 7231105984382388152u, 6273878214333135574u, 2526904u}, + {3521232867762714201u, 15904560652859130190u, 2763551710075585615u, 15322823093701433607u, 1903526u}, + {15576562003285894917u, 16955110535428790736u, 12005724387321570818u, 9402601097213106821u, 1070183u}, + {6597551230219267619u, 7071743861945892390u, 5352738760624668865u, 16232700059849421406u, 88690u}, + {10719432613301154052u, 10901907713918761199u, 18119211918537360452u, 1636057964597359u, 0u}, + {11455360473176034022u, 7473561792672210805u, 17793680633768346740u, 1636057u, 0u}, + {7703575001397254987u, 12111483800110550640u, 30179942562681661u, 0u, 0u}, + {17831818473515109152u, 10379644607548280734u, 30179942u, 0u, 0u}, + {3046793506934668428u, 556721676613042600u, 0u, 0u, 0u}, + {11308639951528288675u, 556721676u, 0u, 0u, 0u}, + {10269702288767289065u, 0u, 0u, 0u, 0u}, + {10269702289u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2704396u}, + {9922334222350794866u, 18239413295645642712u, 10184520009479717567u, 8264453021209748520u, 181929u}, + {6895069905292745815u, 13674654613342820412u, 4163352376147751049u, 16504545040652536270u, 608991u}, + {719840881416500088u, 16374515533507149572u, 3702551633254162541u, 10747815429275999958u, 1471770u}, + {15429421140552189071u, 804126591772662754u, 1067702678883712972u, 7881427125407323960u, 1170878u}, + {16627045724693592938u, 15318373659774126945u, 14468939981179885560u, 13424311385743560113u, 1449992u}, + {397403112594150129u, 7704956352796739765u, 16792941554385862802u, 11555962690825707405u, 150971u}, + {14417633774516216513u, 11040432745963500398u, 10011537620629575541u, 5262989299724254023u, 3446037u}, + {13160004893665154116u, 2673423560225170048u, 15613320781351648472u, 6764924413397821189u, 1824795u}, + {10811605429083224085u, 5709108946635401062u, 11786360995415590983u, 9184975975933757106u, 61907u}, + {13992567398148057372u, 10993906605872615719u, 2686746482070662063u, 15709697492038637161u, 3065355u}, + {15679622220456357710u, 17036880077056455672u, 11667581143019803868u, 11657818474996161130u, 2673239u}, + {16720161753081387304u, 7971132024813359670u, 895872667754687610u, 9632972574383093211u, 1398129u}, + {17539795714052846508u, 7620947843795976723u, 1372800699669513543u, 8312414251839716676u, 2461556u}, + {16402450880769146797u, 11552227274687649900u, 16185010403788878579u, 15609848014059952616u, 2478732u}, + {16472579663662638755u, 12430519781775420974u, 6570426400471970545u, 2279509965616928254u, 3258671u}, + {2043359397427536799u, 8250564277112987570u, 16435875392383903283u, 10220232631584768119u, 929956u}, + {10098240937035010799u, 1077465530499016027u, 6776909790704230442u, 13996327913910062855u, 129489u}, + {10846082741183360681u, 1185758665490387321u, 724349763612044577u, 15710944164707978538u, 200992u}, + {8752941575466383152u, 12916896033495855995u, 16719789593511171829u, 13334362560712475354u, 596077u}, + {4066512336331722920u, 8893212316574138655u, 2049171081288657070u, 13846053748483750841u, 1190080u}, + {1394019549826283541u, 6477068860269166167u, 12376291768038416370u, 6146848608257168571u, 2582911u}, + {14528465982871840595u, 18371214292405186338u, 17177658767020596712u, 4226986758528838107u, 2939203u}, + {4856817620721191372u, 15881488062733356684u, 14153082799535906573u, 2071831362810648301u, 483532u}, + {6185074864674677063u, 6269192047122207133u, 13330281604409931299u, 11898422609385389729u, 2380449u}, + {14903900136689600734u, 11140119853392522121u, 15129010705493696885u, 18130367648901852373u, 1926061u}, + {8500370825702305622u, 5062459319275644930u, 11011174206591547368u, 11204456648346550821u, 3605918u}, + {11656783919038948612u, 3232251635739627434u, 5360887793292120616u, 931208586156374479u, 634351u}, + {6885520433448605699u, 5036952389594504083u, 17220694054698465289u, 12477665480042643241u, 1340786u}, + {14560130562435626873u, 7871911200745341184u, 16890824260837344857u, 10905429848404396550u, 452139u}, + {5204590950828009598u, 13912055529234245603u, 6687003293576226675u, 14491916904947687947u, 404109u}, + {4302018667745465168u, 18392727058799629750u, 2613499492215735854u, 7933789853964872558u, 1616680u}, + {10676967025556321385u, 1390435564693161307u, 16074998930207897213u, 7956157834314947571u, 2137423u}, + {16205241455380772161u, 21026282815180438u, 4771677209951096021u, 12073046707348383637u, 3256588u}, + {14687384236709468445u, 14415679304711742008u, 11555591035620220203u, 17353896026565264988u, 3404709u}, + {15701312364001644082u, 14425116193759158920u, 6239145082158592376u, 4242146267122171888u, 2071783u}, + {11606710423919246310u, 2835438568244377505u, 1804519836258354471u, 4866076455560580175u, 1463582u}, + {9926025372106422350u, 14505830796317149865u, 9847401170097920994u, 10043003898722947532u, 1112310u}, + {1085637402905642307u, 18379525370295893671u, 1493088550971536542u, 15008498067832642458u, 2753842u}, + {13377409517569439803u, 10478905824253934527u, 16121552829532354477u, 14750548617339229470u, 3610622u}, + {14434743105731100380u, 6444621463304318268u, 259999900971229097u, 12028164845027491322u, 3572200u}, + {1013926261676880444u, 16333275690078026169u, 5721562451826603163u, 9145152319987190041u, 52562u}, + {18216839075152622837u, 8260630779937231222u, 8102367703308377982u, 6630268258396524753u, 3167760u}, + {15084888847120808092u, 1944054220186848042u, 11503849176202752417u, 11587649910705672187u, 3855352u}, + {16854745397219159635u, 7898326197296232144u, 17478677753457334633u, 431406673435353857u, 1990070u}, + {11700356280593557714u, 14679171202985359556u, 15122769512039170439u, 3279302044116930960u, 3884315u}, + {4979569078254852299u, 17511760516389328844u, 1885884448754391811u, 13834653429230208937u, 595546u}, + {12464260364299847519u, 5168021003076529239u, 15807222948793542156u, 1380080185201405641u, 1418362u}, + {13463780136180222678u, 14273409589400246981u, 4622359929098213631u, 6871635595801108932u, 3400960u}, + {638807606343105305u, 15204645862020408037u, 8578848189990993526u, 17644789590850975216u, 1779203u}, + {18273758569652271259u, 14884533001339904440u, 3962679100201348398u, 13507590605133489878u, 892323u}, + {13103743988303431413u, 11196132053775364748u, 6643296893405407410u, 8086910999767604165u, 644552u}, + {4827441732761409128u, 6638536091141341108u, 12558547006033342154u, 8586743584386533022u, 3311584u}, + {6822514797472257443u, 3636074808963013966u, 3048375494433158291u, 9068287205854326956u, 342687u}, + {3974567028876340832u, 13549898309338292395u, 17874141424084031827u, 7212080872247468110u, 868045u}, + {15219510311883136929u, 10262313097181685660u, 18077418692537461576u, 6068850510357490703u, 1479864u}, + {15141312379837080651u, 631055893900239963u, 4614470148247619358u, 9250670715395522430u, 1174382u}, + {12484956422273928147u, 5985718130232725154u, 764133171863843597u, 1895160978435568222u, 2271909u}, + {11516627037291014932u, 3375382524921713049u, 2544233345801891895u, 10129972491086829412u, 1093470u}, + {13075021976748420413u, 10765778228336517297u, 9082751254946524229u, 10828810077061442074u, 1418905u}, + {4695065038014415949u, 16963468934497246847u, 7325987063500126837u, 1395268474949347712u, 3634606u}, + {14023825196950233005u, 12227899606582904349u, 9410994025728415310u, 8497785150523606165u, 2508593u}, + {1975404227695638885u, 2449162380084621453u, 13662441790026449144u, 15898946069898030335u, 1295277u}, + {16501500030319240242u, 1343177831231340108u, 14509249062607987762u, 12922202992011608900u, 1286473u}, + {2713104854925283940u, 12163872510256013658u, 142026440860150654u, 960479973604003508u, 3111898u}, + {13410686615402395969u, 13368781008766965045u, 15840785008557623527u, 17062996579900961475u, 1846768u}, + {5368231370720400503u, 7965144263359166703u, 2208786643255532798u, 11995627484018550397u, 495651u}, + {17731593307683837533u, 3702302237076077875u, 18199048815001868842u, 15645641065372867808u, 2330649u}, + {1161858951395408488u, 18158264928469564062u, 2529908101404510616u, 5591427642194739230u, 2868832u}, + {15875191765943274652u, 6591864470537927362u, 10632182018522058768u, 15905591303630041882u, 26370u}, + {11742536198784578722u, 14368810912297999316u, 9336926551549387231u, 13835544511828978736u, 3045576u}, + {5297209910182198342u, 12564875464461247414u, 3715719403962896511u, 10216301734212415529u, 2862761u}, + {15953210429463972789u, 11516881399524966354u, 16716205301895299335u, 13311405932706238787u, 476632u}, + {5045772196485473036u, 12095997153761436646u, 13135485575974671275u, 9376279546763377943u, 1055688u}, + {17098923536531186717u, 12260423535807135795u, 16413354894360758963u, 7225233419526759435u, 836938u}, + {12313382667306156405u, 1251014863937576182u, 4374668302796458681u, 10752020299968058208u, 2310587u}, + {11577462111678270138u, 1261895295985163615u, 13056915365046727257u, 3789617707773313303u, 2618866u}, + {14618233605102104833u, 13421921105367189221u, 6930455762628345852u, 17702420093947301466u, 3162460u}, + {3330830990285073344u, 12340072464419409154u, 10161145962526935220u, 13821337569209999378u, 819940u}, + {13542590133306158548u, 15625549001199436861u, 17746181348178379037u, 16156026301652992642u, 1331640u}, + {3398754409646022465u, 11969287026230115549u, 17836578961013841427u, 17678674977726685208u, 133244u}, + {8363182895029816023u, 4441622157920469232u, 4099005122956323036u, 10378751477107655117u, 3474908u}, + {15626777919312737823u, 6059536949418400847u, 12811382652555843778u, 2730231728337771019u, 3760807u}, + {18138809473014147534u, 17459206379539738657u, 407398772202731755u, 17363197216072551766u, 2492834u}, + {11608965817520915517u, 11960719732926643705u, 8590123167795276974u, 6963513715820520748u, 1876578u}, + {11742693047183211526u, 4019237669463440817u, 14258794458853677953u, 4069842027187831854u, 87107u}, + {16925148923714034456u, 18279834414021747183u, 1852915799692584541u, 2523622635933348405u, 1926092u}, + {8819859691323512905u, 12747935607003983130u, 11520232903956782683u, 9475074947678601629u, 1532182u}, + {7074875225510641891u, 3671679410764658425u, 16467551242366624217u, 14944185744554502147u, 898390u}, + {2663277625658143391u, 6196254125353784978u, 11636213317053492927u, 2682703364755899300u, 79679u}, + {17462171136851005934u, 4101898280209774732u, 2197202102219415582u, 15061506974730691092u, 2930381u}, + {11062486096515251984u, 11058177255780753902u, 5621401540277486106u, 14969977969258050796u, 1374269u}, + {7946731883263371561u, 14366289357529900448u, 882114083854155443u, 12275141789949159841u, 2505720u}, + {9423518332557540789u, 12682815755711656005u, 11518209000013189850u, 6171117881059391847u, 3160601u}, + {15605269109016848292u, 17068950462740527752u, 11187453392277938540u, 18144758907457140299u, 3858692u}, + {5035329678784845475u, 10545768887637107241u, 11093624175790211888u, 6700478973417399476u, 3851228u}, + {17947789037214347343u, 17945602716170426421u, 8640158385361449197u, 1800424880896253726u, 3404688u}, + {8161213640786477281u, 5837954396407821166u, 14178712309832792695u, 6403873685324913274u, 1789234u}, + {16201681139025072465u, 9511292199949354374u, 3708079984894460638u, 16462136988737422729u, 276970u}, + {8486128114347519553u, 8457998593832154623u, 4584131179728620172u, 5481486358050755459u, 1549103u}, + {7637379410721838113u, 6530440418634046668u, 10842182798824163544u, 11413675770058915933u, 356511u}, + {481977938747812178u, 2339993251686863979u, 278319117423787064u, 13841634533872301748u, 2833538u}, + {5399187466211082331u, 13086547474822296281u, 6257120021028600814u, 16409343410760406821u, 3264970u}, + {5491710104402522056u, 812945626338197832u, 9225186114370848500u, 17930511403813811013u, 3121227u}, + {10934900654898504735u, 1877362407617395587u, 8772604548649463894u, 14973498459446546398u, 1701157u}, + {10560843099591491037u, 4892033254163538573u, 2674152739303831516u, 2625454208147103675u, 3023961u}, + {6258432129770343684u, 1887425331949620660u, 10355534519139170553u, 10864421342970523417u, 300073u}, + {6904447857381036185u, 10212093780133410242u, 4659488644674372249u, 2167263201836689669u, 2987083u}, + {17053739271798978959u, 14470552106629110360u, 7497970536634868288u, 14682793547494562758u, 2028908u}, + {4132383989066026717u, 2876866856426360688u, 8202862855126976869u, 7675531729328256662u, 1125655u}, + {16428628660323480370u, 3289909311786399683u, 12037702174100794872u, 10901461377102941590u, 3001713u}, + {11878941773642449392u, 17582116405343939256u, 7615919044067124764u, 199487030471044168u, 3284796u}, + {1403349053794223805u, 11007600687335949980u, 14408281485403546512u, 5392855750152499134u, 3705650u}, + {9936428643031102440u, 2836619599169437179u, 1813859762993403347u, 933048311024732782u, 1574923u}, + {18408993393748199947u, 5913969834958244811u, 3402655976522602033u, 16602298831173272459u, 2626543u}, + {11377379379051181697u, 4364912584119739735u, 63013103481011898u, 5596885924042343210u, 3667539u}, + {1083997230554426503u, 705883887852733382u, 4916725695031375401u, 4679340177337622483u, 1997682u}, + {6821674544536255471u, 11802280742004694317u, 15291919095976898812u, 10629317056849403013u, 156353u}, + {4982829443157478357u, 12029081018070388305u, 6884683895686742220u, 4902800608984573414u, 2092401u}, + {14254719735501198453u, 1472513202387353346u, 9139318163095516972u, 15819211084955592532u, 518637u}, + {4439567617191204393u, 5507352109346870174u, 12489551149732557578u, 3324216505570052641u, 1264530u}, + {10356931806427936709u, 14603016566250942567u, 16141512051595874147u, 11768714292789998012u, 2273997u}, + {8208891567543875674u, 3570757866088284786u, 666428564558445111u, 9841780641610296888u, 3434846u}, + {8322379679626343560u, 13381487578660423383u, 2588226210882326101u, 4963278129515485248u, 932558u}, + {12060880747956600707u, 6712241073844127200u, 10171515795365741493u, 6430328533098754865u, 3090398u}, + {8375484723720050009u, 10358821179568871718u, 18331231181234052631u, 16269966445956017983u, 119498u}, + {528183233361280733u, 13453805315471342085u, 17617134077574568778u, 9225576402148062397u, 670349u}, + {12321098149018197712u, 7675145563958829394u, 6720082124902720976u, 10388659307130266310u, 595547u}, + {23023061558101714u, 12941578355404932559u, 8605779885034009456u, 7577033287463958089u, 2098989u}, + {2430232780279906009u, 4354340374737079764u, 9239500273611872912u, 16107562990931494553u, 2010230u}, + {16757590552492436018u, 12975724603530137056u, 16169055103283207887u, 2919385975963973582u, 2446727u}, + {427581377286729351u, 16301773490778180707u, 1120352207693777526u, 6242087236968423622u, 1606512u}, + {10310901807949519688u, 10681626832683047829u, 2843510518104875492u, 10838274027646620916u, 2651561u}, + {16968924743069610764u, 9750184568757057587u, 721147644715122284u, 9344342308893807144u, 3814062u}, + {14894892639235746386u, 4703205121680704722u, 13824568056731379388u, 11743687269083928740u, 3547352u}, + {5377088705498806684u, 5019132910077230437u, 7896120919369478078u, 17791605239557321250u, 2690417u}, + {7435183723483664623u, 1825032872702724352u, 5301319804021917403u, 10065635022914145774u, 638397u}, + {7193349474832853665u, 2067219969538172207u, 9908582364412604936u, 6713132601669357027u, 1362064u}, + {13193617528921059307u, 14204283511936223786u, 7040245098609557400u, 8960267313436209792u, 1480103u}, + {4162832955737221056u, 9570931583370398672u, 16818011686724263254u, 9106559938982916977u, 3579509u}, + {16706362248831889987u, 17876798536516453187u, 6979390588091904071u, 2660103680904505638u, 2930856u}, + {1254190954991149912u, 6843768171365906485u, 9510568184832641540u, 846698287626207058u, 741465u}, + {9402752106638206144u, 12808871370902644229u, 5813758845235714017u, 14425196423526898540u, 3676374u}, + {8670689977168599356u, 7085305885595900414u, 11798886601543238938u, 2733948124125769934u, 2260997u}, + {11093972207993887152u, 4695321976722902557u, 3705786461930462474u, 5229854806475184591u, 1923326u}, + {15643708435988098131u, 8109819319890944701u, 10082610440594717474u, 15816092202028384287u, 2594009u}, + {15453107236035301533u, 13564672514054855696u, 5649367605388633294u, 2137521263063901586u, 726423u}, + {4190713330096227232u, 8677314446935061821u, 12496768065926564408u, 6498583604721291816u, 770407u}, + {1963801953709926659u, 1109048810196918753u, 4669231165570926980u, 8805237979887386151u, 1443391u}, + {3160565980303800339u, 9789397319570798023u, 5606998675464900152u, 10691149790793868211u, 3014193u}, + {8762236623865191602u, 1183803872732828109u, 5680750456309813231u, 3226136195219745789u, 1181641u}, + {15081329778204856341u, 2896831514442915343u, 9238639398034411606u, 13784797893584374199u, 600755u}, + {2708551366964238854u, 2892753291529383204u, 4896582689781994182u, 8009474925730800171u, 1842856u}, + {14324104633856240757u, 3303421791643951323u, 3387845402383192814u, 3564816808864643879u, 1424156u}, + {244093732927622999u, 17459518864628232140u, 1030803601058133303u, 2548286836145332469u, 973840u}, + {6797722811575701575u, 6247252708784076659u, 16437117203208578537u, 11619236819903425841u, 1729584u}, + {7944868997654836569u, 16033944948589102800u, 472856198623797259u, 10408198746482842465u, 1372515u}, + {5398547094953454563u, 12626843170771336178u, 13264623946974197701u, 1754700700260796675u, 3151538u}, + {17419515774033944974u, 14083975278046406967u, 2611728463788327801u, 130193210717199089u, 1394213u}, + {16869876101572573863u, 14401553023523973113u, 14838511073954460546u, 3556540798383900889u, 653332u}, + {11515736119277406661u, 4707951510475726792u, 2956743785837420112u, 9739827046875976967u, 1359245u}, + {17323065392341753269u, 17184239764427760853u, 6682644553825201591u, 16958608253301361346u, 15219u}, + {9078120712687741484u, 5341911301795167831u, 17845477068995651762u, 4611966776384053942u, 654891u}, + {11932260014001662648u, 17368593315600905078u, 6482329733057300293u, 6136976104509017058u, 3761601u}, + {1760769588351388018u, 2100476845208972505u, 10649568669059762011u, 4681075315518773931u, 2704664u}, + {6366575715380534650u, 164458093520122947u, 4255865952535689715u, 11579107295362920646u, 1488900u}, + {11066706534443024645u, 7777000668471763137u, 14092999730470937715u, 3270057100537210566u, 2480267u}, + {8629901645141411646u, 4276898336960154986u, 18357683908390956432u, 5233899624584335860u, 1795058u}, + {9685079771869714479u, 4805204173953706611u, 16400070237030602404u, 11418212838749978432u, 856829u}, + {569547863093624680u, 5072514098179730190u, 2795864106075215794u, 2898109478213262760u, 953740u}, + {1120877555365489535u, 1104616754967480800u, 17921133618915579984u, 13348248297607637385u, 3450960u}, + {1224820716021035598u, 7204226554251861386u, 15723797048246605815u, 9863491778435056307u, 3195483u}, + {3966237875607509119u, 10653016384695779221u, 10359817571014825040u, 14110177104352328917u, 627990u}, + {15828709349436070995u, 10108047493048668814u, 12389954099092838807u, 6424710254296612269u, 3575770u}, + {14704167379239102469u, 6737426668508939797u, 12517159749202272020u, 2515919517770708481u, 1289157u}, + {987843912438396792u, 9900550321437625335u, 3750890725710571362u, 16092624222223680430u, 1787344u}, + {15765336996038485617u, 7770858927002234138u, 871208994076566048u, 9760745888552575907u, 481075u}, + {8297373133342515730u, 3270182719056104160u, 1775371964558853257u, 2170602098303843791u, 2308619u}, + {16148976909774748250u, 697448836329138718u, 11917004254202050921u, 14382047719574964633u, 3081917u}, + {10797143738120730024u, 11730081661431285977u, 14069193458588446818u, 11081663236340436647u, 220940u}, + {11439086792525406728u, 4648708829980845372u, 12441880396097621923u, 10380369176178931408u, 3080258u}, + {5355830563491993508u, 5169015638653931972u, 4068029787634909161u, 8775789619976645868u, 2631668u}, + {10908306574127368492u, 738247133160913579u, 4774411319010499887u, 3002907070413806064u, 3120903u}, + {5115563326267880792u, 16048004719371685318u, 3335822724727829082u, 10938267201649897767u, 2683779u}, + {9229174760466629654u, 5730347840160176598u, 6942148627466743633u, 4300905043539411572u, 2665203u}, + {3622281000418119287u, 10064719794092415349u, 11714228886307177180u, 3579986429804856825u, 1731043u}, + {5009323244092556830u, 3652178414137176486u, 3004463886318346048u, 6228885198043375329u, 2712940u}, + {81780287552693127u, 12770097123324856238u, 82758903767688133u, 17992385831540270853u, 183727u}, + {4563070104118252585u, 14346274402114172494u, 6087862455540296747u, 13550216862071268234u, 56485u}, + {6201517000776149081u, 10487989531958156280u, 1739490968070061311u, 3748036867861473018u, 1806972u}, + {12847972343377624837u, 13344921268883127258u, 14095890775472770786u, 5509709900662919099u, 3906103u}, + {4918268445916707119u, 9562805754853079224u, 6619273727178171210u, 15708552794106621113u, 2066003u}, + {700972590370416666u, 7005523437529879882u, 16121199229021390715u, 12576132406904529812u, 675747u}, + {14450900872889986755u, 7986048181167213090u, 5172226582633612624u, 18387151824215333095u, 1489959u}, + {12531999585021451844u, 13685905954829541480u, 582120937980483035u, 2549500702067949794u, 2002461u}, + {12659136424826452304u, 11076224914130436422u, 9342847356051176558u, 11854384310354266708u, 897893u}, + {246985793351786899u, 16536378866413469842u, 14451396914480003569u, 737139154610238960u, 3121416u}, + {10302392970363764468u, 4137690028460772200u, 6958982860522824054u, 12307370949284470448u, 3065844u}, + {1149600658254114459u, 1633955151025836579u, 15662657277853760635u, 5316759216714028263u, 562319u}, + {1269495538909558483u, 11673286092719712396u, 1276252153054957141u, 18168886657555383370u, 2066490u}, + {14523933488601197631u, 547729978528651027u, 16128564067803053606u, 38120030329766708u, 749197u}, + {4643593052580967551u, 1580047858294393632u, 5014176650304865101u, 17451758002536471517u, 763507u}, + {7115497128500484382u, 17604147811249910963u, 2991117955428870130u, 8588937926192668145u, 2190407u}, + {9773063526909971704u, 15053374059997709955u, 354469999227118158u, 7534395665879705188u, 1420390u}, + {2326806839736068773u, 15607602129709938287u, 16593868760786729250u, 16455333018996821383u, 1003846u}, + {753880635240709184u, 17616529076985554275u, 10115023448855643710u, 13349172603723418217u, 2809388u}, + {565415488342009424u, 15085402551449462757u, 9569972071888144606u, 5744374003785230277u, 3093871u}, + {13207126847741553921u, 206758759615585721u, 17579300940416263949u, 13243611561219258135u, 2068919u}, + {15228733361111158196u, 12986437232408713010u, 720921631495777543u, 16107008303003776381u, 2102638u}, + {9111084544191038431u, 6205118865107116514u, 3588618321859748766u, 11568001887241134567u, 1808479u}, + {573086962603890998u, 15380793056795462799u, 8081271967759251461u, 2771549134284941631u, 2233555u}, + {10612850732666449632u, 730181857928783707u, 15580424626927760281u, 2347044829444797423u, 2554062u}, + {11012876725872926345u, 16561120127281176026u, 4874766395990589777u, 13521884215501955626u, 144481u}, + {1829623535426651528u, 9934599718854197432u, 4224063151235257742u, 17872948538958525973u, 457967u}, + {17826889645198615084u, 15702792046377988101u, 3384067102696007937u, 656966364257504505u, 3556083u}, + {4805744695551801684u, 832406851718485612u, 12853407802828701974u, 12027158763958873023u, 542086u}, + {11589501593051267590u, 9453852262078488185u, 17638481529782557631u, 6999586355414109471u, 2854126u}, + {10731920086353569875u, 7776782489672253469u, 2392120053751649467u, 11149518820716608847u, 3793937u}, + {2529139473452062633u, 869551687274643525u, 15605226785154544923u, 16571174830705793559u, 393719u}, + {2058679164629639434u, 17554495927001319657u, 12147060401776956684u, 3970430522287168161u, 1171736u}, + {14330922642049731973u, 9165494952156150247u, 8476159692709650984u, 12055232922418347969u, 3335922u}, + {6613588809824567268u, 12186681363723150428u, 4875436116376664942u, 4240877365638910525u, 2800307u}, + {6973425841637991286u, 14527555001208422262u, 18374001870534252213u, 11292641220714452754u, 3225885u}, + {5925301803106739348u, 9285006995210939890u, 11607298545686493823u, 14471025893884446957u, 3300498u}, + {563906974123314846u, 12289800563229338457u, 10587540593346422844u, 10941580156119934457u, 3204179u}, + {6308530746559479792u, 2577563192774354736u, 9358729108813600526u, 15695604587151296865u, 2390945u}, + {2990529191992623640u, 3869209847806946725u, 734438401208240091u, 6096943065390866695u, 3444603u}, + {18168972801523977569u, 14241646047247194980u, 295058310077825219u, 17213249097100323976u, 1151340u}, + {16722869663813782152u, 17522958353687332039u, 4757220056565475529u, 381526461724713532u, 812593u}, + {11733214340428792309u, 10787815497717797652u, 7397399312317848920u, 7436921881395191735u, 1440951u}, + {1534264194387063458u, 10748499705530684671u, 9330705365429001905u, 16311597114328391269u, 928904u}, + {10216485691289782318u, 13329005455250328978u, 12224659760394987024u, 521538428934137763u, 876304u}, + {4356919411300932433u, 8669981829036607068u, 15743282006273798029u, 11401264814132920291u, 764574u}, + {16881942417403240171u, 1066185457597824630u, 15682903012534069709u, 1383198199025308004u, 2250190u}, + {15682839612213348781u, 7492713506128463058u, 18006144418848641231u, 14597142676091861766u, 2879661u}, + {8097049018891114689u, 17195160221257414830u, 3835888697758447144u, 5169209560776068653u, 3216663u}, + {3059841690939972982u, 18229657641556957195u, 3797189609684093555u, 14470855771887167548u, 2078813u}, + {11516199229424086803u, 18294242110116985411u, 196999350801224151u, 38347345858956146u, 356176u}, + {8509809541641775976u, 13875794811724373794u, 2127584041752533620u, 16363644134165186391u, 3626511u}, + {4209267833105517701u, 13342557524932071470u, 16706813361922963639u, 18297468628256904441u, 1436085u}, + {11427579946792023763u, 2598778333017683210u, 12716591414409748872u, 11483648562791103633u, 1209845u}, + {5680511226306502564u, 7698824642347043383u, 4906154229144448168u, 3841370196577686303u, 253083u}, + {17447454567253907012u, 4410296722967516604u, 540829598205866632u, 7210427964964570431u, 1338639u}, + {16698730548945312778u, 1530738719123754764u, 7936915567010099040u, 14436212345836101645u, 3866934u}, + {8047011894565675141u, 6613217962128269561u, 1932609841393059350u, 3458039276066751309u, 1450356u}, + {6774862673338531101u, 12149081547192871996u, 9413864278372675073u, 15447079473522386670u, 3429819u}, + {15219989948476093095u, 9146638334470452563u, 2516581832659084973u, 10439562550220848678u, 2876573u}, + {9052915042588861161u, 6605205534222033064u, 4455638482677058546u, 17851289143748105648u, 750589u}, + {13926233531889605944u, 4108704151504489059u, 7120581050979244164u, 1671170603911173250u, 3139350u}, + {11807164752079487450u, 11199198445266908637u, 14330590181443193391u, 1931408232665097020u, 622971u}, + {12917768427537995955u, 4425991640600916189u, 13740392256718551973u, 12189225180943572329u, 3473334u}, + {13661120859083593353u, 10011046924870264953u, 12842255649587825281u, 17790239848900011328u, 418538u}, + {10833932649188139217u, 8760407783614716833u, 3952560548831492105u, 15355988211240012465u, 3311415u}, + {2324573714852862764u, 3153577622575522042u, 1927852717259999818u, 9140341689161751062u, 2968755u}, + {14356338732321080207u, 5402558629808896508u, 1282217355184988407u, 126821466880815225u, 943567u}, + {11639339392426731607u, 8486342694522206506u, 6833955999557125866u, 377693709281859047u, 3177116u}, + {7648690274811517361u, 13806220527012493296u, 1362817844223739329u, 15190702194087048065u, 2854657u}, + {12967844748052008596u, 11520230776087774860u, 10598093079942795839u, 8483397644725494193u, 447425u}, + {8575310112823140854u, 18359353133242673381u, 15814079981212830101u, 12690390093625893876u, 689026u}, + {7503939021489226630u, 734467703638453166u, 2539376812752576896u, 5777317822006756771u, 1111287u}, + {18076754599380605631u, 17319144489214129739u, 9102482464251973717u, 5568934373579209360u, 3657416u}, + {1724241296540890728u, 9460545034016328754u, 228621871602314342u, 16064253298912026659u, 245725u}, + {460809445459864962u, 1676271987253781296u, 8907347195319320732u, 17586585787506181962u, 163504u}, + {12768623446642926761u, 1703983822115167307u, 619892255073258368u, 5767623657063848474u, 1138400u}, + {3150972097770302526u, 16613188479926496856u, 11501597946520265528u, 9172314222037982482u, 1484890u}, + {13315696177143852151u, 9443926490701576325u, 2528397859769745147u, 315621771131636542u, 3242806u}, + {16278056401582119468u, 10870344488630599394u, 6812586204110420877u, 4527390043029843579u, 1020118u}, + {15649652812216214859u, 2788526963430404292u, 7475621754940344515u, 2757006433639636051u, 3097170u}, + {5443797399757091u, 1004101495690262520u, 11403090440007746431u, 6254085792361579941u, 153707u}, + {2476559951775784987u, 17261512710480078308u, 7596746512213223376u, 219008182059207274u, 1282764u}, + {10251029304992179540u, 2933448188379729125u, 6057060329607677105u, 5283867184202715469u, 2094599u}, + {9414155154951648790u, 3179317613133206396u, 5682288066665394871u, 11928141553232024577u, 1452477u}, + {8152823296731613273u, 12883903627885215788u, 11705887064463000349u, 11339835747374776933u, 665349u}, + {4108365212576496483u, 11745267402274099946u, 15364863468685099483u, 14928195499913617075u, 3350030u}, + {3813173584569230882u, 1484711351429953130u, 2098604092853391517u, 17139446947966365541u, 2775723u}, + {16916699292427831965u, 5975609887183054062u, 13034172538022883204u, 7040789690618966037u, 3579258u}, + {11399032073518887499u, 15217247580915866351u, 16914686005553882183u, 3164502206971468440u, 1374466u}, + {9033117033797306363u, 10624655335352211055u, 10014838757837030685u, 6150249918928392039u, 30117u}, + {18067398430762342232u, 11352791521623555439u, 9120275241830244063u, 12682692117416834565u, 2156188u}, + {10728411190067253829u, 6521677240416391652u, 1782589556574663546u, 17549770012109984216u, 561602u}, + {6618320562097658979u, 15902368326329221095u, 13219546433001002197u, 3901469823963161987u, 2428230u}, + {8793537062667216551u, 8308894434872407908u, 8922351937513753232u, 6602033998715015744u, 684849u}, + {13774309025131231595u, 18111487052264745072u, 7926228878487631445u, 8875717307499306039u, 339909u}, + {9788938893752338409u, 6021717761982995672u, 8846117368134921393u, 18164783920764907719u, 3266099u}, + {8722696569527146229u, 16795307451546558275u, 10853579127787911198u, 18074647420019166613u, 1104297u}, + {9569928868221197100u, 11465283038229389448u, 13651707852453471542u, 12342219282700689712u, 128250u}, + {14834022895845807049u, 680281511279249759u, 12828635293098132619u, 17224130782334449236u, 3637507u}, + {2203462690548169225u, 9602972586624994256u, 5617228159529683248u, 16784461994718738944u, 2427385u}, + {17556180429663809596u, 12767716761420378929u, 12325064849719132770u, 14384238580195482718u, 609552u}, + {5807685281241801467u, 102061604976414757u, 14796479310298878255u, 15071281418054795008u, 611963u}, + {5377434960244606928u, 14042755683847528082u, 7201188610555712862u, 18241860031510628744u, 3562297u}, + {3711234959625597981u, 7416284692357678765u, 1912017869375058937u, 8208220925601260114u, 1257375u}, + {8569341641074738267u, 14380918636509383613u, 1188488932021801263u, 8670105767589253793u, 79415u}, + {323981447561243583u, 10917871349081883483u, 11636915126599458970u, 7423397142757296819u, 2537376u}, + {2088879101910802411u, 11509807790948713501u, 18419008206593279640u, 12656885289751558789u, 314337u}, + {9188110663371645407u, 2429018129009669185u, 1436584134856779041u, 11462955958879324753u, 2013539u}, + {17842036809071603262u, 1173815635986065923u, 13478183232244834424u, 17763311383408661271u, 1462302u}, + {8674807852287458242u, 11585110009951198644u, 2874764646032607799u, 8097425260763713840u, 3605299u}, + {13448391655570296848u, 6645966827424834819u, 9137170847394953488u, 5254652806790437625u, 392307u}, + {9392980620242145863u, 5397046561704620562u, 15795130451221725290u, 15859907480426123499u, 21500u}, + {2989437775017208414u, 1827217779235704458u, 14496696645694327432u, 15925124903239566091u, 2355385u}, + {6960289063008724289u, 8162150184309272330u, 8718267935257920012u, 12581470562814640139u, 3656091u}, + {3842339513115168020u, 6165144120239058288u, 1695868128761702517u, 18009783903012719455u, 180682u}, + {18295984593621613962u, 10955240718117141628u, 4017729766997771973u, 14703082196359808836u, 2057885u}, + {5810912041795211127u, 15952403187154593992u, 18208799452133525581u, 6018741597779226664u, 3471916u}, + {16819269163144946831u, 8309968625723343023u, 7150749755434265272u, 14979967517767241721u, 3642535u}, + {4954974611349354521u, 10114670166975987964u, 6693000449461723661u, 14694884515603868147u, 329187u}, + {7739547750707337163u, 4446873316914338976u, 14235063513915723066u, 11607345083142674437u, 525730u}, + {11984443508911116647u, 1101752786643932168u, 13166439542090607442u, 4909614412948316053u, 516926u}, + {17953096375347652222u, 8312164603520947376u, 11565526903094940269u, 153650794612516668u, 1573481u}, + {10109399868050280601u, 15334300456988197268u, 11046131059748904271u, 12422931775989100365u, 3139918u}, + {16522991657443984153u, 1832586621801891149u, 16235124332599118278u, 14109152113577313243u, 3059157u}, + {8714774603572000352u, 10349943439296071586u, 6830109093607413306u, 128489094407377140u, 3492084u}, + {17352947823668116067u, 10145448229461553837u, 4663058067680465548u, 11305402249877143056u, 2812960u}, + {4487375290588758504u, 11542382415920708162u, 3521232867762714200u, 15904560652859130190u, 1169633u}, + {12034640527377905586u, 16630051322605460004u, 15576562003285894916u, 16955110535428790736u, 547502u}, + {14036158346889353300u, 4595216855735407633u, 6597551230219267618u, 7071743861945892390u, 1149851u}, + {4666595662337762304u, 15066616448050461023u, 10719432613301154051u, 10901907713918761199u, 2798846u}, + {5229120664887186637u, 6096306024902037070u, 11455360473176034021u, 7473561792672210805u, 314852u}, + {12467757313823452226u, 1287387446761724364u, 7703575001397254986u, 12111483800110550640u, 181661u}, + {14857262918584434031u, 13288990934565222623u, 17831818473515109151u, 10379644607548280734u, 2836192u}, + {4354932720051715215u, 9819033040676078596u, 3046793506934668427u, 556721676613042600u, 0u}, + {15018088856429886203u, 8144422483864627164u, 11308639951528288674u, 556721676u, 0u}, + {9639246592103993317u, 7310759939411737485u, 10269702288767289064u, 0u, 0u}, + {13135279149831527756u, 14153985001474908806u, 10269702288u, 0u, 0u}, + {14097116462331792526u, 4975129096983891719u, 10u, 0u, 0u}, + {1464816835446211619u, 189442569834u, 0u, 0u, 0u}, + {8163972464006936859u, 189u, 0u, 0u, 0u}, + {3494598602396u, 0u, 0u, 0u, 0u}, + {3495u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 479326u}, + {17125737607990494282u, 13362058744808215742u, 9922334222350794865u, 18239413295645642712u, 3023261u}, + {8988178096182564741u, 13718760072569430598u, 6895069905292745814u, 13674654613342820412u, 945515u}, + {5170019791507053618u, 1474843876403769308u, 719840881416500087u, 16374515533507149572u, 623039u}, + {3594674152580572814u, 8857079154881897555u, 15429421140552189070u, 804126591772662754u, 2285700u}, + {3903915792932007794u, 3705558604805856567u, 16627045724693592937u, 15318373659774126945u, 3624020u}, + {1347287453671066757u, 3472768861351746129u, 397403112594150128u, 7704956352796739765u, 846808u}, + {9978522434297535329u, 18225250626888380328u, 14417633774516216512u, 11040432745963500398u, 395331u}, + {14862759086598472765u, 13592882133758031040u, 13160004893665154115u, 2673423560225170048u, 897666u}, + {7753194292945970490u, 7437974023101535505u, 10811605429083224084u, 5709108946635401062u, 2230871u}, + {3608809175724412071u, 1706295278696281445u, 13992567398148057371u, 10993906605872615719u, 1696119u}, + {10148853842164563759u, 13983527396088729191u, 15679622220456357709u, 17036880077056455672u, 2428432u}, + {3530235308631593932u, 716483599530286513u, 16720161753081387303u, 7971132024813359670u, 2976160u}, + {2559615627282458585u, 9703042410125279625u, 17539795714052846507u, 7620947843795976723u, 1247495u}, + {10149751754829902096u, 1958741611494467586u, 16402450880769146796u, 11552227274687649900u, 1984827u}, + {10377645956206394481u, 7304233807214171500u, 16472579663662638754u, 12430519781775420974u, 1951485u}, + {14525458231787504585u, 18038054584492854788u, 2043359397427536798u, 8250564277112987570u, 3722023u}, + {15966226719565047602u, 314432260152527817u, 10098240937035010798u, 1077465530499016027u, 1780106u}, + {13523855466639598193u, 4147838322470280240u, 10846082741183360680u, 1185758665490387321u, 1007587u}, + {16414474556774170803u, 2603538192536535504u, 8752941575466383151u, 12916896033495855995u, 1633255u}, + {4593104998471296304u, 4122669310444055755u, 4066512336331722919u, 8893212316574138655u, 3466356u}, + {14246448399536263382u, 3409211674974046849u, 1394019549826283540u, 6477068860269166167u, 3718022u}, + {15105454952097499532u, 12686184581391039529u, 14528465982871840594u, 18371214292405186338u, 1562192u}, + {3587072572877881522u, 10546637319071843458u, 4856817620721191371u, 15881488062733356684u, 9831u}, + {1649166114277471136u, 4512380767711564982u, 6185074864674677062u, 6269192047122207133u, 2344607u}, + {1565477292760840658u, 6249236366460904919u, 14903900136689600733u, 11140119853392522121u, 998969u}, + {6542356325883611011u, 7210594910406303672u, 8500370825702305621u, 5062459319275644930u, 3345712u}, + {17291189118461098191u, 9461135319718137880u, 11656783919038948611u, 3232251635739627434u, 3522486u}, + {13979064720007078996u, 3142985244574708521u, 6885520433448605698u, 5036952389594504083u, 955911u}, + {18330891027080882353u, 755767571954931411u, 14560130562435626872u, 7871911200745341184u, 267791u}, + {6934005733118842476u, 2364760287227411345u, 5204590950828009597u, 13912055529234245603u, 977981u}, + {9980445623634402272u, 3421951843223669033u, 4302018667745465167u, 18392727058799629750u, 1156912u}, + {593654179224978616u, 2059118530072799417u, 10676967025556321384u, 1390435564693161307u, 1139837u}, + {1374778743734318931u, 17122566098234508076u, 16205241455380772160u, 21026282815180438u, 225541u}, + {17378550310682438726u, 12456305328741521736u, 14687384236709468444u, 14415679304711742008u, 737115u}, + {16936065103750158600u, 15649162752191401617u, 15701312364001644081u, 14425116193759158920u, 1365682u}, + {7954404019124414887u, 850612459900034338u, 11606710423919246309u, 2835438568244377505u, 1206413u}, + {12712002021752497257u, 14634018215024711411u, 9926025372106422349u, 14505830796317149865u, 262316u}, + {10751831835070625720u, 8995486232524247229u, 1085637402905642306u, 18379525370295893671u, 1656372u}, + {5149999154545884833u, 5048177940102865743u, 13377409517569439802u, 10478905824253934527u, 1707379u}, + {2506666648115368745u, 12322780293683529918u, 14434743105731100379u, 6444621463304318268u, 2616149u}, + {12677120772787877315u, 3711935223422725402u, 1013926261676880443u, 16333275690078026169u, 2497191u}, + {14370723661276258563u, 13191997975096949651u, 18216839075152622836u, 8260630779937231222u, 3824890u}, + {13121414397249763990u, 11147688946790396626u, 15084888847120808091u, 1944054220186848042u, 2387871u}, + {13362364863200789277u, 2324181648068076438u, 16854745397219159634u, 7898326197296232144u, 2790715u}, + {15634487888571479288u, 17320300622041919356u, 11700356280593557713u, 14679171202985359556u, 95689u}, + {3562295847551055548u, 5172714112831838087u, 4979569078254852298u, 17511760516389328844u, 2815229u}, + {9901874702253266492u, 15486551264803662994u, 12464260364299847518u, 5168021003076529239u, 325584u}, + {13275113236252129300u, 15905484580663955021u, 13463780136180222677u, 14273409589400246981u, 26753u}, + {13397355145575590384u, 5699607503163696135u, 638807606343105304u, 15204645862020408037u, 2204650u}, + {13818560610498822268u, 6683504340862596837u, 18273758569652271258u, 14884533001339904440u, 1474784u}, + {15992014990372034828u, 5603600694987075659u, 13103743988303431412u, 11196132053775364748u, 500762u}, + {8408344927440607129u, 6297601332436661708u, 4827441732761409127u, 6638536091141341108u, 1799510u}, + {11205938594703177705u, 10094541944827360272u, 6822514797472257442u, 3636074808963013966u, 166459u}, + {16931091412653417020u, 18241631083993190461u, 3974567028876340831u, 13549898309338292395u, 1633607u}, + {11459050086456851763u, 758215488438902582u, 15219510311883136928u, 10262313097181685660u, 2959608u}, + {16539423760160077808u, 5737541280295882996u, 15141312379837080650u, 631055893900239963u, 267680u}, + {6702270372022550412u, 3948579771249159362u, 12484956422273928146u, 5985718130232725154u, 3292353u}, + {17527945146707122637u, 12364354088637732439u, 11516627037291014931u, 3375382524921713049u, 1582757u}, + {2271431566456081690u, 13958952063995981778u, 13075021976748420412u, 10765778228336517297u, 1622743u}, + {662528281801883921u, 7553317695684488004u, 4695065038014415948u, 16963468934497246847u, 2719515u}, + {10103367396512728010u, 7967785923528778966u, 14023825196950233004u, 12227899606582904349u, 3863108u}, + {14613074252224778367u, 10661779714145739123u, 1975404227695638884u, 2449162380084621453u, 2501316u}, + {13232077743355871488u, 485758638863607400u, 16501500030319240241u, 1343177831231340108u, 3154850u}, + {17804976400381028241u, 13064286108240605644u, 2713104854925283939u, 12163872510256013658u, 2066820u}, + {6063035941197656319u, 8831289954173507180u, 13410686615402395968u, 13368781008766965045u, 2103835u}, + {16581836324270895927u, 11920146719451157553u, 5368231370720400502u, 7965144263359166703u, 1483456u}, + {617355890777844655u, 2603102820255216209u, 17731593307683837532u, 3702302237076077875u, 3892764u}, + {15670296308040729749u, 13507405440121535284u, 1161858951395408487u, 18158264928469564062u, 1876938u}, + {6876706324889282632u, 12485391099717374098u, 15875191765943274651u, 6591864470537927362u, 1591050u}, + {7262482890441739765u, 14352681878383469483u, 11742536198784578721u, 14368810912297999316u, 1455763u}, + {14326043298978598785u, 15367877447952609553u, 5297209910182198341u, 12564875464461247414u, 3237641u}, + {1733472449353033309u, 1260552018198578670u, 15953210429463972788u, 11516881399524966354u, 3381569u}, + {11078548656975712184u, 6186213689270545992u, 5045772196485473035u, 12095997153761436646u, 576391u}, + {3270155126034659621u, 5639691103633955166u, 17098923536531186716u, 12260423535807135795u, 1411401u}, + {3174371764682590698u, 11475558859647009301u, 12313382667306156404u, 1251014863937576182u, 2001231u}, + {303894118461624722u, 17481404790945693021u, 11577462111678270137u, 1261895295985163615u, 1041301u}, + {2381023618880450960u, 1535990907614273490u, 14618233605102104832u, 13421921105367189221u, 987918u}, + {3032429011873675946u, 3055234167324648141u, 3330830990285073343u, 12340072464419409154u, 3312708u}, + {9768861096272495519u, 9351559479049141703u, 13542590133306158547u, 15625549001199436861u, 418849u}, + {16344921602551344559u, 16949054167648485537u, 3398754409646022464u, 11969287026230115549u, 2499569u}, + {4841505330770198093u, 15616314639512095858u, 8363182895029816022u, 4441622157920469232u, 363156u}, + {10847957939695438019u, 12418533884750407042u, 15626777919312737822u, 6059536949418400847u, 1152974u}, + {1329702751338707873u, 5029075307019919027u, 18138809473014147533u, 17459206379539738657u, 3860665u}, + {3792148591637908706u, 7137884337301493506u, 11608965817520915516u, 11960719732926643705u, 3039560u}, + {5685611226898617836u, 12416358746891269352u, 11742693047183211525u, 4019237669463440817u, 2670559u}, + {872017590591013535u, 15193581466174458058u, 16925148923714034455u, 18279834414021747183u, 3566973u}, + {5237023154020065369u, 1419935760637388693u, 8819859691323512904u, 12747935607003983130u, 3729639u}, + {3820383071343984506u, 1075359735598653197u, 7074875225510641890u, 3671679410764658425u, 3868359u}, + {2383723340285615454u, 6587837639904195817u, 2663277625658143390u, 6196254125353784978u, 3614351u}, + {11416551946403637562u, 6618191762789962788u, 17462171136851005933u, 4101898280209774732u, 1808740u}, + {17209730293754152392u, 13401527940002094599u, 11062486096515251983u, 11058177255780753902u, 1454356u}, + {1059311951041291885u, 5865325855187757360u, 7946731883263371560u, 14366289357529900448u, 36819u}, + {11393602553691308931u, 4399437639406659068u, 9423518332557540788u, 12682815755711656005u, 3434658u}, + {5248381378270155514u, 10412023339605333633u, 15605269109016848291u, 17068950462740527752u, 1374776u}, + {14474423999459493300u, 15014346958898368912u, 5035329678784845474u, 10545768887637107241u, 176822u}, + {2977383902757638877u, 16376461611006386054u, 17947789037214347342u, 17945602716170426421u, 69891u}, + {1215345990505938803u, 13113144262718656104u, 8161213640786477280u, 5837954396407821166u, 3889433u}, + {129980334751233772u, 2743510177071765857u, 16201681139025072464u, 9511292199949354374u, 1477772u}, + {9627797291911887709u, 11680420796374888286u, 8486128114347519552u, 8457998593832154623u, 2453384u}, + {495949394019193231u, 10215943828328773701u, 7637379410721838112u, 6530440418634046668u, 1851288u}, + {9134852550454674789u, 4991853649092838574u, 481977938747812177u, 2339993251686863979u, 2391910u}, + {16053858082577063588u, 12602321201855787970u, 5399187466211082330u, 13086547474822296281u, 1101120u}, + {6396812617988323787u, 4129361706959060221u, 5491710104402522055u, 812945626338197832u, 209520u}, + {11781647916875226325u, 5351025751200133368u, 10934900654898504734u, 1877362407617395587u, 3478904u}, + {1156134348910324739u, 5031304256932325366u, 10560843099591491036u, 4892033254163538573u, 755032u}, + {18318068848473013136u, 10588829479225602715u, 6258432129770343683u, 1887425331949620660u, 2817463u}, + {874896826378727964u, 254313668131040704u, 6904447857381036184u, 10212093780133410242u, 3200201u}, + {12896828908665105885u, 4663150811333872734u, 17053739271798978958u, 14470552106629110360u, 3611514u}, + {10701649220443612775u, 14898053568760722953u, 4132383989066026716u, 2876866856426360688u, 2565091u}, + {7862948154825551430u, 9724773371355210173u, 16428628660323480369u, 3289909311786399683u, 3440u}, + {2272033178902304661u, 15964305541709318112u, 11878941773642449391u, 17582116405343939256u, 2973228u}, + {11578080325817806952u, 6529908624955452643u, 1403349053794223804u, 11007600687335949980u, 1429706u}, + {2264879498372164121u, 9708584500387977727u, 9936428643031102439u, 2836619599169437179u, 284447u}, + {5752069033544541038u, 11899229717415599881u, 18408993393748199946u, 5913969834958244811u, 2247385u}, + {7720781306909180573u, 15124616117775221098u, 11377379379051181696u, 4364912584119739735u, 3109792u}, + {17984166627955708640u, 6641208032161925705u, 1083997230554426502u, 705883887852733382u, 3084171u}, + {4579336811432973409u, 4872426878734224969u, 6821674544536255470u, 11802280742004694317u, 3660288u}, + {5499603244010882834u, 17035218960077882474u, 4982829443157478356u, 12029081018070388305u, 1700100u}, + {13034791263666858648u, 259634914606652810u, 14254719735501198452u, 1472513202387353346u, 1679156u}, + {11316686320600774096u, 18338216787282188894u, 4439567617191204392u, 5507352109346870174u, 2568614u}, + {6114096854346787604u, 7303943324267973898u, 10356931806427936708u, 14603016566250942567u, 2164921u}, + {8040249418284083967u, 8845397446431671176u, 8208891567543875673u, 3570757866088284786u, 2755645u}, + {7321790907796201995u, 3247714751869561109u, 8322379679626343559u, 13381487578660423383u, 590067u}, + {16253096622690911869u, 9359657304742075601u, 12060880747956600706u, 6712241073844127200u, 2959071u}, + {405815712961528120u, 1244662374226890667u, 8375484723720050008u, 10358821179568871718u, 2769747u}, + {13950577377801931856u, 16588565322755730129u, 528183233361280732u, 13453805315471342085u, 2007974u}, + {6746924421259676815u, 1696920357360708371u, 12321098149018197711u, 7675145563958829394u, 2345618u}, + {9199146654032716350u, 11403744408199946184u, 23023061558101713u, 12941578355404932559u, 1674264u}, + {18114127889036589552u, 17574866861483550572u, 2430232780279906008u, 4354340374737079764u, 290440u}, + {7455253922900108315u, 5207244185936355688u, 16757590552492436017u, 12975724603530137056u, 908411u}, + {2563930527560502674u, 289151408843812174u, 427581377286729350u, 16301773490778180707u, 927150u}, + {1439723478141885623u, 13466718302954430106u, 10310901807949519687u, 10681626832683047829u, 1214814u}, + {5018707266640992020u, 15743752547063688755u, 16968924743069610763u, 9750184568757057587u, 1055010u}, + {1417768700755711391u, 1820987235750818379u, 14894892639235746385u, 4703205121680704722u, 2556490u}, + {12191763267947034496u, 12079418280403248612u, 5377088705498806683u, 5019132910077230437u, 1278980u}, + {2887112692314944199u, 17792581127994783718u, 7435183723483664622u, 1825032872702724352u, 2689219u}, + {9023365172477564501u, 16441773344195257018u, 7193349474832853664u, 2067219969538172207u, 484502u}, + {12236080010216471900u, 18130291818880316088u, 13193617528921059306u, 14204283511936223786u, 3216240u}, + {7857907897136490337u, 11589036416383763905u, 4162832955737221055u, 9570931583370398672u, 353190u}, + {656029997513282367u, 11496373341505645155u, 16706362248831889986u, 17876798536516453187u, 3813915u}, + {7360631682204054679u, 8325023322700516796u, 1254190954991149911u, 6843768171365906485u, 2964058u}, + {10625455565700256751u, 731009777640530205u, 9402752106638206143u, 12808871370902644229u, 1282701u}, + {16299668751822589557u, 11087468339262418806u, 8670689977168599355u, 7085305885595900414u, 627664u}, + {4270867938824430755u, 10564213541247254340u, 11093972207993887151u, 4695321976722902557u, 2134186u}, + {2942181970838222879u, 12141722204148917076u, 15643708435988098130u, 8109819319890944701u, 967370u}, + {14165131774254263162u, 1207812865899408186u, 15453107236035301532u, 13564672514054855696u, 1648158u}, + {14332803650202636672u, 11728519499419767913u, 4190713330096227231u, 8677314446935061821u, 1527906u}, + {1850584039081956478u, 2574632428854874920u, 1963801953709926658u, 1109048810196918753u, 3340542u}, + {271503755919971500u, 13935236016134639507u, 3160565980303800338u, 9789397319570798023u, 1674136u}, + {9523962820165277057u, 7141795738480811367u, 8762236623865191601u, 1183803872732828109u, 787551u}, + {7348500005364471678u, 10270224788626332674u, 15081329778204856340u, 2896831514442915343u, 566470u}, + {14243554606208583350u, 5998529735672478659u, 2708551366964238853u, 2892753291529383204u, 3297604u}, + {15113441691302247174u, 292342917720778360u, 14324104633856240756u, 3303421791643951323u, 1169914u}, + {7024654598252848142u, 988072324058437075u, 244093732927622998u, 17459518864628232140u, 2726747u}, + {4411114484904878179u, 6839589136841001742u, 6797722811575701574u, 6247252708784076659u, 2014397u}, + {9345388804704693218u, 16405880248919451340u, 7944868997654836568u, 16033944948589102800u, 908789u}, + {11467694647419203147u, 9331251416508808718u, 5398547094953454562u, 12626843170771336178u, 1775079u}, + {4468813451393519903u, 10251284282743457817u, 17419515774033944973u, 14083975278046406967u, 3366003u}, + {7190039554130593615u, 9739585973072421141u, 16869876101572573862u, 14401553023523973113u, 1312312u}, + {15938728685794528233u, 13918451035719019550u, 11515736119277406660u, 4707951510475726792u, 1872004u}, + {7951927376714486298u, 4316175759325902163u, 17323065392341753268u, 17184239764427760853u, 523091u}, + {18387654640941089241u, 6422643692657521390u, 9078120712687741483u, 5341911301795167831u, 147080u}, + {12618007090480018627u, 13022568617987355810u, 11932260014001662647u, 17368593315600905078u, 585827u}, + {6042082021162943297u, 3169202424896484488u, 1760769588351388017u, 2100476845208972505u, 1102791u}, + {792840623608260781u, 12054574501980896957u, 6366575715380534649u, 164458093520122947u, 3623301u}, + {2717394832465150501u, 5161459084923955116u, 11066706534443024644u, 7777000668471763137u, 1382373u}, + {1096834181968127917u, 8221144277143786384u, 8629901645141411645u, 4276898336960154986u, 2678140u}, + {9643363079803251371u, 16545638520340836967u, 9685079771869714478u, 4805204173953706611u, 1544040u}, + {3493976978270630034u, 2050726289213872302u, 569547863093624679u, 5072514098179730190u, 1287644u}, + {14136057824577996398u, 13358419702315289127u, 1120877555365489534u, 1104616754967480800u, 3823154u}, + {17201862889253429662u, 2865047915705738131u, 1224820716021035597u, 7204226554251861386u, 3282425u}, + {10929764115381100874u, 17594433904679648160u, 3966237875607509118u, 10653016384695779221u, 1083352u}, + {2308536539926124842u, 12258982389424813988u, 15828709349436070994u, 10108047493048668814u, 1955381u}, + {4317771317291387250u, 2649305790179661834u, 14704167379239102468u, 6737426668508939797u, 1553658u}, + {8215038367118212608u, 9619432267842852167u, 987843912438396791u, 9900550321437625335u, 3290356u}, + {15557710191852876277u, 4864526085885447182u, 15765336996038485616u, 7770858927002234138u, 1495710u}, + {11078445369033137153u, 15192856187985879358u, 8297373133342515729u, 3270182719056104160u, 2652527u}, + {15366000838957010499u, 6707007439213879230u, 16148976909774748249u, 697448836329138718u, 3076501u}, + {457662223201720771u, 6131918968609738395u, 10797143738120730023u, 11730081661431285977u, 2007010u}, + {11069135448219784637u, 2463109163972777437u, 11439086792525406727u, 4648708829980845372u, 2869149u}, + {2747188843177680276u, 7469064966090331857u, 5355830563491993507u, 5169015638653931972u, 957957u}, + {4594601993425824342u, 9599974333419013255u, 10908306574127368491u, 738247133160913579u, 2776579u}, + {11650382839599370344u, 17329815478357675502u, 5115563326267880791u, 16048004719371685318u, 2049028u}, + {13133193655191410771u, 1503768393169145364u, 9229174760466629653u, 5730347840160176598u, 2640803u}, + {15768586531279627813u, 9971409443726170159u, 3622281000418119286u, 10064719794092415349u, 2672488u}, + {16614608432116173359u, 9996213110296017736u, 5009323244092556829u, 3652178414137176486u, 862102u}, + {10339296915735951930u, 806099058844673946u, 81780287552693126u, 12770097123324856238u, 369343u}, + {4266278456725496277u, 13227554052946444574u, 4563070104118252584u, 14346274402114172494u, 2148801u}, + {3987250417249376821u, 5230890546308297090u, 6201517000776149080u, 10487989531958156280u, 773381u}, + {15339859065395246203u, 14291620436573611478u, 12847972343377624836u, 13344921268883127258u, 2775738u}, + {12129312549230600048u, 2870835287444160058u, 4918268445916707118u, 9562805754853079224u, 863936u}, + {1945606628249796914u, 7644034086477880080u, 700972590370416665u, 7005523437529879882u, 3237039u}, + {17868325312148774930u, 6875558283745593095u, 14450900872889986754u, 7986048181167213090u, 3633198u}, + {14402627623937593025u, 8141590075602354674u, 12531999585021451843u, 13685905954829541480u, 2787105u}, + {12864462744656451819u, 12627873671789915015u, 12659136424826452303u, 11076224914130436422u, 1907644u}, + {16777574197482876645u, 15063240794151349359u, 246985793351786898u, 16536378866413469842u, 1648375u}, + {11893178159410744718u, 8650334461912351395u, 10302392970363764467u, 4137690028460772200u, 2639386u}, + {15060385311221019904u, 805120752873590185u, 1149600658254114458u, 1633955151025836579u, 3903857u}, + {10675927875880783748u, 5634777752628597469u, 1269495538909558482u, 11673286092719712396u, 2348751u}, + {3866545537318513317u, 17931745554004752819u, 14523933488601197630u, 547729978528651027u, 3623316u}, + {3734937124234785740u, 17875178330451785101u, 4643593052580967550u, 1580047858294393632u, 1197765u}, + {7610601485083951832u, 12936198077547962755u, 7115497128500484381u, 17604147811249910963u, 3545042u}, + {5381398761520593693u, 546978090503118611u, 9773063526909971703u, 15053374059997709955u, 2339806u}, + {10301091981978890923u, 10210762034551305613u, 2326806839736068772u, 15607602129709938287u, 1868954u}, + {6502252633387635218u, 7576586710058780382u, 753880635240709183u, 17616529076985554275u, 1375060u}, + {13097525320850260955u, 10465851440051657165u, 565415488342009423u, 15085402551449462757u, 3395914u}, + {11584294620446618147u, 17368818168088359662u, 13207126847741553920u, 206758759615585721u, 871173u}, + {1860560127762229942u, 17383970791742073259u, 15228733361111158195u, 12986437232408713010u, 442667u}, + {15759838760372591963u, 12866152192693785675u, 9111084544191038430u, 6205118865107116514u, 1763212u}, + {2810451698414753463u, 8444582354009181954u, 573086962603890997u, 15380793056795462799u, 520737u}, + {17965889146295289838u, 4264652097639523111u, 10612850732666449631u, 730181857928783707u, 3248871u}, + {2004508360739069195u, 14831852206825144654u, 11012876725872926344u, 16561120127281176026u, 3399479u}, + {926978369605443118u, 3946049735606784729u, 1829623535426651527u, 9934599718854197432u, 3593812u}, + {15983788393706364781u, 4324136533992230588u, 17826889645198615083u, 15702792046377988101u, 2156115u}, + {5340310510590744020u, 6186848684605379812u, 4805744695551801683u, 832406851718485612u, 775608u}, + {1427065583389303143u, 10516782530114549738u, 11589501593051267589u, 9453852262078488185u, 3611473u}, + {140688337856348432u, 8975433732155173724u, 10731920086353569874u, 7776782489672253469u, 263491u}, + {12540297838532797551u, 8280350028399535522u, 2529139473452062632u, 869551687274643525u, 2412381u}, + {17416246427830024026u, 2954905874826963162u, 2058679164629639433u, 17554495927001319657u, 768726u}, + {10981678400060499656u, 9339221300388136482u, 14330922642049731972u, 9165494952156150247u, 485070u}, + {4808984767069417153u, 8823871721446408592u, 6613588809824567267u, 12186681363723150428u, 2384084u}, + {1678884226030499039u, 4868560978314617274u, 6973425841637991285u, 14527555001208422262u, 3341237u}, + {12898141616670866603u, 18282157597819713473u, 5925301803106739347u, 9285006995210939890u, 2168923u}, + {15009360695780899056u, 7948397207197785338u, 563906974123314845u, 12289800563229338457u, 3011230u}, + {18094601831777341296u, 5188372511486438582u, 6308530746559479791u, 2577563192774354736u, 2719036u}, + {5895112905894550414u, 8301211613506129097u, 2990529191992623639u, 3869209847806946725u, 2509929u}, + {1542253049132171934u, 17595018487435507714u, 18168972801523977568u, 14241646047247194980u, 702725u}, + {2475370101426351825u, 8217708103878271466u, 16722869663813782151u, 17522958353687332039u, 2777399u}, + {13111092897089591798u, 10044069884074366634u, 11733214340428792308u, 10787815497717797652u, 646086u}, + {14745639715482881304u, 611678474476280404u, 1534264194387063457u, 10748499705530684671u, 3816833u}, + {11646282894859329455u, 2172669341976140711u, 10216485691289782317u, 13329005455250328978u, 1250656u}, + {13291741077764347061u, 7895684254838610584u, 4356919411300932432u, 8669981829036607068u, 3110529u}, + {11862615756364286277u, 10503106503148762594u, 16881942417403240170u, 1066185457597824630u, 3837063u}, + {177144869965699677u, 8454806496442477931u, 15682839612213348780u, 7492713506128463058u, 2464003u}, + {14218409934424075094u, 17446356416906750278u, 8097049018891114688u, 17195160221257414830u, 3856720u}, + {13743556426617335126u, 18198898950443839725u, 3059841690939972981u, 18229657641556957195u, 3451601u}, + {10250845309987040762u, 2301990554040007178u, 11516199229424086802u, 18294242110116985411u, 2208343u}, + {17538038175595163314u, 4407635258229215849u, 8509809541641775975u, 13875794811724373794u, 645242u}, + {10098971572722216991u, 1085026994625853143u, 4209267833105517700u, 13342557524932071470u, 255055u}, + {17135290209167804125u, 819465247094648518u, 11427579946792023762u, 2598778333017683210u, 3291620u}, + {3167918222027026642u, 3991688036343911475u, 5680511226306502563u, 7698824642347043383u, 801414u}, + {16534441599889286247u, 17562375346174076598u, 17447454567253907011u, 4410296722967516604u, 950262u}, + {9213236489857917695u, 5230399922590989930u, 16698730548945312777u, 1530738719123754764u, 3034514u}, + {8158192295180324068u, 2719119902621506821u, 8047011894565675140u, 6613217962128269561u, 2353030u}, + {8033534122955818403u, 8469774508841292587u, 6774862673338531100u, 12149081547192871996u, 3652757u}, + {69924881755380130u, 10235375699112349350u, 15219989948476093094u, 9146638334470452563u, 2600159u}, + {13739161660160729510u, 13564009097476545185u, 9052915042588861160u, 6605205534222033064u, 77048u}, + {12532200266438490517u, 2061506157640549119u, 13926233531889605943u, 4108704151504489059u, 1641014u}, + {14672161260403783260u, 13127287311744781542u, 11807164752079487449u, 11199198445266908637u, 1652237u}, + {14147600332457982220u, 3294992728194700427u, 12917768427537995954u, 4425991640600916189u, 3637441u}, + {15964963615280230588u, 6829565252205244670u, 13661120859083593352u, 10011046924870264953u, 2246407u}, + {15952149235838654131u, 7842559315216933693u, 10833932649188139216u, 8760407783614716833u, 2987035u}, + {9180002964279638719u, 17195396358378148195u, 2324573714852862763u, 3153577622575522042u, 3810790u}, + {6177523048675246822u, 6124187616615442314u, 14356338732321080206u, 5402558629808896508u, 3014309u}, + {6371131346160475495u, 8392549837619433730u, 11639339392426731606u, 8486342694522206506u, 2342964u}, + {642048267909093588u, 7942077545702709497u, 7648690274811517360u, 13806220527012493296u, 3419211u}, + {16358707103525231910u, 4393367186943634419u, 12967844748052008595u, 11520230776087774860u, 3075027u}, + {12167809816773379571u, 14353257851428403077u, 8575310112823140853u, 18359353133242673381u, 753073u}, + {17538309621351172457u, 14345642492032344227u, 7503939021489226629u, 734467703638453166u, 1372704u}, + {8496333684609207476u, 1906284868269076848u, 18076754599380605630u, 17319144489214129739u, 1138423u}, + {17320900922159718050u, 5757002707122180395u, 1724241296540890727u, 9460545034016328754u, 1027136u}, + {16000648771077146011u, 17910445707487619786u, 460809445459864961u, 1676271987253781296u, 2529398u}, + {8536975088446141667u, 12315466670582661838u, 12768623446642926760u, 1703983822115167307u, 2165252u}, + {15153350607656583839u, 15249402844720369202u, 3150972097770302525u, 16613188479926496856u, 237530u}, + {13251565751332586078u, 7953599665609162595u, 13315696177143852150u, 9443926490701576325u, 3345055u}, + {14119976792955608501u, 15991361250343845689u, 16278056401582119467u, 10870344488630599394u, 2728849u}, + {17671035053718324079u, 13040636401719532630u, 15649652812216214858u, 2788526963430404292u, 3651201u}, + {17764222050031427187u, 10597827624526649642u, 5443797399757090u, 1004101495690262520u, 2154729u}, + {3558771451651554910u, 7975723449867741673u, 2476559951775784986u, 17261512710480078308u, 2772544u}, + {15827360301741006044u, 1601081064676159618u, 10251029304992179539u, 2933448188379729125u, 476153u}, + {6577550569569075220u, 8625776980594392867u, 9414155154951648789u, 3179317613133206396u, 3125315u}, + {14481076081169082892u, 5194480745635457652u, 8152823296731613272u, 12883903627885215788u, 3899721u}, + {2012070286392624107u, 17766621036621658805u, 4108365212576496482u, 11745267402274099946u, 2361363u}, + {2303857053205532742u, 5804890544384842855u, 3813173584569230881u, 1484711351429953130u, 3625961u}, + {5523820090461880827u, 10038684502303182161u, 16916699292427831964u, 5975609887183054062u, 709894u}, + {13454377786891924499u, 11780862218346766697u, 11399032073518887498u, 15217247580915866351u, 1744969u}, + {213995987533743500u, 1607183251420881507u, 9033117033797306362u, 10624655335352211055u, 2154811u}, + {3206989239157332568u, 9985887721403973360u, 18067398430762342231u, 11352791521623555439u, 1978331u}, + {18041550570438971508u, 13066596055927132784u, 10728411190067253828u, 6521677240416391652u, 2694114u}, + {3545063713301198010u, 16073265057398529521u, 6618320562097658978u, 15902368326329221095u, 1207319u}, + {15980195118152844093u, 6696997517336874422u, 8793537062667216550u, 8308894434872407908u, 1356930u}, + {7856146421289006920u, 14218491309532036873u, 13774309025131231594u, 18111487052264745072u, 2219223u}, + {3090519862025502308u, 6066887580880273634u, 9788938893752338408u, 6021717761982995672u, 319191u}, + {12730956415359231138u, 9662339176614953490u, 8722696569527146228u, 16795307451546558275u, 440488u}, + {5603928757931134586u, 13270572127236992398u, 9569928868221197099u, 11465283038229389448u, 1721884u}, + {6077957463384344185u, 13976141921621703094u, 14834022895845807048u, 680281511279249759u, 1046937u}, + {2418945869272180116u, 11233658817738443221u, 2203462690548169224u, 9602972586624994256u, 733062u}, + {17617996299373776799u, 9408673134083709223u, 17556180429663809595u, 12767716761420378929u, 1626520u}, + {17832048532774873682u, 6742690409337510311u, 5807685281241801466u, 102061604976414757u, 3446811u}, + {15742639843826492825u, 12069069975494249980u, 5377434960244606927u, 14042755683847528082u, 3600098u}, + {9479140069889142212u, 17697993086563248252u, 3711234959625597980u, 7416284692357678765u, 2247411u}, + {13680622439885041480u, 3998749356173390888u, 8569341641074738266u, 14380918636509383613u, 2015241u}, + {7361121732984965216u, 1210249746435548665u, 323981447561243582u, 10917871349081883483u, 2854180u}, + {13439628214889745753u, 389008445118010775u, 2088879101910802410u, 11509807790948713501u, 2771086u}, + {2272599167480654278u, 12490866725876096678u, 9188110663371645406u, 2429018129009669185u, 1132673u}, + {14665293287517867136u, 10852224236527190663u, 17842036809071603261u, 1173815635986065923u, 3030072u}, + {1111099780531244843u, 4458387332580844779u, 8674807852287458241u, 11585110009951198644u, 903583u}, + {9841047741810633896u, 1599587151590014133u, 13448391655570296847u, 6645966827424834819u, 3511980u}, + {8163596066570343722u, 3579724077509322636u, 9392980620242145862u, 5397046561704620562u, 1397424u}, + {3871488358327476056u, 14789924214153456646u, 2989437775017208413u, 1827217779235704458u, 1064798u}, + {9867309322644350561u, 2055676194529176848u, 6960289063008724288u, 8162150184309272330u, 2181882u}, + {3216909409711396910u, 5392901204786085919u, 3842339513115168019u, 6165144120239058288u, 134789u}, + {4263796938250081141u, 2540194343582000853u, 18295984593621613961u, 10955240718117141628u, 1500259u}, + {454569486328350948u, 4070309371025619914u, 5810912041795211126u, 15952403187154593992u, 1265551u}, + {983535716450616254u, 7730190269956401278u, 16819269163144946830u, 8309968625723343023u, 1442368u}, + {11068558785079169896u, 12143303585344100703u, 4954974611349354520u, 10114670166975987964u, 2784235u}, + {8170342743081885149u, 11534758378592899360u, 7739547750707337162u, 4446873316914338976u, 1132388u}, + {17831321149761649684u, 2474802394423244668u, 11984443508911116646u, 1101752786643932168u, 1384596u}, + {13268950150093061238u, 15108472034446317239u, 17953096375347652221u, 8312164603520947376u, 3149093u}, + {3659818523781159201u, 2914977479832427149u, 10109399868050280600u, 15334300456988197268u, 1688469u}, + {15428398917169322099u, 13196183706551013268u, 16522991657443984152u, 1832586621801891149u, 2477808u}, + {9917298202860094781u, 10411331005203505233u, 8714774603572000351u, 10349943439296071586u, 3110850u}, + {3909478710077964139u, 8815347168487407860u, 17352947823668116066u, 10145448229461553837u, 713804u}, + {7021634559896113728u, 18310335612081645436u, 4487375290588758503u, 11542382415920708162u, 3079388u}, + {11029821181964800892u, 17327344435018898944u, 12034640527377905585u, 16630051322605460004u, 3013454u}, + {14723875912702053734u, 9673492402937024392u, 14036158346889353299u, 4595216855735407633u, 356664u}, + {8215961563278230072u, 12432755230130514521u, 4666595662337762303u, 15066616448050461023u, 2356411u}, + {10439047768149609830u, 12500802984381426744u, 5229120664887186636u, 6096306024902037070u, 3383163u}, + {5760447571323732260u, 3167436646691751155u, 12467757313823452225u, 1287387446761724364u, 1647642u}, + {5080269682192627368u, 13023607941186749708u, 14857262918584434030u, 13288990934565222623u, 1040847u}, + {8151140063894489951u, 13340427626115645947u, 4354932720051715214u, 9819033040676078596u, 103777u}, + {544838226512022143u, 1232162495488433922u, 15018088856429886202u, 8144422483864627164u, 1785840u}, + {16185538090521888642u, 11624515834019339405u, 9639246592103993316u, 7310759939411737485u, 1664064u}, + {17519528921440480741u, 18111682222132666318u, 13135279149831527755u, 14153985001474908806u, 171038u}, + {14442988638453471290u, 17201027698444372785u, 14097116462331792525u, 4975129096983891719u, 10u}, + {1462919219229221293u, 3677819413982684741u, 1464816835446211618u, 189442569834u, 0u}, + {3161361182046447076u, 6525782205146886205u, 8163972464006936858u, 189u, 0u}, + {2632607105816988014u, 2069582319625233006u, 3494598602395u, 0u, 0u}, + {6252585260287248785u, 11042265184544176451u, 3494u, 0u, 0u}, + {13235958634800585806u, 64463966058725u, 0u, 0u, 0u}, + {17820638073485114090u, 64463u, 0u, 0u, 0u}, + {1189150283861613u, 0u, 0u, 0u, 0u}, + {1189151u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1702406u}, + {17731522780413012370u, 14609141285604431650u, 17125737607990494281u, 13362058744808215742u, 1507973u}, + {14130204244199096390u, 17287772807972176214u, 8988178096182564740u, 13718760072569430598u, 1826446u}, + {18173259264137316436u, 17234359211720969528u, 5170019791507053617u, 1474843876403769308u, 3580723u}, + {3122311710502265067u, 16952890471109318351u, 3594674152580572813u, 8857079154881897555u, 1659984u}, + {7446542967975060938u, 11120590111657943506u, 3903915792932007793u, 3705558604805856567u, 759177u}, + {6728729155143889736u, 14381114470848775533u, 1347287453671066756u, 3472768861351746129u, 3617816u}, + {4081566980400481896u, 11467627211158595330u, 9978522434297535328u, 18225250626888380328u, 2496616u}, + {12194826739845897794u, 12266684009629245474u, 14862759086598472764u, 13592882133758031040u, 869629u}, + {14836013855558580393u, 17873109891373738504u, 7753194292945970489u, 7437974023101535505u, 2654702u}, + {2172675978581598555u, 1637382477576431308u, 3608809175724412070u, 1706295278696281445u, 236039u}, + {9841878307524128866u, 1454340824793297610u, 10148853842164563758u, 13983527396088729191u, 3684403u}, + {11853946410389078523u, 11402064997930152060u, 3530235308631593931u, 716483599530286513u, 2565483u}, + {15197465446023509342u, 5617442859757386858u, 2559615627282458584u, 9703042410125279625u, 714845u}, + {18210325488663502958u, 14228838935753653293u, 10149751754829902095u, 1958741611494467586u, 1432058u}, + {689428575880914050u, 16548159421500156626u, 10377645956206394480u, 7304233807214171500u, 1282398u}, + {8027006864223781075u, 17843350501310861245u, 14525458231787504584u, 18038054584492854788u, 1420406u}, + {1956758547937020117u, 4198721137875844108u, 15966226719565047601u, 314432260152527817u, 2198516u}, + {15023973070243320198u, 14383833366429418757u, 13523855466639598192u, 4147838322470280240u, 513088u}, + {3779909744041594949u, 18151636027881231369u, 16414474556774170802u, 2603538192536535504u, 834101u}, + {8576771620721421784u, 11481370149944494945u, 4593104998471296303u, 4122669310444055755u, 1219985u}, + {12214076862565966111u, 8832200410091093230u, 14246448399536263381u, 3409211674974046849u, 219444u}, + {7594873080142827932u, 12888220429905763652u, 15105454952097499531u, 12686184581391039529u, 1421854u}, + {16822123761680826275u, 6472737808563340235u, 3587072572877881521u, 10546637319071843458u, 2429151u}, + {17626128044393015484u, 4194116394909319815u, 1649166114277471135u, 4512380767711564982u, 2834282u}, + {5214127902133370844u, 858080538996252998u, 1565477292760840657u, 6249236366460904919u, 262133u}, + {10341686384882315293u, 7991782714349964280u, 6542356325883611010u, 7210594910406303672u, 1170423u}, + {10023921632898020469u, 5440144982501929234u, 17291189118461098190u, 9461135319718137880u, 2412821u}, + {3595218225704184645u, 8474243235314173806u, 13979064720007078995u, 3142985244574708521u, 1907742u}, + {928556231897241803u, 1311402711846901829u, 18330891027080882352u, 755767571954931411u, 3193912u}, + {3532850863253507599u, 13151576673872109601u, 6934005733118842475u, 2364760287227411345u, 1910631u}, + {16974046364103160834u, 1525817487034306407u, 9980445623634402271u, 3421951843223669033u, 2250039u}, + {8881578512546322583u, 3411843063525821546u, 593654179224978615u, 2059118530072799417u, 2434918u}, + {10436006878394907980u, 1903834871467871759u, 1374778743734318930u, 17122566098234508076u, 3382664u}, + {17474900228138078094u, 4828777081364995844u, 17378550310682438725u, 12456305328741521736u, 686562u}, + {4073716481143995880u, 10219835143692734942u, 16936065103750158599u, 15649162752191401617u, 3143043u}, + {4832822011788384191u, 679251167143564818u, 7954404019124414886u, 850612459900034338u, 342967u}, + {10859582635080148690u, 5280104639167732064u, 12712002021752497256u, 14634018215024711411u, 3271285u}, + {13672976413420884026u, 17967652473030948674u, 10751831835070625719u, 8995486232524247229u, 224774u}, + {14283341730742857237u, 10199365801057194824u, 5149999154545884832u, 5048177940102865743u, 50508u}, + {2445785779424347339u, 10086590535036384460u, 2506666648115368744u, 12322780293683529918u, 2005661u}, + {8731206045225195331u, 14271667557595471678u, 12677120772787877314u, 3711935223422725402u, 295893u}, + {11747855863696569362u, 5415542639997683943u, 14370723661276258562u, 13191997975096949651u, 2754928u}, + {3607693926465865309u, 1180586940659959221u, 13121414397249763989u, 11147688946790396626u, 994139u}, + {3069159044648528216u, 8811419146467096231u, 13362364863200789276u, 2324181648068076438u, 1435378u}, + {6184725905829376123u, 11409374896561319266u, 15634487888571479287u, 17320300622041919356u, 3069643u}, + {17333584937966681106u, 5190707024196920510u, 3562295847551055547u, 5172714112831838087u, 3590126u}, + {12771124214822798763u, 6528996238219968451u, 9901874702253266491u, 15486551264803662994u, 2863046u}, + {17534891772319021801u, 1874553914994967993u, 13275113236252129299u, 15905484580663955021u, 382591u}, + {4900917867403009039u, 2640757134316362658u, 13397355145575590383u, 5699607503163696135u, 2938496u}, + {17429195149086672622u, 18232848895280561786u, 13818560610498822267u, 6683504340862596837u, 2990552u}, + {11623635128867316871u, 8390032477904588087u, 15992014990372034827u, 5603600694987075659u, 1549902u}, + {7375086045318984551u, 14791098999860099239u, 8408344927440607128u, 6297601332436661708u, 351215u}, + {8900804437490745308u, 7080714400744461367u, 11205938594703177704u, 10094541944827360272u, 599552u}, + {7716820093129015736u, 7929240123148586256u, 16931091412653417019u, 18241631083993190461u, 2040443u}, + {11605088430621840905u, 17333796726779905582u, 11459050086456851762u, 758215488438902582u, 2438986u}, + {14941785640813085282u, 14162448857294309452u, 16539423760160077807u, 5737541280295882996u, 3115438u}, + {16369385919522495669u, 5180898524191121628u, 6702270372022550411u, 3948579771249159362u, 2304228u}, + {11012912167824827128u, 5866348165523692927u, 17527945146707122636u, 12364354088637732439u, 2810057u}, + {5816054746952215966u, 6541345540842962968u, 2271431566456081689u, 13958952063995981778u, 3216172u}, + {9915591131551169529u, 13233719458613214778u, 662528281801883920u, 7553317695684488004u, 2247040u}, + {16949443302278752094u, 789310809427905747u, 10103367396512728009u, 7967785923528778966u, 3757486u}, + {16212700291938988453u, 2505006621255487276u, 14613074252224778366u, 10661779714145739123u, 2895528u}, + {467604834636708935u, 4512440730034917914u, 13232077743355871487u, 485758638863607400u, 1185119u}, + {14374808496074424868u, 11214756189814738893u, 17804976400381028240u, 13064286108240605644u, 2182687u}, + {3631498898917617907u, 1073807414986182820u, 6063035941197656318u, 8831289954173507180u, 1661198u}, + {17778163900695359974u, 9012036656193712712u, 16581836324270895926u, 11920146719451157553u, 489486u}, + {9403555275952404329u, 15226001412565495693u, 617355890777844654u, 2603102820255216209u, 1769166u}, + {6659488546903726219u, 16453648912741473743u, 15670296308040729748u, 13507405440121535284u, 1053157u}, + {4227489912432832549u, 8786466158797930924u, 6876706324889282631u, 12485391099717374098u, 716693u}, + {3264192614990143886u, 3223753132235155915u, 7262482890441739764u, 14352681878383469483u, 1063055u}, + {11187379670834603613u, 15134305999294223403u, 14326043298978598784u, 15367877447952609553u, 1928411u}, + {12082354900745711167u, 2746034874273831777u, 1733472449353033308u, 1260552018198578670u, 3324066u}, + {15171638325895013752u, 2515474099009629310u, 11078548656975712183u, 6186213689270545992u, 1040767u}, + {9604899086833688928u, 17230402794619973816u, 3270155126034659620u, 5639691103633955166u, 997542u}, + {3242994138586880107u, 13535280551079546647u, 3174371764682590697u, 11475558859647009301u, 2356352u}, + {16615547727798814256u, 6916415319002912192u, 303894118461624721u, 17481404790945693021u, 1234983u}, + {3787128971160136208u, 15507475020968547397u, 2381023618880450959u, 1535990907614273490u, 1562076u}, + {11757598229933860882u, 1000799615006992862u, 3032429011873675945u, 3055234167324648141u, 3042805u}, + {13648497990761456667u, 11270884647898496042u, 9768861096272495518u, 9351559479049141703u, 841317u}, + {10076104708177745340u, 7501647366721780153u, 16344921602551344558u, 16949054167648485537u, 2812112u}, + {9706567998105756251u, 17271269993128204330u, 4841505330770198092u, 15616314639512095858u, 1335070u}, + {14106833392024372323u, 7924104043280187045u, 10847957939695438018u, 12418533884750407042u, 3095468u}, + {12406405942222456935u, 18144204529210479268u, 1329702751338707872u, 5029075307019919027u, 226735u}, + {2863825522810935935u, 10333527808736959806u, 3792148591637908705u, 7137884337301493506u, 1217156u}, + {505912990238266055u, 3996552360036490877u, 5685611226898617835u, 12416358746891269352u, 3333201u}, + {640449648755703488u, 1749513616989575753u, 872017590591013534u, 15193581466174458058u, 2756121u}, + {10730389143220352628u, 5450227745209420893u, 5237023154020065368u, 1419935760637388693u, 3607868u}, + {6640612363954814577u, 12685439703906359208u, 3820383071343984505u, 1075359735598653197u, 1658644u}, + {412600987668420520u, 389715538740290094u, 2383723340285615453u, 6587837639904195817u, 3304144u}, + {11730888097457108490u, 12755543321517767253u, 11416551946403637561u, 6618191762789962788u, 3842035u}, + {9468686388244539631u, 9412560547111455057u, 17209730293754152391u, 13401527940002094599u, 1553701u}, + {9672055024780142898u, 14146310549299491808u, 1059311951041291884u, 5865325855187757360u, 212742u}, + {10371005681264484524u, 1600402562706227533u, 11393602553691308930u, 4399437639406659068u, 1936916u}, + {8251415998120844788u, 11294434370725151036u, 5248381378270155513u, 10412023339605333633u, 1429379u}, + {2344235783183863871u, 1977901692752899447u, 14474423999459493299u, 15014346958898368912u, 1051012u}, + {18078311960589325321u, 3542670693362587159u, 2977383902757638876u, 16376461611006386054u, 3833724u}, + {17191445057586568182u, 7178445018237617380u, 1215345990505938802u, 13113144262718656104u, 288484u}, + {4228703958532512106u, 2971319823495333059u, 129980334751233771u, 2743510177071765857u, 384380u}, + {4910140820305306379u, 12519177333969955653u, 9627797291911887708u, 11680420796374888286u, 3026174u}, + {15602922088361484566u, 11018373580812057286u, 495949394019193230u, 10215943828328773701u, 1077678u}, + {9283713381464649948u, 8255346206720325022u, 9134852550454674788u, 4991853649092838574u, 3485701u}, + {770820637768640607u, 1916635680766676393u, 16053858082577063587u, 12602321201855787970u, 1196896u}, + {4896469086264169519u, 15915180858308711905u, 6396812617988323786u, 4129361706959060221u, 1017187u}, + {11648849731001271436u, 6391523714962785149u, 11781647916875226324u, 5351025751200133368u, 3216300u}, + {6928474248865370487u, 1126760559913964689u, 1156134348910324738u, 5031304256932325366u, 3709096u}, + {6857322717282479534u, 590664192964618191u, 18318068848473013135u, 10588829479225602715u, 2067621u}, + {910121905744398349u, 11328454537665678549u, 874896826378727963u, 254313668131040704u, 2789912u}, + {14656434993630497885u, 430500882701907124u, 12896828908665105884u, 4663150811333872734u, 2937602u}, + {14063276834186931883u, 2263646820445347183u, 10701649220443612774u, 14898053568760722953u, 3743520u}, + {3107786721661899662u, 420953632114542513u, 7862948154825551429u, 9724773371355210173u, 2145487u}, + {14916849231443222632u, 14562598914795563145u, 2272033178902304660u, 15964305541709318112u, 2424555u}, + {7824113778268872913u, 8424180367440570354u, 11578080325817806951u, 6529908624955452643u, 2865920u}, + {5822450949356791552u, 4536193815087812280u, 2264879498372164120u, 9708584500387977727u, 527285u}, + {9917671924289080169u, 16871353617549323817u, 5752069033544541037u, 11899229717415599881u, 3500832u}, + {16199115622955991445u, 17809042453795775247u, 7720781306909180572u, 15124616117775221098u, 645608u}, + {2074134487673867952u, 3948713522215194930u, 17984166627955708639u, 6641208032161925705u, 2416040u}, + {10734785243574475411u, 3994682259630972063u, 4579336811432973408u, 4872426878734224969u, 1606070u}, + {10262347552884502285u, 1247207097206883854u, 5499603244010882833u, 17035218960077882474u, 2356086u}, + {889117985178495647u, 10185960646098849160u, 13034791263666858647u, 259634914606652810u, 1929224u}, + {5259845133763765894u, 6111217261125923647u, 11316686320600774095u, 18338216787282188894u, 1416310u}, + {3147283700677474136u, 17025868103831524674u, 6114096854346787603u, 7303943324267973898u, 2947456u}, + {10033353556628969921u, 3389823643346942840u, 8040249418284083966u, 8845397446431671176u, 277719u}, + {315224908740674090u, 13149821394464940774u, 7321790907796201994u, 3247714751869561109u, 3481789u}, + {4013619074720999244u, 1753896554088014103u, 16253096622690911868u, 9359657304742075601u, 1067032u}, + {14973637570873457987u, 14406015702860438425u, 405815712961528119u, 1244662374226890667u, 830428u}, + {11997935188059556527u, 12722334953450253271u, 13950577377801931855u, 16588565322755730129u, 2146486u}, + {5121226256427209354u, 4226406135387860371u, 6746924421259676814u, 1696920357360708371u, 1010723u}, + {4692368005396579450u, 14663262229162182387u, 9199146654032716349u, 11403744408199946184u, 3516691u}, + {14532038972923314001u, 5835844971047163844u, 18114127889036589551u, 17574866861483550572u, 1035272u}, + {5322785954695017936u, 11573301571202115768u, 7455253922900108314u, 5207244185936355688u, 49929u}, + {10747023370243948006u, 9243418973763204939u, 2563930527560502673u, 289151408843812174u, 3469762u}, + {8795234241037676933u, 2594891120326868140u, 1439723478141885622u, 13466718302954430106u, 1908035u}, + {16567887637004318012u, 10305935411656608681u, 5018707266640992019u, 15743752547063688755u, 1059665u}, + {16574003054032055378u, 8573905335259786313u, 1417768700755711390u, 1820987235750818379u, 2482827u}, + {17286063313270239172u, 780813164536584729u, 12191763267947034495u, 12079418280403248612u, 3600255u}, + {8346528229136688111u, 6952813351743532218u, 2887112692314944198u, 17792581127994783718u, 685318u}, + {1899839809698281427u, 2415333554935545905u, 9023365172477564500u, 16441773344195257018u, 2376338u}, + {978248567449712167u, 3868904185095415720u, 12236080010216471899u, 18130291818880316088u, 3242922u}, + {3355107537482132656u, 16214402839549476432u, 7857907897136490336u, 11589036416383763905u, 2125897u}, + {2011115693154329242u, 9617889764668505624u, 656029997513282366u, 11496373341505645155u, 2081668u}, + {1128853818264064933u, 10538467253053302681u, 7360631682204054678u, 8325023322700516796u, 565619u}, + {9922502328658392400u, 15431223065225423538u, 10625455565700256750u, 731009777640530205u, 3396613u}, + {2750063970009119600u, 14259638625597078947u, 16299668751822589556u, 11087468339262418806u, 2374663u}, + {16561431989956368273u, 173756906452656901u, 4270867938824430754u, 10564213541247254340u, 1954079u}, + {12773949498926231096u, 3840118075620303463u, 2942181970838222878u, 12141722204148917076u, 2975666u}, + {16635010085345201321u, 8752009583609582457u, 14165131774254263161u, 1207812865899408186u, 2991816u}, + {13396737330582970552u, 7371979942786739643u, 14332803650202636671u, 11728519499419767913u, 2852353u}, + {13759529627509784286u, 8631047959016913512u, 1850584039081956477u, 2574632428854874920u, 1524408u}, + {8112498644744882371u, 13559191525743183385u, 271503755919971499u, 13935236016134639507u, 438772u}, + {9824213360850829865u, 6755877326743537008u, 9523962820165277056u, 7141795738480811367u, 2062501u}, + {1899880947415250931u, 9361862524270529785u, 7348500005364471677u, 10270224788626332674u, 962198u}, + {6373877084397972839u, 16257358117759915570u, 14243554606208583349u, 5998529735672478659u, 222941u}, + {3918497854667757758u, 4754803050992029396u, 15113441691302247173u, 292342917720778360u, 2782258u}, + {3606380750266132138u, 16366404786365993099u, 7024654598252848141u, 988072324058437075u, 3587370u}, + {7618388630392159355u, 18157537161739726548u, 4411114484904878178u, 6839589136841001742u, 2645800u}, + {3013374305246150086u, 16050107130659800098u, 9345388804704693217u, 16405880248919451340u, 1941902u}, + {15692792797364167689u, 3650388735459276595u, 11467694647419203146u, 9331251416508808718u, 1035734u}, + {7304165475761429593u, 4337938885674609065u, 4468813451393519902u, 10251284282743457817u, 640263u}, + {8658051225261398773u, 4522313429296099530u, 7190039554130593614u, 9739585973072421141u, 614492u}, + {4064922356024887322u, 10214475423448910906u, 15938728685794528232u, 13918451035719019550u, 3511606u}, + {9458929473362875213u, 7208607000996439419u, 7951927376714486297u, 4316175759325902163u, 515962u}, + {2532196577287431609u, 890837126438704456u, 18387654640941089240u, 6422643692657521390u, 2829859u}, + {8731246111639734226u, 16100690557506917530u, 12618007090480018626u, 13022568617987355810u, 3834057u}, + {1770436933423594933u, 10014083953149027190u, 6042082021162943296u, 3169202424896484488u, 1136043u}, + {1549500346478942750u, 10872225263886280062u, 792840623608260780u, 12054574501980896957u, 2459507u}, + {9535900576530342563u, 564571541472237766u, 2717394832465150500u, 5161459084923955116u, 356624u}, + {9195291785372377199u, 14327632239474964555u, 1096834181968127916u, 8221144277143786384u, 2409611u}, + {15254265163530351198u, 16027049176353104152u, 9643363079803251370u, 16545638520340836967u, 1795094u}, + {10349439672137097121u, 5645384498118956295u, 3493976978270630033u, 2050726289213872302u, 1505133u}, + {7165204302636415045u, 3426920144979153585u, 14136057824577996397u, 13358419702315289127u, 2970808u}, + {255672193621467942u, 16366911996713160911u, 17201862889253429661u, 2865047915705738131u, 671173u}, + {9448769685447356556u, 6730428238320655929u, 10929764115381100873u, 17594433904679648160u, 498266u}, + {14402774931216210043u, 4978088703626264990u, 2308536539926124841u, 12258982389424813988u, 2994154u}, + {6489833127234020254u, 272231021932582163u, 4317771317291387249u, 2649305790179661834u, 1939218u}, + {8416367185575152666u, 7800987892235784281u, 8215038367118212607u, 9619432267842852167u, 1987737u}, + {9747051073416229121u, 11014173676743397875u, 15557710191852876276u, 4864526085885447182u, 3293884u}, + {18419165223388971004u, 2714576604467134428u, 11078445369033137152u, 15192856187985879358u, 306351u}, + {6052373133441430662u, 568837379775122588u, 15366000838957010498u, 6707007439213879230u, 380743u}, + {7194377104668901287u, 6765121770418513888u, 457662223201720770u, 6131918968609738395u, 712915u}, + {13209402942781538338u, 3345710513583441180u, 11069135448219784636u, 2463109163972777437u, 2555073u}, + {8110159670833185610u, 18245973056921810u, 2747188843177680275u, 7469064966090331857u, 884401u}, + {17402387163216378988u, 4947583574493806271u, 4594601993425824341u, 9599974333419013255u, 1951179u}, + {6036604615782772719u, 12857399901170698077u, 11650382839599370343u, 17329815478357675502u, 3394447u}, + {18300309933026050259u, 2200076899377281283u, 13133193655191410770u, 1503768393169145364u, 1488689u}, + {16109706365742183660u, 9237025913189842895u, 15768586531279627812u, 9971409443726170159u, 2833298u}, + {9985953055827261481u, 1308181191671395944u, 16614608432116173358u, 9996213110296017736u, 729967u}, + {15236651272295486829u, 1319618939831502240u, 10339296915735951929u, 806099058844673946u, 2223392u}, + {17534702234489191493u, 5883172440807863844u, 4266278456725496276u, 13227554052946444574u, 2317144u}, + {7588522498668173611u, 4199023578731498589u, 3987250417249376820u, 5230890546308297090u, 1312796u}, + {2522038211710049816u, 10949346003742034979u, 15339859065395246202u, 14291620436573611478u, 3284542u}, + {15461009623607367743u, 6611457008464112384u, 12129312549230600047u, 2870835287444160058u, 321418u}, + {7044245483528553388u, 2525698376798601627u, 1945606628249796913u, 7644034086477880080u, 1631011u}, + {973570662764465836u, 11124644912939081656u, 17868325312148774929u, 6875558283745593095u, 3856482u}, + {12673007479367737427u, 4366791500894786573u, 14402627623937593024u, 8141590075602354674u, 964653u}, + {6178253432553105793u, 14113806366624922478u, 12864462744656451818u, 12627873671789915015u, 173669u}, + {9638564533348776556u, 10472550916654822583u, 16777574197482876644u, 15063240794151349359u, 185570u}, + {13537082476789060557u, 13683438889763626300u, 11893178159410744717u, 8650334461912351395u, 676933u}, + {17141601157348180320u, 14358825420121313649u, 15060385311221019903u, 805120752873590185u, 774414u}, + {12896657462445645085u, 7673765250345046034u, 10675927875880783747u, 5634777752628597469u, 3331874u}, + {16503991181793927583u, 11067902475062000916u, 3866545537318513316u, 17931745554004752819u, 265358u}, + {7830104304653719819u, 14315781471289534114u, 3734937124234785739u, 17875178330451785101u, 2053952u}, + {16248268243278164011u, 3514714738843736407u, 7610601485083951831u, 12936198077547962755u, 2307991u}, + {9253228458874480362u, 9750189044148955405u, 5381398761520593692u, 546978090503118611u, 2745269u}, + {8623083948079219405u, 1677191483948523432u, 10301091981978890922u, 10210762034551305613u, 571338u}, + {13540477580573602141u, 18257843107285484082u, 6502252633387635217u, 7576586710058780382u, 948693u}, + {16780004648924323083u, 4716086067299920945u, 13097525320850260954u, 10465851440051657165u, 159269u}, + {78174975427888368u, 449644150772727405u, 11584294620446618146u, 17368818168088359662u, 980694u}, + {3480329440250413097u, 14269707655187669949u, 1860560127762229941u, 17383970791742073259u, 2163007u}, + {18050101835628840877u, 11674477211620304325u, 15759838760372591962u, 12866152192693785675u, 750476u}, + {181630589356333781u, 8986254242898369028u, 2810451698414753462u, 8444582354009181954u, 718503u}, + {17942102620585742474u, 17510783847831429331u, 17965889146295289837u, 4264652097639523111u, 3255069u}, + {17856178276299941699u, 8680257057049067228u, 2004508360739069194u, 14831852206825144654u, 2978284u}, + {4676091367477397184u, 5654878218290163239u, 926978369605443117u, 3946049735606784729u, 36911u}, + {7429426014341916618u, 1559996824442485874u, 15983788393706364780u, 4324136533992230588u, 3358489u}, + {8370406145977662298u, 10902855336096824695u, 5340310510590744019u, 6186848684605379812u, 3709673u}, + {14546709081867362990u, 14494235845142619462u, 1427065583389303142u, 10516782530114549738u, 2184237u}, + {376605310461165578u, 18181089243277851088u, 140688337856348431u, 8975433732155173724u, 3566174u}, + {14615865050408927799u, 3729484502362069786u, 12540297838532797550u, 8280350028399535522u, 29518u}, + {14691259010606262879u, 16289569097206030292u, 17416246427830024025u, 2954905874826963162u, 2373951u}, + {2323564073066802781u, 2836675258278275971u, 10981678400060499655u, 9339221300388136482u, 1780544u}, + {17428514553886719314u, 7210216711846743370u, 4808984767069417152u, 8823871721446408592u, 2206469u}, + {5401486666892222031u, 12588255321910274542u, 1678884226030499038u, 4868560978314617274u, 2796499u}, + {572992732925564612u, 14521394379385187589u, 12898141616670866602u, 18282157597819713473u, 1195975u}, + {2059702735608654689u, 14592823937507521067u, 15009360695780899055u, 7948397207197785338u, 12237u}, + {13473214602351699358u, 10763533787309022321u, 18094601831777341295u, 5188372511486438582u, 790833u}, + {11615597491136795525u, 12738817041850654545u, 5895112905894550413u, 8301211613506129097u, 702863u}, + {6571254746945187561u, 18153804127407430349u, 1542253049132171933u, 17595018487435507714u, 170348u}, + {6113314984353791851u, 12293730134414205345u, 2475370101426351824u, 8217708103878271466u, 1521369u}, + {11568728881878130216u, 9369915640401201234u, 13111092897089591797u, 10044069884074366634u, 1909156u}, + {7901295118145849991u, 17178779034781816966u, 14745639715482881303u, 611678474476280404u, 593141u}, + {5467747288290791010u, 9618823447584172628u, 11646282894859329454u, 2172669341976140711u, 2244651u}, + {11270495850340602140u, 7483664888650856523u, 13291741077764347060u, 7895684254838610584u, 2968294u}, + {7977759546811033739u, 5383255555311884478u, 11862615756364286276u, 10503106503148762594u, 1304728u}, + {205785354716661212u, 6159407475201145168u, 177144869965699676u, 8454806496442477931u, 456376u}, + {6574862605081543760u, 4104947102693198576u, 14218409934424075093u, 17446356416906750278u, 2189288u}, + {3625554077351781712u, 11243431985111220091u, 13743556426617335125u, 18198898950443839725u, 3697407u}, + {4882527814711244375u, 2785003045389602906u, 10250845309987040761u, 2301990554040007178u, 657136u}, + {10021741701904695347u, 3539753562955360231u, 17538038175595163313u, 4407635258229215849u, 225681u}, + {8888976092689433220u, 7296182266175611075u, 10098971572722216990u, 1085026994625853143u, 1454550u}, + {9073029661143725380u, 12725871537667487356u, 17135290209167804124u, 819465247094648518u, 1546092u}, + {17645719677888565718u, 12048291015550482458u, 3167918222027026641u, 3991688036343911475u, 2839525u}, + {9646841303734211098u, 9386047262507988897u, 16534441599889286246u, 17562375346174076598u, 2290547u}, + {12163104820411561561u, 13906540046504062877u, 9213236489857917694u, 5230399922590989930u, 2872535u}, + {14482646162929726858u, 440979281549902238u, 8158192295180324067u, 2719119902621506821u, 2116146u}, + {16502543999413845621u, 17997849548432812894u, 8033534122955818402u, 8469774508841292587u, 173328u}, + {7507180804879742012u, 2688328185906006768u, 69924881755380129u, 10235375699112349350u, 931406u}, + {7282970250868845694u, 6711236601042666175u, 13739161660160729509u, 13564009097476545185u, 2379472u}, + {14403457421687649714u, 17047184091971966496u, 12532200266438490516u, 2061506157640549119u, 694171u}, + {7350600153610014038u, 1234821302205510440u, 14672161260403783259u, 13127287311744781542u, 2840663u}, + {7953169534978793219u, 17636756009723316339u, 14147600332457982219u, 3294992728194700427u, 3043974u}, + {3350162249072053198u, 14209312903150248220u, 15964963615280230587u, 6829565252205244670u, 3270992u}, + {3548769206772360168u, 1494216887328204868u, 15952149235838654130u, 7842559315216933693u, 2476804u}, + {6800029543333306281u, 8830800273782001339u, 9180002964279638718u, 17195396358378148195u, 3867875u}, + {1243449774945577609u, 272049602057328800u, 6177523048675246821u, 6124187616615442314u, 1836038u}, + {3822843623202171023u, 10219082511977800113u, 6371131346160475494u, 8392549837619433730u, 853386u}, + {9499614855533263245u, 3476716710904716838u, 642048267909093587u, 7942077545702709497u, 3789912u}, + {6085695507484069965u, 16595108071516079991u, 16358707103525231909u, 4393367186943634419u, 747917u}, + {1017091327229255857u, 15632511858132302655u, 12167809816773379570u, 14353257851428403077u, 335087u}, + {3080972226282264771u, 558174030920321151u, 17538309621351172456u, 14345642492032344227u, 1777409u}, + {15101261442601746967u, 15552280071483266280u, 8496333684609207475u, 1906284868269076848u, 3493992u}, + {14928717564979072826u, 11388396214477145487u, 17320900922159718049u, 5757002707122180395u, 2177207u}, + {1952205344999017089u, 4334427057616095941u, 16000648771077146010u, 17910445707487619786u, 3560285u}, + {3743801336250185199u, 17536307717510678515u, 8536975088446141666u, 12315466670582661838u, 2453034u}, + {15105178424901187563u, 24522713279527573u, 15153350607656583838u, 15249402844720369202u, 1478001u}, + {3554480791661198664u, 6502361551134821204u, 13251565751332586077u, 7953599665609162595u, 3612180u}, + {6781636221036145777u, 1452195528662736484u, 14119976792955608500u, 15991361250343845689u, 3809315u}, + {18068805490808571763u, 12224741490039467794u, 17671035053718324078u, 13040636401719532630u, 290636u}, + {7709428916221795067u, 78955286593687196u, 17764222050031427186u, 10597827624526649642u, 2677334u}, + {717906482860313620u, 4218529861087096716u, 3558771451651554909u, 7975723449867741673u, 857278u}, + {16130619514149865097u, 14385236720951379008u, 15827360301741006043u, 1601081064676159618u, 2760557u}, + {12481461374003821753u, 16218187826801828988u, 6577550569569075219u, 8625776980594392867u, 343365u}, + {7073446159908853294u, 15022802066744206320u, 14481076081169082891u, 5194480745635457652u, 2192956u}, + {11489186799093586911u, 17837124557639930253u, 2012070286392624106u, 17766621036621658805u, 2183746u}, + {12094497913055895376u, 14299863671917087782u, 2303857053205532741u, 5804890544384842855u, 1229427u}, + {9066292673605855514u, 14435538936086382511u, 5523820090461880826u, 10038684502303182161u, 1923070u}, + {11511588508642802230u, 2702317455179434531u, 13454377786891924498u, 11780862218346766697u, 1188078u}, + {5394898240308673956u, 4675851507757089990u, 213995987533743499u, 1607183251420881507u, 2273558u}, + {6802837028946989466u, 5009937558617270012u, 3206989239157332567u, 9985887721403973360u, 1310341u}, + {9500404877221701409u, 9845927942534635977u, 18041550570438971507u, 13066596055927132784u, 239694u}, + {2591926507450280035u, 4602184387102109162u, 3545063713301198009u, 16073265057398529521u, 3669962u}, + {13415657201152343102u, 14793156435225768269u, 15980195118152844092u, 6696997517336874422u, 1254708u}, + {9609162478121279481u, 13494621415946650411u, 7856146421289006919u, 14218491309532036873u, 761634u}, + {7495477833057861751u, 4829778031735965943u, 3090519862025502307u, 6066887580880273634u, 358956u}, + {10038565670068446614u, 12244852558081322146u, 12730956415359231137u, 9662339176614953490u, 649156u}, + {661993776712738217u, 544217940389512079u, 5603928757931134585u, 13270572127236992398u, 3741921u}, + {10119443715525687305u, 9064669699065226500u, 6077957463384344184u, 13976141921621703094u, 3509114u}, + {12001578101565271055u, 18067738607201358174u, 2418945869272180115u, 11233658817738443221u, 2232692u}, + {5298086093891253301u, 11604750847109466460u, 17617996299373776798u, 9408673134083709223u, 2240729u}, + {5203308154983079367u, 9502334595921165983u, 17832048532774873681u, 6742690409337510311u, 1921844u}, + {5552608672458573414u, 17322066775837921478u, 15742639843826492824u, 12069069975494249980u, 2378877u}, + {7706934092250093474u, 7512905383787659073u, 9479140069889142211u, 17697993086563248252u, 1928886u}, + {12116021053750012910u, 11574141342456387734u, 13680622439885041479u, 3998749356173390888u, 3107770u}, + {14356780799887509921u, 3352319562518957189u, 7361121732984965215u, 1210249746435548665u, 1556940u}, + {2449711191296439580u, 4181185039725790437u, 13439628214889745752u, 389008445118010775u, 1349992u}, + {5653205811795150792u, 5835009599759708718u, 2272599167480654277u, 12490866725876096678u, 2362754u}, + {15284771112512024995u, 15094892264242478347u, 14665293287517867135u, 10852224236527190663u, 3408411u}, + {12953711210866950575u, 14140996564523021867u, 1111099780531244842u, 4458387332580844779u, 776293u}, + {2968990392875715284u, 5380367650397500629u, 9841047741810633895u, 1599587151590014133u, 2650981u}, + {14447186936833412392u, 5856124758796583335u, 8163596066570343721u, 3579724077509322636u, 982148u}, + {4698110781300591093u, 6541418091877181461u, 3871488358327476055u, 14789924214153456646u, 2063429u}, + {4994516855357159197u, 5149567533417634433u, 9867309322644350560u, 2055676194529176848u, 3287260u}, + {5205948640072964987u, 1538227655235093884u, 3216909409711396909u, 5392901204786085919u, 985461u}, + {2260499958255772682u, 5208128820405259371u, 4263796938250081140u, 2540194343582000853u, 1901913u}, + {11535184912773312120u, 6724297839150600931u, 454569486328350947u, 4070309371025619914u, 1085704u}, + {8030879529180139774u, 17698857643219722735u, 983535716450616253u, 7730190269956401278u, 2039806u}, + {11745346829101057241u, 2530875540397265142u, 11068558785079169895u, 12143303585344100703u, 300504u}, + {12149369026384645553u, 10605582274737338876u, 8170342743081885148u, 11534758378592899360u, 1346806u}, + {11245437357150639054u, 16481436161056486988u, 17831321149761649683u, 2474802394423244668u, 2625660u}, + {4317509972758251750u, 18372848849955180969u, 13268950150093061237u, 15108472034446317239u, 1771245u}, + {15865223056367772663u, 17977314687755317137u, 3659818523781159200u, 2914977479832427149u, 522802u}, + {495440325460416833u, 774794554751064867u, 15428398917169322098u, 13196183706551013268u, 1899384u}, + {2573865106855305724u, 8564939304218363003u, 9917298202860094780u, 10411331005203505233u, 1318427u}, + {6659483485666159854u, 9684559462941409086u, 3909478710077964138u, 8815347168487407860u, 417782u}, + {13143617388767730620u, 13107822665509393929u, 7021634559896113727u, 18310335612081645436u, 1817223u}, + {9513896924411713304u, 8774101432026705680u, 11029821181964800891u, 17327344435018898944u, 963573u}, + {6195069831779726265u, 700730628284234803u, 14723875912702053733u, 9673492402937024392u, 2106011u}, + {1432757493148702210u, 991202976743806255u, 8215961563278230071u, 12432755230130514521u, 1888637u}, + {14398907120583286874u, 2672407097683990735u, 10439047768149609829u, 12500802984381426744u, 3738334u}, + {13255072642647251440u, 13753568403864082221u, 5760447571323732259u, 3167436646691751155u, 2886201u}, + {9519304698228840955u, 16535059945336287172u, 5080269682192627367u, 13023607941186749708u, 529780u}, + {3860165157874931406u, 6580233556968575549u, 8151140063894489950u, 13340427626115645947u, 389412u}, + {10109936082360828046u, 4274003137727763234u, 544838226512022142u, 1232162495488433922u, 1260016u}, + {3545860346459150742u, 16644190781563067245u, 16185538090521888641u, 11624515834019339405u, 1367510u}, + {6646246435132254446u, 8122316908716031359u, 17519528921440480740u, 18111682222132666318u, 2782079u}, + {9519202312190405660u, 13382147183439826058u, 14442988638453471289u, 17201027698444372785u, 156239u}, + {14598055724272538209u, 13767097182890504597u, 1462919219229221292u, 3677819413982684741u, 2200862u}, + {15580520667194191770u, 11543747773751716801u, 3161361182046447075u, 6525782205146886205u, 2817282u}, + {15614673634237509230u, 8844973009537083642u, 2632607105816988013u, 2069582319625233006u, 946145u}, + {9156323782465201778u, 532425228651215193u, 6252585260287248784u, 11042265184544176451u, 3494u}, + {15940411104607311067u, 11331297420676871184u, 13235958634800585805u, 64463966058725u, 0u}, + {1384163706149272254u, 5077197087390095712u, 17820638073485114089u, 64463u, 0u}, + {7369504954213268230u, 5735762299063140120u, 1189150283861612u, 0u, 0u}, + {10664157056136701547u, 5236322514650402440u, 1189150u, 0u, 0u}, + {17608687102881958240u, 21935950951574227u, 0u, 0u, 0u}, + {17553446250215684705u, 21935950u, 0u, 0u, 0u}, + {404646873217135289u, 0u, 0u, 0u, 0u}, + {404646874u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 2900636u}, + {6430569221252150499u, 14847526345659691341u, 17731522780413012369u, 14609141285604431650u, 3578291u}, + {10989699088738303583u, 10536050937723468121u, 14130204244199096389u, 17287772807972176214u, 682734u}, + {4634338502012393807u, 17704427124895698369u, 18173259264137316435u, 17234359211720969528u, 1049283u}, + {16323038040454739586u, 694699437346173010u, 3122311710502265066u, 16952890471109318351u, 1285897u}, + {3790371207499509859u, 16960052974805342595u, 7446542967975060937u, 11120590111657943506u, 2258027u}, + {2087944814683346929u, 1907835061468465587u, 6728729155143889735u, 14381114470848775533u, 567566u}, + {15365483527922450907u, 16759552455435997677u, 4081566980400481895u, 11467627211158595330u, 915772u}, + {9774674932041772927u, 11686366694067977143u, 12194826739845897793u, 12266684009629245474u, 153228u}, + {3079482180840550413u, 5317527541430438085u, 14836013855558580392u, 17873109891373738504u, 2825181u}, + {13633759015121702613u, 8165938116014653906u, 2172675978581598554u, 1637382477576431308u, 714974u}, + {1744809688441242399u, 16667268326373999526u, 9841878307524128865u, 1454340824793297610u, 919682u}, + {8036039940704152576u, 16912779575080448237u, 11853946410389078522u, 11402064997930152060u, 3740937u}, + {1156637336205604u, 6408062328827108902u, 15197465446023509341u, 5617442859757386858u, 1815654u}, + {2617098426851925859u, 4750112107911765563u, 18210325488663502957u, 14228838935753653293u, 2546269u}, + {17041170559990263452u, 11644177170581043827u, 689428575880914049u, 16548159421500156626u, 2446218u}, + {10349209956620052612u, 14827402010983863592u, 8027006864223781074u, 17843350501310861245u, 1050628u}, + {9612609120057796351u, 7948653373677981356u, 1956758547937020116u, 4198721137875844108u, 2405419u}, + {11469696340779349833u, 10418328292704990702u, 15023973070243320197u, 14383833366429418757u, 3533410u}, + {8343731789152467139u, 4687805946416812376u, 3779909744041594948u, 18151636027881231369u, 1312572u}, + {12930063012978993745u, 15359904368117450805u, 8576771620721421783u, 11481370149944494945u, 2232043u}, + {3942411980433427791u, 4664951210214313413u, 12214076862565966110u, 8832200410091093230u, 3359329u}, + {3477152914785157317u, 2608347738849010389u, 7594873080142827931u, 12888220429905763652u, 3231569u}, + {14750164526149525612u, 8488159105723445647u, 16822123761680826274u, 6472737808563340235u, 801005u}, + {14949187381570993261u, 3861170277203546u, 17626128044393015483u, 4194116394909319815u, 3547889u}, + {6045943591111537651u, 10357900422076796676u, 5214127902133370843u, 858080538996252998u, 3547909u}, + {129284307034442163u, 2725711482808865955u, 10341686384882315292u, 7991782714349964280u, 1942100u}, + {12010511019626525866u, 14153990678487035052u, 10023921632898020468u, 5440144982501929234u, 2358396u}, + {9103299609145341037u, 15224968363145833833u, 3595218225704184644u, 8474243235314173806u, 778783u}, + {4785558414788351285u, 8830330744089100612u, 928556231897241802u, 1311402711846901829u, 2010900u}, + {14179496919790623887u, 12440813781669673248u, 3532850863253507598u, 13151576673872109601u, 683481u}, + {14449549514791159270u, 16718858782521676463u, 16974046364103160833u, 1525817487034306407u, 1362633u}, + {10465692952499538658u, 16788163997494643419u, 8881578512546322582u, 3411843063525821546u, 1644595u}, + {10976993824005683566u, 17666838588130439023u, 10436006878394907979u, 1903834871467871759u, 49780u}, + {1029643234658069100u, 11813298667159482406u, 17474900228138078093u, 4828777081364995844u, 3237123u}, + {7829863780530138847u, 1007987016206255961u, 4073716481143995879u, 10219835143692734942u, 1666029u}, + {13826793202343986739u, 4862384188926115367u, 4832822011788384190u, 679251167143564818u, 1078796u}, + {3869658945040651194u, 15622862151660436495u, 10859582635080148689u, 5280104639167732064u, 1372142u}, + {2917100504369057293u, 6456782226224450586u, 13672976413420884025u, 17967652473030948674u, 2127477u}, + {11419230432623261427u, 5062113475034413396u, 14283341730742857236u, 10199365801057194824u, 3826418u}, + {1525491217739528466u, 12579525213661847523u, 2445785779424347338u, 10086590535036384460u, 231148u}, + {12254247702894704492u, 6571951167838130039u, 8731206045225195330u, 14271667557595471678u, 608404u}, + {12957075525020590314u, 10238002033955276332u, 11747855863696569361u, 5415542639997683943u, 1499746u}, + {14139228866240853764u, 14162698526879552418u, 3607693926465865308u, 1180586940659959221u, 1105489u}, + {12935079537038359839u, 9865289746500882859u, 3069159044648528215u, 8811419146467096231u, 1315952u}, + {9202483454862876639u, 10773518783787658226u, 6184725905829376122u, 11409374896561319266u, 138791u}, + {2188363268575791494u, 17483818030196863776u, 17333584937966681105u, 5190707024196920510u, 2375095u}, + {9525292408054737333u, 4589800542040995816u, 12771124214822798762u, 6528996238219968451u, 57271u}, + {15970022980708274909u, 17287590414994178704u, 17534891772319021800u, 1874553914994967993u, 2530731u}, + {2861870097715763466u, 3075124347980236825u, 4900917867403009038u, 2640757134316362658u, 123469u}, + {10232565830106905279u, 17141180007719019401u, 17429195149086672621u, 18232848895280561786u, 1699571u}, + {4624837985335442360u, 11866867458021554152u, 11623635128867316870u, 8390032477904588087u, 1045833u}, + {15388331317180903328u, 12989797078694174945u, 7375086045318984550u, 14791098999860099239u, 1033796u}, + {11367306974150928289u, 3729410544173786120u, 8900804437490745307u, 7080714400744461367u, 157468u}, + {2869942831041560529u, 3997737556739109451u, 7716820093129015735u, 7929240123148586256u, 2167003u}, + {11258170305201811246u, 13263057711246756676u, 11605088430621840904u, 17333796726779905582u, 2122890u}, + {6408295084189221700u, 1386996975787688057u, 14941785640813085281u, 14162448857294309452u, 3513321u}, + {7098710759178807385u, 9676517948172670479u, 16369385919522495668u, 5180898524191121628u, 1609121u}, + {5529683651114980146u, 13073884382648029729u, 11012912167824827127u, 5866348165523692927u, 3044552u}, + {14492338887289371930u, 3509213992306035425u, 5816054746952215965u, 6541345540842962968u, 2557619u}, + {16467424995822289733u, 6283985142905427405u, 9915591131551169528u, 13233719458613214778u, 3726124u}, + {17819121754353721526u, 6999198672897482770u, 16949443302278752093u, 789310809427905747u, 2984181u}, + {11273743633347082057u, 10870053507244852882u, 16212700291938988452u, 2505006621255487276u, 2432402u}, + {5339988610196613028u, 10592559121568150858u, 467604834636708934u, 4512440730034917914u, 2484401u}, + {687072637091203356u, 4653298452555838064u, 14374808496074424867u, 11214756189814738893u, 3523716u}, + {1871844248469313124u, 4049363796219301628u, 3631498898917617906u, 1073807414986182820u, 262236u}, + {15685618820558883840u, 4047780898953146028u, 17778163900695359973u, 9012036656193712712u, 1184440u}, + {8905706354444217143u, 16816922680195407611u, 9403555275952404328u, 15226001412565495693u, 1329094u}, + {14341548305524609191u, 18418983216435067317u, 6659488546903726218u, 16453648912741473743u, 3659034u}, + {7272405235523133450u, 5674927034931912477u, 4227489912432832548u, 8786466158797930924u, 2885007u}, + {12594065548293591585u, 8143239988085164155u, 3264192614990143885u, 3223753132235155915u, 119872u}, + {13622253974824954070u, 9850674920107402380u, 11187379670834603612u, 15134305999294223403u, 425348u}, + {9603964314975113419u, 1930627906676795275u, 12082354900745711166u, 2746034874273831777u, 3551624u}, + {9579762164285372754u, 16093259435270567007u, 15171638325895013751u, 2515474099009629310u, 468257u}, + {14671733292988835096u, 13986891432511951316u, 9604899086833688927u, 17230402794619973816u, 3280278u}, + {12374233326936537407u, 18310982526121110620u, 3242994138586880106u, 13535280551079546647u, 3845875u}, + {9727963327390568377u, 13769676503809446378u, 16615547727798814255u, 6916415319002912192u, 818155u}, + {8917725914883597467u, 7052194091624861344u, 3787128971160136207u, 15507475020968547397u, 3472205u}, + {18193240956572921031u, 9825847114126157471u, 11757598229933860881u, 1000799615006992862u, 1620881u}, + {6546742387956292447u, 15115974314165395560u, 13648497990761456666u, 11270884647898496042u, 415118u}, + {11051198965622978130u, 13564856545779890017u, 10076104708177745339u, 7501647366721780153u, 2683672u}, + {15577809066055476002u, 13100306156135232507u, 9706567998105756250u, 17271269993128204330u, 3785290u}, + {10325322011877047608u, 14346692719259741038u, 14106833392024372322u, 7924104043280187045u, 3130548u}, + {14570122410823649893u, 7813024941773919598u, 12406405942222456934u, 18144204529210479268u, 1587914u}, + {4111006239342828594u, 12770622011141576097u, 2863825522810935934u, 10333527808736959806u, 1809787u}, + {2859173928189677411u, 3534438641698229780u, 505912990238266054u, 3996552360036490877u, 1091323u}, + {15125617434896974412u, 15009554395676714104u, 640449648755703487u, 1749513616989575753u, 2488688u}, + {17689429834319618633u, 1536246023612962497u, 10730389143220352627u, 5450227745209420893u, 179064u}, + {6202114153454918863u, 5327842102016108405u, 6640612363954814576u, 12685439703906359208u, 1595271u}, + {12102261035544802658u, 2311732690989390039u, 412600987668420519u, 389715538740290094u, 73139u}, + {11551649084422716741u, 7242059038219980462u, 11730888097457108489u, 12755543321517767253u, 2443429u}, + {7092024871059853874u, 12633473327627911102u, 9468686388244539630u, 9412560547111455057u, 1248031u}, + {942517026456937016u, 14054664305610372259u, 9672055024780142897u, 14146310549299491808u, 820496u}, + {8568746435661738021u, 10184572873456153051u, 10371005681264484523u, 1600402562706227533u, 2897514u}, + {2773482940360421300u, 314484438138030631u, 8251415998120844787u, 11294434370725151036u, 1753515u}, + {1943443424556675607u, 16048423902760253599u, 2344235783183863870u, 1977901692752899447u, 642313u}, + {6013653308921272146u, 12786507322355585596u, 18078311960589325320u, 3542670693362587159u, 2425534u}, + {1038232273543120711u, 3769440310651839418u, 17191445057586568181u, 7178445018237617380u, 919320u}, + {4257986562176322896u, 13115343231132429498u, 4228703958532512105u, 2971319823495333059u, 2884713u}, + {623941384535053277u, 10663280195902996040u, 4910140820305306378u, 12519177333969955653u, 3557228u}, + {8754380983131057425u, 11824281685556714017u, 15602922088361484565u, 11018373580812057286u, 2210714u}, + {18213525900083486734u, 13799978355070073785u, 9283713381464649947u, 8255346206720325022u, 2338528u}, + {2873029808274794379u, 16044281958118413068u, 770820637768640606u, 1916635680766676393u, 3388683u}, + {11810464070331075196u, 8710444506623148440u, 4896469086264169518u, 15915180858308711905u, 2735194u}, + {9382660274037532216u, 12922690624502695849u, 11648849731001271435u, 6391523714962785149u, 2488062u}, + {11346579468634274245u, 1229669030227509526u, 6928474248865370486u, 1126760559913964689u, 769970u}, + {6849741054546057907u, 12673544611917774068u, 6857322717282479533u, 590664192964618191u, 835501u}, + {10997328791633570203u, 17879057435664612319u, 910121905744398348u, 11328454537665678549u, 3806249u}, + {8612547501649810168u, 185797026142009641u, 14656434993630497884u, 430500882701907124u, 1618790u}, + {8384387727704243424u, 14194188640040927733u, 14063276834186931882u, 2263646820445347183u, 3288692u}, + {2930256542289714990u, 8029593996691390756u, 3107786721661899661u, 420953632114542513u, 377569u}, + {8652476375020741855u, 12783245616389874588u, 14916849231443222631u, 14562598914795563145u, 3550732u}, + {8639076518273866480u, 11208255417900015944u, 7824113778268872912u, 8424180367440570354u, 3720059u}, + {4323880368750305767u, 15717748999788000832u, 5822450949356791551u, 4536193815087812280u, 535412u}, + {8621087322911565214u, 3090123006635103098u, 9917671924289080168u, 16871353617549323817u, 586375u}, + {14120874462231989000u, 6294590599929425736u, 16199115622955991444u, 17809042453795775247u, 3122688u}, + {1007437951176477792u, 2448885045800908297u, 2074134487673867951u, 3948713522215194930u, 1708409u}, + {826924317110472449u, 6930595504553417957u, 10734785243574475410u, 3994682259630972063u, 1204982u}, + {12952973806261501314u, 9290758184354073041u, 10262347552884502284u, 1247207097206883854u, 1400783u}, + {1922021193949879423u, 6686583106039649643u, 889117985178495646u, 10185960646098849160u, 3164751u}, + {17672339337006844188u, 6831302717527649603u, 5259845133763765893u, 6111217261125923647u, 1099159u}, + {9563478124555239932u, 9610660494729662802u, 3147283700677474135u, 17025868103831524674u, 168957u}, + {13391409774695742757u, 10348968591990082130u, 10033353556628969920u, 3389823643346942840u, 1915746u}, + {6439911588179690476u, 8016688171076857589u, 315224908740674089u, 13149821394464940774u, 1328922u}, + {13857571741014971523u, 7031812241451343180u, 4013619074720999243u, 1753896554088014103u, 3607926u}, + {11911939472891140782u, 15145513783632866593u, 14973637570873457986u, 14406015702860438425u, 2179159u}, + {8537212807548310264u, 13077787682269534358u, 11997935188059556526u, 12722334953450253271u, 2551435u}, + {15322948644504933868u, 12970492783592887008u, 5121226256427209353u, 4226406135387860371u, 1928288u}, + {9558432808574481162u, 7096208206652989351u, 4692368005396579449u, 14663262229162182387u, 3861789u}, + {13655854420971678099u, 13459143394115291034u, 14532038972923314000u, 5835844971047163844u, 2389935u}, + {13625017132128287970u, 1777920523967779147u, 5322785954695017935u, 11573301571202115768u, 1086746u}, + {1171861362221407990u, 4159025038282620409u, 10747023370243948005u, 9243418973763204939u, 44329u}, + {14537776755359958419u, 1774806501353833808u, 8795234241037676932u, 2594891120326868140u, 92128u}, + {12799281654222494167u, 14362810919503526578u, 16567887637004318011u, 10305935411656608681u, 3854839u}, + {12861727312267903608u, 3105179016432197869u, 16574003054032055377u, 8573905335259786313u, 3265466u}, + {7952176755170617404u, 11552562742659605555u, 17286063313270239171u, 780813164536584729u, 1912767u}, + {3876667152387542185u, 6920664745878502264u, 8346528229136688110u, 6952813351743532218u, 2029244u}, + {1416858555707818521u, 8383522444588095174u, 1899839809698281426u, 2415333554935545905u, 2702466u}, + {10921741739725648772u, 14275278579831808527u, 978248567449712166u, 3868904185095415720u, 78289u}, + {2187268216226602159u, 5057995228791710019u, 3355107537482132655u, 16214402839549476432u, 1855598u}, + {3662182278485082410u, 7433621984917802748u, 2011115693154329241u, 9617889764668505624u, 978954u}, + {10334337016023963047u, 11922400928626040965u, 1128853818264064932u, 10538467253053302681u, 590778u}, + {9130358047992991226u, 2440507868436013054u, 9922502328658392399u, 15431223065225423538u, 3485308u}, + {9680171241346109360u, 15938323627438626032u, 2750063970009119599u, 14259638625597078947u, 1606880u}, + {17533433388088345425u, 6584846275407934746u, 16561431989956368272u, 173756906452656901u, 1141968u}, + {16696876392997466757u, 8383227923536395856u, 12773949498926231095u, 3840118075620303463u, 1791140u}, + {12630650671644801643u, 14306873074723063377u, 16635010085345201320u, 8752009583609582457u, 1198333u}, + {17720426725995189346u, 17220121937877004468u, 13396737330582970551u, 7371979942786739643u, 3046297u}, + {10938203593547107199u, 16577389249706924245u, 13759529627509784285u, 8631047959016913512u, 670245u}, + {13201445556087544664u, 3116510964211720419u, 8112498644744882370u, 13559191525743183385u, 2955593u}, + {16875380827147027460u, 17669323350885514666u, 9824213360850829864u, 6755877326743537008u, 3601334u}, + {14741564316972452731u, 8646304330553674331u, 1899880947415250930u, 9361862524270529785u, 2406899u}, + {1139338720518337108u, 17033141196386273577u, 6373877084397972838u, 16257358117759915570u, 3852139u}, + {12040821640587343539u, 7838728859013603849u, 3918497854667757757u, 4754803050992029396u, 505831u}, + {18043614714594419787u, 16381845599683329339u, 3606380750266132137u, 16366404786365993099u, 3853311u}, + {17556753825650004734u, 14022494276052095421u, 7618388630392159354u, 18157537161739726548u, 2890550u}, + {2670685922347000042u, 10105158182893881579u, 3013374305246150085u, 16050107130659800098u, 2575469u}, + {6113986109896112728u, 14930450022846140145u, 15692792797364167688u, 3650388735459276595u, 785138u}, + {9211121947611036953u, 10026472010535438894u, 7304165475761429592u, 4337938885674609065u, 2967602u}, + {11121608382635787824u, 15747563806969767519u, 8658051225261398772u, 4522313429296099530u, 2946572u}, + {15827145257161431669u, 11733385174750353075u, 4064922356024887321u, 10214475423448910906u, 154368u}, + {18134674524849928433u, 1535714053131195640u, 9458929473362875212u, 7208607000996439419u, 1417377u}, + {16286927132031495486u, 11239550031272371529u, 2532196577287431608u, 890837126438704456u, 1726434u}, + {6507842666910591016u, 6741554626689024838u, 8731246111639734225u, 16100690557506917530u, 3802078u}, + {6716533421402249691u, 1958458967520282425u, 1770436933423594932u, 10014083953149027190u, 3447012u}, + {561665160554012616u, 431717343869852331u, 1549500346478942749u, 10872225263886280062u, 3261734u}, + {2460733881848616493u, 2303032555952061277u, 9535900576530342562u, 564571541472237766u, 3265000u}, + {4708139710664691710u, 17260847503740967328u, 9195291785372377198u, 14327632239474964555u, 1640576u}, + {13230548516813970498u, 3559976908979909134u, 15254265163530351197u, 16027049176353104152u, 1349406u}, + {9136646047881840323u, 6387295173910308833u, 10349439672137097120u, 5645384498118956295u, 2179963u}, + {6896741788262690159u, 700532969034678747u, 7165204302636415044u, 3426920144979153585u, 533327u}, + {14597731372549029650u, 1781079553025279630u, 255672193621467941u, 16366911996713160911u, 1575995u}, + {14889293588869580323u, 16660155458388503370u, 9448769685447356555u, 6730428238320655929u, 331479u}, + {5705984855168435789u, 267685202472564673u, 14402774931216210042u, 4978088703626264990u, 3038923u}, + {226322979619118828u, 6962461053721186573u, 6489833127234020253u, 272231021932582163u, 1017401u}, + {2708499369184432342u, 2711514902067787863u, 8416367185575152665u, 7800987892235784281u, 3329551u}, + {4087011459106631190u, 7519575730280904647u, 9747051073416229120u, 11014173676743397875u, 2626242u}, + {2974268145062456425u, 2657686473314334751u, 18419165223388971003u, 2714576604467134428u, 3492986u}, + {3952772436712679303u, 9711367132519042440u, 6052373133441430661u, 568837379775122588u, 3456736u}, + {4788335732978817749u, 10154941568959351046u, 7194377104668901286u, 6765121770418513888u, 1683830u}, + {9066608474558235241u, 13165455533341361608u, 13209402942781538337u, 3345710513583441180u, 989116u}, + {17735847444160261312u, 2471828910036468359u, 8110159670833185609u, 18245973056921810u, 2584043u}, + {12468825632619719746u, 9956209106216565121u, 17402387163216378987u, 4947583574493806271u, 1688545u}, + {2133827299215874680u, 7532440976457949809u, 6036604615782772718u, 12857399901170698077u, 2078907u}, + {15591499492719848616u, 6264029920358317239u, 18300309933026050258u, 2200076899377281283u, 740178u}, + {8130360093907847057u, 5245013551075045727u, 16109706365742183659u, 9237025913189842895u, 604144u}, + {4160383020146790182u, 321446381985841883u, 9985953055827261480u, 1308181191671395944u, 1224186u}, + {16071369442624558019u, 10658192995368683791u, 15236651272295486828u, 1319618939831502240u, 2521167u}, + {16877459482926153233u, 14148575607803190978u, 17534702234489191492u, 5883172440807863844u, 1067024u}, + {7795232838284664616u, 10477572452467848891u, 7588522498668173610u, 4199023578731498589u, 3721486u}, + {10861843046721119664u, 14266472991748785133u, 2522038211710049815u, 10949346003742034979u, 2939052u}, + {4410066602998215483u, 11145625919347900188u, 15461009623607367742u, 6611457008464112384u, 199633u}, + {6705567309567999215u, 696842997788969076u, 7044245483528553387u, 2525698376798601627u, 1505709u}, + {12854699281149546661u, 7560119937746303408u, 973570662764465835u, 11124644912939081656u, 2349241u}, + {13213510521838241568u, 3400229811148055706u, 12673007479367737426u, 4366791500894786573u, 3392226u}, + {11561734935089987293u, 1651545301354279136u, 6178253432553105792u, 14113806366624922478u, 1311872u}, + {1849254524125263294u, 14608638355225551335u, 9638564533348776555u, 10472550916654822583u, 3499458u}, + {14514551825633205339u, 647693441001757561u, 13537082476789060556u, 13683438889763626300u, 1049735u}, + {14594905597229164416u, 7875385732836085798u, 17141601157348180319u, 14358825420121313649u, 1933147u}, + {5059166375999088709u, 13106764650693872588u, 12896657462445645084u, 7673765250345046034u, 2335945u}, + {11096464691548115038u, 3215672374293269274u, 16503991181793927582u, 11067902475062000916u, 2622568u}, + {8461012572038042372u, 13225334985830926925u, 7830104304653719818u, 14315781471289534114u, 3033067u}, + {5674123097420465498u, 17446258985975081434u, 16248268243278164010u, 3514714738843736407u, 1215057u}, + {11458661014920624840u, 924932936277324532u, 9253228458874480361u, 9750189044148955405u, 1076982u}, + {16731518966464751300u, 2111610471831463967u, 8623083948079219404u, 1677191483948523432u, 1478408u}, + {15617149889419474152u, 570512860042883346u, 13540477580573602140u, 18257843107285484082u, 1753287u}, + {13482248041822274300u, 8449245641721888248u, 16780004648924323082u, 4716086067299920945u, 937758u}, + {15656892603067015287u, 10327886526449843505u, 78174975427888367u, 449644150772727405u, 124902u}, + {6238365102580225284u, 9599725452806792326u, 3480329440250413096u, 14269707655187669949u, 62177u}, + {7714904266967313148u, 17002371253461496071u, 18050101835628840876u, 11674477211620304325u, 2770818u}, + {15845159458573396764u, 17975818710780693917u, 181630589356333780u, 8986254242898369028u, 42744u}, + {8476164344987256617u, 6798700506743333158u, 17942102620585742473u, 17510783847831429331u, 1807677u}, + {2162660386313904738u, 3075793161091227404u, 17856178276299941698u, 8680257057049067228u, 1864062u}, + {8386238353960063072u, 56749898585546552u, 4676091367477397183u, 5654878218290163239u, 2536347u}, + {4558950032133847623u, 8032314453029710478u, 7429426014341916617u, 1559996824442485874u, 1201222u}, + {6165732088156463555u, 14709216669570795571u, 8370406145977662297u, 10902855336096824695u, 577849u}, + {8754163372433010577u, 96984896928133133u, 14546709081867362989u, 14494235845142619462u, 1223822u}, + {11622159731154525731u, 12599465862339237864u, 376605310461165577u, 18181089243277851088u, 2957009u}, + {10162541684768744202u, 2734155924872029711u, 14615865050408927798u, 3729484502362069786u, 246810u}, + {6913497594120034687u, 8106556974346854968u, 14691259010606262878u, 16289569097206030292u, 1432723u}, + {3133857885293119679u, 8516666912427350435u, 2323564073066802780u, 2836675258278275971u, 241631u}, + {3079500694730783371u, 12657171694993316974u, 17428514553886719313u, 7210216711846743370u, 2723188u}, + {12934044368488191383u, 11546683405940425525u, 5401486666892222030u, 12588255321910274542u, 2050116u}, + {16003935718229807467u, 14191279415393949379u, 572992732925564611u, 14521394379385187589u, 2016070u}, + {15393237184806171895u, 4312043670479475529u, 2059702735608654688u, 14592823937507521067u, 1461085u}, + {760873772091994673u, 1618493717506905381u, 13473214602351699357u, 10763533787309022321u, 3072655u}, + {18202962032054776421u, 6800498697445057445u, 11615597491136795524u, 12738817041850654545u, 3650943u}, + {13730883351402552098u, 8062947362789934316u, 6571254746945187560u, 18153804127407430349u, 2381945u}, + {15771452270462656435u, 17010544487714944619u, 6113314984353791850u, 12293730134414205345u, 131644u}, + {3526788060508673814u, 12604531742557063646u, 11568728881878130215u, 9369915640401201234u, 1575977u}, + {5887779794048603032u, 7190852067555782516u, 7901295118145849990u, 17178779034781816966u, 1906213u}, + {6663917661980280622u, 8329501376199352958u, 5467747288290791009u, 9618823447584172628u, 3346536u}, + {5787262455710421159u, 14836241687429309415u, 11270495850340602139u, 7483664888650856523u, 2764368u}, + {1771500883337550622u, 3423588709083786977u, 7977759546811033738u, 5383255555311884478u, 1870898u}, + {10486755616672292330u, 8445983337885528563u, 205785354716661211u, 6159407475201145168u, 3779628u}, + {10326908574350285769u, 4624065028078683289u, 6574862605081543759u, 4104947102693198576u, 132669u}, + {3861529129386089440u, 13593380606521949295u, 3625554077351781711u, 11243431985111220091u, 2537817u}, + {9204829355126668023u, 13745228309747938315u, 4882527814711244374u, 2785003045389602906u, 484175u}, + {12028358770102218969u, 803342252032105474u, 10021741701904695346u, 3539753562955360231u, 995583u}, + {5305824355483002537u, 17319232775400141062u, 8888976092689433219u, 7296182266175611075u, 2370878u}, + {10090200299703650942u, 7075410798330706983u, 9073029661143725379u, 12725871537667487356u, 795414u}, + {16885757117577243826u, 7381565348946186257u, 17645719677888565717u, 12048291015550482458u, 1006141u}, + {14168355928573785338u, 10785242019204169575u, 9646841303734211097u, 9386047262507988897u, 3875046u}, + {15153070093650835777u, 4433594244396010270u, 12163104820411561560u, 13906540046504062877u, 468034u}, + {4463680537859921224u, 7989622364386773639u, 14482646162929726857u, 440979281549902238u, 3009129u}, + {16188690366301766810u, 16879237335144742133u, 16502543999413845620u, 17997849548432812894u, 1203312u}, + {15633417666646880384u, 15508631475764094338u, 7507180804879742011u, 2688328185906006768u, 535615u}, + {6422406663313416131u, 14758954743773520100u, 7282970250868845693u, 6711236601042666175u, 2254701u}, + {18006510392990567280u, 7871025545390876595u, 14403457421687649713u, 17047184091971966496u, 533546u}, + {14479775375779917308u, 14237385701918211162u, 7350600153610014037u, 1234821302205510440u, 2965459u}, + {10475995588222139820u, 18317310312991209477u, 7953169534978793218u, 17636756009723316339u, 757145u}, + {13860353514057370924u, 12143494630412848082u, 3350162249072053197u, 14209312903150248220u, 2876659u}, + {8534703775601538701u, 14259005216458091547u, 3548769206772360167u, 1494216887328204868u, 2156142u}, + {5610511898632698895u, 4168772457906205818u, 6800029543333306280u, 8830800273782001339u, 3029088u}, + {6076592330542496524u, 4385754580825990874u, 1243449774945577608u, 272049602057328800u, 3196323u}, + {16930783457578504249u, 10599401307608695983u, 3822843623202171022u, 10219082511977800113u, 973190u}, + {1238151068521622897u, 3932260531924818908u, 9499614855533263244u, 3476716710904716838u, 1185111u}, + {8463528439816965700u, 14857101168996898963u, 6085695507484069964u, 16595108071516079991u, 3690165u}, + {14565651010432109494u, 2046032808643684734u, 1017091327229255856u, 15632511858132302655u, 2914924u}, + {8209236728780958057u, 16523960251018439434u, 3080972226282264770u, 558174030920321151u, 3247042u}, + {17191761206464172258u, 1398409647565601369u, 15101261442601746966u, 15552280071483266280u, 178695u}, + {10891932167565574188u, 1479158926457141021u, 14928717564979072825u, 11388396214477145487u, 594761u}, + {15388516473418265333u, 10345152358338099677u, 1952205344999017088u, 4334427057616095941u, 1426396u}, + {8637075440659534640u, 5434416717418089851u, 3743801336250185198u, 17536307717510678515u, 1329378u}, + {3670834693349174952u, 4314136463284519254u, 15105178424901187562u, 24522713279527573u, 931226u}, + {6885915554720715332u, 9614822760205056150u, 3554480791661198663u, 6502361551134821204u, 598677u}, + {9874489979043886232u, 6646510192747982758u, 6781636221036145776u, 1452195528662736484u, 2548314u}, + {9857475590742586504u, 4589348936462019495u, 18068805490808571762u, 12224741490039467794u, 373924u}, + {9870093772414543881u, 9623670261659877493u, 7709428916221795066u, 78955286593687196u, 2124462u}, + {13738830200416637914u, 10852966161706638797u, 717906482860313619u, 4218529861087096716u, 2481495u}, + {17062041401824430949u, 6150391579164598009u, 16130619514149865096u, 14385236720951379008u, 283473u}, + {11641308566615558697u, 16801455216519421348u, 12481461374003821752u, 16218187826801828988u, 1887731u}, + {4153064628434631790u, 14294616199381746580u, 7073446159908853293u, 15022802066744206320u, 2108709u}, + {8168794777637445655u, 5781886916097344069u, 11489186799093586910u, 17837124557639930253u, 1759662u}, + {13862177525804178514u, 13726473700150888934u, 12094497913055895375u, 14299863671917087782u, 1302133u}, + {8852642190363925920u, 5085522658788059323u, 9066292673605855513u, 14435538936086382511u, 1961672u}, + {11615664964706044742u, 14450399402536893028u, 11511588508642802229u, 2702317455179434531u, 3478418u}, + {8985607463098844377u, 11739709621212115917u, 5394898240308673955u, 4675851507757089990u, 2058009u}, + {3523082803814695559u, 4813657567908991961u, 6802837028946989465u, 5009937558617270012u, 2498823u}, + {7686689655596642837u, 17064071051256200430u, 9500404877221701408u, 9845927942534635977u, 3391165u}, + {15092980463985103220u, 8780216328729203971u, 2591926507450280034u, 4602184387102109162u, 1157367u}, + {11147434217602465261u, 17413397656489151402u, 13415657201152343101u, 14793156435225768269u, 1076142u}, + {7640079039038099388u, 16150097835294411733u, 9609162478121279480u, 13494621415946650411u, 104041u}, + {11613563990023950515u, 9619743736170584724u, 7495477833057861750u, 4829778031735965943u, 3638537u}, + {8765687741433219563u, 755495820997996014u, 10038565670068446613u, 12244852558081322146u, 2158363u}, + {7440059736286523231u, 6680323766752040228u, 661993776712738216u, 544217940389512079u, 3115479u}, + {4439974361083369690u, 8807126871322041950u, 10119443715525687304u, 9064669699065226500u, 2891572u}, + {8198133844758244513u, 13705195494567569364u, 12001578101565271054u, 18067738607201358174u, 188553u}, + {17476693636805795177u, 16536462100751700999u, 5298086093891253300u, 11604750847109466460u, 3403840u}, + {511347434101993076u, 6722799679712243817u, 5203308154983079366u, 9502334595921165983u, 1531121u}, + {17556447702846578317u, 9549511770072845519u, 5552608672458573413u, 17322066775837921478u, 1025416u}, + {469425953895645174u, 10569016961185627296u, 7706934092250093473u, 7512905383787659073u, 2435459u}, + {2729181323927400328u, 15840657164601439167u, 12116021053750012909u, 11574141342456387734u, 2042107u}, + {15983046504355411284u, 17046061506044037391u, 14356780799887509920u, 3352319562518957189u, 99995u}, + {16167848360922940187u, 5198662612490508059u, 2449711191296439579u, 4181185039725790437u, 3816504u}, + {14399520674026269321u, 15528572375980455567u, 5653205811795150791u, 5835009599759708718u, 1889499u}, + {3160597536671885103u, 2199582824455183522u, 15284771112512024994u, 15094892264242478347u, 959959u}, + {6322590580787990669u, 17929756548836554232u, 12953711210866950574u, 14140996564523021867u, 2607814u}, + {14603540417704386243u, 7195241641654043173u, 2968990392875715283u, 5380367650397500629u, 1054909u}, + {14613562117765468784u, 13328127718720555666u, 14447186936833412391u, 5856124758796583335u, 3048485u}, + {3698163458437141961u, 10362936470320162227u, 4698110781300591092u, 6541418091877181461u, 1814865u}, + {18114391948677021508u, 10375841754168705959u, 4994516855357159196u, 5149567533417634433u, 1356238u}, + {7590399695265036230u, 13986606406151850749u, 5205948640072964986u, 1538227655235093884u, 1083229u}, + {3204649793556820283u, 5610631715687360268u, 2260499958255772681u, 5208128820405259371u, 1243666u}, + {14544034243470686531u, 5840311361456636182u, 11535184912773312119u, 6724297839150600931u, 2425745u}, + {2376743859368281953u, 15380919840902673901u, 8030879529180139773u, 17698857643219722735u, 480287u}, + {3811657758536840594u, 15622499702104667828u, 11745346829101057240u, 2530875540397265142u, 711017u}, + {8574224697245656795u, 18307239923191836180u, 12149369026384645552u, 10605582274737338876u, 2835444u}, + {1510742083776900112u, 17592948200907399527u, 11245437357150639053u, 16481436161056486988u, 3806631u}, + {10193801361143938097u, 5754948770089956538u, 4317509972758251749u, 18372848849955180969u, 1895931u}, + {17268734306379986210u, 14732182052008459036u, 15865223056367772662u, 17977314687755317137u, 2939196u}, + {6891222438334204151u, 10279363848186412837u, 495440325460416832u, 774794554751064867u, 3368790u}, + {1716387288918071546u, 11657422583991261606u, 2573865106855305723u, 8564939304218363003u, 1563520u}, + {18341159745394972744u, 8932903916283649015u, 6659483485666159853u, 9684559462941409086u, 3545240u}, + {11828526750214555978u, 17281136180287052212u, 13143617388767730619u, 13107822665509393929u, 2988741u}, + {11679317616377320734u, 6373106210344387749u, 9513896924411713303u, 8774101432026705680u, 2830433u}, + {10565731376834976587u, 16014220472466237184u, 6195069831779726264u, 700730628284234803u, 2951971u}, + {953714978346636316u, 9441000984066470573u, 1432757493148702209u, 991202976743806255u, 340229u}, + {3481652884332777318u, 3510852834310148531u, 14398907120583286873u, 2672407097683990735u, 3394937u}, + {3160905143658190494u, 7883454138642900939u, 13255072642647251439u, 13753568403864082221u, 1836145u}, + {17030514835713379993u, 9934451509034643260u, 9519304698228840954u, 16535059945336287172u, 1246425u}, + {9683879450633451389u, 9694791614994190947u, 3860165157874931405u, 6580233556968575549u, 1225424u}, + {17993852074447963910u, 11828530689171419620u, 10109936082360828045u, 4274003137727763234u, 3845890u}, + {282170343569445052u, 16001259758641985185u, 3545860346459150741u, 16644190781563067245u, 2811681u}, + {4933204227071809605u, 11444105418922216168u, 6646246435132254445u, 8122316908716031359u, 2791402u}, + {5554650081121386554u, 222871747115000924u, 9519202312190405659u, 13382147183439826058u, 222083u}, + {5246229744202445559u, 1992215801680213224u, 14598055724272538208u, 13767097182890504597u, 787820u}, + {10591148382744546084u, 8828295907411065297u, 15580520667194191769u, 11543747773751716801u, 2924447u}, + {4610851664337338331u, 14867282835837674252u, 15614673634237509229u, 8844973009537083642u, 1519079u}, + {9586475021694403378u, 4356082874554730922u, 9156323782465201777u, 532425228651215193u, 989614u}, + {4059495767568683538u, 15383139240984929705u, 15940411104607311066u, 11331297420676871184u, 1797905u}, + {17953831304153345143u, 4725024489606365263u, 1384163706149272253u, 5077197087390095712u, 2342547u}, + {17014149563246897693u, 8027308712332655097u, 7369504954213268229u, 5735762299063140120u, 2611612u}, + {12389317250354770052u, 12003835409098691815u, 10664157056136701546u, 5236322514650402440u, 1189150u}, + {7403069314122626293u, 2618459734780268100u, 17608687102881958239u, 21935950951574227u, 0u}, + {17025917487057262048u, 7263572812057088302u, 17553446250215684704u, 21935950u, 0u}, + {7655641677447855868u, 18201031679023882124u, 404646873217135288u, 0u, 0u}, + {9498367472085052985u, 4005439105308248397u, 404646873u, 0u, 0u}, + {17611939723864965492u, 7464417310463290676u, 0u, 0u, 0u}, + {8546204549519831720u, 7464417310u, 0u, 0u, 0u}, + {8566987269516836233u, 7u, 0u, 0u, 0u}, + {137694195786u, 0u, 0u, 0u, 0u}, + {138u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 198516u}, + {6678871250921436444u, 4895752890654687107u, 6430569221252150498u, 14847526345659691341u, 847965u}, + {5420594402396681514u, 13783307453673067384u, 10989699088738303582u, 10536050937723468121u, 2727667u}, + {12363814080123733298u, 2875667928054789356u, 4634338502012393806u, 17704427124895698369u, 2503481u}, + {12842366679163826763u, 17874644983131048384u, 16323038040454739585u, 694699437346173010u, 1437564u}, + {1176822004514827289u, 4599823470143808412u, 3790371207499509858u, 16960052974805342595u, 1861445u}, + {8063108360348532961u, 10867111562760370259u, 2087944814683346928u, 1907835061468465587u, 2287159u}, + {17843038281682362651u, 13375347199810217307u, 15365483527922450906u, 16759552455435997677u, 706707u}, + {11237066359510867431u, 11501218989365470184u, 9774674932041772926u, 11686366694067977143u, 3107495u}, + {3031248834937370896u, 17837055839996672608u, 3079482180840550412u, 5317527541430438085u, 1270142u}, + {8027864234336659207u, 5080095427877971302u, 13633759015121702612u, 8165938116014653906u, 1190676u}, + {651117057887343566u, 13803679484610092539u, 1744809688441242398u, 16667268326373999526u, 2781117u}, + {17935075573708022247u, 8073268581356772629u, 8036039940704152575u, 16912779575080448237u, 3631754u}, + {8948266260345422879u, 5534528504953057044u, 1156637336205603u, 6408062328827108902u, 3597843u}, + {13414954349665986374u, 10473704216961777116u, 2617098426851925858u, 4750112107911765563u, 2325859u}, + {563198220812167324u, 379382574388922128u, 17041170559990263451u, 11644177170581043827u, 3013823u}, + {7580734930431536078u, 14017573295920065194u, 10349209956620052611u, 14827402010983863592u, 1209862u}, + {7696440479444449317u, 1767130857896799669u, 9612609120057796350u, 7948653373677981356u, 2278708u}, + {16307548460092100243u, 7672858524941896426u, 11469696340779349832u, 10418328292704990702u, 220219u}, + {13136872309551755550u, 7508804884291794073u, 8343731789152467138u, 4687805946416812376u, 630834u}, + {11079184619881053181u, 326526894268693932u, 12930063012978993744u, 15359904368117450805u, 2887511u}, + {12212633204430426527u, 9163800859739428024u, 3942411980433427790u, 4664951210214313413u, 773814u}, + {2885095430190889554u, 13607542969697067119u, 3477152914785157316u, 2608347738849010389u, 3112777u}, + {2227967333426757528u, 4653546342917684421u, 14750164526149525611u, 8488159105723445647u, 209314u}, + {12675996978413463541u, 8840460929046452855u, 14949187381570993260u, 3861170277203546u, 2909157u}, + {9565977210659027449u, 6104510706164753864u, 6045943591111537650u, 10357900422076796676u, 3229865u}, + {4572128092131939404u, 17802943598950026558u, 129284307034442162u, 2725711482808865955u, 1664372u}, + {17575728336046920567u, 3127111884981321952u, 12010511019626525865u, 14153990678487035052u, 1128438u}, + {759304011694045362u, 15140268964559640990u, 9103299609145341036u, 15224968363145833833u, 2130688u}, + {16987578247146044730u, 17500922187710150779u, 4785558414788351284u, 8830330744089100612u, 2542866u}, + {14625256285981082194u, 14975309837051275091u, 14179496919790623886u, 12440813781669673248u, 81150u}, + {11485207677928001223u, 8497438328421573640u, 14449549514791159269u, 16718858782521676463u, 3838193u}, + {11287551642141638087u, 17983961113556640462u, 10465692952499538657u, 16788163997494643419u, 689988u}, + {8860957832443775713u, 8870232917400678567u, 10976993824005683565u, 17666838588130439023u, 3681453u}, + {9474893087566114124u, 17231478135473765459u, 1029643234658069099u, 11813298667159482406u, 3861835u}, + {9928899852316634879u, 8247888950620935827u, 7829863780530138846u, 1007987016206255961u, 1871625u}, + {14980161452297846885u, 13533598088357046049u, 13826793202343986738u, 4862384188926115367u, 3167054u}, + {16599992448808849696u, 14127262500830249087u, 3869658945040651193u, 15622862151660436495u, 2366615u}, + {12406924704052456852u, 1627345083871244486u, 2917100504369057292u, 6456782226224450586u, 980221u}, + {10016057972432077144u, 6993456639532554697u, 11419230432623261426u, 5062113475034413396u, 2249928u}, + {2203559088414733508u, 15345561030781612342u, 1525491217739528465u, 12579525213661847523u, 797436u}, + {5901481001205657387u, 12920144740647967497u, 12254247702894704491u, 6571951167838130039u, 315702u}, + {8251131397283750916u, 6979872154894825387u, 12957075525020590313u, 10238002033955276332u, 2136425u}, + {15860831296365813465u, 5121325753146679909u, 14139228866240853763u, 14162698526879552418u, 3548428u}, + {1653547947691754752u, 15308075197363111465u, 12935079537038359838u, 9865289746500882859u, 2002373u}, + {9120892719780076608u, 17456062989811140503u, 9202483454862876638u, 10773518783787658226u, 2487174u}, + {16899439878344145864u, 9901016850313885770u, 2188363268575791493u, 17483818030196863776u, 2719835u}, + {520170050046592754u, 6896928986585920965u, 9525292408054737332u, 4589800542040995816u, 3568404u}, + {7700695822647039977u, 6995230631286219100u, 15970022980708274908u, 17287590414994178704u, 2640324u}, + {14416531828668778036u, 16023069099519358971u, 2861870097715763465u, 3075124347980236825u, 3443980u}, + {1208292944688736103u, 15632832461972264755u, 10232565830106905278u, 17141180007719019401u, 2679173u}, + {12722108192874376476u, 7618748483055256918u, 4624837985335442359u, 11866867458021554152u, 1053310u}, + {4202355252017587024u, 9726439676914827345u, 15388331317180903327u, 12989797078694174945u, 2953000u}, + {13401775345317774682u, 11472628690671369480u, 11367306974150928288u, 3729410544173786120u, 1874037u}, + {807132873128359086u, 2355023516126358204u, 2869942831041560528u, 3997737556739109451u, 241799u}, + {11259560763367045293u, 2976062808614655609u, 11258170305201811245u, 13263057711246756676u, 970506u}, + {17555824656366958033u, 4495774005001657152u, 6408295084189221699u, 1386996975787688057u, 1127589u}, + {14997967972851915003u, 13372623919058022082u, 7098710759178807384u, 9676517948172670479u, 1705442u}, + {2788079320419591068u, 12372139029889251640u, 5529683651114980145u, 13073884382648029729u, 2734871u}, + {10084609937607391933u, 14311987290932457867u, 14492338887289371929u, 3509213992306035425u, 811767u}, + {11738053652630829547u, 6647680495782671570u, 16467424995822289732u, 6283985142905427405u, 521070u}, + {12461677347272666840u, 2842719490352834967u, 17819121754353721525u, 6999198672897482770u, 3329281u}, + {11733794301801277421u, 17410424090747204805u, 11273743633347082056u, 10870053507244852882u, 5030u}, + {986723232872057712u, 10257552752713294029u, 5339988610196613027u, 10592559121568150858u, 2255814u}, + {5047070740068054623u, 14383013783649055457u, 687072637091203355u, 4653298452555838064u, 766451u}, + {8545277422044562168u, 1390468266760690719u, 1871844248469313123u, 4049363796219301628u, 680642u}, + {8687624862134041136u, 18261884142989268048u, 15685618820558883839u, 4047780898953146028u, 1490955u}, + {4304627428222147157u, 13312011104637903312u, 8905706354444217142u, 16816922680195407611u, 2401330u}, + {14964885716352879655u, 15192793735757930796u, 14341548305524609190u, 18418983216435067317u, 2950910u}, + {14598767073063192000u, 4397121291080791240u, 7272405235523133449u, 5674927034931912477u, 39674u}, + {5308368643676521304u, 10521130462796483833u, 12594065548293591584u, 8143239988085164155u, 2756157u}, + {2566752452981781261u, 8873818348243222621u, 13622253974824954069u, 9850674920107402380u, 3097048u}, + {15516375718208401980u, 16040957296507848388u, 9603964314975113418u, 1930627906676795275u, 1323592u}, + {11948780869092099707u, 10883537883290308377u, 9579762164285372753u, 16093259435270567007u, 418403u}, + {665641640710273553u, 5835273929857893746u, 14671733292988835095u, 13986891432511951316u, 452851u}, + {9916966995254238123u, 16528703410771121271u, 12374233326936537406u, 18310982526121110620u, 361908u}, + {15925030911135570057u, 17412202241434685810u, 9727963327390568376u, 13769676503809446378u, 3393957u}, + {12290277289076459249u, 11333432685076668225u, 8917725914883597466u, 7052194091624861344u, 1410239u}, + {5068654106020635508u, 926531156071044427u, 18193240956572921030u, 9825847114126157471u, 3032359u}, + {13298596250219390216u, 16859380902272572563u, 6546742387956292446u, 15115974314165395560u, 977346u}, + {13002273812181318299u, 4190974500505096477u, 11051198965622978129u, 13564856545779890017u, 3137769u}, + {11885361126473281026u, 10693158156993885785u, 15577809066055476001u, 13100306156135232507u, 392020u}, + {18430944689103453470u, 3468696860265538739u, 10325322011877047607u, 14346692719259741038u, 1669930u}, + {4181328275325403845u, 9005388618045133899u, 14570122410823649892u, 7813024941773919598u, 890556u}, + {14851182845004566251u, 10330726329469157772u, 4111006239342828593u, 12770622011141576097u, 196052u}, + {10639489560934180962u, 2739766831854702265u, 2859173928189677410u, 3534438641698229780u, 1169574u}, + {17359913740430177446u, 1354759029492812743u, 15125617434896974411u, 15009554395676714104u, 1248813u}, + {11276103432623503338u, 7621608101490234014u, 17689429834319618632u, 1536246023612962497u, 3666649u}, + {5513998591720682399u, 7015199527618593984u, 6202114153454918862u, 5327842102016108405u, 319280u}, + {15419587923950415168u, 14896170527477727398u, 12102261035544802657u, 2311732690989390039u, 1967807u}, + {5231440667302097128u, 8340744655970853316u, 11551649084422716740u, 7242059038219980462u, 1268211u}, + {10828734698766625074u, 17378097413187906920u, 7092024871059853873u, 12633473327627911102u, 186128u}, + {4080546861106467228u, 15682998900344580258u, 942517026456937015u, 14054664305610372259u, 1325551u}, + {2587179804292119151u, 12094973289844486972u, 8568746435661738020u, 10184572873456153051u, 1423235u}, + {13525486791072709782u, 10582871187953463563u, 2773482940360421299u, 314484438138030631u, 2799303u}, + {3064981346648971784u, 5116871569032152887u, 1943443424556675606u, 16048423902760253599u, 1751700u}, + {5795700011297543667u, 5615498621987056664u, 6013653308921272145u, 12786507322355585596u, 1216768u}, + {16063810060772189204u, 5650043821665775520u, 1038232273543120710u, 3769440310651839418u, 46681u}, + {11175289632228079598u, 15430659622986012722u, 4257986562176322895u, 13115343231132429498u, 3838827u}, + {10772956140956665898u, 6775374282722319089u, 623941384535053276u, 10663280195902996040u, 370594u}, + {5110256677477870038u, 9499681764826549248u, 8754380983131057424u, 11824281685556714017u, 2004575u}, + {1442985197081836948u, 418189468538108376u, 18213525900083486733u, 13799978355070073785u, 2574767u}, + {16985671481681802854u, 17993028786994264269u, 2873029808274794378u, 16044281958118413068u, 3444142u}, + {12253090332738212071u, 6829040346353919250u, 11810464070331075195u, 8710444506623148440u, 1321712u}, + {9020660077505597078u, 4443579130965514251u, 9382660274037532215u, 12922690624502695849u, 254241u}, + {8291106269573909687u, 16616072501974808137u, 11346579468634274244u, 1229669030227509526u, 3440480u}, + {17394290500041748917u, 11309830517960084883u, 6849741054546057906u, 12673544611917774068u, 475645u}, + {9881955995621445865u, 10262678469601485834u, 10997328791633570202u, 17879057435664612319u, 2259576u}, + {849487811486885732u, 14064357772102406591u, 8612547501649810167u, 185797026142009641u, 3843508u}, + {15882885109374052597u, 14494855142396164475u, 8384387727704243423u, 14194188640040927733u, 1691412u}, + {2367537109186688456u, 16027007616005928988u, 2930256542289714989u, 8029593996691390756u, 1574883u}, + {13561919257972596041u, 12164453283783516040u, 8652476375020741854u, 12783245616389874588u, 2131993u}, + {17812433607683131284u, 7751098112931592775u, 8639076518273866479u, 11208255417900015944u, 498380u}, + {17982546220707694072u, 18267317453349368305u, 4323880368750305766u, 15717748999788000832u, 3453403u}, + {9727016885900691455u, 4649226009434931685u, 8621087322911565213u, 3090123006635103098u, 1386690u}, + {13298457424681854257u, 10477607141294101940u, 14120874462231988999u, 6294590599929425736u, 3848074u}, + {9278126487569557168u, 12785698777545274071u, 1007437951176477791u, 2448885045800908297u, 708335u}, + {18271000458011177235u, 11848740391667160756u, 826924317110472448u, 6930595504553417957u, 3653010u}, + {2707411601177827242u, 17600472399995637237u, 12952973806261501313u, 9290758184354073041u, 3105396u}, + {14518575540989184386u, 8627581789140467797u, 1922021193949879422u, 6686583106039649643u, 3138162u}, + {1168806176467990476u, 3939050997807460760u, 17672339337006844187u, 6831302717527649603u, 1463699u}, + {430385119223196237u, 15443399772835807032u, 9563478124555239931u, 9610660494729662802u, 2424961u}, + {1565064121368296716u, 12358971358658588068u, 13391409774695742756u, 10348968591990082130u, 991786u}, + {10194321946762764292u, 6955626215091770013u, 6439911588179690475u, 8016688171076857589u, 2289055u}, + {5078766387664958858u, 17172413097881178522u, 13857571741014971522u, 7031812241451343180u, 727447u}, + {5098397204678460193u, 16114766361853937575u, 11911939472891140781u, 15145513783632866593u, 1917040u}, + {10338051951908950118u, 13951554960266324668u, 8537212807548310263u, 13077787682269534358u, 6822u}, + {9141126058148573007u, 10575253182569693179u, 15322948644504933867u, 12970492783592887008u, 1873717u}, + {17188497775455237557u, 26577101759217997u, 9558432808574481161u, 7096208206652989351u, 3059125u}, + {4713239586046049641u, 12500590649950960219u, 13655854420971678098u, 13459143394115291034u, 2631264u}, + {4654715544003004970u, 11164881274682198456u, 13625017132128287969u, 1777920523967779147u, 2804949u}, + {16896049823485822715u, 14176973356240431058u, 1171861362221407989u, 4159025038282620409u, 2462453u}, + {16753160950303833186u, 13768659032612563610u, 14537776755359958418u, 1774806501353833808u, 1265790u}, + {12942224332566921107u, 12587813670141398u, 12799281654222494166u, 14362810919503526578u, 363341u}, + {5095668791519463905u, 1106411913253831634u, 12861727312267903607u, 3105179016432197869u, 1265681u}, + {1369117091991974681u, 5394776997901444941u, 7952176755170617403u, 11552562742659605555u, 169987u}, + {8369446816991800111u, 11145806024485339894u, 3876667152387542184u, 6920664745878502264u, 1346662u}, + {17395257054169319623u, 11882667217452520915u, 1416858555707818520u, 8383522444588095174u, 426902u}, + {12224487070041520645u, 14541734681032475321u, 10921741739725648771u, 14275278579831808527u, 756970u}, + {197558904316509445u, 5292863841630886780u, 2187268216226602158u, 5057995228791710019u, 633705u}, + {8290178039035763523u, 962317612172543229u, 3662182278485082409u, 7433621984917802748u, 1783399u}, + {18405437487033836648u, 740491433625199351u, 10334337016023963046u, 11922400928626040965u, 3393946u}, + {14432812695885302792u, 11439893366353377372u, 9130358047992991225u, 2440507868436013054u, 737005u}, + {17546728846738624891u, 13649036838284888932u, 9680171241346109359u, 15938323627438626032u, 1496481u}, + {15705643588582519400u, 355347152565741930u, 17533433388088345424u, 6584846275407934746u, 1330696u}, + {5191889741489475091u, 4553548079568411316u, 16696876392997466756u, 8383227923536395856u, 2139643u}, + {17551639456166611u, 12955522098554699535u, 12630650671644801642u, 14306873074723063377u, 3817180u}, + {3634989930876310583u, 12381140192029892690u, 17720426725995189345u, 17220121937877004468u, 224571u}, + {16177374597702684627u, 9568234095714612730u, 10938203593547107198u, 16577389249706924245u, 977647u}, + {2640303340268226013u, 11100533937119378642u, 13201445556087544663u, 3116510964211720419u, 824688u}, + {17327037078145854598u, 5504831168483033687u, 16875380827147027459u, 17669323350885514666u, 3873346u}, + {16191466245213335164u, 3122655452909650547u, 14741564316972452730u, 8646304330553674331u, 1493434u}, + {12256441551939877649u, 6987654881762266380u, 1139338720518337107u, 17033141196386273577u, 3063342u}, + {8711250514870864700u, 13186350470781014983u, 12040821640587343538u, 7838728859013603849u, 1342879u}, + {11194113697099257332u, 12192105190117022471u, 18043614714594419786u, 16381845599683329339u, 2348437u}, + {12144373075689185590u, 10130506958899821210u, 17556753825650004733u, 14022494276052095421u, 926722u}, + {12635459401230921079u, 4864079933444355134u, 2670685922347000041u, 10105158182893881579u, 787567u}, + {14777768704308332914u, 4258417168349083157u, 6113986109896112727u, 14930450022846140145u, 567386u}, + {15026920005770337676u, 10487178086491984710u, 9211121947611036952u, 10026472010535438894u, 2114644u}, + {1227037401375439430u, 15940778251485464412u, 11121608382635787823u, 15747563806969767519u, 3255584u}, + {2079783843414595501u, 14966190853578989502u, 15827145257161431668u, 11733385174750353075u, 1219975u}, + {11291063708340407814u, 16035468123412951216u, 18134674524849928432u, 1535714053131195640u, 3828478u}, + {5740653625488847493u, 16283432431161012957u, 16286927132031495485u, 11239550031272371529u, 2179158u}, + {6620988565045514248u, 13389945460424381925u, 6507842666910591015u, 6741554626689024838u, 699523u}, + {4010412575738150337u, 14018874542257587552u, 6716533421402249690u, 1958458967520282425u, 3872194u}, + {12947054230824992104u, 11585532121194152172u, 561665160554012615u, 431717343869852331u, 3753895u}, + {17377236323780855734u, 15496199010600751466u, 2460733881848616492u, 2303032555952061277u, 2118668u}, + {688697733494368587u, 9298094868866160458u, 4708139710664691709u, 17260847503740967328u, 1580484u}, + {1847320298349121351u, 10424595630693707239u, 13230548516813970497u, 3559976908979909134u, 2505965u}, + {16669292093900964310u, 7344867805463502929u, 9136646047881840322u, 6387295173910308833u, 2819718u}, + {11718062811982368220u, 1224012644174132926u, 6896741788262690158u, 700532969034678747u, 2802516u}, + {17684897650360594310u, 2475896276036069910u, 14597731372549029649u, 1781079553025279630u, 805087u}, + {17879984961414735549u, 17042732888391640056u, 14889293588869580322u, 16660155458388503370u, 2792493u}, + {12131258793950966744u, 18224019025143519063u, 5705984855168435788u, 267685202472564673u, 2435770u}, + {12679116443420083729u, 18046052697814630846u, 226322979619118827u, 6962461053721186573u, 2460267u}, + {4419633252312811317u, 4113431122667480222u, 2708499369184432341u, 2711514902067787863u, 1387017u}, + {3219381821371920130u, 4986813494447298429u, 4087011459106631189u, 7519575730280904647u, 3448472u}, + {10012538453602478995u, 433239738239866033u, 2974268145062456424u, 2657686473314334751u, 3016767u}, + {16998340880101876494u, 10495215864015300669u, 3952772436712679302u, 9711367132519042440u, 3625485u}, + {18153439033708247329u, 16561828141530503078u, 4788335732978817748u, 10154941568959351046u, 2763274u}, + {15575477496940519551u, 13323622608909228598u, 9066608474558235240u, 13165455533341361608u, 1185613u}, + {7410480167613190836u, 11879265935171050638u, 17735847444160261311u, 2471828910036468359u, 664677u}, + {8612314607919030961u, 13051425012772434494u, 12468825632619719745u, 9956209106216565121u, 2084443u}, + {7212594263125810924u, 3440027966002114338u, 2133827299215874679u, 7532440976457949809u, 3636242u}, + {2376574068204387550u, 18444980107247531106u, 15591499492719848615u, 6264029920358317239u, 3082754u}, + {17458524584195811472u, 11654406899988963753u, 8130360093907847056u, 5245013551075045727u, 1800643u}, + {4878184099930202199u, 6555199863087116819u, 4160383020146790181u, 321446381985841883u, 3563050u}, + {13427454431229316091u, 3287650843694300282u, 16071369442624558018u, 10658192995368683791u, 1370820u}, + {9366551730179132006u, 17519392937592026180u, 16877459482926153232u, 14148575607803190978u, 1584090u}, + {3875987446623033184u, 7526432455201212744u, 7795232838284664615u, 10477572452467848891u, 3855800u}, + {6640323905363332284u, 12351336095795559777u, 10861843046721119663u, 14266472991748785133u, 2643091u}, + {18160272951733729384u, 12239324076403989457u, 4410066602998215482u, 11145625919347900188u, 2619684u}, + {11453711821312030643u, 15868243331250031157u, 6705567309567999214u, 696842997788969076u, 3584923u}, + {2177871408433936447u, 6185265578126336782u, 12854699281149546660u, 7560119937746303408u, 733077u}, + {12625733456132020493u, 8702880556930660048u, 13213510521838241567u, 3400229811148055706u, 3592950u}, + {18058134940649743560u, 11794805059391867600u, 11561734935089987292u, 1651545301354279136u, 2873372u}, + {2507259336463848745u, 15525161671831089487u, 1849254524125263293u, 14608638355225551335u, 3861531u}, + {16336778021863986686u, 13233136919419183161u, 14514551825633205338u, 647693441001757561u, 1144266u}, + {12639386625002898420u, 2414405985136867061u, 14594905597229164415u, 7875385732836085798u, 3487885u}, + {6725287200806764001u, 9756935681439188888u, 5059166375999088708u, 13106764650693872588u, 2446948u}, + {1766285934385705456u, 11039033488690512563u, 11096464691548115037u, 3215672374293269274u, 2103096u}, + {15880641764850558754u, 5132430180629380329u, 8461012572038042371u, 13225334985830926925u, 451094u}, + {16474102570991322878u, 520862916433735659u, 5674123097420465497u, 17446258985975081434u, 3265714u}, + {12574858770672254388u, 10211793318199375245u, 11458661014920624839u, 924932936277324532u, 1189383u}, + {103058817321437432u, 7449536807840729311u, 16731518966464751299u, 2111610471831463967u, 3583814u}, + {10786729741835207720u, 15981247361232769727u, 15617149889419474151u, 570512860042883346u, 1003274u}, + {9317100378555137477u, 8366857093203422295u, 13482248041822274299u, 8449245641721888248u, 1282100u}, + {16666082958197729287u, 12356010427797286120u, 15656892603067015286u, 10327886526449843505u, 870909u}, + {15038229245281641414u, 4755623576713824380u, 6238365102580225283u, 9599725452806792326u, 3731642u}, + {2377298258308868222u, 7452758563130521090u, 7714904266967313147u, 17002371253461496071u, 1814834u}, + {10712121721682632216u, 3551960921874821929u, 15845159458573396763u, 17975818710780693917u, 1370792u}, + {6295647255498710609u, 1850388972429278344u, 8476164344987256616u, 6798700506743333158u, 2676581u}, + {16246350481336315970u, 12168429409951753269u, 2162660386313904737u, 3075793161091227404u, 3076418u}, + {5692388776039685425u, 14695307385953475757u, 8386238353960063071u, 56749898585546552u, 1838889u}, + {1770163383616868558u, 14222504019321956707u, 4558950032133847622u, 8032314453029710478u, 513233u}, + {9773132881322355107u, 5184961364293179098u, 6165732088156463554u, 14709216669570795571u, 1351311u}, + {3896881963361440702u, 10255930496920501137u, 8754163372433010576u, 96984896928133133u, 3330913u}, + {14464417598678698286u, 6305887245592020366u, 11622159731154525730u, 12599465862339237864u, 3687639u}, + {10370069144860224864u, 5340449331108741609u, 10162541684768744201u, 2734155924872029711u, 1957334u}, + {8232208288959670033u, 14957090141789895974u, 6913497594120034686u, 8106556974346854968u, 751938u}, + {14081403373252783280u, 10475254841244430704u, 3133857885293119678u, 8516666912427350435u, 2552902u}, + {7111919059883805409u, 11217796200754156265u, 3079500694730783370u, 12657171694993316974u, 946961u}, + {2142504199549383311u, 2237563688514739407u, 12934044368488191382u, 11546683405940425525u, 3685798u}, + {16841473855806200576u, 13423542003297870398u, 16003935718229807466u, 14191279415393949379u, 3287605u}, + {17863372413154339290u, 10058212841940816983u, 15393237184806171894u, 4312043670479475529u, 1801220u}, + {12364687121623287761u, 1463805931385324640u, 760873772091994672u, 1618493717506905381u, 1468273u}, + {13132383511799485877u, 8831855685767023601u, 18202962032054776420u, 6800498697445057445u, 3499502u}, + {16092681897362118841u, 16492356779348349043u, 13730883351402552097u, 8062947362789934316u, 268464u}, + {14899871193224068863u, 17976911735197278955u, 15771452270462656434u, 17010544487714944619u, 3605534u}, + {13578611932131414709u, 13805695320805795678u, 3526788060508673813u, 12604531742557063646u, 3098121u}, + {10017033585004334723u, 14519430890716677869u, 5887779794048603031u, 7190852067555782516u, 2324424u}, + {6358614182681561899u, 10447317781862716475u, 6663917661980280621u, 8329501376199352958u, 3493023u}, + {1648428118158855847u, 14171383475559699508u, 5787262455710421158u, 14836241687429309415u, 1999365u}, + {16734150495377097513u, 18177628928914675985u, 1771500883337550621u, 3423588709083786977u, 826424u}, + {7518928632521434510u, 12026701560480924623u, 10486755616672292329u, 8445983337885528563u, 671067u}, + {2299867138649712155u, 16975499828456067254u, 10326908574350285768u, 4624065028078683289u, 2523639u}, + {5500370275796742078u, 11124109363068191098u, 3861529129386089439u, 13593380606521949295u, 2942819u}, + {9359727902684301213u, 7233607044045688597u, 9204829355126668022u, 13745228309747938315u, 580520u}, + {2620077935866538617u, 5860017447924489140u, 12028358770102218968u, 803342252032105474u, 1377490u}, + {17542163929850433670u, 12172829183783890357u, 5305824355483002536u, 17319232775400141062u, 746287u}, + {1933439364185814285u, 16157920042751091280u, 10090200299703650941u, 7075410798330706983u, 1717959u}, + {12869526843050842748u, 12885489286090906143u, 16885757117577243825u, 7381565348946186257u, 2637891u}, + {6282589729863540424u, 6538714691669055706u, 14168355928573785337u, 10785242019204169575u, 2064375u}, + {15049619324600412738u, 18032587688206907036u, 15153070093650835776u, 4433594244396010270u, 3430796u}, + {11649476543071302251u, 8712970421277467219u, 4463680537859921223u, 7989622364386773639u, 962789u}, + {12636922024626884903u, 18042439985710466595u, 16188690366301766809u, 16879237335144742133u, 880846u}, + {17975348664929502496u, 12237118331119223601u, 15633417666646880383u, 15508631475764094338u, 3209539u}, + {11762079400979442395u, 10690061141177494519u, 6422406663313416130u, 14758954743773520100u, 907899u}, + {3495504961094459865u, 12720665796096789101u, 18006510392990567279u, 7871025545390876595u, 2278975u}, + {15797715719868501651u, 6130450724475593913u, 14479775375779917307u, 14237385701918211162u, 795881u}, + {15448507577448017487u, 9372197330459143032u, 10475995588222139819u, 18317310312991209477u, 2050162u}, + {10396551771251878192u, 6586604095978080380u, 13860353514057370923u, 12143494630412848082u, 3450971u}, + {5301434803524903761u, 4786841752256863745u, 8534703775601538700u, 14259005216458091547u, 3333357u}, + {627876426577561166u, 1580266972959612928u, 5610511898632698894u, 4168772457906205818u, 3377232u}, + {10643042906128305067u, 9872154615938506020u, 6076592330542496523u, 4385754580825990874u, 375946u}, + {8319285093168177531u, 267224764952484040u, 16930783457578504248u, 10599401307608695983u, 2230770u}, + {12516853289372306478u, 711378320264376247u, 1238151068521622896u, 3932260531924818908u, 717568u}, + {4879959963040506923u, 2922651071162323650u, 8463528439816965699u, 14857101168996898963u, 1540660u}, + {10953948208814944865u, 12251236605363224587u, 14565651010432109493u, 2046032808643684734u, 1234430u}, + {16152656429131473948u, 16675298032133887119u, 8209236728780958056u, 16523960251018439434u, 1589188u}, + {13245315054655771344u, 7399378807448988520u, 17191761206464172257u, 1398409647565601369u, 2060366u}, + {16570138955888130634u, 11338982211997723646u, 10891932167565574187u, 1479158926457141021u, 2218083u}, + {2934780743586752002u, 9720935541138347618u, 15388516473418265332u, 10345152358338099677u, 1631570u}, + {13332394649278528599u, 6787650751214345377u, 8637075440659534639u, 5434416717418089851u, 3401056u}, + {10926435101395626566u, 4639012865865135321u, 3670834693349174951u, 4314136463284519254u, 1689336u}, + {15992534226432096095u, 1406059371320812819u, 6885915554720715331u, 9614822760205056150u, 933039u}, + {9943958304956526599u, 10563500601800884645u, 9874489979043886231u, 6646510192747982758u, 2695354u}, + {18178247536249762666u, 10029468624403031368u, 9857475590742586503u, 4589348936462019495u, 2168960u}, + {12390919591049342658u, 17763221804585952003u, 9870093772414543880u, 9623670261659877493u, 2402974u}, + {15011491700042560105u, 1660072544526272254u, 13738830200416637913u, 10852966161706638797u, 1382145u}, + {16941305563120023841u, 6993842932832929709u, 17062041401824430948u, 6150391579164598009u, 652462u}, + {14176004317657175238u, 16302645148794014033u, 11641308566615558696u, 16801455216519421348u, 1475196u}, + {10963952828206109669u, 17356586525311502115u, 4153064628434631789u, 14294616199381746580u, 936717u}, + {7796443547524947740u, 16722619543598500447u, 8168794777637445654u, 5781886916097344069u, 1926130u}, + {14945630547211955901u, 4356317389867476699u, 13862177525804178513u, 13726473700150888934u, 2249235u}, + {11347812934186477181u, 15765178099153508159u, 8852642190363925919u, 5085522658788059323u, 2107721u}, + {10627493326165028476u, 16983800387412367174u, 11615664964706044741u, 14450399402536893028u, 3598433u}, + {8434577575654705976u, 14698853371488647774u, 8985607463098844376u, 11739709621212115917u, 3136399u}, + {15934409068319557910u, 7893420685846253788u, 3523082803814695558u, 4813657567908991961u, 3170145u}, + {5717949303739294842u, 6999352409672028609u, 7686689655596642836u, 17064071051256200430u, 3320230u}, + {4454219912812413680u, 8219732586551206864u, 15092980463985103219u, 8780216328729203971u, 2575928u}, + {9915457575762241038u, 7400861824983228954u, 11147434217602465260u, 17413397656489151402u, 498557u}, + {3335936841427715307u, 10313572479189559583u, 7640079039038099387u, 16150097835294411733u, 1956102u}, + {11442950972119272360u, 17028455595931610983u, 11613563990023950514u, 9619743736170584724u, 1893010u}, + {5478622329993429372u, 10540230842984291440u, 8765687741433219562u, 755495820997996014u, 2766077u}, + {11237184793690148769u, 17857486788688938507u, 7440059736286523230u, 6680323766752040228u, 872804u}, + {1348651413261145842u, 7241717696766650565u, 4439974361083369689u, 8807126871322041950u, 772636u}, + {9786201476739862668u, 17564600580161717842u, 8198133844758244512u, 13705195494567569364u, 1912156u}, + {9500940094037620466u, 5928707414695314196u, 17476693636805795176u, 16536462100751700999u, 1162450u}, + {7849428221298571320u, 14795889192559602851u, 511347434101993075u, 6722799679712243817u, 2055070u}, + {15650444999211832136u, 13968488295243861771u, 17556447702846578316u, 9549511770072845519u, 2635057u}, + {1742869849297881161u, 10071922499574832362u, 469425953895645173u, 10569016961185627296u, 3254995u}, + {1420407153731480724u, 3585645453935830603u, 2729181323927400327u, 15840657164601439167u, 2193845u}, + {13990588219138446725u, 12168072264274998660u, 15983046504355411283u, 17046061506044037391u, 570064u}, + {5356540249181498688u, 18434538299599163965u, 16167848360922940186u, 5198662612490508059u, 1961845u}, + {3382792802747873180u, 12014546134070695306u, 14399520674026269320u, 15528572375980455567u, 2052123u}, + {16675306674788413888u, 7471607988439538204u, 3160597536671885102u, 2199582824455183522u, 3224050u}, + {15036676545948692850u, 7900250806973228251u, 6322590580787990668u, 17929756548836554232u, 3336080u}, + {3971901501018595624u, 15667964554638987409u, 14603540417704386242u, 7195241641654043173u, 3769251u}, + {17030131254928107634u, 15477616410339371477u, 14613562117765468783u, 13328127718720555666u, 3182161u}, + {3931605439133259209u, 9753927251904906170u, 3698163458437141960u, 10362936470320162227u, 3881758u}, + {5798498069645500245u, 17564444430985343446u, 18114391948677021507u, 10375841754168705959u, 402952u}, + {14456419184583674299u, 15807372198631658448u, 7590399695265036229u, 13986606406151850749u, 3371704u}, + {8681588226387293669u, 4571797477379301295u, 3204649793556820282u, 5610631715687360268u, 197663u}, + {9101056537077287384u, 8696545906508791940u, 14544034243470686530u, 5840311361456636182u, 1770085u}, + {9144817914483513527u, 16748728706012250927u, 2376743859368281952u, 15380919840902673901u, 3147405u}, + {725512206004501582u, 2241789437284589149u, 3811657758536840593u, 15622499702104667828u, 249964u}, + {1990601970330821130u, 4534914822351814772u, 8574224697245656794u, 18307239923191836180u, 590632u}, + {1622616710059890356u, 749009129040111579u, 1510742083776900111u, 17592948200907399527u, 3382647u}, + {465558541173272826u, 12809230467574768091u, 10193801361143938096u, 5754948770089956538u, 1758189u}, + {7809168986532313840u, 18137146625345563681u, 17268734306379986209u, 14732182052008459036u, 2557930u}, + {17214669830147618860u, 3195611858738141364u, 6891222438334204150u, 10279363848186412837u, 3043894u}, + {17901927990209483746u, 5761811110508736812u, 1716387288918071545u, 11657422583991261606u, 3784941u}, + {14099971838613610868u, 6836565111518505100u, 18341159745394972743u, 8932903916283649015u, 3218519u}, + {14900258886451555958u, 9817073990003024818u, 11828526750214555977u, 17281136180287052212u, 1736779u}, + {3825417658633537418u, 11803532768529655234u, 11679317616377320733u, 6373106210344387749u, 945131u}, + {12467631948347024289u, 12405322009237385137u, 10565731376834976586u, 16014220472466237184u, 78938u}, + {9164572406951415981u, 4747816693310213195u, 953714978346636315u, 9441000984066470573u, 2823713u}, + {17733507567006195556u, 9413159726244730662u, 3481652884332777317u, 3510852834310148531u, 1581655u}, + {6650400822105997721u, 3584074971273608493u, 3160905143658190493u, 7883454138642900939u, 3391445u}, + {4042181263263400005u, 13926403328699964368u, 17030514835713379992u, 9934451509034643260u, 2118206u}, + {8747493562607984516u, 17436897153378277737u, 9683879450633451388u, 9694791614994190947u, 600933u}, + {4909444976744147511u, 5621833209328505961u, 17993852074447963909u, 11828530689171419620u, 242529u}, + {2111296438444865177u, 7180986409801070788u, 282170343569445051u, 16001259758641985185u, 3198697u}, + {17662740407896668004u, 13169625767353405893u, 4933204227071809604u, 11444105418922216168u, 363151u}, + {8755596954198963161u, 2508664014243064406u, 5554650081121386553u, 222871747115000924u, 2529485u}, + {3781729343055393617u, 17374248475758102707u, 5246229744202445558u, 1992215801680213224u, 2020380u}, + {17586001640625819920u, 10656477871051000518u, 10591148382744546083u, 8828295907411065297u, 1269517u}, + {8444076622793506582u, 284131280467338394u, 4610851664337338330u, 14867282835837674252u, 1768725u}, + {4836518374736234252u, 6143561975197121420u, 9586475021694403377u, 4356082874554730922u, 1890399u}, + {17067971486186238606u, 237672892750367960u, 4059495767568683537u, 15383139240984929705u, 2237840u}, + {9153253618515335854u, 13328360251418780100u, 17953831304153345142u, 4725024489606365263u, 1567527u}, + {3394398151303447219u, 11072648219224206953u, 17014149563246897692u, 8027308712332655097u, 2291721u}, + {16790272078082926316u, 4059025635335394172u, 12389317250354770051u, 12003835409098691815u, 1321986u}, + {14621086454626146202u, 17780165575769069006u, 7403069314122626292u, 2618459734780268100u, 3134071u}, + {8477940857451202211u, 11750451809252045742u, 17025917487057262047u, 7263572812057088302u, 2304904u}, + {13805421340263842067u, 12061187852780011952u, 7655641677447855867u, 18201031679023882124u, 2291538u}, + {14905515544135226029u, 16030729354869597042u, 9498367472085052984u, 4005439105308248397u, 2303123u}, + {7858855804196897510u, 14369822246033961253u, 17611939723864965491u, 7464417310463290676u, 0u}, + {13252675260353892683u, 12885012140820597775u, 8546204549519831719u, 7464417310u, 0u}, + {18295647525677490814u, 6063531102228862643u, 8566987269516836232u, 7u, 0u}, + {4229723086906554806u, 8922644809313396188u, 137694195785u, 0u, 0u}, + {7019627111739280737u, 12805651991865544855u, 137u, 0u, 0u}, + {1367203447132470446u, 2540009590090u, 0u, 0u, 0u}, + {176905937241044681u, 2540u, 0u, 0u, 0u}, + {46854906853160u, 0u, 0u, 0u, 0u}, + {46855u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3680546u}, + {5558395355530955724u, 11096361753657017362u, 6678871250921436443u, 4895752890654687107u, 1100844u}, + {15427773297742639071u, 11800755169766788255u, 5420594402396681513u, 13783307453673067384u, 3546520u}, + {1437670755771950068u, 12612171327278192623u, 12363814080123733297u, 2875667928054789356u, 236446u}, + {9220061345793305690u, 13633213222390738840u, 12842366679163826762u, 17874644983131048384u, 3263179u}, + {13806091511218160424u, 5460124287714713083u, 1176822004514827288u, 4599823470143808412u, 3169798u}, + {6498665667507501925u, 14400025901191980078u, 8063108360348532960u, 10867111562760370259u, 2422774u}, + {16635717382577935735u, 2258258688044894231u, 17843038281682362650u, 13375347199810217307u, 2388580u}, + {17532399916207161988u, 12819624600626998549u, 11237066359510867430u, 11501218989365470184u, 2104984u}, + {7643721963782973470u, 18287760416901540824u, 3031248834937370895u, 17837055839996672608u, 1955024u}, + {2345390917690065529u, 7383500571185820598u, 8027864234336659206u, 5080095427877971302u, 2205214u}, + {7405868763512582049u, 2400194829013773759u, 651117057887343565u, 13803679484610092539u, 152766u}, + {10767768857413485682u, 8035842321390276065u, 17935075573708022246u, 8073268581356772629u, 3152391u}, + {2422016205385851949u, 729236805438192758u, 8948266260345422878u, 5534528504953057044u, 1374393u}, + {7958511965388372589u, 9287053703007831990u, 13414954349665986373u, 10473704216961777116u, 1035120u}, + {15176305587829492292u, 11030056287983439462u, 563198220812167323u, 379382574388922128u, 2081671u}, + {3628677746914202228u, 13697614087890388966u, 7580734930431536077u, 14017573295920065194u, 2046355u}, + {11492246704662277291u, 251474532859440675u, 7696440479444449316u, 1767130857896799669u, 1883994u}, + {14925814394340993605u, 10800562826237289711u, 16307548460092100242u, 7672858524941896426u, 803128u}, + {16125695926343803266u, 7291242106246272404u, 13136872309551755549u, 7508804884291794073u, 2076058u}, + {2241903732687837074u, 2343621302731850640u, 11079184619881053180u, 326526894268693932u, 676890u}, + {9906786128095755471u, 3569428968832563560u, 12212633204430426526u, 9163800859739428024u, 3291382u}, + {17967770536819701905u, 2467906919736186333u, 2885095430190889553u, 13607542969697067119u, 2269252u}, + {7744737072635740544u, 5916881136632733121u, 2227967333426757527u, 4653546342917684421u, 2679847u}, + {765182776285160522u, 9058441456449306846u, 12675996978413463540u, 8840460929046452855u, 2801188u}, + {16572828146652551882u, 8458513737154306292u, 9565977210659027448u, 6104510706164753864u, 255756u}, + {9156182001748405759u, 14602671504407461384u, 4572128092131939403u, 17802943598950026558u, 1552324u}, + {10640181308141944227u, 12617220167039595114u, 17575728336046920566u, 3127111884981321952u, 443125u}, + {10076568677676370600u, 11183061869249042043u, 759304011694045361u, 15140268964559640990u, 3414392u}, + {831507124596811134u, 10663324023434633812u, 16987578247146044729u, 17500922187710150779u, 3219422u}, + {7317015628842586657u, 15702828258065329098u, 14625256285981082193u, 14975309837051275091u, 3615804u}, + {13251289927778860994u, 13210264506471952095u, 11485207677928001222u, 8497438328421573640u, 2256235u}, + {3533533737148361875u, 506024123771005064u, 11287551642141638086u, 17983961113556640462u, 387539u}, + {8378283455203566211u, 7086712640442858331u, 8860957832443775712u, 8870232917400678567u, 526551u}, + {3264597248472194248u, 12277382526515272085u, 9474893087566114123u, 17231478135473765459u, 1806455u}, + {7098064308335790472u, 558832078266533260u, 9928899852316634878u, 8247888950620935827u, 3189072u}, + {8963323349018344814u, 8138521637876407622u, 14980161452297846884u, 13533598088357046049u, 215434u}, + {2799226534254736536u, 4040279165629848407u, 16599992448808849695u, 14127262500830249087u, 2281053u}, + {9778723942906207033u, 4031857909267308271u, 12406924704052456851u, 1627345083871244486u, 209794u}, + {7105031465619116527u, 3302821111455783737u, 10016057972432077143u, 6993456639532554697u, 3759530u}, + {17672064522596644334u, 5755258255271898147u, 2203559088414733507u, 15345561030781612342u, 1183699u}, + {9757732079531997615u, 16576869999289873786u, 5901481001205657386u, 12920144740647967497u, 3379627u}, + {16504762842853093618u, 18370917826434234817u, 8251131397283750915u, 6979872154894825387u, 283875u}, + {8768640055479695261u, 12811232547224484633u, 15860831296365813464u, 5121325753146679909u, 1727419u}, + {8326406217035757295u, 16539507030115008993u, 1653547947691754751u, 15308075197363111465u, 982570u}, + {2156468090879763419u, 17600257974418124u, 9120892719780076607u, 17456062989811140503u, 1578948u}, + {17955706727380059296u, 7910106691963618723u, 16899439878344145863u, 9901016850313885770u, 2789519u}, + {17773465141922368431u, 2574793723366642628u, 520170050046592753u, 6896928986585920965u, 305962u}, + {14940801439398153293u, 2289662726925394447u, 7700695822647039976u, 6995230631286219100u, 1424816u}, + {10795632302936875161u, 10256346763251969829u, 14416531828668778035u, 16023069099519358971u, 3707545u}, + {2676557735585469154u, 6798744752762894040u, 1208292944688736102u, 15632832461972264755u, 2856932u}, + {18217326052412056170u, 12363804304727524581u, 12722108192874376475u, 7618748483055256918u, 3833851u}, + {5309955897388902621u, 10980480112959773433u, 4202355252017587023u, 9726439676914827345u, 838697u}, + {1908379007407614057u, 12301015299877911444u, 13401775345317774681u, 11472628690671369480u, 2666080u}, + {3539496691167509789u, 18141761133207619179u, 807132873128359085u, 2355023516126358204u, 1176438u}, + {10189612697889363624u, 2218967661865206256u, 11259560763367045292u, 2976062808614655609u, 1528897u}, + {17351201988390330142u, 3816695324377921515u, 17555824656366958032u, 4495774005001657152u, 2275145u}, + {18100027556506838705u, 12904913898173482393u, 14997967972851915002u, 13372623919058022082u, 2726250u}, + {7624353252008087555u, 7021190777122623611u, 2788079320419591067u, 12372139029889251640u, 2416885u}, + {10829616437079516902u, 6586887140468140826u, 10084609937607391932u, 14311987290932457867u, 996481u}, + {8779658972569306298u, 2011457699021235419u, 11738053652630829546u, 6647680495782671570u, 1760382u}, + {857293015183800768u, 9978265527156991021u, 12461677347272666839u, 2842719490352834967u, 2414731u}, + {8959690090511559761u, 5648058181602960182u, 11733794301801277420u, 17410424090747204805u, 1375548u}, + {2814677822235147578u, 7450090002685020650u, 986723232872057711u, 10257552752713294029u, 2360989u}, + {16829739273830533121u, 11611276482888357051u, 5047070740068054622u, 14383013783649055457u, 1158685u}, + {2330623551928571321u, 10088865499607929446u, 8545277422044562167u, 1390468266760690719u, 1697473u}, + {13522016626214495436u, 3542969464940568766u, 8687624862134041135u, 18261884142989268048u, 2895567u}, + {15151839160219201910u, 18273755215249011701u, 4304627428222147156u, 13312011104637903312u, 3290498u}, + {9087240190490746895u, 6696987816549981809u, 14964885716352879654u, 15192793735757930796u, 87172u}, + {3685138557408511120u, 18444685829596283068u, 14598767073063191999u, 4397121291080791240u, 39125u}, + {636502915700126676u, 4372834624679886592u, 5308368643676521303u, 10521130462796483833u, 581906u}, + {14252191770900266694u, 6549711414488037814u, 2566752452981781260u, 8873818348243222621u, 2394537u}, + {5470369093483395854u, 9505656443645432019u, 15516375718208401979u, 16040957296507848388u, 154020u}, + {16075506089399585312u, 9689154308023214316u, 11948780869092099706u, 10883537883290308377u, 3830833u}, + {6894073861052913661u, 17107690983484897798u, 665641640710273552u, 5835273929857893746u, 1491557u}, + {14169517417822703203u, 13199458534325644281u, 9916966995254238122u, 16528703410771121271u, 2511124u}, + {2739066892436360519u, 8273338941709977388u, 15925030911135570056u, 17412202241434685810u, 1105366u}, + {7571045153093390302u, 16558017226450438500u, 12290277289076459248u, 11333432685076668225u, 3352354u}, + {11586880534844622805u, 14174999689144888604u, 5068654106020635507u, 926531156071044427u, 3792620u}, + {9033391761344644580u, 2555506035388993803u, 13298596250219390215u, 16859380902272572563u, 630682u}, + {2342515938675615472u, 16801202547870958205u, 13002273812181318298u, 4190974500505096477u, 1552265u}, + {7459452404526416732u, 7901164225282376613u, 11885361126473281025u, 10693158156993885785u, 538433u}, + {4942767100163878993u, 13620117209979018674u, 18430944689103453469u, 3468696860265538739u, 3808095u}, + {14518725423020138775u, 12470774010506542861u, 4181328275325403844u, 9005388618045133899u, 1436046u}, + {4452138759946793887u, 5271666335456689063u, 14851182845004566250u, 10330726329469157772u, 85557u}, + {8576410913760033484u, 2834652026817112819u, 10639489560934180961u, 2739766831854702265u, 3129134u}, + {4603490120165105591u, 15678815754541027904u, 17359913740430177445u, 1354759029492812743u, 3011953u}, + {15929846705063696166u, 7577068415354830879u, 11276103432623503337u, 7621608101490234014u, 1388478u}, + {14334045136290256329u, 3345758457483235396u, 5513998591720682398u, 7015199527618593984u, 2835522u}, + {14836033374353028774u, 3687514732111396134u, 15419587923950415167u, 14896170527477727398u, 2933923u}, + {16513497676398201565u, 8640680402365881660u, 5231440667302097127u, 8340744655970853316u, 662298u}, + {5284475611010244053u, 8849671835071447863u, 10828734698766625073u, 17378097413187906920u, 2520823u}, + {18307005546970355610u, 11388209637404975752u, 4080546861106467227u, 15682998900344580258u, 3326065u}, + {3990666657612090478u, 4583366496079918269u, 2587179804292119150u, 12094973289844486972u, 3386096u}, + {6257318530153925544u, 12986169851229972327u, 13525486791072709781u, 10582871187953463563u, 42413u}, + {11218649340002884948u, 2747843925870260251u, 3064981346648971783u, 5116871569032152887u, 3635540u}, + {7140898652153176123u, 1026255371199318000u, 5795700011297543666u, 5615498621987056664u, 1601989u}, + {9700684941103818671u, 11519967214675228616u, 16063810060772189203u, 5650043821665775520u, 560234u}, + {7521944871058205278u, 1074895976105927519u, 11175289632228079597u, 15430659622986012722u, 106275u}, + {7269343548802640146u, 3545920750510952034u, 10772956140956665897u, 6775374282722319089u, 3260030u}, + {15366544571376225341u, 4006031470945576503u, 5110256677477870037u, 9499681764826549248u, 3138846u}, + {15942587494576836257u, 10250386787978819680u, 1442985197081836947u, 418189468538108376u, 2747795u}, + {6400942880768644915u, 8365821339686311078u, 16985671481681802853u, 17993028786994264269u, 3015518u}, + {15167970314281753104u, 17620067358171295787u, 12253090332738212070u, 6829040346353919250u, 2605657u}, + {9379829569176695508u, 1236423697649100560u, 9020660077505597077u, 4443579130965514251u, 2321595u}, + {3607732459346208994u, 8280171806666029380u, 8291106269573909686u, 16616072501974808137u, 3732140u}, + {193264106297769702u, 3239338988710923574u, 17394290500041748916u, 11309830517960084883u, 1653414u}, + {8917495911343787235u, 15640636953011471902u, 9881955995621445864u, 10262678469601485834u, 711612u}, + {2963483869712801020u, 11582354228427360344u, 849487811486885731u, 14064357772102406591u, 611421u}, + {17547342669125092824u, 4364974902889605119u, 15882885109374052596u, 14494855142396164475u, 1638323u}, + {5108627726070083570u, 5705992702957092503u, 2367537109186688455u, 16027007616005928988u, 3186333u}, + {17974925784240062480u, 13218271084379381286u, 13561919257972596040u, 12164453283783516040u, 2219120u}, + {7786512473162678053u, 13332483904909847546u, 17812433607683131283u, 7751098112931592775u, 1992013u}, + {17007546116763280833u, 15594999404671610134u, 17982546220707694071u, 18267317453349368305u, 2035046u}, + {18050769344590364734u, 13840812108415843115u, 9727016885900691454u, 4649226009434931685u, 1585971u}, + {10431599757490704790u, 17213176922734632593u, 13298457424681854256u, 10477607141294101940u, 1707869u}, + {16852088820369340u, 161161103617784843u, 9278126487569557167u, 12785698777545274071u, 1696503u}, + {1855314101987897372u, 15684238467435909083u, 18271000458011177234u, 11848740391667160756u, 998520u}, + {8351835009934551811u, 1213870485047825487u, 2707411601177827241u, 17600472399995637237u, 2858395u}, + {4448357355712233753u, 7853246633694527366u, 14518575540989184385u, 8627581789140467797u, 2598882u}, + {7229430823638857264u, 5011731876590714866u, 1168806176467990475u, 3939050997807460760u, 1250879u}, + {17688114536677488383u, 2959751665205811846u, 430385119223196236u, 15443399772835807032u, 2012429u}, + {16330389689764443310u, 8395972332669969406u, 1565064121368296715u, 12358971358658588068u, 2065252u}, + {7668452571576637880u, 9997056438519398405u, 10194321946762764291u, 6955626215091770013u, 1230879u}, + {6056567340444013277u, 2508851706691445072u, 5078766387664958857u, 17172413097881178522u, 2489484u}, + {17215270435935313123u, 1159914907601714931u, 5098397204678460192u, 16114766361853937575u, 2409059u}, + {12056225020006216057u, 13001473598731463509u, 10338051951908950117u, 13951554960266324668u, 2973123u}, + {3137669375143101046u, 11394751078366243808u, 9141126058148573006u, 10575253182569693179u, 1440747u}, + {13498468435874247332u, 5216700534170745632u, 17188497775455237556u, 26577101759217997u, 1877127u}, + {12546360263649937851u, 10858447533514195568u, 4713239586046049640u, 12500590649950960219u, 3686926u}, + {17009380576434282743u, 18074817141205052427u, 4654715544003004969u, 11164881274682198456u, 2910265u}, + {12046124320615325795u, 14822064119975382377u, 16896049823485822714u, 14176973356240431058u, 306751u}, + {14439180542473722311u, 15839331825633022515u, 16753160950303833185u, 13768659032612563610u, 682386u}, + {16453859149496860942u, 7835087821027781613u, 12942224332566921106u, 12587813670141398u, 1384960u}, + {18418862887960410980u, 11149618581544060933u, 5095668791519463904u, 1106411913253831634u, 3388947u}, + {10888917749450102844u, 9689360415138712011u, 1369117091991974680u, 5394776997901444941u, 2652855u}, + {12948822376569706412u, 3978155034145987399u, 8369446816991800110u, 11145806024485339894u, 3535680u}, + {2328349949947081574u, 17884466916222093994u, 17395257054169319622u, 11882667217452520915u, 3152766u}, + {12919651701501898382u, 11818009135710052836u, 12224487070041520644u, 14541734681032475321u, 1770473u}, + {9917167449829353112u, 3289572243373083068u, 197558904316509444u, 5292863841630886780u, 1386092u}, + {13402273173314904080u, 6124611896270057592u, 8290178039035763522u, 962317612172543229u, 1079621u}, + {2201305028802349917u, 4111959337270118504u, 18405437487033836647u, 740491433625199351u, 2970362u}, + {6377841197767116735u, 17983821836253404964u, 14432812695885302791u, 11439893366353377372u, 1634519u}, + {12960606318193612185u, 8606985298789245718u, 17546728846738624890u, 13649036838284888932u, 3638407u}, + {5883950997282482135u, 13996090650274539470u, 15705643588582519399u, 355347152565741930u, 754586u}, + {16602611822030873776u, 15914291958684742958u, 5191889741489475090u, 4553548079568411316u, 3101510u}, + {10132749570880856861u, 15179093489110620156u, 17551639456166610u, 12955522098554699535u, 3214204u}, + {5803523891269526544u, 4511818939859768180u, 3634989930876310582u, 12381140192029892690u, 3070009u}, + {4533497581013110195u, 8415786978155788091u, 16177374597702684626u, 9568234095714612730u, 198650u}, + {15655179611016836084u, 5425015996454345051u, 2640303340268226012u, 11100533937119378642u, 1542495u}, + {1435501935405122202u, 17432804107514839435u, 17327037078145854597u, 5504831168483033687u, 1310741u}, + {17936735781459040984u, 10905561729132918127u, 16191466245213335163u, 3122655452909650547u, 3801530u}, + {14034077172678308569u, 13443927970010326707u, 12256441551939877648u, 6987654881762266380u, 3895991u}, + {10382843828295577556u, 11252894344056530641u, 8711250514870864699u, 13186350470781014983u, 779096u}, + {12115848985197203084u, 12013460591340545764u, 11194113697099257331u, 12192105190117022471u, 2300882u}, + {16311435839123881931u, 7690902494605086263u, 12144373075689185589u, 10130506958899821210u, 1963551u}, + {13082127335319028808u, 13436630619307548711u, 12635459401230921078u, 4864079933444355134u, 380507u}, + {4439100784266338626u, 8762310697818712184u, 14777768704308332913u, 4258417168349083157u, 2104813u}, + {1192254402072781u, 17255127820499030718u, 15026920005770337675u, 10487178086491984710u, 870070u}, + {12824619165008353420u, 9954803073273077742u, 1227037401375439429u, 15940778251485464412u, 2725081u}, + {848429487828552037u, 15924283854931909045u, 2079783843414595500u, 14966190853578989502u, 2096968u}, + {13316174849403278230u, 852168387697540620u, 11291063708340407813u, 16035468123412951216u, 3820390u}, + {2468107298017060848u, 6396606054593240766u, 5740653625488847492u, 16283432431161012957u, 3214147u}, + {3179535081333750469u, 16081945940915674645u, 6620988565045514247u, 13389945460424381925u, 2152211u}, + {17788078231973019871u, 16166436225869509009u, 4010412575738150336u, 14018874542257587552u, 3052954u}, + {5211988854746021819u, 13995090807411707192u, 12947054230824992103u, 11585532121194152172u, 206881u}, + {1525830705410219439u, 10546571594631615057u, 17377236323780855733u, 15496199010600751466u, 144482u}, + {13408273318921678767u, 426314983648306157u, 688697733494368586u, 9298094868866160458u, 2618461u}, + {18192567083055711751u, 16986830563382260105u, 1847320298349121350u, 10424595630693707239u, 3634831u}, + {2012028176187394830u, 11571522855055793917u, 16669292093900964309u, 7344867805463502929u, 3853858u}, + {3924999571275384445u, 1089184713436514136u, 11718062811982368219u, 1224012644174132926u, 1406106u}, + {2677531476994255328u, 14056916512390275065u, 17684897650360594309u, 2475896276036069910u, 2013401u}, + {8113554396166454839u, 69926547985729152u, 17879984961414735548u, 17042732888391640056u, 3551050u}, + {17502216478034623969u, 6100243153833231220u, 12131258793950966743u, 18224019025143519063u, 1715976u}, + {13712389659664429402u, 8316596641697331274u, 12679116443420083728u, 18046052697814630846u, 333297u}, + {1990507185499903790u, 3993375072373559903u, 4419633252312811316u, 4113431122667480222u, 804451u}, + {5016958903235213610u, 17615547145184283658u, 3219381821371920129u, 4986813494447298429u, 48473u}, + {1685526124016164889u, 314297137329680456u, 10012538453602478994u, 433239738239866033u, 2540542u}, + {851103996325729849u, 7562934006618946014u, 16998340880101876493u, 10495215864015300669u, 3287252u}, + {12104284139956588449u, 2985910073190737806u, 18153439033708247328u, 16561828141530503078u, 3525028u}, + {3476150766681737058u, 16388864857651718144u, 15575477496940519550u, 13323622608909228598u, 3351296u}, + {4990634681504654786u, 17422597350515264064u, 7410480167613190835u, 11879265935171050638u, 487917u}, + {9265614790626300184u, 12043860684169769522u, 8612314607919030960u, 13051425012772434494u, 2890539u}, + {3026282268485001915u, 10416655914982475505u, 7212594263125810923u, 3440027966002114338u, 3810625u}, + {1574488657745172444u, 15679753336337322154u, 2376574068204387549u, 18444980107247531106u, 2880413u}, + {14027046640980968892u, 13679481422730975441u, 17458524584195811471u, 11654406899988963753u, 3795596u}, + {806546285738830492u, 11657126535595740216u, 4878184099930202198u, 6555199863087116819u, 2442659u}, + {18363754238963814885u, 4783853292553724868u, 13427454431229316090u, 3287650843694300282u, 509444u}, + {13138633053329796905u, 528725490258440067u, 9366551730179132005u, 17519392937592026180u, 1758720u}, + {2432781469343716008u, 14099495913690050735u, 3875987446623033183u, 7526432455201212744u, 1598521u}, + {2441362810193977812u, 7985301537848058099u, 6640323905363332283u, 12351336095795559777u, 3338837u}, + {17598649317318199015u, 10909378387927754211u, 18160272951733729383u, 12239324076403989457u, 844194u}, + {16462471273381558052u, 5477361457608930591u, 11453711821312030642u, 15868243331250031157u, 3272668u}, + {5464095007546069337u, 15882922653126116241u, 2177871408433936446u, 6185265578126336782u, 3034100u}, + {8320241016713873335u, 11822993443957224894u, 12625733456132020492u, 8702880556930660048u, 2678913u}, + {17742298011562053053u, 14633532541672375696u, 18058134940649743559u, 11794805059391867600u, 1776950u}, + {3545276809789484944u, 15394257288383044856u, 2507259336463848744u, 15525161671831089487u, 2526039u}, + {1174636572553836901u, 1907624305851627769u, 16336778021863986685u, 13233136919419183161u, 1978960u}, + {8836383420364002179u, 16500439563828150904u, 12639386625002898419u, 2414405985136867061u, 1580793u}, + {12305884813894160378u, 11156288361017399765u, 6725287200806764000u, 9756935681439188888u, 770954u}, + {16837219124448980083u, 13120358004342459563u, 1766285934385705455u, 11039033488690512563u, 885847u}, + {14602986490941225363u, 2662243248976436979u, 15880641764850558753u, 5132430180629380329u, 892285u}, + {17133118441598533070u, 17158006149572740248u, 16474102570991322877u, 520862916433735659u, 2801175u}, + {13038560572303931213u, 8796488958087065287u, 12574858770672254387u, 10211793318199375245u, 1496449u}, + {14508690789721459799u, 4012536720493738384u, 103058817321437431u, 7449536807840729311u, 3063905u}, + {8162362851056427065u, 8875645141246992409u, 10786729741835207719u, 15981247361232769727u, 443231u}, + {662529597411644439u, 16893360126400108796u, 9317100378555137476u, 8366857093203422295u, 1851917u}, + {769287594034467117u, 10289176005561790349u, 16666082958197729286u, 12356010427797286120u, 3896620u}, + {13064330306922935209u, 3353210889460889424u, 15038229245281641413u, 4755623576713824380u, 1671101u}, + {196985561903797715u, 10757634765569053991u, 2377298258308868221u, 7452758563130521090u, 1145937u}, + {1895582237676294374u, 10546076148741827324u, 10712121721682632215u, 3551960921874821929u, 2653537u}, + {1716811540589382591u, 11790040045879895131u, 6295647255498710608u, 1850388972429278344u, 3401880u}, + {1969946303432560489u, 7114019920381508714u, 16246350481336315969u, 12168429409951753269u, 3665459u}, + {14915549269803763828u, 18148773399525827453u, 5692388776039685424u, 14695307385953475757u, 1472237u}, + {17797661843764160235u, 10426206907298992077u, 1770163383616868557u, 14222504019321956707u, 3733568u}, + {12460010265730101678u, 1108872110584329149u, 9773132881322355106u, 5184961364293179098u, 1287606u}, + {13425431679536483709u, 14124520859514312101u, 3896881963361440701u, 10255930496920501137u, 1999082u}, + {14953334023846589584u, 6336668464299438393u, 14464417598678698285u, 6305887245592020366u, 443838u}, + {12522843341188714448u, 9502247503574311617u, 10370069144860224863u, 5340449331108741609u, 2231731u}, + {9535415419687802922u, 10579675231609735376u, 8232208288959670032u, 14957090141789895974u, 1458452u}, + {5891562157355591945u, 5860348496539704119u, 14081403373252783279u, 10475254841244430704u, 2649200u}, + {4186695306080778960u, 1203394440137267346u, 7111919059883805408u, 11217796200754156265u, 204820u}, + {17187518303730725049u, 9250997291687147313u, 2142504199549383310u, 2237563688514739407u, 1129170u}, + {6270033293744974825u, 17245612787480313114u, 16841473855806200575u, 13423542003297870398u, 2288060u}, + {283961104866813847u, 17887422263910856681u, 17863372413154339289u, 10058212841940816983u, 1228078u}, + {12937602576603773702u, 7207057795761843910u, 12364687121623287760u, 1463805931385324640u, 2213356u}, + {2866234557437694595u, 1020332513518089281u, 13132383511799485876u, 8831855685767023601u, 3427452u}, + {7527358928269156427u, 5358137281526168460u, 16092681897362118840u, 16492356779348349043u, 1874087u}, + {5924659967647371785u, 15822934542255463404u, 14899871193224068862u, 17976911735197278955u, 2314492u}, + {8545301237668750555u, 15058639718205825225u, 13578611932131414708u, 13805695320805795678u, 1943675u}, + {9618378097655267336u, 440345120534235923u, 10017033585004334722u, 14519430890716677869u, 3850231u}, + {7079729689926341776u, 12307065581586280226u, 6358614182681561898u, 10447317781862716475u, 2607237u}, + {7204806562754139897u, 18438305991874980237u, 1648428118158855846u, 14171383475559699508u, 1036238u}, + {12042334648601737039u, 8068666787427795257u, 16734150495377097512u, 18177628928914675985u, 3531297u}, + {17490555649398369834u, 8488780342183935012u, 7518928632521434509u, 12026701560480924623u, 2274939u}, + {5114285803589305113u, 2707547820600591470u, 2299867138649712154u, 16975499828456067254u, 1476676u}, + {11212932286466450u, 2768761730161229683u, 5500370275796742077u, 11124109363068191098u, 1509623u}, + {10591991522840906315u, 4838535465185147277u, 9359727902684301212u, 7233607044045688597u, 1265932u}, + {10956114803065177685u, 18139438957367420417u, 2620077935866538616u, 5860017447924489140u, 3640392u}, + {8166501725024925217u, 17832829217952259801u, 17542163929850433669u, 12172829183783890357u, 922600u}, + {3416305595812353157u, 5827440490042796172u, 1933439364185814284u, 16157920042751091280u, 3211273u}, + {12168568204820080484u, 7014674236340183419u, 12869526843050842747u, 12885489286090906143u, 2901933u}, + {4078847161000605062u, 16527623834700351800u, 6282589729863540423u, 6538714691669055706u, 986037u}, + {6735394292451418516u, 3123055758278842711u, 15049619324600412737u, 18032587688206907036u, 3581072u}, + {11656214078902791117u, 16438700600025141627u, 11649476543071302250u, 8712970421277467219u, 1520131u}, + {2959740751377802414u, 13809212154131749122u, 12636922024626884902u, 18042439985710466595u, 3219263u}, + {15961575140120215373u, 17333102157405270227u, 17975348664929502495u, 12237118331119223601u, 1384375u}, + {13147459430585262279u, 7725343530341035395u, 11762079400979442394u, 10690061141177494519u, 2088674u}, + {15572624536942844103u, 1137877122628924091u, 3495504961094459864u, 12720665796096789101u, 301149u}, + {9325251114103488985u, 4278907199197402484u, 15797715719868501650u, 6130450724475593913u, 255335u}, + {3215938446348274925u, 12350700546874463006u, 15448507577448017486u, 9372197330459143032u, 1591773u}, + {16288467309562449713u, 603368771980027125u, 10396551771251878191u, 6586604095978080380u, 1682711u}, + {8740217090633699166u, 6015658247301080836u, 5301434803524903760u, 4786841752256863745u, 3635194u}, + {1218989265116817775u, 10275724555118563170u, 627876426577561165u, 1580266972959612928u, 14324u}, + {1128595452374442129u, 4341414609371569165u, 10643042906128305066u, 9872154615938506020u, 2767533u}, + {17716742014257898791u, 14766460620536175281u, 8319285093168177530u, 267224764952484040u, 3407646u}, + {11800913781492714272u, 12167080338686738243u, 12516853289372306477u, 711378320264376247u, 2187232u}, + {8108904239363271997u, 6318036070235930508u, 4879959963040506922u, 2922651071162323650u, 78367u}, + {7047978728242085342u, 11809562655180175566u, 10953948208814944864u, 12251236605363224587u, 1625967u}, + {858048352281706709u, 17860237383967101151u, 16152656429131473947u, 16675298032133887119u, 2683628u}, + {17036517330145131995u, 10196449223137773665u, 13245315054655771343u, 7399378807448988520u, 1406207u}, + {4470467816311105079u, 16862667844635264567u, 16570138955888130633u, 11338982211997723646u, 3535471u}, + {11469080269725378851u, 10208397657892091719u, 2934780743586752001u, 9720935541138347618u, 771784u}, + {17556017351265071509u, 15103459748220436364u, 13332394649278528598u, 6787650751214345377u, 1481391u}, + {5148633493546061410u, 8264567959528787479u, 10926435101395626565u, 4639012865865135321u, 2003881u}, + {6936958453366975483u, 14951381910440869624u, 15992534226432096094u, 1406059371320812819u, 2336015u}, + {11733262458198169407u, 1318009511947759948u, 9943958304956526598u, 10563500601800884645u, 729833u}, + {3312330655534858519u, 2166196841355608910u, 18178247536249762665u, 10029468624403031368u, 2008683u}, + {7660071833791011123u, 90864992571219424u, 12390919591049342657u, 17763221804585952003u, 148962u}, + {1181762184969424451u, 18286961641707645519u, 15011491700042560104u, 1660072544526272254u, 230735u}, + {2006525532312890521u, 10967008627706597348u, 16941305563120023840u, 6993842932832929709u, 955664u}, + {10439234498330431960u, 3472975306126125035u, 14176004317657175237u, 16302645148794014033u, 3402440u}, + {17854351155690060793u, 5263874440208899517u, 10963952828206109668u, 17356586525311502115u, 285021u}, + {7800819306577070710u, 12713091742021377995u, 7796443547524947739u, 16722619543598500447u, 1781438u}, + {17253599433004056196u, 17529457951752684852u, 14945630547211955900u, 4356317389867476699u, 3069517u}, + {447780488756473895u, 17589675821517917776u, 11347812934186477180u, 15765178099153508159u, 2724913u}, + {16718066630444629936u, 15814678751070301381u, 10627493326165028475u, 16983800387412367174u, 3857687u}, + {5311627023328768695u, 3858024585541248128u, 8434577575654705975u, 14698853371488647774u, 2121942u}, + {7500754280094937955u, 9307790078531502225u, 15934409068319557909u, 7893420685846253788u, 529404u}, + {2918689621215126411u, 6617428937302235116u, 5717949303739294841u, 6999352409672028609u, 280096u}, + {10180958979135442003u, 3863795271292576873u, 4454219912812413679u, 8219732586551206864u, 2764023u}, + {1411300059960611670u, 869826539848354579u, 9915457575762241037u, 7400861824983228954u, 506134u}, + {16916060165684036626u, 16749676916171152452u, 3335936841427715306u, 10313572479189559583u, 1239427u}, + {3721084388801451517u, 16490045299553270025u, 11442950972119272359u, 17028455595931610983u, 1074558u}, + {7570052811477962593u, 6567176213598426334u, 5478622329993429371u, 10540230842984291440u, 3212548u}, + {14002840755616035077u, 681538928690927346u, 11237184793690148768u, 17857486788688938507u, 1949302u}, + {16968628953220327779u, 14466486268684013260u, 1348651413261145841u, 7241717696766650565u, 2960155u}, + {8868711926996236834u, 10085657004926166708u, 9786201476739862667u, 17564600580161717842u, 1083372u}, + {1535688575312956601u, 11962805240651091638u, 9500940094037620465u, 5928707414695314196u, 1305510u}, + {3763124982780409912u, 3229725342592334759u, 7849428221298571319u, 14795889192559602851u, 3327017u}, + {7751479601644452863u, 2168143362148726646u, 15650444999211832135u, 13968488295243861771u, 3031262u}, + {12018240711077695453u, 1845440742628152639u, 1742869849297881160u, 10071922499574832362u, 2971979u}, + {8341386267745295266u, 18425891433332213312u, 1420407153731480723u, 3585645453935830603u, 3382519u}, + {667120457235036026u, 4396280362591800741u, 13990588219138446724u, 12168072264274998660u, 3244573u}, + {17396554203063512446u, 16375351290862522879u, 5356540249181498687u, 18434538299599163965u, 2872350u}, + {10652251519091834578u, 17927610782401436582u, 3382792802747873179u, 12014546134070695306u, 2692930u}, + {16447018558051822279u, 737754580959252530u, 16675306674788413887u, 7471607988439538204u, 2492204u}, + {7320991249847375826u, 7265076293605366772u, 15036676545948692849u, 7900250806973228251u, 1705810u}, + {15958831191300501576u, 17826118595178530855u, 3971901501018595623u, 15667964554638987409u, 3105766u}, + {6294461909864731650u, 12895267722325137392u, 17030131254928107633u, 15477616410339371477u, 1417705u}, + {13253736813570708552u, 1475609397012591830u, 3931605439133259208u, 9753927251904906170u, 2951690u}, + {3042785246230298567u, 8442900774322367943u, 5798498069645500244u, 17564444430985343446u, 1450613u}, + {13803419512608551569u, 10969015254682874605u, 14456419184583674298u, 15807372198631658448u, 1743887u}, + {12357237990264977617u, 1724691961837616180u, 8681588226387293668u, 4571797477379301295u, 2690698u}, + {13068791313076974860u, 4310500052915544134u, 9101056537077287383u, 8696545906508791940u, 1700402u}, + {4527825177582223783u, 11220559240150482062u, 9144817914483513526u, 16748728706012250927u, 433898u}, + {7862157244499567090u, 17491148250229962344u, 725512206004501581u, 2241789437284589149u, 3650725u}, + {16794059402023202791u, 6294434278174426291u, 1990601970330821129u, 4534914822351814772u, 1541366u}, + {1996024849541693018u, 6551943656909997061u, 1622616710059890355u, 749009129040111579u, 2983525u}, + {12491178901733072470u, 15567473313958233083u, 465558541173272825u, 12809230467574768091u, 2747938u}, + {5418310996440569102u, 7739066024598350940u, 7809168986532313839u, 18137146625345563681u, 1359465u}, + {16156671929292545905u, 7448857522464231736u, 17214669830147618859u, 3195611858738141364u, 3754656u}, + {8191602122652858561u, 10381868505457692733u, 17901927990209483745u, 5761811110508736812u, 3423437u}, + {749610699467786622u, 14850850330196433792u, 14099971838613610867u, 6836565111518505100u, 934647u}, + {12185516554099475860u, 13937778746060721606u, 14900258886451555957u, 9817073990003024818u, 3152043u}, + {676251267354259213u, 9112072753426856510u, 3825417658633537417u, 11803532768529655234u, 618853u}, + {6531279553240212390u, 14854711601396146923u, 12467631948347024288u, 12405322009237385137u, 3473408u}, + {15391877871656212221u, 13590043397835476999u, 9164572406951415980u, 4747816693310213195u, 2475911u}, + {18315972445585011789u, 17753617197249900645u, 17733507567006195555u, 9413159726244730662u, 2886843u}, + {14891295119660051104u, 10649651340191243767u, 6650400822105997720u, 3584074971273608493u, 1045587u}, + {13400545880514201808u, 6956582271234302213u, 4042181263263400004u, 13926403328699964368u, 3849838u}, + {1380173101017197369u, 6927911231097229337u, 8747493562607984515u, 17436897153378277737u, 72688u}, + {92143277362527462u, 17477759396174431132u, 4909444976744147510u, 5621833209328505961u, 2563303u}, + {952811151200412743u, 17840393230911028547u, 2111296438444865176u, 7180986409801070788u, 2989343u}, + {13587274361627416083u, 2567270136492746358u, 17662740407896668003u, 13169625767353405893u, 3182448u}, + {2845388556692453869u, 7202814918624274144u, 8755596954198963160u, 2508664014243064406u, 453647u}, + {4307454053867813514u, 1673549282464259798u, 3781729343055393616u, 17374248475758102707u, 3470072u}, + {14558228682096816964u, 17796735416588034479u, 17586001640625819919u, 10656477871051000518u, 3684037u}, + {7652612295328150259u, 318849757054772097u, 8444076622793506581u, 284131280467338394u, 1011912u}, + {424566745924993257u, 15973315291043875717u, 4836518374736234251u, 6143561975197121420u, 1165523u}, + {4363530474777358033u, 17824728346572910659u, 17067971486186238605u, 237672892750367960u, 3781857u}, + {11749173491811334791u, 12381745305444948832u, 9153253618515335853u, 13328360251418780100u, 2593212u}, + {6359050763505694290u, 7105946389834705735u, 3394398151303447218u, 11072648219224206953u, 1290220u}, + {14304356346511421877u, 16745835959802988573u, 16790272078082926315u, 4059025635335394172u, 2927207u}, + {4002196698758993064u, 14277626065504710099u, 14621086454626146201u, 17780165575769069006u, 274518u}, + {10172231585790004133u, 9618835287492714980u, 8477940857451202210u, 11750451809252045742u, 1494553u}, + {9844329666450151589u, 13455432372898889596u, 13805421340263842066u, 12061187852780011952u, 1840079u}, + {18381242425466261574u, 1337417034743855050u, 14905515544135226028u, 16030729354869597042u, 1645874u}, + {1527769582062084326u, 15072436945950238777u, 7858855804196897509u, 14369822246033961253u, 3185407u}, + {16284534074656140425u, 5420667054068409476u, 13252675260353892682u, 12885012140820597775u, 579679u}, + {7309234069775559970u, 13645973510604550191u, 18295647525677490813u, 6063531102228862643u, 3228794u}, + {524249667035496328u, 7379361080280405121u, 4229723086906554805u, 8922644809313396188u, 2789535u}, + {18085060404940800665u, 5425327136650210412u, 7019627111739280736u, 12805651991865544855u, 137u}, + {10658628725227318835u, 10514383806987403368u, 1367203447132470445u, 2540009590090u, 0u}, + {5745487999969297719u, 18254084167742544389u, 176905937241044680u, 2540u, 0u}, + {4092327334170316997u, 9263020011081365389u, 46854906853159u, 0u, 0u}, + {9675692348400237894u, 16728488145771055742u, 46854u, 0u, 0u}, + {1890271189728507222u, 864320475317733u, 0u, 0u, 0u}, + {8768064576237080165u, 864320u, 0u, 0u, 0u}, + {15943898605853216u, 0u, 0u, 0u, 0u}, + {15943899u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 3878726u}, + {1236863339727285996u, 13796044224583936138u, 5558395355530955723u, 11096361753657017362u, 3001469u}, + {9772675530663235582u, 6433146669470405642u, 15427773297742639070u, 11800755169766788255u, 113427u}, + {3784287464753637939u, 2370939029832279457u, 1437670755771950067u, 12612171327278192623u, 776719u}, + {2375849163074216188u, 7651187382841630986u, 9220061345793305689u, 13633213222390738840u, 3025180u}, + {6796642535481012426u, 1507711596397201570u, 13806091511218160423u, 5460124287714713083u, 3283218u}, + {10314558088121198596u, 16921160690516828852u, 6498665667507501924u, 14400025901191980078u, 1326698u}, + {4567580085022635339u, 12810530702502955070u, 16635717382577935734u, 2258258688044894231u, 3546992u}, + {651546051907237606u, 11470247864731587183u, 17532399916207161987u, 12819624600626998549u, 3100228u}, + {8576367375643426821u, 10064158760558057571u, 7643721963782973469u, 18287760416901540824u, 1822867u}, + {4423640858700307870u, 12069878149120331621u, 2345390917690065528u, 7383500571185820598u, 1208572u}, + {2264154644856092311u, 2635167725717120677u, 7405868763512582048u, 2400194829013773759u, 2030135u}, + {9264218830542042177u, 7999488714336635116u, 10767768857413485681u, 8035842321390276065u, 469506u}, + {11628746824165629912u, 16753655000553798239u, 2422016205385851948u, 729236805438192758u, 3452190u}, + {9227505871596720575u, 15689647899494297937u, 7958511965388372588u, 9287053703007831990u, 284299u}, + {6325342232328142037u, 5498933324716669011u, 15176305587829492291u, 11030056287983439462u, 361647u}, + {13492643160197627523u, 12879349129093032611u, 3628677746914202227u, 13697614087890388966u, 1913711u}, + {5489621830386369386u, 5935138443056247885u, 11492246704662277290u, 251474532859440675u, 3468434u}, + {7473628066411381761u, 3649466849309224273u, 14925814394340993604u, 10800562826237289711u, 727776u}, + {2058967455290511959u, 1878218634526842113u, 16125695926343803265u, 7291242106246272404u, 2047965u}, + {851966880046707092u, 13884775149938778045u, 2241903732687837073u, 2343621302731850640u, 2092882u}, + {14358505171812722043u, 16582285639438038478u, 9906786128095755470u, 3569428968832563560u, 973002u}, + {12439656881196520909u, 14749635505081368419u, 17967770536819701904u, 2467906919736186333u, 442269u}, + {8265564616000543066u, 3493807734500026173u, 7744737072635740543u, 5916881136632733121u, 2777845u}, + {14034595700983049379u, 9039022640326815693u, 765182776285160521u, 9058441456449306846u, 1505698u}, + {3259111967204236369u, 7327045740545532488u, 16572828146652551881u, 8458513737154306292u, 2549908u}, + {3501503852211006851u, 691122049890577133u, 9156182001748405758u, 14602671504407461384u, 387125u}, + {14286286909283449069u, 1533040684597538306u, 10640181308141944226u, 12617220167039595114u, 766248u}, + {2797775518688862103u, 13984209906999457777u, 10076568677676370599u, 11183061869249042043u, 3841203u}, + {603102594356862543u, 16387785937035890780u, 831507124596811133u, 10663324023434633812u, 3595775u}, + {1010814798628839195u, 15086664584216522456u, 7317015628842586656u, 15702828258065329098u, 1286123u}, + {17053045483860733684u, 5953393583006579270u, 13251289927778860993u, 13210264506471952095u, 87872u}, + {156642204561916776u, 13609235695063095652u, 3533533737148361874u, 506024123771005064u, 1358962u}, + {471704865705449827u, 7939736363948536433u, 8378283455203566210u, 7086712640442858331u, 1495740u}, + {14671336937137610074u, 4185133588328928841u, 3264597248472194247u, 12277382526515272085u, 2950597u}, + {12084216070026241284u, 8874227546031012845u, 7098064308335790471u, 558832078266533260u, 3690142u}, + {10893941898331371560u, 833892139829248057u, 8963323349018344813u, 8138521637876407622u, 273972u}, + {8335648480663845392u, 16826846877719222001u, 2799226534254736535u, 4040279165629848407u, 3723705u}, + {7874229443265268503u, 2146771715931811243u, 9778723942906207032u, 4031857909267308271u, 3265041u}, + {77407471288182403u, 8576493866462765911u, 7105031465619116526u, 3302821111455783737u, 3399425u}, + {3721590015664603276u, 18129429056794709215u, 17672064522596644333u, 5755258255271898147u, 196423u}, + {17879403081803110893u, 10823106407133539867u, 9757732079531997614u, 16576869999289873786u, 3701950u}, + {1291709420000827128u, 4129764655857391538u, 16504762842853093617u, 18370917826434234817u, 3092057u}, + {4688373451371621179u, 10863525201647733055u, 8768640055479695260u, 12811232547224484633u, 2077222u}, + {5196148511829758205u, 6070222490599417181u, 8326406217035757294u, 16539507030115008993u, 954111u}, + {8121060083700759111u, 16121266319280535560u, 2156468090879763418u, 17600257974418124u, 3026493u}, + {905759491842376365u, 327533209663864371u, 17955706727380059295u, 7910106691963618723u, 2861097u}, + {10603791536984523400u, 18164377825592684979u, 17773465141922368430u, 2574793723366642628u, 3029115u}, + {4889886301687460870u, 17686677693823046000u, 14940801439398153292u, 2289662726925394447u, 1310172u}, + {16814738789453370615u, 15572004896901882387u, 10795632302936875160u, 10256346763251969829u, 1373191u}, + {12404939318096037981u, 6355731976708736461u, 2676557735585469153u, 6798744752762894040u, 2274424u}, + {9945227326680738465u, 1417431901439438311u, 18217326052412056169u, 12363804304727524581u, 1503019u}, + {4065484853879103049u, 17611378270681402497u, 5309955897388902620u, 10980480112959773433u, 2776875u}, + {10370111395951964988u, 17612957678656195804u, 1908379007407614056u, 12301015299877911444u, 2998091u}, + {4288762861066362003u, 1015272950959452108u, 3539496691167509788u, 18141761133207619179u, 3102977u}, + {4542981714709429899u, 11412217753387860597u, 10189612697889363623u, 2218967661865206256u, 3778468u}, + {15390440093541321312u, 7585351478792674383u, 17351201988390330141u, 3816695324377921515u, 358034u}, + {3593694031948124707u, 16605498646946089433u, 18100027556506838704u, 12904913898173482393u, 1713264u}, + {15491240849843293577u, 15485823552182739686u, 7624353252008087554u, 7021190777122623611u, 1607117u}, + {3709555356798004469u, 801055078868489617u, 10829616437079516901u, 6586887140468140826u, 3572590u}, + {8374359334853019819u, 4592921197946670457u, 8779658972569306297u, 2011457699021235419u, 1860358u}, + {8724078469051360474u, 14112767317097612337u, 857293015183800767u, 9978265527156991021u, 1494347u}, + {7534338296640776495u, 5838024379522001421u, 8959690090511559760u, 5648058181602960182u, 1526438u}, + {567477582855490781u, 3537856779549002381u, 2814677822235147577u, 7450090002685020650u, 542309u}, + {7166930428484406253u, 7793931646958334661u, 16829739273830533120u, 11611276482888357051u, 43494u}, + {1777001814480463226u, 9991583012249526990u, 2330623551928571320u, 10088865499607929446u, 658509u}, + {15427852319812857302u, 16777962332552051834u, 13522016626214495435u, 3542969464940568766u, 2341005u}, + {2582702274343901237u, 17496267688436421680u, 15151839160219201909u, 18273755215249011701u, 3669436u}, + {8244771085735565652u, 15475334088757154897u, 9087240190490746894u, 6696987816549981809u, 3794672u}, + {15261537717643914194u, 6261981011543455284u, 3685138557408511119u, 18444685829596283068u, 2676839u}, + {9339887959578848115u, 5294521605347549240u, 636502915700126675u, 4372834624679886592u, 3498067u}, + {3251718710398970650u, 16486130022008702083u, 14252191770900266693u, 6549711414488037814u, 3583918u}, + {17026929231478122192u, 6604648745038403902u, 5470369093483395853u, 9505656443645432019u, 1812607u}, + {1552143853948173921u, 841436228696517957u, 16075506089399585311u, 9689154308023214316u, 1628536u}, + {15392606771322405081u, 15558507526545116159u, 6894073861052913660u, 17107690983484897798u, 700330u}, + {6194790904441297550u, 13791444581401152335u, 14169517417822703202u, 13199458534325644281u, 3186102u}, + {13294223413769366017u, 12982741201010558165u, 2739066892436360518u, 8273338941709977388u, 3080662u}, + {4534750804955945324u, 4716526219785161823u, 7571045153093390301u, 16558017226450438500u, 2803272u}, + {13593220341120122684u, 6303074130028119456u, 11586880534844622804u, 14174999689144888604u, 1815509u}, + {7871635375137474958u, 14113197552219796397u, 9033391761344644579u, 2555506035388993803u, 638765u}, + {11114286333617867793u, 8632560967707056779u, 2342515938675615471u, 16801202547870958205u, 2541720u}, + {15604571491740236745u, 17040531644577988987u, 7459452404526416731u, 7901164225282376613u, 66783u}, + {11737448900093078607u, 1232969083073160890u, 4942767100163878992u, 13620117209979018674u, 260763u}, + {6755953159486681403u, 9567534860732327661u, 14518725423020138774u, 12470774010506542861u, 621354u}, + {16039134903649453287u, 16177491555992656874u, 4452138759946793886u, 5271666335456689063u, 1323044u}, + {17143625542438369780u, 3054075394396926502u, 8576410913760033483u, 2834652026817112819u, 2294055u}, + {6559159978700591281u, 4934376151494717423u, 4603490120165105590u, 15678815754541027904u, 597451u}, + {5949945343056120213u, 8337875015160720461u, 15929846705063696165u, 7577068415354830879u, 1686429u}, + {13069726796401892245u, 13694443200572401463u, 14334045136290256328u, 3345758457483235396u, 681824u}, + {585248628229168852u, 8083953710178280014u, 14836033374353028773u, 3687514732111396134u, 3568473u}, + {3419400896546436302u, 1621616478349333342u, 16513497676398201564u, 8640680402365881660u, 3179171u}, + {13459610406658197830u, 1821562483342620942u, 5284475611010244052u, 8849671835071447863u, 168581u}, + {1391771399178886407u, 9538896143572534393u, 18307005546970355609u, 11388209637404975752u, 2371045u}, + {13858296693008928120u, 3218262533401022546u, 3990666657612090477u, 4583366496079918269u, 856678u}, + {13333168833157329991u, 7058948208842083536u, 6257318530153925543u, 12986169851229972327u, 523417u}, + {7789594587414244642u, 6414322645849804567u, 11218649340002884947u, 2747843925870260251u, 945915u}, + {8142101660069787166u, 3318620971498309589u, 7140898652153176122u, 1026255371199318000u, 3404924u}, + {3153113870811202861u, 14290203171314158799u, 9700684941103818670u, 11519967214675228616u, 3582727u}, + {16568898863425574326u, 12565601804930541986u, 7521944871058205277u, 1074895976105927519u, 818499u}, + {12136857932868573706u, 12028209170368553633u, 7269343548802640145u, 3545920750510952034u, 2323651u}, + {4249811695724499357u, 10030840362650549127u, 15366544571376225340u, 4006031470945576503u, 987081u}, + {14399777662146667577u, 1175133681898698778u, 15942587494576836256u, 10250386787978819680u, 387083u}, + {7387273941031835501u, 16389230839243364150u, 6400942880768644914u, 8365821339686311078u, 2060765u}, + {10508744528605552721u, 9654487256535345983u, 15167970314281753103u, 17620067358171295787u, 620412u}, + {4330916530658752886u, 6777975120286587180u, 9379829569176695507u, 1236423697649100560u, 3556513u}, + {12353480139216987041u, 9245755230658069729u, 3607732459346208993u, 8280171806666029380u, 3729918u}, + {2500497215550373865u, 17823754757586628356u, 193264106297769701u, 3239338988710923574u, 224378u}, + {17503333385881741754u, 15348422555892856506u, 8917495911343787234u, 15640636953011471902u, 2880680u}, + {8955622028240280890u, 5968461511017041710u, 2963483869712801019u, 11582354228427360344u, 2250763u}, + {7105297079463931956u, 6154900991549376101u, 17547342669125092823u, 4364974902889605119u, 728734u}, + {13130853552033366438u, 13292573094217665752u, 5108627726070083569u, 5705992702957092503u, 1720161u}, + {15692163367680363819u, 11466179454254917006u, 17974925784240062479u, 13218271084379381286u, 99150u}, + {4080122553962712430u, 17845067648294470679u, 7786512473162678052u, 13332483904909847546u, 1656611u}, + {8718763994682976118u, 5330149898242271463u, 17007546116763280832u, 15594999404671610134u, 311927u}, + {8454173642209198669u, 10326359833897719412u, 18050769344590364733u, 13840812108415843115u, 3440690u}, + {4522064734408732535u, 5822405111700014439u, 10431599757490704789u, 17213176922734632593u, 924060u}, + {10960439783717284691u, 9189364307832420717u, 16852088820369339u, 161161103617784843u, 2588021u}, + {16087456522889903555u, 16452544112755518099u, 1855314101987897371u, 15684238467435909083u, 3304050u}, + {8481873501839902345u, 5918126859244667920u, 8351835009934551810u, 1213870485047825487u, 3850353u}, + {1858034285780772070u, 14861301531501837103u, 4448357355712233752u, 7853246633694527366u, 2155279u}, + {3502358137974726732u, 11666337678623094231u, 7229430823638857263u, 5011731876590714866u, 292209u}, + {4567661004076686753u, 13018365790848272107u, 17688114536677488382u, 2959751665205811846u, 2021572u}, + {5524757556259510698u, 6793204441963071067u, 16330389689764443309u, 8395972332669969406u, 2879015u}, + {3844319677422228865u, 14154172807258767746u, 7668452571576637879u, 9997056438519398405u, 3192623u}, + {14106669726648702051u, 13936504960792266291u, 6056567340444013276u, 2508851706691445072u, 379113u}, + {1774694613351927376u, 11189207550930435764u, 17215270435935313122u, 1159914907601714931u, 1686296u}, + {5727043829555824375u, 9280531018550315333u, 12056225020006216056u, 13001473598731463509u, 523193u}, + {5453187031211487814u, 13253904608140872122u, 3137669375143101045u, 11394751078366243808u, 1547902u}, + {8251588009091513479u, 159750384905475590u, 13498468435874247331u, 5216700534170745632u, 2700120u}, + {17069144886991836905u, 1869824015871270421u, 12546360263649937850u, 10858447533514195568u, 3275300u}, + {12703015127642664232u, 15609866122320042763u, 17009380576434282742u, 18074817141205052427u, 2724455u}, + {758700337121520009u, 16956454767821491495u, 12046124320615325794u, 14822064119975382377u, 3183148u}, + {17864972855034144886u, 3566502997793913363u, 14439180542473722310u, 15839331825633022515u, 2865961u}, + {17202164755502366876u, 535061945630409003u, 16453859149496860941u, 7835087821027781613u, 2859534u}, + {7683966376448123047u, 12427922948808023257u, 18418862887960410979u, 11149618581544060933u, 1823780u}, + {7447515964499627488u, 15905749122362087774u, 10888917749450102843u, 9689360415138712011u, 812466u}, + {8642144911584638769u, 12960186461379658406u, 12948822376569706411u, 3978155034145987399u, 768894u}, + {966029248003407251u, 11530005668032911339u, 2328349949947081573u, 17884466916222093994u, 30558u}, + {14454030049692498985u, 5522001951698636480u, 12919651701501898381u, 11818009135710052836u, 2546818u}, + {926475191770122158u, 9131661563903880773u, 9917167449829353111u, 3289572243373083068u, 3890876u}, + {5986375258892282208u, 2731344010418093571u, 13402273173314904079u, 6124611896270057592u, 253512u}, + {17432172030390513040u, 17601997991953368856u, 2201305028802349916u, 4111959337270118504u, 2248685u}, + {6097694790395181877u, 7470705210372022717u, 6377841197767116734u, 17983821836253404964u, 1741857u}, + {9664624008813474439u, 18038192049796163475u, 12960606318193612184u, 8606985298789245718u, 917094u}, + {10460086982190612820u, 17314507585353533863u, 5883950997282482134u, 13996090650274539470u, 3340495u}, + {2934032998705672212u, 7461272172354535752u, 16602611822030873775u, 15914291958684742958u, 2547806u}, + {3915121765021031498u, 3343646489638440147u, 10132749570880856860u, 15179093489110620156u, 2398694u}, + {1778097658507097352u, 10017825714853382515u, 5803523891269526543u, 4511818939859768180u, 3095726u}, + {15563122829062043425u, 17556549944208713095u, 4533497581013110194u, 8415786978155788091u, 1121956u}, + {13148870015812638390u, 3468784544503512868u, 15655179611016836083u, 5425015996454345051u, 3627954u}, + {13972892804232578152u, 2389281101443626u, 1435501935405122201u, 17432804107514839435u, 1347935u}, + {11188089788956421251u, 11046694725344426992u, 17936735781459040983u, 10905561729132918127u, 2234295u}, + {9310749699927497463u, 5214299376486846728u, 14034077172678308568u, 13443927970010326707u, 645624u}, + {590574586865897251u, 1313142992869615803u, 10382843828295577555u, 11252894344056530641u, 2813503u}, + {15510993952435695647u, 3813565113916973146u, 12115848985197203083u, 12013460591340545764u, 2862159u}, + {13517407388346656179u, 12876772043473590881u, 16311435839123881930u, 7690902494605086263u, 1838705u}, + {4382178449028264250u, 1847209334924848224u, 13082127335319028807u, 13436630619307548711u, 2349564u}, + {14913471246496092593u, 3490141818594575777u, 4439100784266338625u, 8762310697818712184u, 1808603u}, + {7551506171030736688u, 117762855511826952u, 1192254402072780u, 17255127820499030718u, 588455u}, + {1109765723332791126u, 12266227920978902724u, 12824619165008353419u, 9954803073273077742u, 3882157u}, + {3565513092766740918u, 11427298328407210526u, 848429487828552036u, 15924283854931909045u, 3227390u}, + {7111988372232144129u, 11885211318889682946u, 13316174849403278229u, 852168387697540620u, 3010709u}, + {10518278027028489133u, 12809464346532336770u, 2468107298017060847u, 6396606054593240766u, 710286u}, + {13388260842650184144u, 953237707980950197u, 3179535081333750468u, 16081945940915674645u, 1384263u}, + {1361282159333907853u, 2184900917144374906u, 17788078231973019870u, 16166436225869509009u, 862892u}, + {255435054922478262u, 17620683491689181338u, 5211988854746021818u, 13995090807411707192u, 1418291u}, + {17784718357530078460u, 10008941149995222490u, 1525830705410219438u, 10546571594631615057u, 3579331u}, + {14587313824529051708u, 16113553518161107371u, 13408273318921678766u, 426314983648306157u, 2889180u}, + {14404935160766250012u, 8452751165828232227u, 18192567083055711750u, 16986830563382260105u, 2293510u}, + {10621415127049863406u, 17473530573854093520u, 2012028176187394829u, 11571522855055793917u, 451071u}, + {10738070211412914100u, 1243016840535668675u, 3924999571275384444u, 1089184713436514136u, 308221u}, + {6965309997793059359u, 14466084204011660599u, 2677531476994255327u, 14056916512390275065u, 3790725u}, + {15180808381724450605u, 7767111678423378736u, 8113554396166454838u, 69926547985729152u, 2569844u}, + {10248466474648779354u, 9357984097340266703u, 17502216478034623968u, 6100243153833231220u, 1624857u}, + {157003624813973958u, 8283275793072640665u, 13712389659664429401u, 8316596641697331274u, 1637546u}, + {715195781606488931u, 11352037047449561177u, 1990507185499903789u, 3993375072373559903u, 1815724u}, + {12164883815478384588u, 5978427083805316681u, 5016958903235213609u, 17615547145184283658u, 1413081u}, + {17030724953132358217u, 10772176779269433193u, 1685526124016164888u, 314297137329680456u, 3737474u}, + {15536970194265097887u, 12504751342269129159u, 851103996325729848u, 7562934006618946014u, 1710259u}, + {16386242315044563053u, 6137519092313611264u, 12104284139956588448u, 2985910073190737806u, 1723394u}, + {7716970201770981388u, 8304440255836776692u, 3476150766681737057u, 16388864857651718144u, 3074644u}, + {9051402125370636126u, 12495444902075973946u, 4990634681504654785u, 17422597350515264064u, 555245u}, + {4385034756861376248u, 6501904139692947617u, 9265614790626300183u, 12043860684169769522u, 2188048u}, + {3593506638916418629u, 15658069037189972211u, 3026282268485001914u, 10416655914982475505u, 2344881u}, + {15610296910858078726u, 3418637880497391788u, 1574488657745172443u, 15679753336337322154u, 3284923u}, + {16564676434611029323u, 13081530607148934491u, 14027046640980968891u, 13679481422730975441u, 3027845u}, + {9853394089285768058u, 11341498538038970166u, 806546285738830491u, 11657126535595740216u, 1520706u}, + {10648063787049293143u, 9006207439993879396u, 18363754238963814884u, 4783853292553724868u, 1318516u}, + {6201833811243864652u, 17869745939863980261u, 13138633053329796904u, 528725490258440067u, 2616455u}, + {11936673320858034462u, 3945826016532552512u, 2432781469343716007u, 14099495913690050735u, 3196563u}, + {4409997299655560831u, 14782842454129429267u, 2441362810193977811u, 7985301537848058099u, 1554837u}, + {6007771382572482993u, 7322037861101709780u, 17598649317318199014u, 10909378387927754211u, 53359u}, + {9427674972354197409u, 18061847121229953127u, 16462471273381558051u, 5477361457608930591u, 1639962u}, + {12318993790247248812u, 15739643428735934328u, 5464095007546069336u, 15882922653126116241u, 300758u}, + {12842869832510360975u, 16464612661808348736u, 8320241016713873334u, 11822993443957224894u, 316638u}, + {3706057740792793678u, 1217613625348660529u, 17742298011562053052u, 14633532541672375696u, 2493109u}, + {8998314402610691609u, 2081428997828641437u, 3545276809789484943u, 15394257288383044856u, 1850020u}, + {569775310761288149u, 17018991153611057490u, 1174636572553836900u, 1907624305851627769u, 3865621u}, + {3238472943259754563u, 11345038711971848534u, 8836383420364002178u, 16500439563828150904u, 3221103u}, + {17370721403680786149u, 15027068406393680676u, 12305884813894160377u, 11156288361017399765u, 318532u}, + {2281796219944809059u, 3678893381248696819u, 16837219124448980082u, 13120358004342459563u, 3695495u}, + {13495021457974016736u, 7099683434817668312u, 14602986490941225362u, 2662243248976436979u, 449877u}, + {6140893814451702101u, 18041364668044890858u, 17133118441598533069u, 17158006149572740248u, 296121u}, + {3734319511070802148u, 12169981406061882371u, 13038560572303931212u, 8796488958087065287u, 2676301u}, + {8867839290533520561u, 8857928398333956451u, 14508690789721459798u, 4012536720493738384u, 680937u}, + {15633259128007459849u, 10590324001363590657u, 8162362851056427064u, 8875645141246992409u, 1728387u}, + {10893583370962597999u, 12837300980106767156u, 662529597411644438u, 16893360126400108796u, 3089848u}, + {11867265440277347800u, 15129234814494467758u, 769287594034467116u, 10289176005561790349u, 2090426u}, + {18046432288557426057u, 4090406059818554739u, 13064330306922935208u, 3353210889460889424u, 1141299u}, + {2176422792214548504u, 8964485564674306561u, 196985561903797714u, 10757634765569053991u, 1391433u}, + {9799892724806117571u, 10698255974832398705u, 1895582237676294373u, 10546076148741827324u, 2420601u}, + {13050143810530165861u, 11659357076014419579u, 1716811540589382590u, 11790040045879895131u, 2839292u}, + {1725054423993049056u, 6314199460555524912u, 1969946303432560488u, 7114019920381508714u, 3378227u}, + {16406838478372569545u, 12021942786708568080u, 14915549269803763827u, 18148773399525827453u, 2705808u}, + {10750099265221827155u, 9599949840695761189u, 17797661843764160234u, 10426206907298992077u, 1518327u}, + {5162845909838941364u, 6752629496788957651u, 12460010265730101677u, 1108872110584329149u, 66810u}, + {12760173422159910575u, 16349936273124574605u, 13425431679536483708u, 14124520859514312101u, 3667735u}, + {3650358848443943478u, 17966410870650667066u, 14953334023846589583u, 6336668464299438393u, 3399119u}, + {12293869964677582859u, 11958838534473211296u, 12522843341188714447u, 9502247503574311617u, 3212843u}, + {5796249751946572903u, 16926122284827973301u, 9535415419687802921u, 10579675231609735376u, 1283878u}, + {4290745530992286735u, 15655325684729036419u, 5891562157355591944u, 5860348496539704119u, 2736143u}, + {9514928641954884021u, 10178036363528015819u, 4186695306080778959u, 1203394440137267346u, 1497568u}, + {10437467879605639980u, 2819568295115107210u, 17187518303730725048u, 9250997291687147313u, 1292792u}, + {10648348679148841303u, 13365736142952366184u, 6270033293744974824u, 17245612787480313114u, 929103u}, + {16194913879661790859u, 9925658338998613469u, 283961104866813846u, 17887422263910856681u, 70385u}, + {9363772085315844530u, 6974546115717657195u, 12937602576603773701u, 7207057795761843910u, 624836u}, + {3804198750770688068u, 4747333733672843512u, 2866234557437694594u, 1020332513518089281u, 1402704u}, + {7974183176837446200u, 5270229510837347549u, 7527358928269156426u, 5358137281526168460u, 2294250u}, + {15346911241194814051u, 8915602616396003385u, 5924659967647371784u, 15822934542255463404u, 3830494u}, + {16023084990517687046u, 2902999393969943686u, 8545301237668750554u, 15058639718205825225u, 433656u}, + {14107042879566590361u, 3472180649220908541u, 9618378097655267335u, 440345120534235923u, 3104862u}, + {13222739447597406129u, 12965625655903663931u, 7079729689926341775u, 12307065581586280226u, 3448820u}, + {2373618333964858180u, 13782833694014895067u, 7204806562754139896u, 18438305991874980237u, 3809552u}, + {7761369194900767084u, 6902413779329917943u, 12042334648601737038u, 8068666787427795257u, 3146454u}, + {9950290473670055697u, 9809966957639363186u, 17490555649398369833u, 8488780342183935012u, 2245211u}, + {9625545046514518280u, 3934440401329318889u, 5114285803589305112u, 2707547820600591470u, 1657374u}, + {5024068618077652459u, 6959904449339790070u, 11212932286466449u, 2768761730161229683u, 578783u}, + {3004156870466567032u, 2534992621574635036u, 10591991522840906314u, 4838535465185147277u, 2872206u}, + {17773665698419132019u, 18215198367915541247u, 10956114803065177684u, 18139438957367420417u, 1875858u}, + {13367258069632776848u, 5614281408230935664u, 8166501725024925216u, 17832829217952259801u, 3406181u}, + {16786078755746206506u, 17371726273993265867u, 3416305595812353156u, 5827440490042796172u, 1360002u}, + {14880955017100568409u, 17158239386467547183u, 12168568204820080483u, 7014674236340183419u, 1433033u}, + {3065836760420626069u, 16147572069947193004u, 4078847161000605061u, 16527623834700351800u, 1332441u}, + {6371533371389131633u, 16597604777210335643u, 6735394292451418515u, 3123055758278842711u, 518745u}, + {7847957330136959219u, 9279306473746867498u, 11656214078902791116u, 16438700600025141627u, 2505140u}, + {9874086586606524127u, 3991768214353497043u, 2959740751377802413u, 13809212154131749122u, 2129350u}, + {16598116225363037832u, 15925390801187249348u, 15961575140120215372u, 17333102157405270227u, 822961u}, + {10743680167410335452u, 12410848049141172119u, 13147459430585262278u, 7725343530341035395u, 3090692u}, + {6492562522274815629u, 4096618809823728909u, 15572624536942844102u, 1137877122628924091u, 1491274u}, + {16213834719349152663u, 15201225807045607432u, 9325251114103488984u, 4278907199197402484u, 1564068u}, + {901736043691746063u, 10766739850484178985u, 3215938446348274924u, 12350700546874463006u, 1458686u}, + {2882627705691531898u, 12612028529998302718u, 16288467309562449712u, 603368771980027125u, 1890737u}, + {9072582118679404725u, 12058946223748495562u, 8740217090633699165u, 6015658247301080836u, 2360644u}, + {7198259741488256511u, 2369812732605170527u, 1218989265116817774u, 10275724555118563170u, 973557u}, + {11982265298382860940u, 11600594466377084570u, 1128595452374442128u, 4341414609371569165u, 3616434u}, + {4756502600588679659u, 16318555617738292645u, 17716742014257898790u, 14766460620536175281u, 3328746u}, + {16601421028233235207u, 2988687294606888611u, 11800913781492714271u, 12167080338686738243u, 2657671u}, + {5348404186191413384u, 16433170081550034303u, 8108904239363271996u, 6318036070235930508u, 3478924u}, + {3082144558092950020u, 15674683014937504292u, 7047978728242085341u, 11809562655180175566u, 3361658u}, + {5522789379415049811u, 8261448966165283861u, 858048352281706708u, 17860237383967101151u, 1969369u}, + {21997175981621735u, 11734121266139755541u, 17036517330145131994u, 10196449223137773665u, 64555u}, + {14459763776421921758u, 12519191196237556451u, 4470467816311105078u, 16862667844635264567u, 2617095u}, + {10442686542235903842u, 14276593246524122411u, 11469080269725378850u, 10208397657892091719u, 2353943u}, + {8897340658530137215u, 9987394906851181720u, 17556017351265071508u, 15103459748220436364u, 2710626u}, + {7473837237450152382u, 9455195747604364507u, 5148633493546061409u, 8264567959528787479u, 1922287u}, + {11880146410862647498u, 12658106816729174367u, 6936958453366975482u, 14951381910440869624u, 1136938u}, + {14698702730272887886u, 5863290127108593871u, 11733262458198169406u, 1318009511947759948u, 242266u}, + {4989486253781409814u, 7346317512072206186u, 3312330655534858518u, 2166196841355608910u, 1019551u}, + {475445095473191078u, 876835254614474248u, 7660071833791011122u, 90864992571219424u, 3056927u}, + {5786731367760066495u, 9635767780284855125u, 1181762184969424450u, 18286961641707645519u, 772728u}, + {17270437213152080714u, 608837048291328523u, 2006525532312890520u, 10967008627706597348u, 770368u}, + {9811698840574746842u, 17903315832840780575u, 10439234498330431959u, 3472975306126125035u, 198955u}, + {11361367375236978369u, 4481950066813560386u, 17854351155690060792u, 5263874440208899517u, 1678084u}, + {10445252536578392660u, 16822703207692746625u, 7800819306577070709u, 12713091742021377995u, 1055069u}, + {17744714740074905334u, 10493081610562180017u, 17253599433004056195u, 17529457951752684852u, 413236u}, + {5799602951194904379u, 13071522296332698957u, 447780488756473894u, 17589675821517917776u, 1846702u}, + {1946546723338315775u, 5619210705145148112u, 16718066630444629935u, 15814678751070301381u, 2112681u}, + {790036861987474221u, 12678173586924940197u, 5311627023328768694u, 3858024585541248128u, 670061u}, + {4733632371434098342u, 13734751277621883145u, 7500754280094937954u, 9307790078531502225u, 3262791u}, + {14817515877415383781u, 3246945177042903851u, 2918689621215126410u, 6617428937302235116u, 2425511u}, + {15278721714871546824u, 9624180718619481424u, 10180958979135442002u, 3863795271292576873u, 278391u}, + {12760426023542387685u, 6129227093504467460u, 1411300059960611669u, 869826539848354579u, 1751805u}, + {14637655020975400888u, 1858314175875956055u, 16916060165684036625u, 16749676916171152452u, 3302146u}, + {9560153944451496860u, 17885661137866841018u, 3721084388801451516u, 16490045299553270025u, 538585u}, + {14476809850309527238u, 5378917039081696830u, 7570052811477962592u, 6567176213598426334u, 1790049u}, + {13811071952907369770u, 17952734369836423275u, 14002840755616035076u, 681538928690927346u, 2979792u}, + {4375189531394722477u, 15860941562256744999u, 16968628953220327778u, 14466486268684013260u, 3775811u}, + {13772329223905173186u, 8940154653053012491u, 8868711926996236833u, 10085657004926166708u, 67471u}, + {12873936272359391770u, 6238407302013927980u, 1535688575312956600u, 11962805240651091638u, 3208761u}, + {2469656824077013873u, 3315057447748979108u, 3763124982780409911u, 3229725342592334759u, 347787u}, + {531368426754660262u, 3679725649735803488u, 7751479601644452862u, 2168143362148726646u, 2385293u}, + {786266346083629692u, 1190357441390223232u, 12018240711077695452u, 1845440742628152639u, 2775826u}, + {1902931882273142886u, 9368598310410036795u, 8341386267745295265u, 18425891433332213312u, 41585u}, + {7762712117398646688u, 3781678781142888934u, 667120457235036025u, 4396280362591800741u, 990822u}, + {9997853835292212433u, 3188341023312532753u, 17396554203063512445u, 16375351290862522879u, 3107727u}, + {12304773158917516835u, 3291921482941434088u, 10652251519091834577u, 17927610782401436582u, 931255u}, + {16847566179899973221u, 6104181998083564987u, 16447018558051822278u, 737754580959252530u, 3215575u}, + {13499421685084153077u, 7711439230426324440u, 7320991249847375825u, 7265076293605366772u, 1512075u}, + {15380284118420771973u, 9776969477989569212u, 15958831191300501575u, 17826118595178530855u, 3741363u}, + {8742955010821168168u, 16404095215773051029u, 6294461909864731649u, 12895267722325137392u, 1867945u}, + {4191603581701816304u, 9749750651718680101u, 13253736813570708551u, 1475609397012591830u, 659318u}, + {6960287201089738651u, 9893963563990293922u, 3042785246230298566u, 8442900774322367943u, 881508u}, + {16818980398962592141u, 12482913606141112660u, 13803419512608551568u, 10969015254682874605u, 3651988u}, + {16405771902724153633u, 2406152283898767588u, 12357237990264977616u, 1724691961837616180u, 3203926u}, + {9355871695528070153u, 536814126902643665u, 13068791313076974859u, 4310500052915544134u, 2798985u}, + {14537426570554473450u, 4024481200382719372u, 4527825177582223782u, 11220559240150482062u, 2884546u}, + {14046431414953764487u, 2506819367584037031u, 7862157244499567089u, 17491148250229962344u, 1378215u}, + {3408522219391309987u, 15785728065350027757u, 16794059402023202790u, 6294434278174426291u, 3619077u}, + {5389088725307498023u, 1599058940400804193u, 1996024849541693017u, 6551943656909997061u, 164419u}, + {13861767193649296866u, 5328852208890909509u, 12491178901733072469u, 15567473313958233083u, 1566859u}, + {11722572447805054946u, 5794515252976536458u, 5418310996440569101u, 7739066024598350940u, 1459625u}, + {4666035930468747836u, 9207731804665699754u, 16156671929292545904u, 7448857522464231736u, 302219u}, + {16416946596089669084u, 16009046403395860207u, 8191602122652858560u, 10381868505457692733u, 378709u}, + {15240214433365014033u, 10639259125365075739u, 749610699467786621u, 14850850330196433792u, 1662249u}, + {11540089988789202260u, 13704437353665016229u, 12185516554099475859u, 13937778746060721606u, 1778953u}, + {6405642903841943793u, 15443184767352270229u, 676251267354259212u, 9112072753426856510u, 588029u}, + {6339359467606033188u, 8100695755487391485u, 6531279553240212389u, 14854711601396146923u, 2342728u}, + {2234496266798005882u, 2143178244566613353u, 15391877871656212220u, 13590043397835476999u, 1488016u}, + {5613634815423705971u, 6740512228978535872u, 18315972445585011788u, 17753617197249900645u, 3100005u}, + {626061839121974443u, 8095563715009460360u, 14891295119660051103u, 10649651340191243767u, 2117080u}, + {840272067146183316u, 12803830743996066417u, 13400545880514201807u, 6956582271234302213u, 562820u}, + {15567490980227384108u, 2811171930134359361u, 1380173101017197368u, 6927911231097229337u, 2158735u}, + {2378473039734464150u, 3055225756884531552u, 92143277362527461u, 17477759396174431132u, 2285904u}, + {13538521186439509892u, 10956498930527002846u, 952811151200412742u, 17840393230911028547u, 2453242u}, + {9491535726300234162u, 10240434130865478257u, 13587274361627416082u, 2567270136492746358u, 3746629u}, + {16378340203453297329u, 10027879455524758893u, 2845388556692453868u, 7202814918624274144u, 879538u}, + {1448535999662396341u, 10371827594749257157u, 4307454053867813513u, 1673549282464259798u, 3825460u}, + {6862598554394598512u, 18059673120150423969u, 14558228682096816963u, 17796735416588034479u, 1659879u}, + {4157475258610689806u, 18416470236179400379u, 7652612295328150258u, 318849757054772097u, 2633907u}, + {3265538766068908187u, 14714001193518605327u, 424566745924993256u, 15973315291043875717u, 1436709u}, + {9784526403614392751u, 2550082195108234709u, 4363530474777358032u, 17824728346572910659u, 3247007u}, + {878548277047600030u, 12350928362434948315u, 11749173491811334790u, 12381745305444948832u, 2401625u}, + {16722791561455693615u, 7973850516801550532u, 6359050763505694289u, 7105946389834705735u, 1543586u}, + {7424017090538067771u, 1991017324468723084u, 14304356346511421876u, 16745835959802988573u, 554159u}, + {9037086713806721454u, 7477412578480195432u, 4002196698758993063u, 14277626065504710099u, 1906855u}, + {17775863006819145849u, 17928278545638966155u, 10172231585790004132u, 9618835287492714980u, 2857950u}, + {8414990479457473454u, 130732314539587022u, 9844329666450151588u, 13455432372898889596u, 2189022u}, + {1198904044015766582u, 12458465277906766752u, 18381242425466261573u, 1337417034743855050u, 672194u}, + {16282670639581180969u, 7286036639640758831u, 1527769582062084325u, 15072436945950238777u, 886199u}, + {9104015107279887630u, 1704362963655878912u, 16284534074656140424u, 5420667054068409476u, 1468456u}, + {12163224631471494108u, 11501278855825749209u, 7309234069775559969u, 13645973510604550191u, 1598465u}, + {4502884348585518470u, 16191328294635393741u, 524249667035496327u, 7379361080280405121u, 1138823u}, + {3197480352704593277u, 12002893342042867051u, 18085060404940800664u, 5425327136650210412u, 3579638u}, + {9238712260190232656u, 8030963148738734328u, 10658628725227318834u, 10514383806987403368u, 1274635u}, + {1594662742699630076u, 15583441979252332207u, 5745487999969297718u, 18254084167742544389u, 2149320u}, + {16976457388508894700u, 7057544663790926643u, 4092327334170316996u, 9263020011081365389u, 603159u}, + {4621407967592780217u, 1389503291805981779u, 9675692348400237893u, 16728488145771055742u, 46854u}, + {15767841551008425365u, 17376397372749576557u, 1890271189728507221u, 864320475317733u, 0u}, + {7532634636188868057u, 5388547585591226832u, 8768064576237080164u, 864320u, 0u}, + {11153303170796378643u, 16414305502676171447u, 15943898605853215u, 0u, 0u}, + {8083674774420001423u, 11176019219753434325u, 15943898u, 0u, 0u}, + {6358103722446195398u, 294113017119348792u, 0u, 0u, 0u}, + {2201596627888497667u, 294113017u, 0u, 0u, 0u}, + {5425427555547183236u, 0u, 0u, 0u, 0u}, + {5425427556u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1791306u}, + {2908722745657626491u, 14580334850058926815u, 1236863339727285995u, 13796044224583936138u, 1085329u}, + {13581312892407538814u, 4746606017224924404u, 9772675530663235581u, 6433146669470405642u, 3528862u}, + {16801523329329462798u, 6177743113898649228u, 3784287464753637938u, 2370939029832279457u, 709199u}, + {12131440972916977067u, 4205381618305954733u, 2375849163074216187u, 7651187382841630986u, 3608209u}, + {11748764609050107443u, 13938947668693715721u, 6796642535481012425u, 1507711596397201570u, 3235459u}, + {11874348197646838336u, 396011930254989192u, 10314558088121198595u, 16921160690516828852u, 3054010u}, + {15152343455661020554u, 13317848005531834275u, 4567580085022635338u, 12810530702502955070u, 709632u}, + {5001588867873906197u, 2738836989813300464u, 651546051907237605u, 11470247864731587183u, 2610389u}, + {12257218314696200107u, 10776435096218794507u, 8576367375643426820u, 10064158760558057571u, 1965655u}, + {13352784232207262886u, 12120529791559265928u, 4423640858700307869u, 12069878149120331621u, 2227728u}, + {15158846155786368090u, 132989470783441442u, 2264154644856092310u, 2635167725717120677u, 59402u}, + {6088132180461485708u, 7108741594268695035u, 9264218830542042176u, 7999488714336635116u, 1967457u}, + {7960984220141991192u, 2006581929936503259u, 11628746824165629911u, 16753655000553798239u, 2881266u}, + {5362869819105674427u, 2490631997153320229u, 9227505871596720574u, 15689647899494297937u, 1222772u}, + {348676617155080801u, 719659102795959845u, 6325342232328142036u, 5498933324716669011u, 2878415u}, + {10426466416741268316u, 11039196696444800166u, 13492643160197627522u, 12879349129093032611u, 1431999u}, + {559424050879686564u, 13100092595653431323u, 5489621830386369385u, 5935138443056247885u, 2525494u}, + {16558695228814952805u, 9362844358568068244u, 7473628066411381760u, 3649466849309224273u, 255936u}, + {4674673328069479935u, 18302116887168030220u, 2058967455290511958u, 1878218634526842113u, 2695169u}, + {4270426791761656641u, 11956674639495350814u, 851966880046707091u, 13884775149938778045u, 490005u}, + {12819525506730002686u, 7309985198419637913u, 14358505171812722042u, 16582285639438038478u, 2704342u}, + {5942732709277153454u, 4669690742565996512u, 12439656881196520908u, 14749635505081368419u, 1899696u}, + {1071230473354038411u, 11426898118697994219u, 8265564616000543065u, 3493807734500026173u, 1725149u}, + {11673037872768731883u, 5904721199472287573u, 14034595700983049378u, 9039022640326815693u, 2668695u}, + {18375763762751822117u, 2894832537742285134u, 3259111967204236368u, 7327045740545532488u, 2309551u}, + {16563479944662387226u, 3349066009353647862u, 3501503852211006850u, 691122049890577133u, 1075052u}, + {17309017205653187290u, 6751498926487284308u, 14286286909283449068u, 1533040684597538306u, 273038u}, + {2591947968822250088u, 15627618425148028356u, 2797775518688862102u, 13984209906999457777u, 1664905u}, + {10995982027484443730u, 10646195506583732174u, 603102594356862542u, 16387785937035890780u, 1443475u}, + {14997743912138553098u, 6213096249475270852u, 1010814798628839194u, 15086664584216522456u, 2421612u}, + {14862037086054649251u, 4875754154428176325u, 17053045483860733683u, 5953393583006579270u, 3383145u}, + {15940073092174617717u, 4937144197945120743u, 156642204561916775u, 13609235695063095652u, 726470u}, + {18034008797878215874u, 18032259150093383775u, 471704865705449826u, 7939736363948536433u, 314046u}, + {728946260770454236u, 5725620900869031104u, 14671336937137610073u, 4185133588328928841u, 604089u}, + {4978652854398789273u, 16757219942252639239u, 12084216070026241283u, 8874227546031012845u, 2236633u}, + {9324350533463838802u, 7493370926884796404u, 10893941898331371559u, 833892139829248057u, 2028947u}, + {2944603074157891705u, 10507237817102453184u, 8335648480663845391u, 16826846877719222001u, 3095477u}, + {9442332825918975005u, 11609154372507265319u, 7874229443265268502u, 2146771715931811243u, 88914u}, + {2897970646041484010u, 5465511546616916666u, 77407471288182402u, 8576493866462765911u, 2329568u}, + {1353320331187219803u, 1716941519918055257u, 3721590015664603275u, 18129429056794709215u, 784273u}, + {6962710731487859361u, 16992701665249458402u, 17879403081803110892u, 10823106407133539867u, 1218740u}, + {7457045865361499451u, 4856500228506894807u, 1291709420000827127u, 4129764655857391538u, 2975381u}, + {10891967538685992222u, 1911401284609706813u, 4688373451371621178u, 10863525201647733055u, 942420u}, + {17040306412092255566u, 2284658364402477565u, 5196148511829758204u, 6070222490599417181u, 2841848u}, + {13130993314501478194u, 8416942885805774303u, 8121060083700759110u, 16121266319280535560u, 2130610u}, + {4827844665019460492u, 12073250673458391695u, 905759491842376364u, 327533209663864371u, 317895u}, + {5982353171609308198u, 12378780225391295307u, 10603791536984523399u, 18164377825592684979u, 1765468u}, + {4094307297235589710u, 6561522946511355936u, 4889886301687460869u, 17686677693823046000u, 410076u}, + {17937361885058452122u, 2044406996559170120u, 16814738789453370614u, 15572004896901882387u, 794920u}, + {352261551526113508u, 4459712999035884676u, 12404939318096037980u, 6355731976708736461u, 2620387u}, + {13122429415323957748u, 11607842968976796415u, 9945227326680738464u, 1417431901439438311u, 1589729u}, + {894487042028439190u, 7615451713822902202u, 4065484853879103048u, 17611378270681402497u, 1675348u}, + {11354362233704519442u, 5502200530165831966u, 10370111395951964987u, 17612957678656195804u, 350556u}, + {14421696957556571269u, 4201315826109358048u, 4288762861066362002u, 1015272950959452108u, 1470064u}, + {16313338881335350076u, 14355656794962905422u, 4542981714709429898u, 11412217753387860597u, 1046477u}, + {7854387782829139510u, 13158895653988536833u, 15390440093541321311u, 7585351478792674383u, 1748385u}, + {13130946155437707163u, 6406052460072673956u, 3593694031948124706u, 16605498646946089433u, 3550676u}, + {6035055177242860477u, 18327627735140998651u, 15491240849843293576u, 15485823552182739686u, 456532u}, + {4550755598683497116u, 8565870033796691125u, 3709555356798004468u, 801055078868489617u, 2889007u}, + {15419597164805953103u, 5413007645827789105u, 8374359334853019818u, 4592921197946670457u, 3335899u}, + {15294636201201363258u, 4882618408458843930u, 8724078469051360473u, 14112767317097612337u, 73685u}, + {12683847132547908024u, 3179894481663049661u, 7534338296640776494u, 5838024379522001421u, 381350u}, + {11601757636138686727u, 16682652979732405952u, 567477582855490780u, 3537856779549002381u, 634881u}, + {3540087808327986366u, 6258707490440941826u, 7166930428484406252u, 7793931646958334661u, 2582300u}, + {4823127656948210790u, 5692614093030902796u, 1777001814480463225u, 9991583012249526990u, 3285160u}, + {8169051999706872490u, 320457304909698266u, 15427852319812857301u, 16777962332552051834u, 3162071u}, + {15196881602888682024u, 16790344902754588474u, 2582702274343901236u, 17496267688436421680u, 2982041u}, + {11002609696980644174u, 12982778134391094053u, 8244771085735565651u, 15475334088757154897u, 3525170u}, + {7373687892177636378u, 8164099555144821942u, 15261537717643914193u, 6261981011543455284u, 1860341u}, + {1868634337219662180u, 16567383025689047001u, 9339887959578848114u, 5294521605347549240u, 3089899u}, + {8323727447748343770u, 4982519049540658527u, 3251718710398970649u, 16486130022008702083u, 2569975u}, + {7502987353710881289u, 12743386700405067285u, 17026929231478122191u, 6604648745038403902u, 2645599u}, + {7917784492586900768u, 12224841169088889219u, 1552143853948173920u, 841436228696517957u, 3584633u}, + {4002694422421018041u, 861427542718455707u, 15392606771322405080u, 15558507526545116159u, 1541958u}, + {16042632661826986912u, 11968964617719817868u, 6194790904441297549u, 13791444581401152335u, 670810u}, + {12793233411067438480u, 17146622525537622863u, 13294223413769366016u, 12982741201010558165u, 1777148u}, + {5853955576680333443u, 4790954150813466466u, 4534750804955945323u, 4716526219785161823u, 1846583u}, + {13378262997845816296u, 9263145785966073997u, 13593220341120122683u, 6303074130028119456u, 3359222u}, + {9632789658189302830u, 7187050928130567969u, 7871635375137474957u, 14113197552219796397u, 3128317u}, + {8700380011985272431u, 14336847520013650359u, 11114286333617867792u, 8632560967707056779u, 1894071u}, + {15629964465561459749u, 14789677665729290886u, 15604571491740236744u, 17040531644577988987u, 433137u}, + {13365385778305826316u, 5565515665959132686u, 11737448900093078606u, 1232969083073160890u, 3032104u}, + {14400063503561663790u, 15664242183817618417u, 6755953159486681402u, 9567534860732327661u, 1983574u}, + {12782095210012931273u, 1131805938158283457u, 16039134903649453286u, 16177491555992656874u, 1499258u}, + {17994307158722478084u, 16616113505775110800u, 17143625542438369779u, 3054075394396926502u, 1868067u}, + {5508614842393997697u, 15415437915698035422u, 6559159978700591280u, 4934376151494717423u, 2778360u}, + {12150360274387458423u, 11704256363573290200u, 5949945343056120212u, 8337875015160720461u, 189753u}, + {17847385316350816442u, 5743311801723061693u, 13069726796401892244u, 13694443200572401463u, 732008u}, + {17245183927723731466u, 7485506128088318122u, 585248628229168851u, 8083953710178280014u, 1970505u}, + {11381718623942575003u, 14360361474302398682u, 3419400896546436301u, 1621616478349333342u, 1090850u}, + {7337720965917404558u, 6493153817826035621u, 13459610406658197829u, 1821562483342620942u, 1479596u}, + {16481406809018804408u, 6035624824508808363u, 1391771399178886406u, 9538896143572534393u, 2587361u}, + {17418414164007466827u, 5693091531437935880u, 13858296693008928119u, 3218262533401022546u, 3760099u}, + {10320028480698028792u, 12970949831186105159u, 13333168833157329990u, 7058948208842083536u, 64877u}, + {3564117698021547916u, 3463469885376324444u, 7789594587414244641u, 6414322645849804567u, 215303u}, + {5124161290996215717u, 8197476309589232660u, 8142101660069787165u, 3318620971498309589u, 1235966u}, + {17736736647069143224u, 8364851075788611624u, 3153113870811202860u, 14290203171314158799u, 1495138u}, + {17390379781297008796u, 8525586540634581610u, 16568898863425574325u, 12565601804930541986u, 3613025u}, + {10269354573723239470u, 10026508251982680251u, 12136857932868573705u, 12028209170368553633u, 804195u}, + {1843860897779915071u, 10297941983712485622u, 4249811695724499356u, 10030840362650549127u, 1204124u}, + {7596866056002335547u, 17081373862873951447u, 14399777662146667576u, 1175133681898698778u, 1743234u}, + {4539756544623917937u, 12969565027050030041u, 7387273941031835500u, 16389230839243364150u, 3839552u}, + {10879207738425477267u, 14261355166458455877u, 10508744528605552720u, 9654487256535345983u, 247267u}, + {8708484258199081476u, 5615225803786690097u, 4330916530658752885u, 6777975120286587180u, 1213395u}, + {8804229867533658578u, 5391778262800148459u, 12353480139216987040u, 9245755230658069729u, 1383931u}, + {15024775270650324925u, 9557860211707262834u, 2500497215550373864u, 17823754757586628356u, 8403u}, + {15091991209332003939u, 15171744705743592145u, 17503333385881741753u, 15348422555892856506u, 3238446u}, + {1895353992560131940u, 16362129653163388123u, 8955622028240280889u, 5968461511017041710u, 1626601u}, + {14946123954821349930u, 11671721786656948180u, 7105297079463931955u, 6154900991549376101u, 1841831u}, + {7448852309242716808u, 7276818247438060466u, 13130853552033366437u, 13292573094217665752u, 489083u}, + {12313975296202941245u, 5097877949477581201u, 15692163367680363818u, 11466179454254917006u, 2539305u}, + {2125232887210106768u, 7836612120089370579u, 4080122553962712429u, 17845067648294470679u, 3791754u}, + {5625593802603940346u, 17947086661788279219u, 8718763994682976117u, 5330149898242271463u, 1199338u}, + {4817870207845501046u, 17644798696171254621u, 8454173642209198668u, 10326359833897719412u, 3133213u}, + {17378692889010475891u, 15293394719103660061u, 4522064734408732534u, 5822405111700014439u, 2062687u}, + {15168015021720393711u, 11216694566016214208u, 10960439783717284690u, 9189364307832420717u, 1269203u}, + {15127235669382937602u, 17360284907944889560u, 16087456522889903554u, 16452544112755518099u, 509799u}, + {5105004949134596678u, 7095703969293526625u, 8481873501839902344u, 5918126859244667920u, 945270u}, + {15233468263277876066u, 1886625704691184213u, 1858034285780772069u, 14861301531501837103u, 3527182u}, + {15011752945674680652u, 14812320607354433850u, 3502358137974726731u, 11666337678623094231u, 2602023u}, + {4884330571055534657u, 6980792427955350476u, 4567661004076686752u, 13018365790848272107u, 1072850u}, + {6011297681090690656u, 1232819230111310931u, 5524757556259510697u, 6793204441963071067u, 1674245u}, + {3542777540937658075u, 6665835915794801040u, 3844319677422228864u, 14154172807258767746u, 1593197u}, + {6100558744203695237u, 17566303712125929443u, 14106669726648702050u, 13936504960792266291u, 1099406u}, + {11800598293659382421u, 259609200376498811u, 1774694613351927375u, 11189207550930435764u, 3098594u}, + {8333637970933908183u, 12739595631520593091u, 5727043829555824374u, 9280531018550315333u, 3651858u}, + {13335097637639762414u, 10087376036832760990u, 5453187031211487813u, 13253904608140872122u, 847585u}, + {16152016901342331941u, 9829729898534438245u, 8251588009091513478u, 159750384905475590u, 3707113u}, + {5661434549093856859u, 16599366232037347923u, 17069144886991836904u, 1869824015871270421u, 2462538u}, + {1531408318738024175u, 1620040452391320341u, 12703015127642664231u, 15609866122320042763u, 1242504u}, + {7389620852071732003u, 2312208299684040843u, 758700337121520008u, 16956454767821491495u, 1934264u}, + {4696707714888778660u, 12779061501734946017u, 17864972855034144885u, 3566502997793913363u, 1662016u}, + {10667291690237605698u, 8228074080873838899u, 17202164755502366875u, 535061945630409003u, 1844053u}, + {9859872432333117518u, 17746448325972285954u, 7683966376448123046u, 12427922948808023257u, 2877387u}, + {2371204149864832574u, 16137245490969218968u, 7447515964499627487u, 15905749122362087774u, 3354365u}, + {12595767864275744638u, 5456098860173724527u, 8642144911584638768u, 12960186461379658406u, 42859u}, + {15282803091669595196u, 15951186784904487652u, 966029248003407250u, 11530005668032911339u, 2473325u}, + {16762601291331236202u, 6917386524047555160u, 14454030049692498984u, 5522001951698636480u, 2840865u}, + {4001527213534570868u, 2047590517560530419u, 926475191770122157u, 9131661563903880773u, 3535205u}, + {7683535594879876240u, 16674192840599296945u, 5986375258892282207u, 2731344010418093571u, 1081223u}, + {10390952088302635011u, 13459364875302624625u, 17432172030390513039u, 17601997991953368856u, 2643990u}, + {16949883497407943982u, 4001721841828056160u, 6097694790395181876u, 7470705210372022717u, 1289850u}, + {1998138938802084596u, 18036565006606390777u, 9664624008813474438u, 18038192049796163475u, 1121336u}, + {10339422947721738094u, 4816910749756966394u, 10460086982190612819u, 17314507585353533863u, 2132624u}, + {3312768321590911841u, 3341184436956048858u, 2934032998705672211u, 7461272172354535752u, 1571939u}, + {970152827844267695u, 276343795673887736u, 3915121765021031497u, 3343646489638440147u, 98670u}, + {11811620679281619804u, 8642715923376268278u, 1778097658507097351u, 10017825714853382515u, 2523729u}, + {15075389800535297405u, 11457844878591164533u, 15563122829062043424u, 17556549944208713095u, 543186u}, + {16061223928766465283u, 11208126602960748492u, 13148870015812638389u, 3468784544503512868u, 129523u}, + {13912156828495267071u, 576434292433804317u, 13972892804232578151u, 2389281101443626u, 1186271u}, + {11089750989448734826u, 17817679535117560061u, 11188089788956421250u, 11046694725344426992u, 1417735u}, + {14433303925364299180u, 18310468437641308511u, 9310749699927497462u, 5214299376486846728u, 873124u}, + {8168774920774317567u, 7074666786793217718u, 590574586865897250u, 1313142992869615803u, 3608779u}, + {7714924043807369983u, 10213171241195252998u, 15510993952435695646u, 3813565113916973146u, 2738711u}, + {6423056054573293379u, 3200008318669485399u, 13517407388346656178u, 12876772043473590881u, 2481168u}, + {9227878785769223917u, 17799825653575209487u, 4382178449028264249u, 1847209334924848224u, 1700967u}, + {3014390704007357564u, 4756902218223108784u, 14913471246496092592u, 3490141818594575777u, 2477687u}, + {1246821337914522885u, 8092226844596868881u, 7551506171030736687u, 117762855511826952u, 891048u}, + {3525582182323944488u, 3987024061078796718u, 1109765723332791125u, 12266227920978902724u, 2287583u}, + {11318575921767499526u, 9609719855511577548u, 3565513092766740917u, 11427298328407210526u, 3673596u}, + {13575499317188842057u, 1368134309322010720u, 7111988372232144128u, 11885211318889682946u, 2996203u}, + {8428037580639283425u, 14078304792999672011u, 10518278027028489132u, 12809464346532336770u, 893869u}, + {15137048943108548094u, 15572238060138601175u, 13388260842650184143u, 953237707980950197u, 1256216u}, + {4701053701752996426u, 12349412477369358950u, 1361282159333907852u, 2184900917144374906u, 2094166u}, + {15357572146277459463u, 9371345263122596067u, 255435054922478261u, 17620683491689181338u, 3523286u}, + {15796320087967440119u, 12643119574955197820u, 17784718357530078459u, 10008941149995222490u, 2423736u}, + {7024196603173864478u, 6468201680163537907u, 14587313824529051707u, 16113553518161107371u, 1193308u}, + {6937609477734387950u, 15638221594911555286u, 14404935160766250011u, 8452751165828232227u, 1929490u}, + {14279967962090361414u, 3313335619610209277u, 10621415127049863405u, 17473530573854093520u, 977827u}, + {7528925510976605541u, 5245845182687426474u, 10738070211412914099u, 1243016840535668675u, 2957996u}, + {12280323565152132765u, 15010947145012429790u, 6965309997793059358u, 14466084204011660599u, 3087217u}, + {11070350344160396416u, 2279930772143836847u, 15180808381724450604u, 7767111678423378736u, 3391084u}, + {5084509118225550070u, 11258901699567577696u, 10248466474648779353u, 9357984097340266703u, 3724780u}, + {3705482194619333226u, 5543266546338965640u, 157003624813973957u, 8283275793072640665u, 2113911u}, + {2309249167318898468u, 12898019041920879123u, 715195781606488930u, 11352037047449561177u, 3778681u}, + {15810776124166896662u, 4989300068992790174u, 12164883815478384587u, 5978427083805316681u, 1929623u}, + {12878566905222429758u, 6789364209199484564u, 17030724953132358216u, 10772176779269433193u, 2102678u}, + {4603497816759540319u, 17661415862563267133u, 15536970194265097886u, 12504751342269129159u, 684326u}, + {2439849552161351470u, 352470921795404088u, 16386242315044563052u, 6137519092313611264u, 965858u}, + {11954251496225049140u, 7231767911336645387u, 7716970201770981387u, 8304440255836776692u, 1598175u}, + {17416772546831703954u, 2848333333220642189u, 9051402125370636125u, 12495444902075973946u, 906429u}, + {15253685538159547858u, 12371926605106952288u, 4385034756861376247u, 6501904139692947617u, 1169373u}, + {7117713109582663449u, 774992132221450287u, 3593506638916418628u, 15658069037189972211u, 1730980u}, + {10992791686069404878u, 16466827067789281829u, 15610296910858078725u, 3418637880497391788u, 2119945u}, + {16076069569166483436u, 15747949516381959769u, 16564676434611029322u, 13081530607148934491u, 1542617u}, + {10888409281053661795u, 7929095546235771636u, 9853394089285768057u, 11341498538038970166u, 3852483u}, + {3502007603527469025u, 2241308208252305128u, 10648063787049293142u, 9006207439993879396u, 3877118u}, + {5091244256726191645u, 997247330681295875u, 6201833811243864651u, 17869745939863980261u, 2966156u}, + {14300648033175965686u, 11953482099533876566u, 11936673320858034461u, 3945826016532552512u, 598245u}, + {13421122983130104768u, 276490382114595094u, 4409997299655560830u, 14782842454129429267u, 2397217u}, + {18068393212718011116u, 14296674064732156635u, 6007771382572482992u, 7322037861101709780u, 2572194u}, + {16335056956203043461u, 4285952245278877988u, 9427674972354197408u, 18061847121229953127u, 1685279u}, + {16077632659367834485u, 15784083189406852027u, 12318993790247248811u, 15739643428735934328u, 1923440u}, + {17043397169247470722u, 10928801193922673534u, 12842869832510360974u, 16464612661808348736u, 3506966u}, + {13998508584137156894u, 16375559265987730712u, 3706057740792793677u, 1217613625348660529u, 3459492u}, + {6974562684966685632u, 17828757743070151306u, 8998314402610691608u, 2081428997828641437u, 726359u}, + {18013573393594129657u, 11502882410518983412u, 569775310761288148u, 17018991153611057490u, 1734530u}, + {16973493031601904299u, 1410579513012271931u, 3238472943259754562u, 11345038711971848534u, 2119010u}, + {13468015586915755354u, 15201298927253076320u, 17370721403680786148u, 15027068406393680676u, 214459u}, + {11567565988039680095u, 7105701844168074189u, 2281796219944809058u, 3678893381248696819u, 2062110u}, + {16564086743500494127u, 5273015119124798391u, 13495021457974016735u, 7099683434817668312u, 1461838u}, + {3773046708236061278u, 14831644423708261411u, 6140893814451702100u, 18041364668044890858u, 3486013u}, + {9283285349832032285u, 7592561004751684884u, 3734319511070802147u, 12169981406061882371u, 3626760u}, + {16401803926751227365u, 18371596528504629818u, 8867839290533520560u, 8857928398333956451u, 3790114u}, + {5450414809846618619u, 157560300333016344u, 15633259128007459848u, 10590324001363590657u, 598980u}, + {1345567941968734938u, 10002312368836188067u, 10893583370962597998u, 12837300980106767156u, 3751212u}, + {7910368268122551610u, 1298775603461867521u, 11867265440277347799u, 15129234814494467758u, 2991356u}, + {2086757106739414127u, 17973014402596268868u, 18046432288557426056u, 4090406059818554739u, 1590736u}, + {3700357907478833586u, 332150173302844923u, 2176422792214548503u, 8964485564674306561u, 1828618u}, + {4351518954436529514u, 10104183535480403032u, 9799892724806117570u, 10698255974832398705u, 3148763u}, + {560933763233219639u, 16675926344536728671u, 13050143810530165860u, 11659357076014419579u, 2449688u}, + {15743039899540848669u, 9165841307344308635u, 1725054423993049055u, 6314199460555524912u, 3273324u}, + {8659080451339121748u, 496339007238818065u, 16406838478372569544u, 12021942786708568080u, 883073u}, + {1382307827286917904u, 6966802347593635331u, 10750099265221827154u, 9599949840695761189u, 2779528u}, + {14347701689102342402u, 8831034626691299205u, 5162845909838941363u, 6752629496788957651u, 3519321u}, + {5421595588653368465u, 14224224504383950690u, 12760173422159910574u, 16349936273124574605u, 1304834u}, + {16029342872498680696u, 16181494208965436311u, 3650358848443943477u, 17966410870650667066u, 3758685u}, + {13485584486388335056u, 8830779093160337968u, 12293869964677582858u, 11958838534473211296u, 3504427u}, + {11963341915176355552u, 7968124717707898113u, 5796249751946572902u, 16926122284827973301u, 1020655u}, + {15384785288459373997u, 9953881519992384331u, 4290745530992286734u, 15655325684729036419u, 971206u}, + {12656958881775056964u, 14608452088306231234u, 9514928641954884020u, 10178036363528015819u, 505353u}, + {1666890345349187941u, 10400670780789529455u, 10437467879605639979u, 2819568295115107210u, 1901758u}, + {3125882817627869654u, 13955533511420558616u, 10648348679148841302u, 13365736142952366184u, 2914766u}, + {12061014168059988986u, 12221963017056935497u, 16194913879661790858u, 9925658338998613469u, 3090902u}, + {14496098635410829633u, 12467786761819836217u, 9363772085315844529u, 6974546115717657195u, 3447227u}, + {4488284564640790607u, 644790474746026296u, 3804198750770688067u, 4747333733672843512u, 543464u}, + {11953080351385732481u, 5462579776170174035u, 7974183176837446199u, 5270229510837347549u, 2847036u}, + {4360426969189422596u, 1012353612432201153u, 15346911241194814050u, 8915602616396003385u, 1121912u}, + {15369120010641159720u, 11327372286059307502u, 16023084990517687045u, 2902999393969943686u, 727290u}, + {10432018920174642358u, 15823946555051326188u, 14107042879566590360u, 3472180649220908541u, 3649225u}, + {15618844271903376550u, 5015009631175640016u, 13222739447597406128u, 12965625655903663931u, 1075161u}, + {14652482295359337989u, 2889000672500646586u, 2373618333964858179u, 13782833694014895067u, 3086850u}, + {15886686535962036776u, 6605595529027601769u, 7761369194900767083u, 6902413779329917943u, 549374u}, + {4614268744505090441u, 16680311814633992152u, 9950290473670055696u, 9809966957639363186u, 2348941u}, + {6033908592901537576u, 16471694884307748283u, 9625545046514518279u, 3934440401329318889u, 2297176u}, + {684581312764248495u, 5597501417974502656u, 5024068618077652458u, 6959904449339790070u, 703475u}, + {7440130895744053174u, 16618951726283987232u, 3004156870466567031u, 2534992621574635036u, 3072882u}, + {15373848855010903164u, 478165430004462423u, 17773665698419132018u, 18215198367915541247u, 3569554u}, + {13384911896459405224u, 336612386305938143u, 13367258069632776847u, 5614281408230935664u, 316918u}, + {1916878795536389501u, 4689577008233613324u, 16786078755746206505u, 17371726273993265867u, 462520u}, + {9479886485115579747u, 17641113835104557042u, 14880955017100568408u, 17158239386467547183u, 361635u}, + {14605722043496303482u, 9303738910614843751u, 3065836760420626068u, 16147572069947193004u, 1320457u}, + {7506661508690501059u, 4930370576395983426u, 6371533371389131632u, 16597604777210335643u, 3032211u}, + {12154928649448847407u, 173213751190882548u, 7847957330136959218u, 9279306473746867498u, 1550438u}, + {15347402795764891662u, 9484461976878469471u, 9874086586606524126u, 3991768214353497043u, 35915u}, + {4614296893697263182u, 605751498152301471u, 16598116225363037831u, 15925390801187249348u, 918420u}, + {7444393407273624895u, 11009085467236822028u, 10743680167410335451u, 12410848049141172119u, 3328150u}, + {14284762160701438014u, 9928335678630076924u, 6492562522274815628u, 4096618809823728909u, 3747602u}, + {13093289919299958622u, 10894851523572509859u, 16213834719349152662u, 15201225807045607432u, 1634886u}, + {9535905992970145732u, 10714178689738356685u, 901736043691746062u, 10766739850484178985u, 105686u}, + {8365076274978693155u, 2355181382603691009u, 2882627705691531897u, 12612028529998302718u, 1373034u}, + {9938560300397755316u, 17596380330817463164u, 9072582118679404724u, 12058946223748495562u, 3467805u}, + {2519247867317777943u, 14637620493506449210u, 7198259741488256510u, 2369812732605170527u, 3869486u}, + {780631863881170845u, 6469453164616231503u, 11982265298382860939u, 11600594466377084570u, 1818172u}, + {9646521143625724055u, 17605655394745484256u, 4756502600588679658u, 16318555617738292645u, 1860812u}, + {3067403123565723095u, 464973260413596780u, 16601421028233235206u, 2988687294606888611u, 218935u}, + {5644759989085438880u, 5080232248453427500u, 5348404186191413383u, 16433170081550034303u, 2070018u}, + {13994285264469820207u, 5206099866566596650u, 3082144558092950019u, 15674683014937504292u, 2541545u}, + {18393448234341421161u, 8733157399913858634u, 5522789379415049810u, 8261448966165283861u, 3295488u}, + {12296165344679252072u, 13300650612431150320u, 21997175981621734u, 11734121266139755541u, 2885464u}, + {8230824766633493943u, 8186694068388121638u, 14459763776421921757u, 12519191196237556451u, 498170u}, + {5300375404847023617u, 391662993906894123u, 10442686542235903841u, 14276593246524122411u, 2355262u}, + {16566104921715431811u, 3561171411023217686u, 8897340658530137214u, 9987394906851181720u, 848438u}, + {7616591985819336438u, 4742703320795806604u, 7473837237450152381u, 9455195747604364507u, 2603595u}, + {12198049942972922070u, 10161020282671808595u, 11880146410862647497u, 12658106816729174367u, 1443344u}, + {6250242478015098288u, 13079173820974971614u, 14698702730272887885u, 5863290127108593871u, 3713420u}, + {7293736913151456832u, 13163097433630419347u, 4989486253781409813u, 7346317512072206186u, 658334u}, + {9130570809698537289u, 8551554414447014452u, 475445095473191077u, 876835254614474248u, 2824768u}, + {8558147405873640139u, 4982798601931266984u, 5786731367760066494u, 9635767780284855125u, 1755122u}, + {12632083163863860645u, 15804729929769126684u, 17270437213152080713u, 608837048291328523u, 1790696u}, + {6893253051285186956u, 11345434891480058370u, 9811698840574746841u, 17903315832840780575u, 779499u}, + {14161375984218438830u, 6071682827575922087u, 11361367375236978368u, 4481950066813560386u, 1804318u}, + {8482398051528301811u, 10970816466189989954u, 10445252536578392659u, 16822703207692746625u, 2424843u}, + {15690583325615018800u, 18396754644172468135u, 17744714740074905333u, 10493081610562180017u, 1577393u}, + {809279762832697606u, 18324571545913800858u, 5799602951194904378u, 13071522296332698957u, 3836772u}, + {10493223948072773390u, 18082032076106773867u, 1946546723338315774u, 5619210705145148112u, 3691417u}, + {3928222262839745423u, 10985735577617856982u, 790036861987474220u, 12678173586924940197u, 2374858u}, + {15765733069020870585u, 10960240362430774659u, 4733632371434098341u, 13734751277621883145u, 236000u}, + {2139985305299932281u, 15414591167595690863u, 14817515877415383780u, 3246945177042903851u, 2196632u}, + {17180608833883534177u, 1698450550501136570u, 15278721714871546823u, 9624180718619481424u, 234816u}, + {1044694806348395198u, 12801673353986044773u, 12760426023542387684u, 6129227093504467460u, 3083163u}, + {9259046657432219359u, 2621621249257922830u, 14637655020975400887u, 1858314175875956055u, 833633u}, + {6810601931474548887u, 14136393277746621076u, 9560153944451496859u, 17885661137866841018u, 2529176u}, + {7665565240780944956u, 10439422058507297110u, 14476809850309527237u, 5378917039081696830u, 563430u}, + {784721954910487395u, 8093667559438289511u, 13811071952907369769u, 17952734369836423275u, 448364u}, + {11103588875175169467u, 13002928260562636675u, 4375189531394722476u, 15860941562256744999u, 271754u}, + {14757506301023809826u, 16069045180160559928u, 13772329223905173185u, 8940154653053012491u, 2247237u}, + {16442360279663119483u, 14206865350685349459u, 12873936272359391769u, 6238407302013927980u, 22124u}, + {9493582672160212436u, 18193285695216439211u, 2469656824077013872u, 3315057447748979108u, 259577u}, + {6875518477521430617u, 9846254260173903962u, 531368426754660261u, 3679725649735803488u, 2029406u}, + {7784785035161232289u, 12203849472412150110u, 786266346083629691u, 1190357441390223232u, 60232u}, + {14891658602220836140u, 15908294920394138805u, 1902931882273142885u, 9368598310410036795u, 1880217u}, + {16216402071801451344u, 443082636651173696u, 7762712117398646687u, 3781678781142888934u, 965313u}, + {7501815642866737956u, 17194021238441696838u, 9997853835292212432u, 3188341023312532753u, 2674171u}, + {7342072253816584481u, 623394008787444695u, 12304773158917516834u, 3291921482941434088u, 2783369u}, + {12076847068054875552u, 6778778264045719172u, 16847566179899973220u, 6104181998083564987u, 69208u}, + {10253440672977781968u, 15592830964905295862u, 13499421685084153076u, 7711439230426324440u, 2666827u}, + {12472808627670964268u, 8836326674150681766u, 15380284118420771972u, 9776969477989569212u, 2549033u}, + {9682894426835697239u, 5377975065492982462u, 8742955010821168167u, 16404095215773051029u, 1191291u}, + {15649614362606403274u, 1700987687197674406u, 4191603581701816303u, 9749750651718680101u, 1196589u}, + {12278500666023457639u, 2422668141148123821u, 6960287201089738650u, 9893963563990293922u, 918852u}, + {3769925035237857628u, 7241917127528756865u, 16818980398962592140u, 12482913606141112660u, 1531526u}, + {7578796125495883798u, 13318780845778802891u, 16405771902724153632u, 2406152283898767588u, 1757002u}, + {3819548210942469531u, 4843944411585715434u, 9355871695528070152u, 536814126902643665u, 3323813u}, + {15677883254166253997u, 17066642066241760542u, 14537426570554473449u, 4024481200382719372u, 3082450u}, + {5323821814307577303u, 15386905193391624849u, 14046431414953764486u, 2506819367584037031u, 277283u}, + {9188377258951941370u, 1490693025432140496u, 3408522219391309986u, 15785728065350027757u, 747658u}, + {803533392637346203u, 8416979003736705288u, 5389088725307498022u, 1599058940400804193u, 3721407u}, + {6858656613668252689u, 11807069173989187032u, 13861767193649296865u, 5328852208890909509u, 1621301u}, + {12536475015795906554u, 8703868662398771896u, 11722572447805054945u, 5794515252976536458u, 3058391u}, + {14021115617894888008u, 12267054731081136266u, 4666035930468747835u, 9207731804665699754u, 664644u}, + {17899216573891511262u, 15222473900291530511u, 16416946596089669083u, 16009046403395860207u, 2536642u}, + {16470825951647060955u, 2228077952441601959u, 15240214433365014032u, 10639259125365075739u, 731537u}, + {3278812981630723978u, 714739909291269674u, 11540089988789202259u, 13704437353665016229u, 1239223u}, + {4313023089443602705u, 876534141779381484u, 6405642903841943792u, 15443184767352270229u, 1639596u}, + {13021977157922499859u, 9739800296417063431u, 6339359467606033187u, 8100695755487391485u, 2900675u}, + {11639906277984499201u, 3275325433465122794u, 2234496266798005881u, 2143178244566613353u, 2122650u}, + {11105730534570567395u, 2092095589839302835u, 5613634815423705970u, 6740512228978535872u, 1361388u}, + {18104734716627120160u, 10568804687044154939u, 626061839121974442u, 8095563715009460360u, 2690805u}, + {16213925304474726771u, 1379415840894486323u, 840272067146183315u, 12803830743996066417u, 50185u}, + {14590125272775788654u, 12244626766483497750u, 15567490980227384107u, 2811171930134359361u, 1561620u}, + {7890701746341525345u, 5969001204304610441u, 2378473039734464149u, 3055225756884531552u, 202997u}, + {10622267028070442046u, 8854175457391412262u, 13538521186439509891u, 10956498930527002846u, 447546u}, + {10123630527648138192u, 7742024764954011653u, 9491535726300234161u, 10240434130865478257u, 643684u}, + {7659584090242258040u, 10888953968178625486u, 16378340203453297328u, 10027879455524758893u, 3664150u}, + {8446102655662192699u, 18415768607097837684u, 1448535999662396340u, 10371827594749257157u, 2454341u}, + {9046195717052404796u, 1557690090303702957u, 6862598554394598511u, 18059673120150423969u, 2265101u}, + {16472538354046402555u, 4074507074231040858u, 4157475258610689805u, 18416470236179400379u, 772602u}, + {6171043803132588395u, 2738986971046022865u, 3265538766068908186u, 14714001193518605327u, 1521482u}, + {16085734699008667525u, 14950429554858995232u, 9784526403614392750u, 2550082195108234709u, 1576418u}, + {11460815715720510160u, 12168894686830820954u, 878548277047600029u, 12350928362434948315u, 2575802u}, + {1233294902334018894u, 8063344508111493199u, 16722791561455693614u, 7973850516801550532u, 2464515u}, + {2236731453671352703u, 7349868438719473361u, 7424017090538067770u, 1991017324468723084u, 3007598u}, + {3282114676331406458u, 8954311561387819616u, 9037086713806721453u, 7477412578480195432u, 3143927u}, + {603010195100136490u, 5835946201069689695u, 17775863006819145848u, 17928278545638966155u, 3180762u}, + {15369061530705029287u, 8779023182094391587u, 8414990479457473453u, 130732314539587022u, 3499756u}, + {8703525150692623635u, 10009309245931553055u, 1198904044015766581u, 12458465277906766752u, 445587u}, + {4851471840697409880u, 4989521187225291935u, 16282670639581180968u, 7286036639640758831u, 2549951u}, + {17693605115439348680u, 2839701380003287891u, 9104015107279887629u, 1704362963655878912u, 2391826u}, + {4572031494660853292u, 5972466858495789163u, 12163224631471494107u, 11501278855825749209u, 2733665u}, + {16319801632931676533u, 16565768158627713622u, 4502884348585518469u, 16191328294635393741u, 2240651u}, + {14136509561272698052u, 1391839710578349104u, 3197480352704593276u, 12002893342042867051u, 1765634u}, + {18310891934310582762u, 5178015746490393521u, 9238712260190232655u, 8030963148738734328u, 1030082u}, + {1560835130936185248u, 3879831651665737902u, 1594662742699630075u, 15583441979252332207u, 3684012u}, + {781611532607024676u, 3094774451995836056u, 16976457388508894699u, 7057544663790926643u, 1106374u}, + {4134670778763228604u, 6796155560603135856u, 4621407967592780216u, 1389503291805981779u, 570139u}, + {16635968883122641802u, 12176648988908859654u, 15767841551008425364u, 17376397372749576557u, 3051249u}, + {4174350146948504821u, 14395839456234464544u, 7532634636188868056u, 5388547585591226832u, 3102534u}, + {8306732962801040960u, 7719188974157764313u, 11153303170796378642u, 16414305502676171447u, 384465u}, + {6323677744796110167u, 2319088406367104890u, 8083674774420001422u, 11176019219753434325u, 318898u}, + {17923569514998326970u, 6834815858675504740u, 6358103722446195397u, 294113017119348792u, 0u}, + {17391174245857608186u, 12496622614534991461u, 2201596627888497666u, 294113017u, 0u}, + {5084706098879593043u, 7147802292060502975u, 5425427555547183235u, 0u, 0u}, + {12965492103089095725u, 10093749104617273195u, 5425427555u, 0u, 0u}, + {13990971332664454474u, 7847753239082743428u, 5u, 0u, 0u}, + {11630699970154906781u, 100081473607u, 0u, 0u, 0u}, + {1502922788721691011u, 100u, 0u, 0u, 0u}, + {1846177330160u, 0u, 0u, 0u, 0u}, + {1847u, 0u, 0u, 0u, 0u}, + {1u, 0u, 0u, 0u, 1339036u}, + {188309085870909973u, 14668784774283075270u, 2908722745657626490u, 14580334850058926815u, 3407777u}, + {10860851545066978097u, 14711330839098809670u, 13581312892407538813u, 4746606017224924404u, 2864875u}, + {8584777164242216130u, 9935115266607780178u, 16801523329329462797u, 6177743113898649228u, 1411694u}, + {2847659345885430317u, 14336472094626326561u, 12131440972916977066u, 4205381618305954733u, 1725617u}, + {10876998997384970382u, 16381519412405617169u, 11748764609050107442u, 13938947668693715721u, 1936599u}, + {10509551374234317760u, 8628293407967646303u, 11874348197646838335u, 396011930254989192u, 3211987u}, + {5193008734235638172u, 1898090265431863770u, 15152343455661020553u, 13317848005531834275u, 35150u}, + {16583184226990334677u, 10406497375109033604u, 5001588867873906196u, 2738836989813300464u, 2160467u}, + {5553288206549892725u, 16571927180419818358u, 12257218314696200106u, 10776435096218794507u, 805236u}, + {9317179306939587345u, 4241958570719253047u, 13352784232207262885u, 12120529791559265928u, 3303123u}, + {16389389470937699604u, 2261194901481271471u, 15158846155786368089u, 132989470783441442u, 2553154u}, + {7195831954370778876u, 2777537048784925208u, 6088132180461485707u, 7108741594268695035u, 3308274u}, + {2241282806352452039u, 13711450318284772608u, 7960984220141991191u, 2006581929936503259u, 2204931u}, + {295379303378296245u, 3847940486322685632u, 5362869819105674426u, 2490631997153320229u, 3856548u}, + {1019080784340545154u, 13140139289254577832u, 348676617155080800u, 719659102795959845u, 779802u}, + {3236694197965008519u, 5086727175249505925u, 10426466416741268315u, 11039196696444800166u, 3126192u}, + {2557211130792397582u, 15342011746187892644u, 559424050879686563u, 13100092595653431323u, 3654559u}, + {18272562613812143972u, 2762998260524047869u, 16558695228814952804u, 9362844358568068244u, 3878494u}, + {8423540066216991522u, 15979720279731577282u, 4674673328069479934u, 18302116887168030220u, 3641380u}, + {13065596886472032652u, 718772491977889351u, 4270426791761656640u, 11956674639495350814u, 1743841u}, + {14458895796369877139u, 17633511245371446092u, 12819525506730002685u, 7309985198419637913u, 3144442u}, + {2504890992286474179u, 7399867960719804290u, 5942732709277153453u, 4669690742565996512u, 2265888u}, + {1978735347668279225u, 2522219137187270221u, 1071230473354038410u, 11426898118697994219u, 3689327u}, + {13751579844159264583u, 12368107040399679866u, 11673037872768731882u, 5904721199472287573u, 679186u}, + {5982650302239838617u, 16114239370464933783u, 18375763762751822116u, 2894832537742285134u, 1865732u}, + {3487324045679269464u, 14951537147641921301u, 16563479944662387225u, 3349066009353647862u, 2718240u}, + {16070010470315588862u, 13790595089782843557u, 17309017205653187289u, 6751498926487284308u, 3424892u}, + {16961638432493556744u, 2139670491190432373u, 2591947968822250087u, 15627618425148028356u, 2912664u}, + {9946193793052947370u, 16383515725299216487u, 10995982027484443729u, 10646195506583732174u, 875122u}, + {6814065068553862032u, 11125868610011772601u, 14997743912138553097u, 6213096249475270852u, 2596412u}, + {14693514504649099438u, 12096374979582541575u, 14862037086054649250u, 4875754154428176325u, 2018123u}, + {10245745634750845539u, 11059884473045764273u, 15940073092174617716u, 4937144197945120743u, 968227u}, + {173040227984756222u, 13997332524431968919u, 18034008797878215873u, 18032259150093383775u, 1792780u}, + {1940357060311772402u, 8701955515867662682u, 728946260770454235u, 5725620900869031104u, 2160713u}, + {10000694111548374583u, 8257619083081460932u, 4978652854398789272u, 16757219942252639239u, 3872701u}, + {4322045656946352209u, 17895410598997238824u, 9324350533463838801u, 7493370926884796404u, 3192253u}, + {8974159332646104627u, 1440285510425059402u, 2944603074157891704u, 10507237817102453184u, 427269u}, + {1739343397003768513u, 6825861845116811376u, 9442332825918975004u, 11609154372507265319u, 3317224u}, + {10382436456551464052u, 4336804672343966069u, 2897970646041484009u, 5465511546616916666u, 3231836u}, + {3806621510262505304u, 14355800070959614771u, 1353320331187219802u, 1716941519918055257u, 3207453u}, + {3249447154353723533u, 9371807134707101201u, 6962710731487859360u, 16992701665249458402u, 1552654u}, + {14272361314356196441u, 6304012760362102934u, 7457045865361499450u, 4856500228506894807u, 2054771u}, + {2118607501226747043u, 7969254246214253164u, 10891967538685992221u, 1911401284609706813u, 2757828u}, + {6770543823453869459u, 3682516093366030330u, 17040306412092255565u, 2284658364402477565u, 3158388u}, + {17143106368004568219u, 10806905724171332227u, 13130993314501478193u, 8416942885805774303u, 2148480u}, + {3413668937871526199u, 5080025267880108869u, 4827844665019460491u, 12073250673458391695u, 3086270u}, + {4927275963166852013u, 17303022537301355146u, 5982353171609308197u, 12378780225391295307u, 232121u}, + {14925646282597279148u, 659516958097162175u, 4094307297235589709u, 6561522946511355936u, 1452525u}, + {14833896411877411037u, 5916031035070450328u, 17937361885058452121u, 2044406996559170120u, 3480276u}, + {7842852405091107951u, 3995710446219469999u, 352261551526113507u, 4459712999035884676u, 356178u}, + {4483795764178136042u, 7222363156108553350u, 13122429415323957747u, 11607842968976796415u, 2678214u}, + {2067888980264256324u, 14141900668471033412u, 894487042028439189u, 7615451713822902202u, 1399888u}, + {16910030608232460621u, 4910791668242911708u, 11354362233704519441u, 5502200530165831966u, 1191287u}, + {17052502501401395779u, 8947784492152909973u, 14421696957556571268u, 4201315826109358048u, 877964u}, + {2602848389446563316u, 4433350653303059409u, 16313338881335350075u, 14355656794962905422u, 2407662u}, + {10296127554541735689u, 1866587280642721317u, 7854387782829139509u, 13158895653988536833u, 3522799u}, + {17103684849341151321u, 13074996510591558936u, 13130946155437707162u, 6406052460072673956u, 1355190u}, + {14886576053932083056u, 15526194653885920525u, 6035055177242860476u, 18327627735140998651u, 3419244u}, + {1578418195028047838u, 6002381568664991669u, 4550755598683497115u, 8565870033796691125u, 470982u}, + {3982493054605139087u, 11954871956024500377u, 15419597164805953102u, 5413007645827789105u, 2968524u}, + {17374722484767649789u, 2031129054015007068u, 15294636201201363257u, 4882618408458843930u, 507425u}, + {12372143830044809371u, 17021086297859161329u, 12683847132547908023u, 3179894481663049661u, 2024680u}, + {840547913056399485u, 6815044081230234450u, 11601757636138686726u, 16682652979732405952u, 3347712u}, + {14505850476998185859u, 12139688465312365211u, 3540087808327986365u, 6258707490440941826u, 3478u}, + {15175988697760388547u, 6783257938233105477u, 4823127656948210789u, 5692614093030902796u, 1747025u}, + {12515301943499155183u, 7523458921554116133u, 8169051999706872489u, 320457304909698266u, 50171u}, + {7766980741483161286u, 6576805146783899310u, 15196881602888682023u, 16790344902754588474u, 672812u}, + {5472045379525650959u, 16906261629332468672u, 11002609696980644173u, 12982778134391094053u, 1170473u}, + {5655646595759597860u, 1149647390460721823u, 7373687892177636377u, 8164099555144821942u, 3588383u}, + {4340736096610972021u, 1570007867946057220u, 1868634337219662179u, 16567383025689047001u, 571648u}, + {2733891371856538878u, 15155204516915768501u, 8323727447748343769u, 4982519049540658527u, 3320377u}, + {10787956784988335286u, 17247932858833414863u, 7502987353710881288u, 12743386700405067285u, 2553717u}, + {8762713738081304830u, 482304898450328053u, 7917784492586900767u, 12224841169088889219u, 3729330u}, + {8041859360521733852u, 11114774832905097292u, 4002694422421018040u, 861427542718455707u, 401372u}, + {14910920803320142422u, 16893679201971481441u, 16042632661826986911u, 11968964617719817868u, 3739019u}, + {16368984905722212460u, 9630367419740400232u, 12793233411067438479u, 17146622525537622863u, 1905644u}, + {2817479115305987778u, 15854842820535936713u, 5853955576680333442u, 4790954150813466466u, 2156139u}, + {10698779985344294124u, 16103470459909343106u, 13378262997845816295u, 9263145785966073997u, 2892061u}, + {1943440388769200490u, 18158905946780549618u, 9632789658189302829u, 7187050928130567969u, 3764561u}, + {8957790611913693188u, 8819416933806012750u, 8700380011985272430u, 14336847520013650359u, 968782u}, + {6409966984091218598u, 12976715677767317735u, 15629964465561459748u, 14789677665729290886u, 925958u}, + {2830005163996037517u, 14761202163412336558u, 13365385778305826315u, 5565515665959132686u, 1504020u}, + {13484649868900502853u, 177088960782998669u, 14400063503561663789u, 15664242183817618417u, 2761572u}, + {6269114125678401591u, 15907448165920906878u, 12782095210012931272u, 1131805938158283457u, 2323818u}, + {9538493160449051777u, 5951044944371898152u, 17994307158722478083u, 16616113505775110800u, 3641313u}, + {3234222047630638636u, 14812968129029328443u, 5508614842393997696u, 15415437915698035422u, 1676508u}, + {17466240212463449577u, 13853786975566192853u, 12150360274387458422u, 11704256363573290200u, 2751806u}, + {1400553953379241551u, 2366923107281096899u, 17847385316350816441u, 5743311801723061693u, 3446350u}, + {7166563080855998771u, 11769906855390325863u, 17245183927723731465u, 7485506128088318122u, 1133005u}, + {5675351391026908031u, 6117344274966976189u, 11381718623942575002u, 14360361474302398682u, 432073u}, + {13272318384277742328u, 15871087960638169958u, 7337720965917404557u, 6493153817826035621u, 2973127u}, + {17017195909221949390u, 16474067817315934204u, 16481406809018804407u, 6035624824508808363u, 29360u}, + {6540090287953082925u, 16751805132639177601u, 17418414164007466826u, 5693091531437935880u, 31599u}, + {12475724888174970699u, 1469228764327753475u, 10320028480698028791u, 12970949831186105159u, 255078u}, + {11830212850544434469u, 15757011464410571283u, 3564117698021547915u, 3463469885376324444u, 2979831u}, + {17917008253445516546u, 13156095310512293876u, 5124161290996215716u, 8197476309589232660u, 334485u}, + {7232275730872043796u, 5682601354819033661u, 17736736647069143223u, 8364851075788611624u, 1235472u}, + {781099438216235025u, 344858916214805555u, 17390379781297008795u, 8525586540634581610u, 569351u}, + {3579460288250580877u, 2159663833735033708u, 10269354573723239469u, 10026508251982680251u, 3565053u}, + {7849911520071822704u, 7146679151710616388u, 1843860897779915070u, 10297941983712485622u, 201882u}, + {10330645457787661533u, 5754284990451683198u, 7596866056002335546u, 17081373862873951447u, 3862778u}, + {2191241773436191430u, 15464065422229144877u, 4539756544623917936u, 12969565027050030041u, 3578362u}, + {4523796526926184593u, 13763655594377334919u, 10879207738425477266u, 14261355166458455877u, 3620750u}, + {7176072823271096388u, 8205785047014866404u, 8708484258199081475u, 5615225803786690097u, 3226385u}, + {809668113621170910u, 13560105413912820192u, 8804229867533658577u, 5391778262800148459u, 2507640u}, + {4399592144279362719u, 7978994558616378156u, 15024775270650324924u, 9557860211707262834u, 2149428u}, + {15357009114453380143u, 12270992501473444719u, 15091991209332003938u, 15171744705743592145u, 274075u}, + {12955016428762867970u, 303697208565258608u, 1895353992560131939u, 16362129653163388123u, 3819055u}, + {10457319033086001048u, 1329692724212415117u, 14946123954821349929u, 11671721786656948180u, 3852107u}, + {16204954313142872806u, 5455561860646186075u, 7448852309242716807u, 7276818247438060466u, 2919017u}, + {7663476912725456753u, 1814949606127302556u, 12313975296202941244u, 5097877949477581201u, 2948594u}, + {1052566428355884764u, 15377296693427050779u, 2125232887210106767u, 7836612120089370579u, 257267u}, + {2412917265369315989u, 7730351302892408011u, 5625593802603940345u, 17947086661788279219u, 3401453u}, + {3890903163332751010u, 8600864843319559093u, 4817870207845501045u, 17644798696171254621u, 931588u}, + {12431165594624117435u, 9175239122164806981u, 17378692889010475890u, 15293394719103660061u, 2589480u}, + {12675461000020856097u, 161728997042900264u, 15168015021720393710u, 11216694566016214208u, 3602930u}, + {250649796356496108u, 5720702759667521100u, 15127235669382937601u, 17360284907944889560u, 1846382u}, + {16989007611048685973u, 7877105656986295574u, 5105004949134596677u, 7095703969293526625u, 711684u}, + {16634692196819637197u, 815799535351143692u, 15233468263277876065u, 1886625704691184213u, 2196259u}, + {3892538315395963630u, 16414971296437275796u, 15011752945674680651u, 14812320607354433850u, 3429515u}, + {1788759599857956918u, 7725608793602684478u, 4884330571055534656u, 6980792427955350476u, 425014u}, + {2466738722546817087u, 14231003700172357191u, 6011297681090690655u, 1232819230111310931u, 1980689u}, + {12348186862587602351u, 752227523727996488u, 3542777540937658074u, 6665835915794801040u, 3052482u}, + {10194891666789859479u, 16782340584231615013u, 6100558744203695236u, 17566303712125929443u, 2354692u}, + {1979767838070829497u, 6568455329571536713u, 11800598293659382420u, 259609200376498811u, 3114863u}, + {17854225377329499581u, 15992986296431130722u, 8333637970933908182u, 12739595631520593091u, 3869000u}, + {18080158034012491399u, 1008248097154818801u, 13335097637639762413u, 10087376036832760990u, 1620725u}, + {12844454063099319469u, 6420349670703331282u, 16152016901342331940u, 9829729898534438245u, 1415946u}, + {12346786894217331652u, 12406601894298268229u, 5661434549093856858u, 16599366232037347923u, 1885068u}, + {499788219520154012u, 842821308277245588u, 1531408318738024174u, 1620040452391320341u, 345063u}, + {11648560241849841845u, 7708653766809833608u, 7389620852071732002u, 2312208299684040843u, 1348062u}, + {4352579373467809042u, 5611177880607942021u, 4696707714888778659u, 12779061501734946017u, 732289u}, + {10750295028462422329u, 13333212820394826975u, 10667291690237605697u, 8228074080873838899u, 1099391u}, + {13825034234430013487u, 16741154016363650856u, 9859872432333117517u, 17746448325972285954u, 3708080u}, + {15107828660256746238u, 13718542183007527212u, 2371204149864832573u, 16137245490969218968u, 2806961u}, + {12770342328902734232u, 8556154737826537184u, 12595767864275744637u, 5456098860173724527u, 1434318u}, + {16800682378349659963u, 12296180442725354942u, 15282803091669595195u, 15951186784904487652u, 3898524u}, + {15379915297521022917u, 11004068923769893807u, 16762601291331236201u, 6917386524047555160u, 1625104u}, + {3991852688095219384u, 8639831158478770412u, 4001527213534570867u, 2047590517560530419u, 1566055u}, + {7946245435551514432u, 10051705582164408431u, 7683535594879876239u, 16674192840599296945u, 3071131u}, + {13769903259269607400u, 12646462310129155047u, 10390952088302635010u, 13459364875302624625u, 2090025u}, + {2600946785104381651u, 2971870279806509844u, 16949883497407943981u, 4001721841828056160u, 1201648u}, + {8086217114582627761u, 11702209149919166352u, 1998138938802084595u, 18036565006606390777u, 3312754u}, + {16759582142425594330u, 2280756389759605870u, 10339422947721738093u, 4816910749756966394u, 1438471u}, + {8381201411300682141u, 13714316240840771612u, 3312768321590911840u, 3341184436956048858u, 3261877u}, + {15851067527091389382u, 723652502070208879u, 970152827844267694u, 276343795673887736u, 3678819u}, + {4337859300174609801u, 15237002009425003788u, 11811620679281619803u, 8642715923376268278u, 37265u}, + {10206908974673790741u, 7119795580951205064u, 15075389800535297404u, 11457844878591164533u, 2125010u}, + {16244736616502056988u, 5044212220292720864u, 16061223928766465282u, 11208126602960748492u, 3904815u}, + {1970761018412500947u, 8322967906236686662u, 13912156828495267070u, 576434292433804317u, 1054593u}, + {2710908829299546101u, 1372636069905750924u, 11089750989448734825u, 17817679535117560061u, 424982u}, + {2357582661063472217u, 13822831425555536575u, 14433303925364299179u, 18310468437641308511u, 705954u}, + {4057262468375019383u, 11974002565614960346u, 8168774920774317566u, 7074666786793217718u, 2875872u}, + {11224285242392460849u, 4379985443209144614u, 7714924043807369982u, 10213171241195252998u, 1597798u}, + {3048944685834034910u, 14666796625480284445u, 6423056054573293378u, 3200008318669485399u, 86732u}, + {14597095066711154010u, 15461137711496229921u, 9227878785769223916u, 17799825653575209487u, 59685u}, + {10613500404123245639u, 9395964733596951838u, 3014390704007357563u, 4756902218223108784u, 1180496u}, + {8340318402772871987u, 14560285960318148101u, 1246821337914522884u, 8092226844596868881u, 1293257u}, + {12687147672383490560u, 14962832456419181723u, 3525582182323944487u, 3987024061078796718u, 1412707u}, + {13593287569207924149u, 11394778270828367313u, 11318575921767499525u, 9609719855511577548u, 3854209u}, + {18293984109318000438u, 3096016626363218128u, 13575499317188842056u, 1368134309322010720u, 1467682u}, + {7043262348689375449u, 1112902550813547742u, 8428037580639283424u, 14078304792999672011u, 422716u}, + {11821863018640727669u, 14538574374068002734u, 15137048943108548093u, 15572238060138601175u, 1494241u}, + {16678877456371320209u, 15929165458293394251u, 4701053701752996425u, 12349412477369358950u, 209144u}, + {7851289855441683376u, 7864092153333542838u, 15357572146277459462u, 9371345263122596067u, 1791135u}, + {6568035952360714272u, 2929274603135631782u, 15796320087967440118u, 12643119574955197820u, 2985665u}, + {4826115220859360638u, 14847700891681391384u, 7024196603173864477u, 6468201680163537907u, 93441u}, + {16028633151871708426u, 14935079570055373592u, 6937609477734387949u, 15638221594911555286u, 3835033u}, + {11379633365882443952u, 5050131437793120848u, 14279967962090361413u, 3313335619610209277u, 3127837u}, + {5041080483917676832u, 16598448889121707960u, 7528925510976605540u, 5245845182687426474u, 1245075u}, + {15711718088900343593u, 6697398955906590321u, 12280323565152132764u, 15010947145012429790u, 2501544u}, + {939356351500296766u, 9069553277797737309u, 11070350344160396415u, 2279930772143836847u, 971284u}, + {13753738259750462194u, 16333128524578737928u, 5084509118225550069u, 11258901699567577696u, 3626081u}, + {5908960392714474686u, 10929525081602659380u, 3705482194619333225u, 5543266546338965640u, 3890513u}, + {17576582901249711536u, 16715044787545939797u, 2309249167318898467u, 12898019041920879123u, 939248u}, + {3580287346369865034u, 4756240680002356546u, 15810776124166896661u, 4989300068992790174u, 864671u}, + {16440499840559090625u, 11905322413776385293u, 12878566905222429757u, 6789364209199484564u, 396022u}, + {9745184344727078664u, 11306253191511352523u, 4603497816759540318u, 17661415862563267133u, 3482486u}, + {11094268777372854548u, 15863035224169141707u, 2439849552161351469u, 352470921795404088u, 1409924u}, + {15740194315333373247u, 17407215108168458025u, 11954251496225049139u, 7231767911336645387u, 2064709u}, + {7660146721553069969u, 12856473702610388654u, 17416772546831703953u, 2848333333220642189u, 2714735u}, + {2371632333488545810u, 2240090285348960685u, 15253685538159547857u, 12371926605106952288u, 2949907u}, + {15369081860785620653u, 5467243372921724652u, 7117713109582663448u, 774992132221450287u, 2043484u}, + {18316033338264403093u, 7491775143105235442u, 10992791686069404877u, 16466827067789281829u, 2135553u}, + {16747636373234669575u, 10981083132151513836u, 16076069569166483435u, 15747949516381959769u, 149630u}, + {17239163776355295190u, 18217661699225002710u, 10888409281053661794u, 7929095546235771636u, 407811u}, + {7173099202395037584u, 8605560822998969656u, 3502007603527469024u, 2241308208252305128u, 3279636u}, + {15521914376169624096u, 14234723154953379424u, 5091244256726191644u, 997247330681295875u, 3468313u}, + {1949536341532421086u, 10812916403365772736u, 14300648033175965685u, 11953482099533876566u, 3269823u}, + {12365723240877327881u, 15006216556848774491u, 13421122983130104767u, 276490382114595094u, 1586754u}, + {201150891357266487u, 15940394102559167881u, 18068393212718011115u, 14296674064732156635u, 1873186u}, + {3327736128721256231u, 3538124101419744229u, 16335056956203043460u, 4285952245278877988u, 188114u}, + {2725031639472609170u, 10793301600760716842u, 16077632659367834484u, 15784083189406852027u, 2607749u}, + {5749765312371047962u, 4698988197028571751u, 17043397169247470721u, 10928801193922673534u, 1002096u}, + {4217707972075702613u, 17797666629701058326u, 13998508584137156893u, 16375559265987730712u, 1655143u}, + {17605724069721925485u, 15190998779811494013u, 6974562684966685631u, 17828757743070151306u, 2478754u}, + {6513486855407109013u, 13335187295673321450u, 18013573393594129656u, 11502882410518983412u, 2248918u}, + {8246800415981899021u, 15257819578552089432u, 16973493031601904298u, 1410579513012271931u, 3751566u}, + {4869417884340001999u, 987544430102012316u, 13468015586915755353u, 15201298927253076320u, 2388368u}, + {8236995342673354917u, 7412497249149485687u, 11567565988039680094u, 7105701844168074189u, 694472u}, + {12134963462367044288u, 14735088541109005266u, 16564086743500494126u, 5273015119124798391u, 3243805u}, + {14240691971462712264u, 12373597467731671886u, 3773046708236061277u, 14831644423708261411u, 1437306u}, + {12312613416773307078u, 16538040827118163257u, 9283285349832032284u, 7592561004751684884u, 3738743u}, + {15378958921586452484u, 3701240266592650980u, 16401803926751227364u, 18371596528504629818u, 728860u}, + {18418055196196243380u, 3629090905612899852u, 5450414809846618618u, 157560300333016344u, 3163940u}, + {6985664751626529896u, 15501300099229757227u, 1345567941968734937u, 10002312368836188067u, 94266u}, + {1592236384858335329u, 7556017064627374179u, 7910368268122551609u, 1298775603461867521u, 1662813u}, + {2128410180581111738u, 402162511068091122u, 2086757106739414126u, 17973014402596268868u, 2380896u}, + {17236736576044338442u, 3358218506507101419u, 3700357907478833585u, 332150173302844923u, 873887u}, + {2769030052582970544u, 18364261766785187076u, 4351518954436529513u, 10104183535480403032u, 1660028u}, + {4045108370284901393u, 11996102027811111762u, 560933763233219638u, 16675926344536728671u, 787502u}, + {11758462663065878384u, 2819121572131939850u, 15743039899540848668u, 9165841307344308635u, 3469091u}, + {13030917158522333882u, 6566290553297779737u, 8659080451339121747u, 496339007238818065u, 2671112u}, + {2689274849398193079u, 2370846740904822572u, 1382307827286917903u, 6966802347593635331u, 2168846u}, + {13923487543203153347u, 1036016649916364961u, 14347701689102342401u, 8831034626691299205u, 1565505u}, + {15627711496143868838u, 461776626010168980u, 5421595588653368464u, 14224224504383950690u, 2200558u}, + {13121305802524389896u, 1335100664096863595u, 16029342872498680695u, 16181494208965436311u, 2154993u}, + {5533751311779780735u, 7821586966577395758u, 13485584486388335055u, 8830779093160337968u, 2265406u}, + {17951113675950429575u, 9787519207928959588u, 11963341915176355551u, 7968124717707898113u, 538498u}, + {6353662623337656504u, 10173181008599312325u, 15384785288459373996u, 9953881519992384331u, 2863274u}, + {9525295455932808850u, 1881011478103315898u, 12656958881775056963u, 14608452088306231234u, 1321492u}, + {6489484183745642489u, 421387443812288598u, 1666890345349187940u, 10400670780789529455u, 2624737u}, + {7056699941392345541u, 1040844474485644707u, 3125882817627869653u, 13955533511420558616u, 2397692u}, + {8015015915094074947u, 12834371277110245152u, 12061014168059988985u, 12221963017056935497u, 98824u}, + {2030670131976085282u, 12784144863074757062u, 14496098635410829632u, 12467786761819836217u, 3704161u}, + {11575416431264759509u, 17590348827783389906u, 4488284564640790606u, 644790474746026296u, 3158293u}, + {12739371385768696236u, 7564816993743065680u, 11953080351385732480u, 5462579776170174035u, 192299u}, + {4923181883666091290u, 3984503811035804447u, 4360426969189422595u, 1012353612432201153u, 776832u}, + {3283561162007652749u, 18067169759874191305u, 15369120010641159719u, 11327372286059307502u, 2349111u}, + {12756395342626889374u, 9367230224512622444u, 10432018920174642357u, 15823946555051326188u, 2332966u}, + {3161045514208589808u, 384073414279695811u, 15618844271903376549u, 5015009631175640016u, 363040u}, + {8561800427079775620u, 10651678435527959927u, 14652482295359337988u, 2889000672500646586u, 2621301u}, + {1196002906275360155u, 17678349018254554895u, 15886686535962036775u, 6605595529027601769u, 1897765u}, + {2305407648802813240u, 10592882665820755161u, 4614268744505090440u, 16680311814633992152u, 2307368u}, + {16255588920372839360u, 347091733474512743u, 6033908592901537575u, 16471694884307748283u, 2659909u}, + {7897059547479201506u, 18283128961947677626u, 684581312764248494u, 5597501417974502656u, 2477678u}, + {17998609100576128152u, 13820665149075733385u, 7440130895744053173u, 16618951726283987232u, 2483899u}, + {16524634845955047211u, 14764165762818935984u, 15373848855010903163u, 478165430004462423u, 2622794u}, + {7964689904761741001u, 15852334880132449800u, 13384911896459405223u, 336612386305938143u, 316229u}, + {14194687669140502603u, 17738642483161292114u, 1916878795536389500u, 4689577008233613324u, 3201697u}, + {5503556040393092248u, 7632560189638351787u, 9479886485115579746u, 17641113835104557042u, 450446u}, + {15778350440628436885u, 154380698104970984u, 14605722043496303481u, 9303738910614843751u, 1650924u}, + {7590348945936047947u, 6191473316068391108u, 7506661508690501058u, 4930370576395983426u, 1577436u}, + {13760233420330040142u, 17050773624934762279u, 12154928649448847406u, 173213751190882548u, 2434964u}, + {18130124301315842809u, 1626865563682559530u, 15347402795764891661u, 9484461976878469471u, 1587854u}, + {11408548749999939266u, 2819810270952695332u, 4614296893697263181u, 605751498152301471u, 3053719u}, + {5214116624955162513u, 8922601216413429181u, 7444393407273624894u, 11009085467236822028u, 3059905u}, + {4699225656385847639u, 381733647263501557u, 14284762160701438013u, 9928335678630076924u, 767334u}, + {148702399964123104u, 1832232097321715790u, 13093289919299958621u, 10894851523572509859u, 2691790u}, + {7571758855031237632u, 15578035656640710581u, 9535905992970145731u, 10714178689738356685u, 2674638u}, + {6669916268135868924u, 10118991342490065531u, 8365076274978693154u, 2355181382603691009u, 776689u}, + {4862245253711681440u, 6767425704516497879u, 9938560300397755315u, 17596380330817463164u, 538246u}, + {16940827874532988686u, 3279360987800265493u, 2519247867317777942u, 14637620493506449210u, 3053508u}, + {8922850482940370749u, 9625307224418990530u, 780631863881170844u, 6469453164616231503u, 1279491u}, + {15565154911087212020u, 5699648946717452404u, 9646521143625724054u, 17605655394745484256u, 1768750u}, + {15031521343952725920u, 3428913075922909392u, 3067403123565723094u, 464973260413596780u, 1962442u}, + {11003353875364705506u, 11312560364641417439u, 5644759989085438879u, 5080232248453427500u, 973239u}, + {10457939708732186600u, 14729814860686067779u, 13994285264469820206u, 5206099866566596650u, 769161u}, + {9548834058877461534u, 7179749915207047614u, 18393448234341421160u, 8733157399913858634u, 2279714u}, + {6588162827582201493u, 5587099824654971008u, 12296165344679252071u, 13300650612431150320u, 2395324u}, + {17608006930458478193u, 5751712055475446936u, 8230824766633493942u, 8186694068388121638u, 1700843u}, + {7349431223536100720u, 2922302912355010191u, 5300375404847023616u, 391662993906894123u, 1645239u}, + {9373692329604833249u, 14946186029142106881u, 16566104921715431810u, 3561171411023217686u, 3196212u}, + {17796913416921744751u, 197694841095287568u, 7616591985819336437u, 4742703320795806604u, 48763u}, + {17006474555410439989u, 115060256638628935u, 12198049942972922069u, 10161020282671808595u, 1992183u}, + {15912137972283127948u, 16787219751666675u, 6250242478015098287u, 13079173820974971614u, 2635441u}, + {10000083040229225719u, 4625310912744225514u, 7293736913151456831u, 13163097433630419347u, 2643193u}, + {11604303819092672690u, 13207695195986360336u, 9130570809698537288u, 8551554414447014452u, 586803u}, + {15087432314474644056u, 5119098554835275480u, 8558147405873640138u, 4982798601931266984u, 1307376u}, + {10900699220389948719u, 9569907743095634687u, 12632083163863860644u, 15804729929769126684u, 1756007u}, + {12833281195075808107u, 1826194099792939201u, 6893253051285186955u, 11345434891480058370u, 1021585u}, + {15031428314290488487u, 14633629321741731106u, 14161375984218438829u, 6071682827575922087u, 979152u}, + {4128411480707442408u, 9646664562467150530u, 8482398051528301810u, 10970816466189989954u, 1196317u}, + {743266288268580980u, 15443153459169804353u, 15690583325615018799u, 18396754644172468135u, 1189513u}, + {9427166962204646427u, 487656057293658836u, 809279762832697605u, 18324571545913800858u, 3666422u}, + {371625828139854450u, 13128816434574177522u, 10493223948072773389u, 18082032076106773867u, 1787918u}, + {7373809722291259360u, 722763165506171462u, 3928222262839745422u, 10985735577617856982u, 405820u}, + {8860228075334477843u, 8260493575891042520u, 15765733069020870584u, 10960240362430774659u, 3595411u}, + {9948698465415121222u, 6740402366288148189u, 2139985305299932280u, 15414591167595690863u, 2229438u}, + {14862018652708274169u, 10884660284579662378u, 17180608833883534176u, 1698450550501136570u, 2573853u}, + {3083281089955689805u, 5983962637639810902u, 1044694806348395197u, 12801673353986044773u, 1493372u}, + {329164700458734310u, 17660322431002896428u, 9259046657432219358u, 2621621249257922830u, 710415u}, + {3453807431295242103u, 3754408248247429350u, 6810601931474548886u, 14136393277746621076u, 3422203u}, + {3508675319312262082u, 726161064836884649u, 7665565240780944955u, 10439422058507297110u, 1258597u}, + {18248275576175929944u, 11205695071552476801u, 784721954910487394u, 8093667559438289511u, 1765153u}, + {4603506916374077329u, 8717561181861222404u, 11103588875175169466u, 13002928260562636675u, 10934u}, + {3691804523703485750u, 14136591678575073755u, 14757506301023809825u, 16069045180160559928u, 624463u}, + {8692308190452977913u, 581101985695704563u, 16442360279663119482u, 14206865350685349459u, 1884993u}, + {1558002918912988582u, 707894431599004535u, 9493582672160212435u, 18193285695216439211u, 2516512u}, + {5373342176887290628u, 8090536878983036341u, 6875518477521430616u, 9846254260173903962u, 1415755u}, + {15771540972497365730u, 18395508028774431330u, 7784785035161232288u, 12203849472412150110u, 3015395u}, + {7081757048593437552u, 13460131099432529487u, 14891658602220836139u, 15908294920394138805u, 582057u}, + {8467742917938859880u, 1703372564140655906u, 16216402071801451343u, 443082636651173696u, 2402259u}, + {13646341120367526940u, 18059790100732884404u, 7501815642866737955u, 17194021238441696838u, 2544256u}, + {460637127898828192u, 12136572249633995403u, 7342072253816584480u, 623394008787444695u, 290806u}, + {4448896804404727433u, 3046205603505793080u, 12076847068054875551u, 6778778264045719172u, 1539060u}, + {9291360984575215023u, 17582124208072978727u, 10253440672977781967u, 15592830964905295862u, 2455728u}, + {7311381023984893714u, 3697002884502306614u, 12472808627670964267u, 8836326674150681766u, 2478112u}, + {1912110804181894700u, 4900362717248965935u, 9682894426835697238u, 5377975065492982462u, 2366977u}, + {1939169829602259031u, 4702893034814643853u, 15649614362606403273u, 1700987687197674406u, 2426853u}, + {1694784375768273976u, 1884728510010624473u, 12278500666023457638u, 2422668141148123821u, 1960114u}, + {6832508004346882983u, 11288823683118993781u, 3769925035237857627u, 7241917127528756865u, 3262556u}, + {2256712492835862075u, 3038972025564188566u, 7578796125495883797u, 13318780845778802891u, 872002u}, + {4062187140199275232u, 5099797292067116311u, 3819548210942469530u, 4843944411585715434u, 3309520u}, + {10768445775790332904u, 15332417059652648285u, 15677883254166253996u, 17066642066241760542u, 2094551u}, + {3226421677108326504u, 9237504545543919524u, 5323821814307577302u, 15386905193391624849u, 2685630u}, + {10106863721161376018u, 9479054359811040458u, 9188377258951941369u, 1490693025432140496u, 3160346u}, + {15565122003279797760u, 4241029714722036729u, 803533392637346202u, 8416979003736705288u, 3343752u}, + {14849707965412690605u, 15604368699809377836u, 6858656613668252688u, 11807069173989187032u, 3087665u}, + {15609414891046395631u, 6924661292374109616u, 12536475015795906553u, 8703868662398771896u, 935869u}, + {11580062847634278377u, 5630052422339472496u, 14021115617894888007u, 12267054731081136266u, 993213u}, + {9971940037502256723u, 2882156027173883522u, 17899216573891511261u, 15222473900291530511u, 3596847u}, + {531344195235230621u, 2873011567560279681u, 16470825951647060954u, 2228077952441601959u, 3589878u}, + {1907215086864927577u, 12719381747318256753u, 3278812981630723977u, 714739909291269674u, 642011u}, + {8478359419807107387u, 13176420335923446965u, 4313023089443602704u, 876534141779381484u, 651882u}, + {6407801317410789831u, 2151647426547739094u, 13021977157922499858u, 9739800296417063431u, 1774497u}, + {2853498623651499082u, 5295912393506652987u, 11639906277984499200u, 3275325433465122794u, 131479u}, + {6197025678053231167u, 14382146578801765938u, 11105730534570567394u, 2092095589839302835u, 2623550u}, + {8484639009374257962u, 11503160030570681577u, 18104734716627120159u, 10568804687044154939u, 559532u}, + {15934562748194497418u, 15520171366098904181u, 16213925304474726770u, 1379415840894486323u, 3626297u}, + {8965244936738257504u, 6410855459635165498u, 14590125272775788653u, 12244626766483497750u, 3267703u}, + {8112889747818448470u, 9224446031152346711u, 7890701746341525344u, 5969001204304610441u, 3423313u}, + {13493039914556712384u, 4936749534204355604u, 10622267028070442045u, 8854175457391412262u, 1727253u}, + {4775465154030952894u, 11746292738149538924u, 10123630527648138191u, 7742024764954011653u, 447627u}, + {15884493909190930370u, 16722607178669677274u, 7659584090242258039u, 10888953968178625486u, 2227066u}, + {16733577443061769443u, 1970324624265819761u, 8446102655662192698u, 18415768607097837684u, 2411298u}, + {14564195902636136141u, 3643599600137350099u, 9046195717052404795u, 1557690090303702957u, 2129471u}, + {2128426426687856120u, 18320440751760220034u, 16472538354046402554u, 4074507074231040858u, 43281u}, + {11248240182317744031u, 2994943620541836782u, 6171043803132588394u, 2738986971046022865u, 1870660u}, + {14616356740797103325u, 14915468990598552360u, 16085734699008667524u, 14950429554858995232u, 3427102u}, + {6385457206727416467u, 513611750929072203u, 11460815715720510159u, 12168894686830820954u, 3521031u}, + {5834777966198647315u, 108651 |
