diff -Nru babl-0.1.63+om~1/acinclude.m4 babl-0.1.73+om~1/acinclude.m4 --- babl-0.1.63+om~1/acinclude.m4 2016-01-02 15:28:48.000000000 +0000 +++ babl-0.1.73+om~1/acinclude.m4 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -dnl BABL_DETECT_CFLAGS(RESULT, FLAGSET) -dnl Detect if the compiler supports a set of flags - -AC_DEFUN([BABL_DETECT_CFLAGS], -[ - $1= - for flag in $2; do - if test -z "[$]$1"; then - $1_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $flag" - AC_MSG_CHECKING([whether [$]CC understands [$]flag]) - AC_TRY_COMPILE([], [], [$1_works=yes], [$1_works=no]) - AC_MSG_RESULT([$]$1_works) - CFLAGS="[$]$1_save_CFLAGS" - if test "x[$]$1_works" = "xyes"; then - $1="$flag" - fi - fi - done -]) - - -# BABL_VARIADIC_MACROS -# -------------------- -# check for flavours of variadic macros -AC_DEFUN([BABL_VARIADIC_MACROS], -[AC_BEFORE([$0], [AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CPP]) -AC_CACHE_CHECK([for GNUC variadic macros], - [babl_cv_prog_gnuc_variadic_macros], - [# gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi - # is passed ISO vararg support is turned off, and there is no work - # around to turn it on, so we unconditionally turn it off. - { echo '#if __GNUC__ == 2 && __GNUC_MINOR__ == 95' - echo ' yes ' - echo '#endif'; } > conftest.c - if ${CPP} conftest.c | grep yes > /dev/null; then - babl_cv_prog_c_variadic_macros=no - babl_cv_prog_cxx_variadic_macros=no - fi - AC_TRY_COMPILE([],[int a(int p1, int p2, int p3); -#define call_a(params...) a(1,params) -call_a(2,3); - ], - babl_cv_prog_gnuc_variadic_macros=yes, - babl_cv_prog_gnuc_variadic_macros=no) -]) -if test x$babl_cv_prog_gnuc_variadic_macros = xyes; then - AC_DEFINE(BABL_GNUC_VARIADIC_MACROS, 1, [Define if the C pre-processor supports GNU style variadic macros]) -fi - -AC_CACHE_CHECK([for ISO C99 variadic macros in C], - [babl_cv_prog_c_variadic_macros], - [AC_TRY_COMPILE([],[int a(int p1, int p2, int p3); -#define call_a(...) a(1,__VA_ARGS__) -call_a(2,3); - ], - babl_cv_prog_c_variadic_macros=yes, - babl_cv_prog_c_variadic_macros=no) -]) -if test x$babl_cv_prog_c_variadic_macros = xyes ; then - AC_DEFINE(BABL_ISO_VARIADIC_MACROS, 1, [Define if the C pre-processor supports variadic macros]) -fi - -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [AC_CACHE_CHECK([for ISO C99 variadic macros in C++], - [babl_cv_prog_cxx_variadic_macros], - [AC_LANG_PUSH(C++) - AC_TRY_COMPILE([],[int a(int p1, int p2, int p3); -#define call_a(...) a(1,__VA_ARGS__) -call_a(2,3); - ], - babl_cv_prog_cxx_variadic_macros=yes, - babl_cv_prog_cxx_variadic_macros=no) - AC_LANG_POP])], - [# No C++ compiler - babl_cv_prog_cxx_variadic_macros=no]) -if test x$babl_cv_prog_cxx_variadic_macros = xyes ; then - AC_DEFINE(BABL_ISO_CXX_VARIADIC_MACROS, 1, [Define if the C++ pre-processor supports variadic macros]) -fi -]) - diff -Nru babl-0.1.63+om~1/AUTHORS babl-0.1.73+om~1/AUTHORS --- babl-0.1.63+om~1/AUTHORS 2018-03-05 13:06:16.000000000 +0000 +++ babl-0.1.73+om~1/AUTHORS 2019-12-09 16:21:18.000000000 +0000 @@ -64,6 +64,7 @@
Michael Henning
Conversion fixes
Elle Stone
+
CIE xyY color space
Verification and improvements to accuracy of color space conversions.
Thomas Manni
@@ -76,6 +77,23 @@
stability fixes
Ell
fast paths
+
Guiu Rocafort
+
sanity crash fix
+
Tobias Stoeckmann
+
bug fixes for leaks and crashers
+
Debarshi Ray
+
SSE2 version of CIE code paths
Félix Piédallu
-
Initial meson build
+
Meson build; original port, and improvements.
+
Yaakov Selkowitz
+
Cygwin patch
+
Étienne Bersac
+
build/packaging
+
Nuno Ferreira
+
coding style fixes
+
John Marshall
+
meson build improvements
+ + + diff -Nru babl-0.1.63+om~1/autogen.sh babl-0.1.73+om~1/autogen.sh --- babl-0.1.63+om~1/autogen.sh 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/autogen.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -#!/bin/sh - -# This script does all the magic calls to automake/autoconf and -# friends that are needed to configure a cvs checkout. As described in -# the file HACKING you need a couple of extra tools to run this script -# successfully. -# -# If you are compiling from a released tarball you don't need these -# tools and you shouldn't use this script. Just call ./configure -# directly. - -test -n "$srcdir" || srcdir=`dirname "$0"` -test -n "$srcdir" || srcdir=. - -ORIGDIR=`pwd` -cd $srcdir - -AUTORECONF=`which autoreconf` -if test -z $AUTORECONF; then - echo "*** No autoreconf found, please install it ***" - exit 1 -fi - -autoreconf --force --install --verbose - -cd $ORIGDIR -test -n "$NOCONFIGURE" || "$srcdir/configure" "$@" diff -Nru babl-0.1.63+om~1/babl/babl-class.h babl-0.1.73+om~1/babl/babl-class.h --- babl-0.1.63+om~1/babl/babl-class.h 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-class.h 2019-12-09 16:21:18.000000000 +0000 @@ -50,6 +50,7 @@ ones */ void *creator; char *name; /*< the name this type exists under */ + const char *doc; /*< the name this type exists under */ } BablInstance; diff -Nru babl-0.1.63+om~1/babl/babl-component.c babl-0.1.73+om~1/babl/babl-component.c --- babl-0.1.63+om~1/babl/babl-component.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-component.c 2019-12-09 16:21:18.000000000 +0000 @@ -29,7 +29,8 @@ int id, int luma, int chroma, - int alpha) + int alpha, + const char *doc) { Babl *babl; @@ -39,6 +40,7 @@ babl->class_type = BABL_COMPONENT; babl->instance.id = id; + babl->instance.doc = doc; babl->component.luma = luma; babl->component.chroma = chroma; babl->component.alpha = alpha; @@ -73,6 +75,7 @@ int alpha = 0; const char *name = first_arg; const char *arg; + const char *doc = NULL; va_start (varg, first_arg); @@ -87,6 +90,10 @@ { id = va_arg (varg, int); } + else if (!strcmp (arg, "doc")) + { + doc = va_arg (varg, const char *); + } else if (!strcmp (arg, "luma")) { @@ -136,7 +143,7 @@ return babl; } - babl = component_new (name, id, luma, chroma, alpha); + babl = component_new (name, id, luma, chroma, alpha, doc); /* Since there is not an already registered instance by the required * id/name, inserting newly created class into database. diff -Nru babl-0.1.63+om~1/babl/babl-core.c babl-0.1.73+om~1/babl/babl-core.c --- babl-0.1.63+om~1/babl/babl-core.c 2018-11-27 14:48:14.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-core.c 2019-12-09 16:21:18.000000000 +0000 @@ -93,6 +93,7 @@ "double", "id", BABL_DOUBLE, "bits", 64, + "doc", "IEEE 754 double precision.", NULL); babl_component_new ( diff -Nru babl-0.1.63+om~1/babl/babl-cpuaccel.c babl-0.1.73+om~1/babl/babl-cpuaccel.c --- babl-0.1.63+om~1/babl/babl-cpuaccel.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-cpuaccel.c 2019-12-09 16:21:18.000000000 +0000 @@ -92,6 +92,7 @@ ARCH_X86_VENDOR_RISE, ARCH_X86_VENDOR_UMC, ARCH_X86_VENDOR_SIS, + ARCH_X86_VENDOR_HYGON, ARCH_X86_VENDOR_UNKNOWN = 0xff } X86Vendor; @@ -120,11 +121,15 @@ ARCH_X86_INTEL_FEATURE_SSE4_2 = 1 << 20, ARCH_X86_INTEL_FEATURE_AVX = 1 << 28, ARCH_X86_INTEL_FEATURE_F16C = 1 << 29, + + /* extended features */ + ARCH_X86_INTEL_FEATURE_AVX2 = 1 << 5 }; #if !defined(ARCH_X86_64) && (defined(PIC) || defined(__PIC__)) #define cpuid(op,eax,ebx,ecx,edx) \ __asm__ ("movl %%ebx, %%esi\n\t" \ + "xor %%ecx, %%ecx\n\t" \ "cpuid\n\t" \ "xchgl %%ebx,%%esi" \ : "=a" (eax), \ @@ -134,7 +139,8 @@ : "0" (op)) #else #define cpuid(op,eax,ebx,ecx,edx) \ - __asm__ ("cpuid" \ + __asm__ ("xor %%ecx, %%ecx\n\t" \ + "cpuid" \ : "=a" (eax), \ "=b" (ebx), \ "=c" (ecx), \ @@ -185,6 +191,8 @@ #ifdef ARCH_X86_64 if (strcmp (id, "AuthenticAMD") == 0) return ARCH_X86_VENDOR_AMD; + else if (strcmp (id, "HygonGenuine") == 0) + return ARCH_X86_VENDOR_HYGON; else if (strcmp (id, "GenuineIntel") == 0) return ARCH_X86_VENDOR_INTEL; #else @@ -192,6 +200,8 @@ return ARCH_X86_VENDOR_INTEL; else if (strcmp (id, "AuthenticAMD") == 0) return ARCH_X86_VENDOR_AMD; + else if (strcmp (id, "HygonGenuine") == 0) + return ARCH_X86_VENDOR_HYGON; else if (strcmp (id, "CentaurHauls") == 0) return ARCH_X86_VENDOR_CENTAUR; else if (strcmp (id, "CyrixInstead") == 0) @@ -248,6 +258,16 @@ if (ecx & ARCH_X86_INTEL_FEATURE_F16C) caps |= BABL_CPU_ACCEL_X86_F16C; + + cpuid (0, eax, ebx, ecx, edx); + + if (eax >= 7) + { + cpuid (7, eax, ebx, ecx, edx); + + if (ebx & ARCH_X86_INTEL_FEATURE_AVX2) + caps |= BABL_CPU_ACCEL_X86_AVX2; + } #endif /* USE_SSE */ } #endif /* USE_MMX */ @@ -393,6 +413,7 @@ break; case ARCH_X86_VENDOR_AMD: + case ARCH_X86_VENDOR_HYGON: caps = arch_accel_amd (); break; diff -Nru babl-0.1.63+om~1/babl/babl-cpuaccel.h babl-0.1.73+om~1/babl/babl-cpuaccel.h --- babl-0.1.63+om~1/babl/babl-cpuaccel.h 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-cpuaccel.h 2019-12-09 16:21:18.000000000 +0000 @@ -35,6 +35,7 @@ /* BABL_CPU_ACCEL_X86_SSE4_2 = 0x00200000, */ /* BABL_CPU_ACCEL_X86_AVX = 0x00080000, */ BABL_CPU_ACCEL_X86_F16C = 0x00040000, + BABL_CPU_ACCEL_X86_AVX2 = 0x00020000, /* powerpc accelerations */ BABL_CPU_ACCEL_PPC_ALTIVEC = 0x04000000, diff -Nru babl-0.1.63+om~1/babl/babl-fish.c babl-0.1.73+om~1/babl/babl-fish.c --- babl-0.1.63+om~1/babl/babl-fish.c 2018-11-25 16:12:37.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-fish.c 2019-12-09 16:21:18.000000000 +0000 @@ -276,18 +276,35 @@ return ffish.fish_path; } + babl_mutex_lock (babl_fish_mutex); + /* do a second look in the database, in case another thread held the + mutex and made the fish + */ + if (!ffish.fish_fish) + { + babl_hash_table_find (id_htable, hashval, find_fish_path, (void *) &ffish); + if (ffish.fish_path) + { + /* we have found suitable fish path in the database */ + babl_mutex_unlock (babl_fish_mutex); + return ffish.fish_path; + } + } + if (!ffish.fish_fish) { const Babl *src_space = (void*)source_format->format.space; const Babl *dst_space = (void*)destination_format->format.space; /* we haven't tried to search for suitable path yet */ - if (src_space->space.cmyk.is_cmyk == 0 && - dst_space->space.cmyk.is_cmyk == 0) + if (!babl_space_is_cmyk (src_space) && + !babl_space_is_cmyk (dst_space)) { Babl *fish_path = babl_fish_path (source_format, destination_format); + if (fish_path) { + babl_mutex_unlock (babl_fish_mutex); return fish_path; } #if 1 @@ -329,12 +346,15 @@ if (ffish.fish_ref) { /* we have already found suitable reference fish */ + babl_mutex_unlock (babl_fish_mutex); return ffish.fish_ref; } else { /* we have to create new reference fish */ - return babl_fish_reference (source_format, destination_format); + Babl *ret = babl_fish_reference (source_format, destination_format); + babl_mutex_unlock (babl_fish_mutex); + return ret; } } } diff -Nru babl-0.1.63+om~1/babl/babl-fish-path.c babl-0.1.73+om~1/babl/babl-fish-path.c --- babl-0.1.63+om~1/babl/babl-fish-path.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-fish-path.c 2019-12-09 16:21:18.000000000 +0000 @@ -21,20 +21,19 @@ #include "babl-internal.h" #include "babl-ref-pixels.h" -#define BABL_TOLERANCE 0.0000047 +#define BABL_TOLERANCE 0.0000041 #define BABL_MAX_COST_VALUE 2000000 #define BABL_HARD_MAX_PATH_LENGTH 8 #define BABL_MAX_NAME_LEN 1024 -#define BABL_TEST_ITER 4 +#define BABL_TEST_ITER 16 #ifndef MIN #define MIN(a, b) (((a) > (b)) ? (b) : (a)) #endif -#define NUM_TEST_PIXELS (babl_get_num_path_test_pixels ()) #define MAX_BUFFER_SIZE 512 - +#define ITERATIONS 4 int babl_in_fish_path = 0; @@ -103,7 +102,7 @@ static int debug_conversions = 0; int _babl_instrument = 0; -double +double _babl_legal_error (void) { static double error = 0.0; @@ -133,7 +132,7 @@ return error; } -static int +static int max_path_length (void) { static int max_length = 0; @@ -146,9 +145,11 @@ if (env) max_length = atoi (env); else - max_length = 4; /* reducing this number makes finding short fishes much + max_length = 3; /* reducing this number makes finding short fishes much faster - even if we lose out on some of the fast - bigger fish + bigger fish, the fishes we can get with a max_length of 3 + is actually 5, since we deepen the search twice if no + sufficient results are found. */ if (max_length > BABL_HARD_MAX_PATH_LENGTH) max_length = BABL_HARD_MAX_PATH_LENGTH; @@ -157,7 +158,7 @@ return max_length; } -int +int _babl_max_path_len (void) { return max_path_length (); @@ -339,6 +340,7 @@ alias_conversion (Babl *babl, void *user_data) { + const Babl *sRGB = babl_space ("sRGB"); BablConversion *conv = (void *)babl; BablSpace *space = user_data; @@ -347,8 +349,8 @@ (!babl_format_is_palette (conv->source)) && (!babl_format_is_palette (conv->destination))) { - if ((conv->source->format.space == (void*)babl_space ("sRGB")) && - (conv->destination->format.space == babl_space ("sRGB"))) + if ((conv->source->format.space == sRGB) && + (conv->destination->format.space == sRGB)) { switch (conv->instance.class_type) { @@ -391,8 +393,8 @@ if ((conv->source->class_type == BABL_MODEL) && (conv->destination->class_type == BABL_MODEL)) { - if ((conv->source->model.space == (void*)babl_space ("sRGB")) && - (conv->destination->model.space == babl_space ("sRGB"))) + if ((conv->source->model.space == sRGB) && + (conv->destination->model.space == sRGB)) { switch (conv->instance.class_type) { @@ -544,6 +546,7 @@ done |= 2; } + /* source space not in initialization array */ if ((done & 1) == 0 && (source->format.space != sRGB)) { run_once[i++] = source->format.space; @@ -551,6 +554,8 @@ _babl_space_add_universal_rgb (source->format.space); } + + /* destination space not in initialization array */ if ((done & 2) == 0 && (destination->format.space != source->format.space) && (destination->format.space != sRGB)) { run_once[i++] = destination->format.space; @@ -596,6 +601,7 @@ get_conversion_path (&pc, (Babl *) source, 0, max_path_length (), tolerance); +#if 0 /* second attempt,. at path length + 1*/ if (babl->fish_path.conversion_list->count == 0 && max_path_length () + 1 <= BABL_HARD_MAX_PATH_LENGTH) @@ -610,17 +616,33 @@ } #endif } +#endif /* third attempt,. at path length + 2 */ if (babl->fish_path.conversion_list->count == 0 && max_path_length () + 2 <= BABL_HARD_MAX_PATH_LENGTH) { get_conversion_path (&pc, (Babl *) source, 0, max_path_length () + 2, tolerance); -#if 0 +#if 1 if (babl->fish_path.conversion_list->count) { - fprintf (stderr, "babl is using very long chain, should be optimized\n"); - babl_list_each (babl->fish_path.conversion_list, show_item, NULL); + //fprintf (stderr, "babl is a long chain, should be optimized\n"); + //babl_list_each (babl->fish_path.conversion_list, show_item, NULL); + } + else + { + static int show_missing = -1; + if (show_missing < 0) + { + const char *val = getenv ("BABL_DEBUG_MISSING"); + if (val && strcmp (val, "0")) + show_missing = 1; + else + show_missing = 0; + } + if (show_missing) + fprintf (stderr, "babl is lacking conversion for %s to %s\n", + babl_get_name (source), babl_get_name (destination)); } #endif } @@ -773,7 +795,7 @@ } } -static long +static inline long _babl_process (const Babl *cbabl, const void *source, void *destination, diff -Nru babl-0.1.63+om~1/babl/babl-fish-reference.c babl-0.1.73+om~1/babl/babl-fish-reference.c --- babl-0.1.63+om~1/babl/babl-fish-reference.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-fish-reference.c 2019-12-09 16:21:18.000000000 +0000 @@ -755,11 +755,11 @@ void *source_double_buf_alloc = NULL; - void *source_double_buf; + void *source_double_buf = NULL; void *rgba_double_buf_alloc = NULL; - void *rgba_double_buf; + void *rgba_double_buf = NULL; void *cmyka_double_buf_alloc = NULL; - void *cmyka_double_buf; + void *cmyka_double_buf = NULL; void *destination_double_buf_alloc = NULL; void *destination_double_buf; const void *type_double = babl_type_from_id (BABL_DOUBLE); diff -Nru babl-0.1.63+om~1/babl/babl-format.c babl-0.1.73+om~1/babl/babl-format.c --- babl-0.1.63+om~1/babl/babl-format.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-format.c 2019-12-09 16:21:18.000000000 +0000 @@ -52,7 +52,8 @@ const Babl *space, BablComponent **component, BablSampling **sampling, - const BablType **type) + const BablType **type, + const char *doc) { Babl *babl; @@ -127,6 +128,8 @@ babl->format.palette = 0; babl->format.space = (void*)space; + babl->format.encoding = NULL; + babl->instance.doc = doc; return babl; } @@ -148,7 +151,7 @@ format->format.planar, format->format.components, (void*)babl_remodel_with_space (BABL(format->format.model), space), space, - format->format.component, format->format.sampling, (void*)format->format.type); + format->format.component, format->format.sampling, (void*)format->format.type, NULL); ret->format.encoding = babl_get_name(format); babl_db_insert (db, (void*)ret); @@ -284,7 +287,7 @@ id, planar, components, model, babl_space("sRGB"), - component, sampling, type); + component, sampling, type, NULL); babl_format_set_is_format_n (babl); @@ -342,7 +345,8 @@ int planar = 0; int components = 0; BablModel *model = NULL; - const Babl * space = babl_space ("sRGB"); + const Babl *space = babl_space ("sRGB"); + const char *doc = NULL; BablComponent *component [BABL_MAX_COMPONENTS]; BablSampling *sampling [BABL_MAX_COMPONENTS]; const BablType*type [BABL_MAX_COMPONENTS]; @@ -367,6 +371,11 @@ name = babl_strdup (va_arg (varg, char *)); } + else if (!strcmp (arg, "doc")) + { + doc = babl_strdup (va_arg (varg, const char *)); + } + else if (!strcmp (arg, "packed")) { planar = 0; @@ -505,7 +514,7 @@ babl = format_new ((void*)name, id, planar, components, model, space, - component, sampling, type); + component, sampling, type, doc); babl_db_insert (db, babl); babl_free (name); diff -Nru babl-0.1.63+om~1/babl/babl.h babl-0.1.73+om~1/babl/babl.h --- babl-0.1.63+om~1/babl/babl.h 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl.h 2019-12-09 16:21:18.000000000 +0000 @@ -111,12 +111,10 @@ /** * babl_space_from_icc: - * * @icc_data: pointer to icc profile in memory * @icc_length: length of icc profile in bytes * @intent: the intent from the ICC profile to use. - * - " @error: pointer to a string where decoding errors can be stored, + * @error: (out): pointer to a string where decoding errors can be stored, * if an error occurs, NULL is returned and an error message * is provided in error. * @@ -153,17 +151,17 @@ * @language: 2 char code for language to extract or NULL * @country: 2 char country code or NULL * - * Returns NULL if key not found or a malloc allocated utf8 string of the key - * when found, free with free() when done. Supported keys: "description", - * "copyright", "manufacturer", "device", "profile-class", "color-space" and - * "pcs". + * Returns: (transfer full) (nullable): %NULL if key not found or a newly + * allocated utf8 string of the key when found, free with free() when done. + * Supported keys: "description", "copyright", "manufacturer", "device", + * "profile-class", "color-space" and "pcs". */ char *babl_icc_get_key (const char *icc_data, int icc_length, const char *key, const char *language, - const char *counter); + const char *country); /** @@ -285,13 +283,25 @@ - -enum _BablModelFlag +/** + * BablModelFlag + * @BABL_MODEL_FLAG_ALPHA: the model encodes alpha. + * @BABL_MODEL_FLAG_ASSOCIATED: the alpha is associated alpha. + * @BABL_MODEL_FLAG_INVERTED: the components are inverted (used for getting the additive complement space of CMYK). + * @BABL_MODEL_FLAG_LINEAR: the data has no TRC, i.e. is linear + * @BABL_MODEL_FLAG_NONLINEAR: the data has a TRC - the TRC from the configured space + * @BABL_MODEL_FLAG_PERCEPTUAL: the data has a TRC - a perceptual TRC where 50% gray is 0.5 + * @BABL_MODEL_FLAG_GRAY: this is a gray component model + * @BABL_MODEL_FLAG_RGB: this is an RGB based component model, the space associated is expected to contain an RGB matrix profile. + * @BABL_MODEL_FLAG_CIE: this model is part of the CIE family of spaces + * @BABL_MODEL_FLAG_CMYK: the encodings described are CMYK encodings, the space associated is expected to contain an CMYK ICC profile. + * + */ +typedef enum { BABL_MODEL_FLAG_ALPHA = 1<<1, - BABL_MODEL_FLAG_PREMULTIPLIED = 1<<2, + BABL_MODEL_FLAG_ASSOCIATED = 1<<2, BABL_MODEL_FLAG_INVERTED = 1<<3, - /* BABL_MODEL_FLAG_ALPHA_ENCODED = 1<<4, NYI */ BABL_MODEL_FLAG_LINEAR = 1<<10, BABL_MODEL_FLAG_NONLINEAR = 1<<11, @@ -303,9 +313,10 @@ BABL_MODEL_FLAG_CIE = 1<<23, BABL_MODEL_FLAG_CMYK = 1<<24, /* BABL_MODEL_FLAG_LUZ = 1<<25, NYI */ -}; +} BablModelFlag; -typedef enum _BablModelFlag BablModelFlag; +// XXX : should warn when used +#define BABL_MODEL_FLAG_PREMULTIPLIED BABL_MODEL_FLAG_ASSOCIATED /* linear, nonlinear and perceptual could occupy two bits with a decidated 0, * but we do not have a lack of bits in this bit pattern so leave it be. @@ -477,6 +488,10 @@ /** * babl_palette_set_palette: + * @babl: a #Babl + * @format: The pixel format + * @data: (array) (element-type guint8): The pixel data + * @count: The number of pixels in @data * * Assign a palette to a palette format, the data is a single span of pixels * representing the colors of the palette. @@ -518,7 +533,22 @@ } BablSpaceFlags; /** - * babl_space_from_chromaticities + * babl_space_from_chromaticities: + * @name: (nullable): The name for the color space + * @wx: The X-coordinate of the color space's white point + * @wy: The Y-coordinate of the color space's white point + * @rx: The X-coordinate of the red primary + * @ry: The Y-coordinate of the red primary + * @gx: The X-coordinate of the green primary + * @gy: The Y-coordinate of the green primary + * @bx: The X-coordinate of the blue primary + * @by: The Y-coordinate of the blue primary + * @trc_red: The red component of the TRC. + * @trc_green: (nullable): The green component of the TRC (can be %NULL if it's + * the same as @trc_red). + * @trc_blue: (nullable): The blue component of the TRC (can be %NULL if it's + * the same as @trc_red). + * @flags: The #BablSpaceFlags * * Creates a new babl-space/ RGB matrix color space definition with the * specified CIE xy(Y) values for white point: wx, wy and primary @@ -564,9 +594,23 @@ /** * babl_space_get: + * @space: A #Babl instance + * @xw: (out) (optional): The X-coordinate of the color space's white point + * @yw: (out) (optional): The Y-coordinate of the color space's white point + * @xr: (out) (optional): The X-coordinate of the red primary + * @yr: (out) (optional): The Y-coordinate of the red primary + * @xg: (out) (optional): The X-coordinate of the blue primary + * @yg: (out) (optional): The Y-coordinate of the green primary + * @xb: (out) (optional): The X-coordinate of the blue primary + * @yb: (out) (optional): The Y-coordinate of the blue primary + * @red_trc: (out) (optional): The red component of the TRC. + * @green_trc: (out) (optional): The green component of the TRC (can be %NULL + * if it's the same as @red_trc). + * @blue_trc: (out) (optional): The blue component of the TRC (can be %NULL if + * it's the same as @red_trc). * * query the chromaticities of white point and primaries as well as trcs - * used for r g a nd b, all arguments mights be NULL. + * used for r g a nd b, all arguments are optional (can be %NULL). */ void babl_space_get (const Babl *space, double *xw, double *yw, @@ -577,12 +621,26 @@ const Babl **green_trc, const Babl **blue_trc); +/** + * babl_space_get_rgb_luminance: + * @space: a BablSpace + * @red_luminance: (out) (optional): Location for the red luminance factor. + * @green_luminance: (out) (optional): Location for the green luminance factor. + * @blue_luminance: (out) (optional): Location for the blue luminance factor. + * + * Retrieve the relevant RGB luminance constants for a babl space. + */ +void +babl_space_get_rgb_luminance (const Babl *space, + double *red_luminance, + double *green_luminance, + double *blue_luminance); /** * babl_model_is: * - * return 0 if the name of the model in babl does not correspond to the provided - * model name. + * Returns: 0 if the name of the model in babl does not correspond to the + * provided model name. */ int babl_model_is (const Babl *babl, const char *model_name); @@ -591,21 +649,38 @@ /** * babl_space_get_icc: + * @babl: a #Babl + * @length: (out) (optional): Length of the profile in bytes. * * Return pointer to ICC profile for space note that this is * the ICC profile for R'G'B', though in formats only supporting linear * like EXR GEGL chooses to load this lienar data as RGB and use the sRGB * TRC. * - * @babl: a BablSpace - * @length: point to an integer where length of profile in bytes is stored. - * - * Returns pointer to ICC profile data. + * Returns: pointer to ICC profile data. */ const char *babl_space_get_icc (const Babl *babl, int *length); /** * babl_space_from_rgbxyz_matrix: + * @name: (nullable): The name for the color space + * @wx: The X-coordinate of the color space's white point + * @wy: The Y-coordinate of the color space's white point + * @wz: The Z-coordinate of the color space's white point + * @rx: The X-coordinate of the red primary + * @ry: The Y-coordinate of the red primary + * @rz: The Z-coordinate of the red primary + * @gx: The X-coordinate of the green primary + * @gy: The Y-coordinate of the green primary + * @gz: The Z-coordinate of the green primary + * @bx: The X-coordinate of the blue primary + * @by: The Y-coordinate of the blue primary + * @bz: The Z-coordinate of the blue primary + * @trc_red: The red component of the TRC. + * @trc_green: (nullable): The green component of the TRC (can be %NULL if it's + * the same as @trc_red). + * @trc_blue: (nullable): The blue component of the TRC (can be %NULL if it's + * the same as @trc_red). * * Creates a new RGB matrix color space definition using a precomputed D50 * adapted 3x3 matrix and associated CIE XYZ whitepoint, as possibly read from @@ -629,12 +704,14 @@ const char * babl_format_get_encoding (const Babl *babl); int babl_space_is_cmyk (const Babl *space); +int babl_space_is_gray (const Babl *space); -/* values below this are stored premultiplied with this value, - * it can also be used as a generic alpha zero epsilon in GEGL - * +/* values below this are stored associated with this value, it should also be + * used as a generic alpha zero epsilon in GEGL to keep the threshold effects + * on one known value. */ -#define BABL_ALPHA_FLOOR (1/65536.0) +#define BABL_ALPHA_FLOOR (1/65536.0) +#define BABL_ALPHA_FLOOR_F (1/65536.0f) #ifdef __cplusplus } diff -Nru babl-0.1.63+om~1/babl/babl-icc.c babl-0.1.73+om~1/babl/babl-icc.c --- babl-0.1.63+om~1/babl/babl-icc.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-icc.c 2019-12-09 16:21:18.000000000 +0000 @@ -561,12 +561,13 @@ static void symmetry_test (ICC *state); -char * -babl_space_to_icc (const Babl *babl, - const char *description, - const char *copyright, - BablICCFlags flags, - int *ret_length) + +static char * +babl_space_to_icc_rgb (const Babl *babl, + const char *description, + const char *copyright, + BablICCFlags flags, + int *ret_length) { const BablSpace *space = &babl->space; char icc[65536]; @@ -691,6 +692,119 @@ } } + +static char * +babl_space_to_icc_gray (const Babl *babl, + const char *description, + const char *copyright, + BablICCFlags flags, + int *ret_length) +{ + const BablSpace *space = &babl->space; + char icc[65536]; + int length=65535; + ICC *state = icc_state_new (icc, length, 10); + + icc[length]=0; + + symmetry_test (state); + + icc_write (sign, 4, "babl"); // ICC verison + icc_write (u8, 8, 2); // ICC verison + icc_write (u8, 9, 0x20); // 2.2 for now.. + icc_write (u32,64, 0); // rendering intent + + icc_write (s15f16,68, 0.96421); // Illuminant + icc_write (s15f16,72, 1.0); + icc_write (s15f16,76, 0.82491); + + icc_write (sign, 80, "babl"); // creator + + icc_write (sign, 12, "mntr"); + icc_write (sign, 16, "GRAY"); + icc_write (sign, 20, "XYZ "); + + icc_write (u16, 24, 2222); // babl profiles + icc_write (u16, 26, 11); // should + icc_write (u16, 28, 11); // use a fixed + icc_write (u16, 30, 3); // date + icc_write (u16, 32, 44); // that gets updated + icc_write (u16, 34, 55); // when the generator changes + + icc_write (sign, 36, "acsp"); // changes + + { + state->tags = 6; /* note: we could reserve a couple of spots and + still use a very simple allocator and + still be valid - albeit with tiny waste of + space. + */ + state->no = state->o = 128 + 4 + 12 * state->tags; + + icc_write (u32, 128, state->tags); + + icc_allocate_tag (state, "wtpt", 20); + icc_write (sign, state->o, "XYZ "); + icc_write (u32, state->o + 4, 0); + icc_write (s15f16, state->o + 8, space->whitepoint[0]); + icc_write (s15f16, state->o + 12, space->whitepoint[1]); + icc_write (s15f16, state->o + 16, space->whitepoint[2]); + + write_trc (state, "kTRC", &space->trc[0]->trc, flags); + + { + char str[128]="CC0/public domain"; + int i; + if (!copyright) copyright = str; + icc_allocate_tag(state, "cprt", 8 + strlen (copyright) + 1); + icc_write (sign, state->o, "text"); + icc_write (u32, state->o + 4, 0); + for (i = 0; copyright[i]; i++) + icc_write (u8, state->o + 8 + i, copyright[i]); + } + { + char str[128]="babl"; + int i; + if (!description) description = str; + icc_allocate_tag(state, "desc", 90 + strlen (description) + 0); + icc_write (sign, state->o,"desc"); + icc_write (u32, state->o + 4, 0); + icc_write (u32, state->o + 8, strlen(description) + 1); + for (i = 0; description[i]; i++) + icc_write (u8, state->o + 12 + i, description[i]); + } + icc_write (u32, 0, state->no + 0); + length = state->no + 0; + } + + if (ret_length) + *ret_length = length; + + babl_free (state); + { + char *ret = malloc (length); + memcpy (ret, icc, length); + return ret; + } +} + +char * +babl_space_to_icc (const Babl *babl, + const char *description, + const char *copyright, + BablICCFlags flags, + int *ret_length) +{ + if (babl->space.icc_type == BablICCTypeRGB) + return babl_space_to_icc_rgb (babl, description, copyright, flags, + ret_length); + else if (babl->space.icc_type == BablICCTypeGray) + return babl_space_to_icc_gray (babl, description, copyright, flags, + ret_length); + fprintf (stderr, "unexpected icc type in %s\n", __FUNCTION__); + return NULL; +} + const char * babl_space_get_icc (const Babl *babl, int *length) @@ -819,9 +933,11 @@ const Babl *trc_red = NULL; const Babl *trc_green = NULL; const Babl *trc_blue = NULL; + const Babl *trc_gray = NULL; const char *int_err; Babl *ret = NULL; int speed_over_accuracy = intent & BABL_ICC_INTENT_PERFORMANCE; + int is_gray = 0; sign_t profile_class, color_space, pcs; @@ -840,9 +956,8 @@ if (!strcmp (color_space.str, "CMYK")) { ret = _babl_space_for_lcms (icc_data, icc_length); - if (ret->space.cmyk.is_cmyk) + if (ret->space.icc_type == BablICCTypeCMYK) return ret; - ret->space.cmyk.is_cmyk = 1; ret->space.icc_length = icc_length; ret->space.icc_profile = malloc (icc_length); memcpy (ret->space.icc_profile, icc_data, icc_length); @@ -877,12 +992,21 @@ return ret; } - if (strcmp (color_space.str, "RGB ")) - *error = "not defining an RGB space"; + + + + if (strcmp (color_space.str, "RGB ") + && strcmp (color_space.str, "GRAY") + ) + { + *error = "not defining RGB, CMYK or GRAY space.."; + } else { if (strcmp (profile_class.str, "mntr")) *error = "not a monitor-class profile"; + if (!strcmp (color_space.str, "GRAY")) + is_gray = 1; } } @@ -946,11 +1070,25 @@ { trc_blue = babl_trc_from_icc (state, offset, error); } + if (!*error && icc_tag (state, "kTRC", &offset, &element_size)) + { + trc_gray = babl_trc_from_icc (state, offset, error); + } } - if (!*error && (!trc_red || !trc_green || !trc_blue)) + if (is_gray) { - *error = "missing TRCs"; + if (!*error && (!trc_gray)) + { + *error = "missing TRC"; + } + } + else + { + if (!*error && (!trc_red || !trc_green || !trc_blue)) + { + *error = "missing TRCs"; + } } if (*error) @@ -960,6 +1098,27 @@ return NULL; } + if (is_gray) + { + int offset, element_size; + if (icc_tag (state, "wtpt", &offset, &element_size)) + { + // wX = icc_read (s15f16, offset + 8); + // wY = icc_read (s15f16, offset + 8 + 4); + // wZ = icc_read (s15f16, offset + 8 + 4 * 2); + } + ret = (void*)babl_space_from_gray_trc (NULL, trc_gray, 1); + ret->space.icc_length = icc_length; + ret->space.icc_profile = malloc (icc_length); + memcpy (ret->space.icc_profile, icc_data, icc_length); + babl_free (state); + return ret; + + + *error = "gray parsing NYI"; + } + else + { if (icc_tag (state, "rXYZ", NULL, NULL) && icc_tag (state, "gXYZ", NULL, NULL) && icc_tag (state, "bXYZ", NULL, NULL) && @@ -1076,8 +1235,9 @@ return ret; } } - *error = "didnt find RGB primaries"; + } + babl_free (state); return NULL; } diff -Nru babl-0.1.63+om~1/babl/babl-ids.h babl-0.1.73+om~1/babl/babl-ids.h --- babl-0.1.63+om~1/babl/babl-ids.h 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-ids.h 2019-12-09 16:21:18.000000000 +0000 @@ -74,6 +74,7 @@ BABL_GREEN_MUL_ALPHA, BABL_BLUE_MUL_ALPHA, BABL_GRAY_PERCEPTUAL, + BABL_GRAY_PERCEPTUAL_MUL_ALPHA, BABL_GRAY_NONLINEAR, BABL_GRAY_NONLINEAR_MUL_ALPHA, BABL_RED_NONLINEAR, diff -Nru babl-0.1.63+om~1/babl/babl-internal.c babl-0.1.73+om~1/babl/babl-internal.c --- babl-0.1.63+om~1/babl/babl-internal.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-internal.c 2019-12-09 16:21:18.000000000 +0000 @@ -77,6 +77,7 @@ exit (-1); } +BablMutex *babl_fish_mutex; BablMutex *babl_format_mutex; #if BABL_DEBUG_MEM @@ -89,6 +90,7 @@ { babl_set_malloc (malloc); babl_set_free (free); + babl_fish_mutex = babl_mutex_new (); babl_format_mutex = babl_mutex_new (); babl_reference_mutex = babl_mutex_new (); #if BABL_DEBUG_MEM @@ -99,6 +101,7 @@ void babl_internal_destroy (void) { + babl_mutex_destroy (babl_fish_mutex); babl_mutex_destroy (babl_format_mutex); babl_mutex_destroy (babl_reference_mutex); #if BABL_DEBUG_MEM @@ -113,3 +116,17 @@ babl_assert (BABL_IS_BABL (babl)); return babl->instance.name; } + +const char * +babl_get_doc (const Babl *babl) +{ + babl_assert (BABL_IS_BABL (babl)); + return babl->instance.doc; +} + +void babl_doc (const Babl *babl, + const char *doc) +{ + babl_assert (BABL_IS_BABL (babl)); + ((Babl*)babl)->instance.doc = doc; +} diff -Nru babl-0.1.63+om~1/babl/babl-internal.h babl-0.1.73+om~1/babl/babl-internal.h --- babl-0.1.63+om~1/babl/babl-internal.h 2018-11-25 16:12:37.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-internal.h 2019-12-09 16:21:18.000000000 +0000 @@ -100,6 +100,11 @@ void babl_die (void); int babl_sanity (void); +void babl_doc (const Babl *babl, + const char *doc); + +const char * babl_get_doc (const Babl *babl); + void babl_core_init (void); const Babl *babl_format_with_model_as_type (const Babl *model, const Babl *type); @@ -242,6 +247,7 @@ extern int babl_hmpf_on_name_lookups; extern int babl_in_fish_path; extern BablMutex *babl_format_mutex; +extern BablMutex *babl_fish_mutex; extern BablMutex *babl_reference_mutex; #define BABL_DEBUG_MEM 0 diff -Nru babl-0.1.63+om~1/babl/babl-introspect.h babl-0.1.73+om~1/babl/babl-introspect.h --- babl-0.1.63+om~1/babl/babl-introspect.h 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-introspect.h 2019-12-09 16:21:18.000000000 +0000 @@ -19,8 +19,15 @@ #ifndef _BABL_INTROSPECT_H #define _BABL_INTROSPECT_H +#include -void babl_introspect (Babl *babl); /* introspect a given BablObject */ +/** + * babl_introspect: + * @babl: A #Babl + * + * introspect a given BablObject + */ +void babl_introspect (Babl *babl); #endif diff -Nru babl-0.1.63+om~1/babl/babl-model.c babl-0.1.73+om~1/babl/babl-model.c --- babl-0.1.63+om~1/babl/babl-model.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-model.c 2019-12-09 16:21:18.000000000 +0000 @@ -57,7 +57,8 @@ int id, int components, BablComponent **component, - BablModelFlag flags) + BablModelFlag flags, + const char *doc) { Babl *babl; @@ -70,6 +71,7 @@ babl->class_type = BABL_MODEL; babl->instance.id = id; + babl->instance.doc = doc; babl->model.components = components; babl->model.space = space; babl->model.data = NULL; @@ -83,9 +85,9 @@ } static int -is_model_duplicate (Babl *babl, - const Babl *space, - int components, +is_model_duplicate (Babl *babl, + const Babl *space, + int components, BablComponent **component) { int i; @@ -117,6 +119,7 @@ const char *arg = first_argument; const char *assigned_name = NULL; char *name = NULL; + const char *doc = NULL; const Babl *space = babl_space ("sRGB"); BablComponent *component [BABL_MAX_COMPONENTS]; BablModelFlag flags = 0; @@ -130,7 +133,10 @@ { id = va_arg (varg, int); } - + else if (!strcmp (arg, "doc")) + { + doc = va_arg (varg, const char *); + } else if (!strcmp (arg, "name")) { assigned_name = va_arg (varg, char *); @@ -155,9 +161,9 @@ { flags |= BABL_MODEL_FLAG_INVERTED; } - else if (!strcmp (arg, "premultiplied")) + else if (!strcmp (arg, "associated")) { - flags |= BABL_MODEL_FLAG_PREMULTIPLIED; + flags |= BABL_MODEL_FLAG_ASSOCIATED; } else if (!strcmp (arg, "alpha")) { @@ -257,7 +263,7 @@ if (! babl) { - babl = model_new (name, space, id, components, component, flags); + babl = model_new (name, space, id, components, component, flags, doc); babl_db_insert (db, babl); construct_double_format (babl); } @@ -374,12 +380,17 @@ { int j; for (j = 0; j < 4; j++) - if (fabs (clipped[i *4 + j] - transformed[i * 4 + j]) > TOLERANCE) + { + float tolerance = TOLERANCE; + if (fabs(clipped[i*4+j]) > 1.0) + tolerance = fabs(clipped[i*4+j]) * 0.01; + if (fabs (clipped[i *4 + j] - transformed[i * 4 + j]) > tolerance) { if (!log) log = 1; symmetric = 0; } + } if (log && log < 5) { babl_log ("%s", babl->instance.name); diff -Nru babl-0.1.63+om~1/babl/babl-space.c babl-0.1.73+om~1/babl/babl-space.c --- babl-0.1.63+om~1/babl/babl-space.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-space.c 2019-12-09 16:21:18.000000000 +0000 @@ -77,16 +77,16 @@ double x_r = X / D50_WHITE_REF_X; double y_r = Y / D50_WHITE_REF_Y; double z_r = Z / D50_WHITE_REF_Z; - + if (x_r > LAB_EPSILON) f_x = pow(x_r, 1.0 / 3.0); else ( f_x = ((LAB_KAPPA * x_r) + 16) / 116.0 ); - + if (y_r > LAB_EPSILON) f_y = pow(y_r, 1.0 / 3.0); else ( f_y = ((LAB_KAPPA * y_r) + 16) / 116.0 ); - + if (z_r > LAB_EPSILON) f_z = pow(z_r, 1.0 / 3.0); else ( f_z = ((LAB_KAPPA * z_r) + 16) / 116.0 ); - + *to_L = (116.0 * f_y) - 16.0; *to_a = 500.0 * (f_x - f_y); *to_b = 200.0 * (f_y - f_z); @@ -101,7 +101,7 @@ * matrix looking for the bit-exact inverse of this integer-solution. * */ -static void +static void babl_matrix_equalize (double *in_mat) { double mat[9]; @@ -168,8 +168,8 @@ } } -static void -babl_space_compute_matrices (BablSpace *space, +static void +babl_space_compute_matrices (BablSpace *space, BablSpaceFlags equalize_matrix) { #define _ space-> @@ -223,11 +223,11 @@ } Babl * -_babl_space_for_lcms (const char *icc_data, +_babl_space_for_lcms (const char *icc_data, int icc_length) { int i=0; - BablSpace space; + BablSpace space = {0,}; for (i = 0; space_db[i].instance.class_type; i++) @@ -243,6 +243,7 @@ memset (&space, 0, sizeof(space)); space.instance.class_type = BABL_SPACE; space.instance.id = 0; + space.icc_type = BablICCTypeCMYK; if (i >= MAX_SPACES-1) { @@ -278,10 +279,9 @@ const Babl *trc_blue) { int i=0; - BablSpace space; + BablSpace space = {0,}; space.instance.class_type = BABL_SPACE; space.instance.id = 0; - /* transplant matrixes */ space.RGBtoXYZ[0] = rx; @@ -293,12 +293,14 @@ space.RGBtoXYZ[6] = rz; space.RGBtoXYZ[7] = gz; space.RGBtoXYZ[8] = bz; + space.icc_type = BablICCTypeRGB; babl_matrix_invert (space.RGBtoXYZ, space.XYZtoRGB); babl_matrix_to_float (space.RGBtoXYZ, space.RGBtoXYZf); babl_matrix_to_float (space.XYZtoRGB, space.XYZtoRGBf); + /* recover chromaticities from matrix */ { double red[3]={1.,.0,.0}; double xyz[3]={1.,.0,.0}; @@ -362,7 +364,7 @@ return (Babl*)&space_db[i]; } -const Babl * +const Babl * babl_space_from_chromaticities (const char *name, double wx, double wy, double rx, double ry, @@ -374,7 +376,7 @@ BablSpaceFlags flags) { int i=0; - static BablSpace space; + BablSpace space = {0,}; space.instance.class_type = BABL_SPACE; space.instance.id = 0; @@ -393,6 +395,7 @@ space.whitepoint[0] = wx / wy; space.whitepoint[1] = 1.0; space.whitepoint[2] = (1.0 - wx - wy) / wy; + space.icc_type = BablICCTypeRGB; for (i = 0; space_db[i].instance.class_type; i++) { @@ -427,6 +430,67 @@ return (Babl*)&space_db[i]; } +const Babl * +babl_space_from_gray_trc (const char *name, + const Babl *trc_gray, + BablSpaceFlags flags) +{ + int i=0; + BablSpace space = {0,}; + space.instance.class_type = BABL_SPACE; + space.instance.id = 0; + + space.xw = 0.3127; + space.yw = 0.3290; + + space.xr = 0.639998686; + space.yr = 0.330010138; + space.xg = 0.300003784; + space.yg = 0.600003357; + space.xb = 0.150002046; + space.yb = 0.059997204; + space.trc[0] = trc_gray; + space.trc[1] = trc_gray; + space.trc[2] = trc_gray; + + space.whitepoint[0] = space.xw / space.yw; + space.whitepoint[1] = 1.0; + space.whitepoint[2] = (1.0 - space.xw - space.yw) / space.yw; + space.icc_type = BablICCTypeGray; + + for (i = 0; space_db[i].instance.class_type; i++) + { + int offset = ((char*)&space_db[i].xr) - (char*)(&space_db[i]); + int size = ((char*)&space_db[i].trc) + sizeof(space_db[i].trc) - ((char*)&space_db[i].xr); + + if (memcmp ((char*)(&space_db[i]) + offset, ((char*)&space) + offset, size)==0) + { + return (void*)&space_db[i]; + } + } + if (i >= MAX_SPACES-1) + { + babl_log ("too many BablSpaces"); + return NULL; + } + space_db[i]=space; + space_db[i].instance.name = space_db[i].name; + if (name) + snprintf (space_db[i].name, sizeof (space_db[i].name), "%s", name); + else + /* XXX: this can get longer than 256bytes ! */ + snprintf (space_db[i].name, sizeof (space_db[i].name), + "space-gray-%s", babl_get_name(space.trc[0])); + + /* compute matrixes */ + babl_space_compute_matrices (&space_db[i], 1); + + //babl_space_get_icc ((Babl*)&space_db[i], NULL); + return (Babl*)&space_db[i]; + +} + + void babl_space_class_for_each (BablEachFunction each_fun, void *user_data) @@ -589,17 +653,17 @@ } -void -babl_space_to_xyz (const Babl *space, - const double *rgb, +void +babl_space_to_xyz (const Babl *space, + const double *rgb, double *xyz) { _babl_space_to_xyz (space, rgb, xyz); } -void -babl_space_from_xyz (const Babl *space, - const double *xyz, +void +babl_space_from_xyz (const Babl *space, + const double *xyz, double *rgb) { _babl_space_from_xyz (space, xyz, rgb); @@ -614,7 +678,7 @@ /////////////////// -static void +static void prep_conversion (const Babl *babl) { Babl *conversion = (void*) babl; @@ -693,9 +757,9 @@ static inline void universal_nonlinear_rgba_converter (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); @@ -714,9 +778,9 @@ static inline void universal_nonlinear_rgb_linear_converter (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); @@ -730,10 +794,27 @@ } static inline void +universal_linear_rgb_nonlinear_converter (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples, + void *data) +{ + const Babl *destination_space = conversion->conversion.destination->format.space; + float * matrixf = data; + float *rgba_in = (void*)src_char; + float *rgba_out = (void*)dst_char; + + babl_matrix_mul_vectorff_buf4 (matrixf, rgba_in, rgba_out, samples); + + TRC_OUT(rgba_out, rgba_out); +} + +static inline void universal_nonlinear_rgba_u8_converter (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; @@ -775,9 +856,9 @@ static inline void universal_rgba_converter (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { float *matrixf = data; @@ -789,9 +870,9 @@ static inline void universal_rgb_converter (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { float *matrixf = data; @@ -803,10 +884,31 @@ static inline void +universal_ya_converter (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples, + void *data) +{ + memcpy (dst_char, src_char, samples * 4 * 2); +} + +static inline void +universal_y_converter (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples, + void *data) +{ + memcpy (dst_char, src_char, samples * 4); +} + + +static inline void universal_nonlinear_rgb_u8_converter (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; @@ -877,9 +979,9 @@ static inline void universal_nonlinear_rgba_converter_sse2 (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); @@ -898,9 +1000,9 @@ static inline void universal_rgba_converter_sse2 (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { float *matrixf = data; @@ -912,9 +1014,9 @@ static inline void universal_nonlinear_rgba_u8_converter_sse2 (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; @@ -953,9 +1055,9 @@ static inline void universal_nonlinear_rgb_u8_converter_sse2 (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; @@ -994,9 +1096,9 @@ static inline void universal_nonlinear_rgb_linear_converter_sse2 (const Babl *conversion, - unsigned char *src_char, - unsigned char *dst_char, - long samples, + unsigned char *src_char, + unsigned char *dst_char, + long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); @@ -1008,6 +1110,24 @@ babl_matrix_mul_vectorff_buf4_sse2 (matrixf, rgba_out, rgba_out, samples); } + + +static inline void +universal_linear_rgb_nonlinear_converter_sse2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples, + void *data) +{ + const Babl *destination_space = conversion->conversion.destination->format.space; + float * matrixf = data; + float *rgba_in = (void*)src_char; + float *rgba_out = (void*)dst_char; + + babl_matrix_mul_vectorff_buf4_sse2 (matrixf, rgba_in, rgba_out, samples); + + TRC_OUT(rgba_out, rgba_out); +} #endif @@ -1022,36 +1142,69 @@ if ((babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE) && (babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE2)) { - prep_conversion(babl_conversion_new(babl_format_with_space("RGBA float", space), + + + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", space), babl_format_with_space("RGBA float", babl), "linear", universal_rgba_converter_sse2, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("RGBA float", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", babl), babl_format_with_space("RGBA float", space), "linear", universal_rgba_converter_sse2, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A float", space), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", space), babl_format_with_space("R'G'B'A float", babl), "linear", universal_nonlinear_rgba_converter_sse2, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A float", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", babl), babl_format_with_space("R'G'B'A float", space), "linear", universal_nonlinear_rgba_converter_sse2, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A u8", space), + + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", space), + babl_format_with_space("RGBA float", babl), + "linear", universal_nonlinear_rgb_linear_converter_sse2, + NULL)); + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", babl), + babl_format_with_space("RGBA float", space), + "linear", universal_nonlinear_rgb_linear_converter_sse2, + NULL)); + + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", babl), + babl_format_with_space("R'G'B'A float", space), + "linear", universal_linear_rgb_nonlinear_converter_sse2, + NULL)); + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", space), + babl_format_with_space("R'G'B'A float", babl), + "linear", universal_linear_rgb_nonlinear_converter_sse2, + NULL)); + + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A u8", space), babl_format_with_space("R'G'B'A u8", babl), "linear", universal_nonlinear_rgba_u8_converter_sse2, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A u8", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A u8", babl), babl_format_with_space("R'G'B'A u8", space), "linear", universal_nonlinear_rgba_u8_converter_sse2, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B' u8", space), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B' u8", space), babl_format_with_space("R'G'B' u8", babl), "linear", universal_nonlinear_rgb_u8_converter_sse2, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B' u8", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B' u8", babl), babl_format_with_space("R'G'B' u8", space), "linear", universal_nonlinear_rgb_u8_converter_sse2, NULL)); @@ -1059,49 +1212,99 @@ //else #endif { - prep_conversion(babl_conversion_new(babl_format_with_space("RGBA float", space), + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", space), babl_format_with_space("RGBA float", babl), "linear", universal_rgba_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("RGBA float", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", babl), babl_format_with_space("RGBA float", space), "linear", universal_rgba_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A float", space), + + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", space), babl_format_with_space("R'G'B'A float", babl), "linear", universal_nonlinear_rgba_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A float", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", babl), babl_format_with_space("R'G'B'A float", space), "linear", universal_nonlinear_rgba_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A u8", space), + + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", space), + babl_format_with_space("RGBA float", babl), + "linear", universal_nonlinear_rgb_linear_converter, + NULL)); + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A float", babl), + babl_format_with_space("RGBA float", space), + "linear", universal_nonlinear_rgb_linear_converter, + NULL)); + + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A u8", space), babl_format_with_space("R'G'B'A u8", babl), "linear", universal_nonlinear_rgba_u8_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B'A u8", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B'A u8", babl), babl_format_with_space("R'G'B'A u8", space), "linear", universal_nonlinear_rgba_u8_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B' u8", space), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B' u8", space), babl_format_with_space("R'G'B' u8", babl), "linear", universal_nonlinear_rgb_u8_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("R'G'B' u8", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("R'G'B' u8", babl), babl_format_with_space("R'G'B' u8", space), "linear", universal_nonlinear_rgb_u8_converter, NULL)); + + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", babl), + babl_format_with_space("R'G'B'A float", space), + "linear", universal_linear_rgb_nonlinear_converter, + NULL)); + prep_conversion(babl_conversion_new( + babl_format_with_space("RGBA float", space), + babl_format_with_space("R'G'B'A float", babl), + "linear", universal_linear_rgb_nonlinear_converter, + NULL)); } - prep_conversion(babl_conversion_new(babl_format_with_space("RGB float", space), + prep_conversion(babl_conversion_new( + babl_format_with_space("RGB float", space), babl_format_with_space("RGB float", babl), "linear", universal_rgb_converter, NULL)); - prep_conversion(babl_conversion_new(babl_format_with_space("RGB float", babl), + prep_conversion(babl_conversion_new( + babl_format_with_space("RGB float", babl), babl_format_with_space("RGB float", space), "linear", universal_rgb_converter, NULL)); + + prep_conversion(babl_conversion_new( + babl_format_with_space("Y float", space), + babl_format_with_space("Y float", babl), + "linear", universal_y_converter, + NULL)); + prep_conversion(babl_conversion_new( + babl_format_with_space("YaA float", babl), + babl_format_with_space("YaA float", space), + "linear", universal_ya_converter, + NULL)); + prep_conversion(babl_conversion_new( + babl_format_with_space("YA float", babl), + babl_format_with_space("YA float", space), + "linear", universal_ya_converter, + NULL)); } return 0; } @@ -1111,7 +1314,7 @@ * with conversions internally as well as for conversions to and from other RGB * spaces. */ -void +void _babl_space_add_universal_rgb (const Babl *space) { babl_space_class_for_each (add_rgb_adapter, (void*)space); @@ -1131,7 +1334,7 @@ for (i = 0; space_db[i].instance.class_type; i++) { BablSpace *space = &space_db[i]; - if (space->cmyk.is_cmyk == 0 && + if (space->icc_type == BablICCTypeRGB && trc_red == space->trc[0] && trc_green == space->trc[1] && trc_blue == space->trc[2] && @@ -1152,7 +1355,7 @@ } const Babl * -babl_space_with_trc (const Babl *babl, +babl_space_with_trc (const Babl *babl, const Babl *trc) { double xw, yw, xr, yr, xg, yg, xb, yb; @@ -1174,7 +1377,7 @@ } -void +void babl_space_get (const Babl *babl, double *xw, double *yw, double *xr, double *yr, @@ -1202,12 +1405,19 @@ if(blue_trc)*blue_trc = space->trc[2]; } -int +int babl_space_is_cmyk (const Babl *space) { - return space?space->space.cmyk.is_cmyk:0; + return space?space->space.icc_type == BablICCTypeCMYK:0; } +int +babl_space_is_gray (const Babl *space) +{ + return space?space->space.icc_type == BablICCTypeGray:0; +} + + /* Trademarks: * * International Color Consortium is a registered trademarks of the. @@ -1218,3 +1428,18 @@ * of Adobe Systems Incorporated in many countires. */ +void +babl_space_get_rgb_luminance (const Babl *space, + double *red_luminance, + double *green_luminance, + double *blue_luminance) +{ + if (!space) + space = babl_space ("sRGB"); + if (red_luminance) + *red_luminance = space->space.RGBtoXYZ[3]; + if (green_luminance) + *green_luminance = space->space.RGBtoXYZ[4]; + if (blue_luminance) + *blue_luminance = space->space.RGBtoXYZ[5]; +} diff -Nru babl-0.1.63+om~1/babl/babl-space.h babl-0.1.73+om~1/babl/babl-space.h --- babl-0.1.63+om~1/babl/babl-space.h 2018-11-25 16:12:37.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-space.h 2019-12-09 16:21:18.000000000 +0000 @@ -33,14 +33,69 @@ typedef struct { - int is_cmyk; + //int is_cmyk; #ifdef HAVE_LCMS cmsHPROFILE lcms_profile; cmsHTRANSFORM lcms_to_rgba; cmsHTRANSFORM lcms_from_rgba; #endif + int filler; } BablCMYK; +#if 0 // draft datastructures for spectral spaces +typedef struct _BablSpectrumType BablSpectrumType; + +struct _BablSpectrumType { + double nm_start; + double nm_gap; + double nm_end; /* last band, computed */ + int bands; +}; + +typedef struct +{ + BablSpectrumType spectrum_type; + int is_spectral; + float *observer_x; + float *observer_y; + float *observer_z; + float *illuminant; + float rev_y_scale; +} BablSpectralSpace; + +typedef struct +{ + BablSpectralSpace *spectral_space; + int inks; + float *on_white; + float *on_black; + float *opaqueness; + float scale; + float trc_gamma; + float *illuminant; +} BablCoat; + +#define BABL_MAX_COATS 16 + +typedef struct +{ + BablSpectralSpace *spectral_space; + BablCoat coat_def[BABL_MAX_COATS]; + int coats; + float *substrate; + + int stochastic_iterations; + float stochastic_diffusion0; + float stochastic_diffusion1; +} BablProcessSpace; +#endif + +typedef enum { + BablICCTypeRGB = 0, + BablICCTypeGray = 2, + BablICCTypeCMYK = 3, +} BablICCType; + typedef struct { BablInstance instance; @@ -56,10 +111,14 @@ double xb; // blue primary chromaticity double yb; + BablICCType icc_type; /* taken into account when looking for duplicate spaces*/ + double whitepoint[3]; /* CIE XYZ whitepoint */ const Babl *trc[3]; + + /* ------------- end of dedup zone -------------- */ + char name[512]; // XXX: allocate this dynamically instead - // or use iccv4 style hashes for name. - double whitepoint[3]; /* CIE XYZ whitepoint */ double RGBtoXYZ[9]; /* matrices for conversions */ double XYZtoRGB[9]; @@ -76,7 +135,6 @@ */ char *icc_profile; int icc_length; - BablCMYK cmyk; } BablSpace; @@ -108,6 +166,10 @@ void babl_space_class_init (void); +const Babl * +babl_space_from_gray_trc (const char *name, + const Babl *trc_gray, + BablSpaceFlags flags); #endif diff -Nru babl-0.1.63+om~1/babl/babl-type.c babl-0.1.73+om~1/babl/babl-type.c --- babl-0.1.63+om~1/babl/babl-type.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-type.c 2019-12-09 16:21:18.000000000 +0000 @@ -38,7 +38,8 @@ static Babl * type_new (const char *name, int id, - int bits) + int bits, + const char *doc) { Babl *babl; @@ -50,6 +51,7 @@ babl->instance.name = (void *) ((char *) babl + sizeof (BablType)); babl->class_type = BABL_TYPE; babl->instance.id = id; + babl->instance.doc = doc; strcpy (babl->instance.name, name); babl->type.bits = bits; babl->type.from_list = NULL; @@ -77,6 +79,7 @@ int bits = 0; const char *name = first_arg; const char *arg; + const char *doc = NULL; va_start (varg, first_arg); @@ -104,6 +107,10 @@ { (void) va_arg (varg, long); } + else if (!strcmp (arg, "doc")) + { + doc = va_arg (varg, const char*); + } else if (!strcmp (arg, "max")) { (void) va_arg (varg, long); @@ -150,7 +157,7 @@ return babl; } - babl = type_new (name, id, bits); + babl = type_new (name, id, bits, doc); /* Since there is not an already registered instance by the required * id/name, inserting newly created class into database. diff -Nru babl-0.1.63+om~1/babl/babl-types.h babl-0.1.73+om~1/babl/babl-types.h --- babl-0.1.63+om~1/babl/babl-types.h 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-types.h 2019-12-09 16:21:18.000000000 +0000 @@ -28,8 +28,6 @@ * * The babl API is based around polymorphism and almost everything is * a Babl object. - * - * Rename to: Object **/ typedef union _Babl Babl; diff -Nru babl-0.1.63+om~1/babl/babl-version.h.in babl-0.1.73+om~1/babl/babl-version.h.in --- babl-0.1.63+om~1/babl/babl-version.h.in 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/babl-version.h.in 2019-12-09 16:21:18.000000000 +0000 @@ -36,7 +36,14 @@ #define BABL_MINOR_VERSION @BABL_MINOR_VERSION@ #define BABL_MICRO_VERSION @BABL_MICRO_VERSION@ -/** Get the version information on the babl library */ +/** + * babl_get_version: + * @major: (out): The major version number + * @minor: (out): The minor version number + * @micro: (out): The micro version number + * + * Get the version information on the babl library + */ void babl_get_version (int *major, int *minor, int *micro); diff -Nru babl-0.1.63+om~1/babl/base/conversions-type.c babl-0.1.73+om~1/babl/base/conversions-type.c --- babl-0.1.63+om~1/babl/base/conversions-type.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/conversions-type.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -/* babl - dynamically extendable universal pixel conversion library. - * Copyright (C) 2005, Øyvind Kolås. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, see - * . - */ - -#include "config.h" -#include -#include "babl.h" -#include - - diff -Nru babl-0.1.63+om~1/babl/base/formats.c babl-0.1.73+om~1/babl/base/formats.c --- babl-0.1.63+om~1/babl/base/formats.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/formats.c 2019-12-09 16:21:18.000000000 +0000 @@ -132,6 +132,13 @@ NULL); babl_format_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL_ALPHA_PREMULTIPLIED), + type, + babl_component_from_id (BABL_GRAY_PERCEPTUAL_MUL_ALPHA), + babl_component_from_id (BABL_ALPHA), + NULL); + + babl_format_new ( babl_model_from_id (BABL_MODEL_GRAY_NONLINEAR_ALPHA_PREMULTIPLIED), type, babl_component_from_id (BABL_GRAY_NONLINEAR_MUL_ALPHA), diff -Nru babl-0.1.63+om~1/babl/base/Makefile.am babl-0.1.73+om~1/babl/base/Makefile.am --- babl-0.1.63+om~1/babl/base/Makefile.am 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ - -h_sources = \ - babl-base.h - -c_sources = \ - babl-base.c \ - formats.c \ - pow-24.c \ - type-float.c \ - type-half.c \ - type-u8.c \ - type-u15.c \ - type-u16.c \ - type-u32.c \ - model-rgb.c \ - model-gray.c \ - model-cmyk.c \ - model-ycbcr.c - -AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl $(LCMS_CFLAGS) - -noinst_LTLIBRARIES= libbase.la -libbase_la_SOURCES= $(h_sources) $(c_sources) -libbase_la_LIBADD = $(MATH_LIB) - -EXTRA_DIST = \ - util.h \ - pow-24.h - diff -Nru babl-0.1.63+om~1/babl/base/meson.build babl-0.1.73+om~1/babl/base/meson.build --- babl-0.1.63+om~1/babl/base/meson.build 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/meson.build 2019-12-09 16:21:18.000000000 +0000 @@ -16,8 +16,14 @@ 'type-u8.c', ] +babl_base_c_args = [ + sse2_cflags, + '-DLIBDIR="@0@"'.format(babl_libdir), + '-fno-unsafe-math-optimizations' +] + babl_base = static_library('babl_base', babl_base_sources, include_directories: [ rootInclude, bablInclude, ], - dependencies: [ math, ], + dependencies: [ math, lcms], ) diff -Nru babl-0.1.63+om~1/babl/base/model-cmyk.c babl-0.1.73+om~1/babl/base/model-cmyk.c --- babl-0.1.63+om~1/babl/base/model-cmyk.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/model-cmyk.c 2019-12-09 16:21:18.000000000 +0000 @@ -43,16 +43,17 @@ { while (n--) { - double cyan = ((double *) src)[0]; - double magenta = ((double *) src)[1]; - double yellow = ((double *) src)[2]; - double key = ((double *) src)[3]; - double alpha = ((double *) src)[4]; - - ((double *) dst)[0] = (cyan) * alpha; - ((double *) dst)[1] = (magenta) * alpha; - ((double *) dst)[2] = (yellow) * alpha; - ((double *) dst)[3] = (key) * alpha; + double cyan = ((double *) src)[0]; + double magenta = ((double *) src)[1]; + double yellow = ((double *) src)[2]; + double key = ((double *) src)[3]; + double alpha = ((double *) src)[4]; + double used_alpha = babl_epsilon_for_zero (alpha); + + ((double *) dst)[0] = (cyan) * used_alpha; + ((double *) dst)[1] = (magenta) * used_alpha; + ((double *) dst)[2] = (yellow) * used_alpha; + ((double *) dst)[3] = (key) * used_alpha; ((double *) dst)[4] = alpha; src += 5 * sizeof (double); @@ -68,12 +69,13 @@ { while (n--) { - double alpha = ((double *) src)[4]; - double ralpha = alpha>0.000001?1.0/alpha:0.0; - double cyan = ((double *) src)[0] * ralpha; - double magenta= ((double *) src)[1] * ralpha; - double yellow = ((double *) src)[2] * ralpha; - double key = ((double *) src)[3] * ralpha; + double alpha = ((double *) src)[4]; + double used_alpha = babl_epsilon_for_zero (alpha); + double ralpha = 1.0/used_alpha; + double cyan = ((double *) src)[0] * ralpha; + double magenta = ((double *) src)[1] * ralpha; + double yellow = ((double *) src)[2] * ralpha; + double key = ((double *) src)[3] * ralpha; ((double *) dst)[0] = cyan; ((double *) dst)[1] = magenta; @@ -142,16 +144,17 @@ { while (n--) { - double cyan = ((double *) src)[0]; - double magenta = ((double *) src)[1]; - double yellow = ((double *) src)[2]; - double key = ((double *) src)[3]; - double alpha = ((double *) src)[4]; - - ((double *) dst)[0] = (1.0-cyan) * alpha; - ((double *) dst)[1] = (1.0-magenta) * alpha; - ((double *) dst)[2] = (1.0-yellow) * alpha; - ((double *) dst)[3] = (1.0-key) * alpha; + double cyan = ((double *) src)[0]; + double magenta = ((double *) src)[1]; + double yellow = ((double *) src)[2]; + double key = ((double *) src)[3]; + double alpha = ((double *) src)[4]; + double used_alpha = babl_epsilon_for_zero (alpha); + + ((double *) dst)[0] = (1.0-cyan) * used_alpha; + ((double *) dst)[1] = (1.0-magenta) * used_alpha; + ((double *) dst)[2] = (1.0-yellow) * used_alpha; + ((double *) dst)[3] = (1.0-key) * used_alpha; ((double *) dst)[4] = alpha; src += 5 * sizeof (double); @@ -167,12 +170,13 @@ { while (n--) { - double alpha = ((double *) src)[4]; - double ralpha = alpha>0.000001?1.0/alpha:0.0; - double cyan = ((double *) src)[0] * ralpha; - double magenta= ((double *) src)[1] * ralpha; - double yellow = ((double *) src)[2] * ralpha; - double key = ((double *) src)[3] * ralpha; + double alpha = ((double *) src)[4]; + double used_alpha = babl_epsilon_for_zero (alpha); + double ralpha = 1.0 / used_alpha; + double cyan = ((double *) src)[0] * ralpha; + double magenta = ((double *) src)[1] * ralpha; + double yellow = ((double *) src)[2] * ralpha; + double key = ((double *) src)[3] * ralpha; ((double *) dst)[0] = 1.0-cyan; ((double *) dst)[1] = 1.0-magenta; @@ -278,6 +282,7 @@ double green = (((double *) src)[1]); double blue = (((double *) src)[2]); double alpha = ((double *) src)[3]; + double used_alpha = babl_epsilon_for_zero (alpha); double cyan, magenta, yellow, key; @@ -307,10 +312,10 @@ yellow = 0.0; } - ((double *) dst)[0] = (1.0-cyan) * alpha; - ((double *) dst)[1] = (1.0-magenta) * alpha; - ((double *) dst)[2] = (1.0-yellow) * alpha; - ((double *) dst)[3] = (1.0-key) * alpha; + ((double *) dst)[0] = (1.0-cyan) * used_alpha; + ((double *) dst)[1] = (1.0-magenta) * used_alpha; + ((double *) dst)[2] = (1.0-yellow) * used_alpha; + ((double *) dst)[3] = (1.0-key) * used_alpha; ((double *) dst)[4] = alpha; src += 4 * sizeof (double); @@ -327,7 +332,8 @@ while (n--) { double alpha = ((double *) src)[4]; - double ralpha = alpha>0.000001?1.0/alpha:0.0; + double used_alpha = babl_epsilon_for_zero (alpha); + double ralpha = 1.0 / used_alpha; double cyanI = ((double *) src)[0] * ralpha; double magentaI= ((double *) src)[1] * ralpha; double yellowI = ((double *) src)[2] * ralpha; @@ -642,7 +648,7 @@ "cmyk", "inverted", "alpha", - "premultiplied", + "associated", NULL ); @@ -678,7 +684,7 @@ babl_component ("A"), "cmyk", "alpha", - "premultiplied", + "associated", NULL ); diff -Nru babl-0.1.63+om~1/babl/base/model-gray.c babl-0.1.73+om~1/babl/base/model-gray.c --- babl-0.1.63+om~1/babl/base/model-gray.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/model-gray.c 2019-12-09 16:21:18.000000000 +0000 @@ -72,6 +72,12 @@ "id", BABL_GRAY_PERCEPTUAL, "luma", NULL); + + babl_component_new ( + "Y~a", + "id", BABL_GRAY_PERCEPTUAL_MUL_ALPHA, + "luma", + NULL); } static void @@ -100,7 +106,7 @@ babl_component_from_id (BABL_ALPHA), "gray", "linear", - "premultiplied", + "associated", "alpha", NULL); @@ -126,7 +132,7 @@ babl_component_from_id (BABL_ALPHA), "gray", "nonlinear", - "premultiplied", + "associated", "alpha", NULL); @@ -146,6 +152,16 @@ "alpha", NULL); + babl_model_new ( + "id", BABL_MODEL_GRAY_PERCEPTUAL_ALPHA_PREMULTIPLIED, + babl_component_from_id (BABL_GRAY_PERCEPTUAL_MUL_ALPHA), + babl_component_from_id (BABL_ALPHA), + "gray", + "perceptual", + "associated", + "alpha", + NULL); + } static void @@ -435,14 +451,14 @@ } static void -gray_alpha_premultiplied_to_rgba (Babl *conversion, - int src_bands, - char **src, - int *src_pitch, - int dst_bands, - char **dst, - int *dst_pitch, - long n) +gray_alpha_associated_alpha_to_rgba (Babl *conversion, + int src_bands, + char **src, + int *src_pitch, + int dst_bands, + char **dst, + int *dst_pitch, + long n) { BABL_PLANAR_SANITY assert (src_bands == 2); @@ -451,16 +467,9 @@ while (n--) { double luminance = *(double *) src[0]; - double alpha; - alpha = *(double *) src[1]; - if (alpha == 0) - luminance = 0; - else - { - luminance = luminance / alpha; - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0; - } + double alpha = *(double *) src[1]; + double used_alpha = babl_epsilon_for_zero (alpha); + luminance = luminance / used_alpha; *(double *) dst[0] = luminance; *(double *) dst[1] = luminance; @@ -472,14 +481,14 @@ static void -rgba_to_gray_alpha_premultiplied (Babl *conversion, - int src_bands, - char **src, - int *src_pitch, - int dst_bands, - char **dst, - int *dst_pitch, - long n) +rgba_to_gray_alpha_associated_alpha (Babl *conversion, + int src_bands, + char **src, + int *src_pitch, + int dst_bands, + char **dst, + int *dst_pitch, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); double RGB_LUMINANCE_RED = space->space.RGBtoXYZ[3]; @@ -497,19 +506,13 @@ double blue = *(double *) src[2]; double luminance; double alpha = *(double *) src[3]; - if (alpha <= BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } + double used_alpha = babl_epsilon_for_zero (alpha); luminance = red * RGB_LUMINANCE_RED + green * RGB_LUMINANCE_GREEN + blue * RGB_LUMINANCE_BLUE; - luminance *= alpha; + luminance *= used_alpha; *(double *) dst[0] = luminance; *(double *) dst[1] = alpha; @@ -518,7 +521,7 @@ } static void -non_premultiplied_to_premultiplied (Babl *conversion, +separate_alpha_to_associated_alpha (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -533,17 +536,11 @@ { int band; double alpha = *(double *) src[src_bands-1]; - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } + double used_alpha = babl_epsilon_for_zero (alpha); for (band = 0; band < src_bands - 1; band++) { - *(double *) dst[band] = *(double *) src[band] * alpha; + *(double *) dst[band] = *(double *) src[band] * used_alpha; } *(double *) dst[dst_bands - 1] = alpha; @@ -552,7 +549,7 @@ } static void -premultiplied_to_non_premultiplied (Babl *conversion, +associated_alpha_to_separate_alpha (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -566,32 +563,30 @@ while (n--) { int band; - double alpha; - alpha = *(double *) src[src_bands-1]; + double alpha = *(double *) src[src_bands-1]; + double used_alpha = babl_epsilon_for_zero (alpha); + double recip_alpha = 1.0 / used_alpha; for (band = 0; band < src_bands - 1; band++) { - if (alpha == 0.0) - *(double *) dst[band] = 0; - else - *(double *) dst[band] = *(double *) src[band] / alpha; + *(double *) dst[band] = *(double *) src[band] * recip_alpha; } - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0; *(double *) dst[dst_bands - 1] = alpha; BABL_PLANAR_STEP } } + + static void -rgba2gray_nonlinear_premultiplied (Babl *conversion, - char *src, - char *dst, - long n) +rgba2gray_perceptual_associated_alpha (Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_destination_space (conversion); - const Babl *trc = space->space.trc[0]; + const Babl *trc = perceptual_trc; double RGB_LUMINANCE_RED = space->space.RGBtoXYZ[3]; double RGB_LUMINANCE_GREEN = space->space.RGBtoXYZ[4]; double RGB_LUMINANCE_BLUE = space->space.RGBtoXYZ[5]; @@ -604,20 +599,14 @@ double luminance; double luma; double alpha = ((double *) src)[3]; - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } + double used_alpha = babl_epsilon_for_zero (alpha); luminance = red * RGB_LUMINANCE_RED + green * RGB_LUMINANCE_GREEN + blue * RGB_LUMINANCE_BLUE; luma = babl_trc_from_linear (trc, luminance); - ((double *) dst)[0] = luma * alpha; + ((double *) dst)[0] = luma * used_alpha; ((double *) dst)[1] = alpha; src += 4 * sizeof (double); @@ -625,31 +614,87 @@ } } - static void -gray_nonlinear_premultiplied2rgba (Babl *conversion, - char *src, - char *dst, - long n) +rgba2gray_nonlinear_associated_alpha (Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_destination_space (conversion); const Babl *trc = space->space.trc[0]; + double RGB_LUMINANCE_RED = space->space.RGBtoXYZ[3]; + double RGB_LUMINANCE_GREEN = space->space.RGBtoXYZ[4]; + double RGB_LUMINANCE_BLUE = space->space.RGBtoXYZ[5]; + + while (n--) + { + double red = ((double *) src)[0]; + double green = ((double *) src)[1]; + double blue = ((double *) src)[2]; + double luminance; + double luma; + double alpha = ((double *) src)[3]; + double used_alpha = babl_epsilon_for_zero (alpha); + + luminance = red * RGB_LUMINANCE_RED + + green * RGB_LUMINANCE_GREEN + + blue * RGB_LUMINANCE_BLUE; + luma = babl_trc_from_linear (trc, luminance); + + ((double *) dst)[0] = luma * used_alpha; + ((double *) dst)[1] = alpha; + + src += 4 * sizeof (double); + dst += 2 * sizeof (double); + } +} + + +static void +gray_perceptual_associated_alpha2rgba (Babl *conversion, + char *src, + char *dst, + long n) +{ + const Babl *trc = perceptual_trc; while (n--) { double luma = ((double *) src)[0]; double luminance; - double alpha; - alpha = ((double *) src)[1]; - if (alpha == 0.0) - luma = 0.0; - else - luma = luma / alpha; + double alpha = ((double *) src)[1]; + double used_alpha = babl_epsilon_for_zero (alpha); + luma = luma / used_alpha; luminance = babl_trc_to_linear (trc, luma); - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0; + ((double *) dst)[0] = luminance; + ((double *) dst)[1] = luminance; + ((double *) dst)[2] = luminance; + ((double *) dst)[3] = alpha; + + src += 2 * sizeof (double); + dst += 4 * sizeof (double); + } +} + +static void +gray_nonlinear_associated_alpha2rgba (Babl *conversion, + char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl *trc = space->space.trc[0]; + + while (n--) + { + double luma = ((double *) src)[0]; + double luminance; + double alpha = ((double *) src)[1]; + double used_alpha = babl_epsilon_for_zero (alpha); + luma = luma / used_alpha; + luminance = babl_trc_to_linear (trc, luma); ((double *) dst)[0] = luminance; ((double *) dst)[1] = luminance; @@ -697,18 +742,30 @@ babl_conversion_new ( babl_model_from_id (BABL_MODEL_GRAY_NONLINEAR_ALPHA_PREMULTIPLIED), babl_model_from_id (BABL_RGBA), - "linear", gray_nonlinear_premultiplied2rgba, + "linear", gray_nonlinear_associated_alpha2rgba, NULL ); babl_conversion_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL_ALPHA_PREMULTIPLIED), babl_model_from_id (BABL_RGBA), - babl_model_from_id (BABL_MODEL_GRAY_NONLINEAR_ALPHA_PREMULTIPLIED), - "linear", rgba2gray_nonlinear_premultiplied, + "linear", gray_perceptual_associated_alpha2rgba, NULL ); + babl_conversion_new ( + babl_model_from_id (BABL_RGBA), + babl_model_from_id (BABL_MODEL_GRAY_NONLINEAR_ALPHA_PREMULTIPLIED), + "linear", rgba2gray_nonlinear_associated_alpha, + NULL + ); + babl_conversion_new ( + babl_model_from_id (BABL_RGBA), + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL_ALPHA_PREMULTIPLIED), + "linear", rgba2gray_perceptual_associated_alpha, + NULL + ); babl_conversion_new ( babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL), @@ -770,28 +827,28 @@ babl_conversion_new ( babl_model_from_id (BABL_GRAY_ALPHA), babl_model_from_id (BABL_GRAY_ALPHA_PREMULTIPLIED), - "planar", non_premultiplied_to_premultiplied, + "planar", separate_alpha_to_associated_alpha, NULL ); babl_conversion_new ( babl_model_from_id (BABL_GRAY_ALPHA_PREMULTIPLIED), babl_model_from_id (BABL_GRAY_ALPHA), - "planar", premultiplied_to_non_premultiplied, + "planar", associated_alpha_to_separate_alpha, NULL ); babl_conversion_new ( babl_model_from_id (BABL_GRAY_ALPHA_PREMULTIPLIED), babl_model_from_id (BABL_RGBA), - "planar", gray_alpha_premultiplied_to_rgba, + "planar", gray_alpha_associated_alpha_to_rgba, NULL ); babl_conversion_new ( babl_model_from_id (BABL_RGBA), babl_model_from_id (BABL_GRAY_ALPHA_PREMULTIPLIED), - "planar", rgba_to_gray_alpha_premultiplied, + "planar", rgba_to_gray_alpha_associated_alpha, NULL ); } @@ -833,6 +890,23 @@ babl_type_from_id (BABL_HALF), babl_component_from_id (BABL_GRAY_NONLINEAR), NULL); + babl_format_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL), + babl_type_from_id (BABL_HALF), + babl_component_from_id (BABL_GRAY_PERCEPTUAL), + NULL); + babl_format_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL_ALPHA), + babl_type_from_id (BABL_HALF), + babl_component_from_id (BABL_GRAY_PERCEPTUAL), + babl_component_from_id (BABL_ALPHA), + NULL); + babl_format_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL_ALPHA_PREMULTIPLIED), + babl_type_from_id (BABL_HALF), + babl_component_from_id (BABL_GRAY_PERCEPTUAL_MUL_ALPHA), + babl_component_from_id (BABL_ALPHA), + NULL); /***********/ babl_format_new ( @@ -904,6 +978,24 @@ babl_type_from_id (BABL_U32), babl_component_from_id (BABL_GRAY_NONLINEAR), NULL); + + babl_format_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL), + babl_type_from_id (BABL_U32), + babl_component_from_id (BABL_GRAY_PERCEPTUAL), + NULL); + babl_format_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL_ALPHA), + babl_type_from_id (BABL_U32), + babl_component_from_id (BABL_GRAY_PERCEPTUAL), + babl_component_from_id (BABL_ALPHA), + NULL); + babl_format_new ( + babl_model_from_id (BABL_MODEL_GRAY_PERCEPTUAL_ALPHA_PREMULTIPLIED), + babl_type_from_id (BABL_U32), + babl_component_from_id (BABL_GRAY_PERCEPTUAL_MUL_ALPHA), + babl_component_from_id (BABL_ALPHA), + NULL); } /********** float versions ***********/ @@ -1193,7 +1285,7 @@ } static void -gray_alpha_premultiplied_to_rgba_float (Babl *conversion, +gray_alpha_associated_alpha_to_rgba_float (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -1209,16 +1301,9 @@ while (n--) { float luminance = *(float *) src[0]; - float alpha; - alpha = *(float *) src[1]; - if (alpha == 0) - luminance = 0.0f; - else - { - luminance = luminance / alpha; - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0f; - } + float alpha = *(float *) src[1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + luminance = luminance / used_alpha; *(float *) dst[0] = luminance; *(float *) dst[1] = luminance; @@ -1230,7 +1315,7 @@ static void -rgba_to_gray_alpha_premultiplied_float (Babl *conversion, +rgba_to_gray_alpha_associated_alpha_float (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -1255,19 +1340,13 @@ float blue = *(float *) src[2]; float luminance; float alpha = *(float *) src[3]; - if (alpha <= BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } + float used_alpha = babl_epsilon_for_zero_float (alpha); luminance = red * RGB_LUMINANCE_RED + green * RGB_LUMINANCE_GREEN + blue * RGB_LUMINANCE_BLUE; - luminance *= alpha; + luminance *= used_alpha; *(float *) dst[0] = luminance; *(float *) dst[1] = alpha; @@ -1276,7 +1355,7 @@ } static void -non_premultiplied_to_premultiplied_float (Babl *conversion, +separate_alpha_to_associated_alpha_float (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -1291,27 +1370,11 @@ { int band; float alpha = *(float *) src[src_bands-1]; - if (alpha < BABL_ALPHA_FLOOR) - { - int non_zero_components = 0; - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - - for (band = 0; band < src_bands - 1; band++) - { - if (*(float *) src[band] != 0.0f) - non_zero_components++; - } - if (non_zero_components) - alpha = 0.0f; - - } + float used_alpha = babl_epsilon_for_zero_float (alpha); for (band = 0; band < src_bands - 1; band++) { - *(float *) dst[band] = *(float *) src[band] * alpha; + *(float *) dst[band] = *(float *) src[band] * used_alpha; } *(float *) dst[dst_bands - 1] = alpha; @@ -1320,7 +1383,7 @@ } static void -premultiplied_to_non_premultiplied_float (Babl *conversion, +associated_alpha_to_separate_alpha_float (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -1334,18 +1397,14 @@ while (n--) { int band; - float alpha; - alpha = *(float *) src[src_bands-1]; + float alpha = *(float *) src[src_bands-1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + float recip_alpha = 1.0f / used_alpha; for (band = 0; band < src_bands - 1; band++) { - if (alpha == 0.0f) - *(float *) dst[band] = 0.0f; - else - *(float *) dst[band] = *(float *) src[band] / alpha; + *(float *) dst[band] = *(float *) src[band] * recip_alpha; } - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0f; *(float *) dst[dst_bands - 1] = alpha; BABL_PLANAR_STEP @@ -1353,7 +1412,7 @@ } static void -rgba2gray_nonlinear_premultiplied_float (Babl *conversion, +rgba2gray_nonlinear_associated_alpha_float (Babl *conversion, char *src, char *dst, long n) @@ -1372,20 +1431,14 @@ float luminance; float luma; float alpha = ((float *) src)[3]; - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } + float used_alpha = babl_epsilon_for_zero_float (alpha); luminance = red * RGB_LUMINANCE_RED + green * RGB_LUMINANCE_GREEN + blue * RGB_LUMINANCE_BLUE; luma = babl_trc_from_linear (trc, luminance); - ((float *) dst)[0] = luma * alpha; + ((float *) dst)[0] = luma * used_alpha; ((float *) dst)[1] = alpha; src += 4 * sizeof (float); @@ -1394,7 +1447,7 @@ } static void -gray_nonlinear_premultiplied2rgba_float (Babl *conversion, +gray_nonlinear_associated_alpha2rgba_float (Babl *conversion, char *src, char *dst, long n) @@ -1406,17 +1459,75 @@ { float luma = ((float *) src)[0]; float luminance; - float alpha; - alpha = ((float *) src)[1]; - if (alpha == 0.0f) - luma = 0.0f; - else - luma = luma / alpha; + float alpha = ((float *) src)[1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + luma = luma / used_alpha; luminance = babl_trc_to_linear (trc, luma); - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0f; + ((float *) dst)[0] = luminance; + ((float *) dst)[1] = luminance; + ((float *) dst)[2] = luminance; + ((float *) dst)[3] = alpha; + + src += 2 * sizeof (float); + dst += 4 * sizeof (float); + } +} + +static void +rgba2gray_perceptual_associated_alpha_float (Babl *conversion, + char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl *trc = perceptual_trc; + float RGB_LUMINANCE_RED = space->space.RGBtoXYZf[3]; + float RGB_LUMINANCE_GREEN = space->space.RGBtoXYZf[4]; + float RGB_LUMINANCE_BLUE = space->space.RGBtoXYZf[5]; + + while (n--) + { + float red = ((float *) src)[0]; + float green = ((float *) src)[1]; + float blue = ((float *) src)[2]; + float luminance; + float luma; + float alpha = ((float *) src)[3]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + + luminance = red * RGB_LUMINANCE_RED + + green * RGB_LUMINANCE_GREEN + + blue * RGB_LUMINANCE_BLUE; + luma = babl_trc_from_linear (trc, luminance); + + ((float *) dst)[0] = luma * used_alpha; + ((float *) dst)[1] = alpha; + + src += 4 * sizeof (float); + dst += 2 * sizeof (float); + } +} + +static void +gray_perceptual_associated_alpha2rgba_float (Babl *conversion, + char *src, + char *dst, + long n) +{ + const Babl *trc = perceptual_trc; + + while (n--) + { + float luma = ((float *) src)[0]; + float luminance; + float alpha = ((float *) src)[1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + + luma = luma / used_alpha; + + luminance = babl_trc_to_linear (trc, luma); ((float *) dst)[0] = luminance; ((float *) dst)[1] = luminance; @@ -1479,6 +1590,12 @@ babl_component ("Y'a"), babl_component ("A"), NULL); + babl_format_new ( + babl_model ("Y~aA"), + babl_type_from_id (BABL_FLOAT), + babl_component ("Y~a"), + babl_component ("A"), + NULL); babl_conversion_new ( babl_format ("Y' float"), @@ -1512,18 +1629,30 @@ babl_conversion_new ( babl_format ("Y'aA float"), babl_format ("RGBA float"), - "linear", gray_nonlinear_premultiplied2rgba_float, + "linear", gray_nonlinear_associated_alpha2rgba_float, NULL ); babl_conversion_new ( + babl_format ("Y~aA float"), babl_format ("RGBA float"), - babl_format ("Y'aA float"), - "linear", rgba2gray_nonlinear_premultiplied_float, + "linear", gray_perceptual_associated_alpha2rgba_float, NULL ); + babl_conversion_new ( + babl_format ("RGBA float"), + babl_format ("Y'aA float"), + "linear", rgba2gray_nonlinear_associated_alpha_float, + NULL + ); + babl_conversion_new ( + babl_format ("RGBA float"), + babl_format ("Y~aA float"), + "linear", rgba2gray_perceptual_associated_alpha_float, + NULL + ); babl_conversion_new ( babl_format ("Y~ float"), @@ -1585,28 +1714,28 @@ babl_conversion_new ( babl_format ("YA float"), babl_format ("YaA float"), - "planar", non_premultiplied_to_premultiplied_float, + "planar", separate_alpha_to_associated_alpha_float, NULL ); babl_conversion_new ( babl_format ("YaA float"), babl_format ("YA float"), - "planar", premultiplied_to_non_premultiplied_float, + "planar", associated_alpha_to_separate_alpha_float, NULL ); babl_conversion_new ( babl_format ("YaA float"), babl_format ("RGBA float"), - "planar", gray_alpha_premultiplied_to_rgba_float, + "planar", gray_alpha_associated_alpha_to_rgba_float, NULL ); babl_conversion_new ( babl_format ("RGBA float"), babl_format ("YaA float"), - "planar", rgba_to_gray_alpha_premultiplied_float, + "planar", rgba_to_gray_alpha_associated_alpha_float, NULL ); } diff -Nru babl-0.1.63+om~1/babl/base/model-rgb.c babl-0.1.73+om~1/babl/base/model-rgb.c --- babl-0.1.63+om~1/babl/base/model-rgb.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/model-rgb.c 2019-12-09 16:21:18.000000000 +0000 @@ -171,7 +171,7 @@ babl_component_from_id (BABL_ALPHA), "rgb", "linear", - "premultiplied", + "associated", "alpha", NULL); @@ -223,7 +223,7 @@ babl_component_from_id (BABL_ALPHA), "rgb", "nonlinear", - "premultiplied", + "associated", "alpha", NULL); @@ -235,7 +235,7 @@ babl_component_from_id (BABL_ALPHA), "rgb", "perceptual", - "premultiplied", + "associated", "alpha", NULL); } @@ -334,10 +334,8 @@ } - - static void -non_premultiplied_to_premultiplied (Babl *conversion, +separate_alpha_to_associated_alpha (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -354,17 +352,11 @@ double alpha = *(double *) src[src_bands - 1]; int band; - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } + double used_alpha = babl_epsilon_for_zero (alpha); for (band = 0; band < src_bands - 1; band++) { - *(double *) dst[band] = *(double *) src[band] * alpha; + *(double *) dst[band] = *(double *) src[band] * used_alpha; } *(double *) dst[dst_bands - 1] = alpha; @@ -376,7 +368,7 @@ static void -premultiplied_to_non_premultiplied (Babl *conversion, +associated_alpha_to_separate_alpha (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -390,19 +382,10 @@ BABL_PLANAR_SANITY while (n--) { - double alpha; - double recip_alpha; + double alpha = *(double *) src[src_bands - 1]; int band; - - alpha = *(double *) src[src_bands - 1]; - if (alpha == 0.0) - recip_alpha = 0.0; - else - { - recip_alpha = 1.0 / alpha; - if (alpha == BABL_ALPHA_FLOOR) - alpha = 0.0; // making 0 round-trip to zero, causing discontinuity - } + double used_alpha = babl_epsilon_for_zero (alpha); + double recip_alpha = 1.0 / used_alpha; for (band = 0; band < src_bands - 1; band++) *(double *) dst[band] = *(double *) src[band] * recip_alpha; @@ -414,10 +397,10 @@ static void -rgba2rgba_nonlinear_premultiplied (Babl *conversion, - char *src, - char *dst, - long samples) +rgba2rgba_nonlinear_associated_alpha (Babl *conversion, + char *src, + char *dst, + long samples) { const Babl *space = babl_conversion_get_destination_space (conversion); const Babl **trc = (void*)space->space.trc; @@ -426,17 +409,11 @@ while (n--) { double alpha = ((double *) src)[3]; - if (alpha <= BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } - - ((double *) dst)[0] = babl_trc_from_linear (trc[0], ((double *) src)[0]) * alpha; - ((double *) dst)[1] = babl_trc_from_linear (trc[1], ((double *) src)[1]) * alpha; - ((double *) dst)[2] = babl_trc_from_linear (trc[2], ((double *) src)[2]) * alpha; + double used_alpha = babl_epsilon_for_zero (alpha); + + ((double *) dst)[0] = babl_trc_from_linear (trc[0], ((double *) src)[0]) * used_alpha; + ((double *) dst)[1] = babl_trc_from_linear (trc[1], ((double *) src)[1]) * used_alpha; + ((double *) dst)[2] = babl_trc_from_linear (trc[2], ((double *) src)[2]) * used_alpha; ((double *) dst)[3] = alpha; src += 4 * sizeof (double); dst += 4 * sizeof (double); @@ -447,10 +424,10 @@ static void -rgba_nonlinear_premultiplied2rgba (Babl *conversion, - char *src, - char *dst, - long samples) +rgba_nonlinear_associated_alpha2rgba (Babl *conversion, + char *src, + char *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); const Babl **trc = (void*)space->space.trc; @@ -458,18 +435,9 @@ while (n--) { - double alpha, reciprocal; - alpha = ((double *) src)[3]; - if (alpha == 0.0) - { - reciprocal= 0.0f; - } - else - { - reciprocal= 1.0 / alpha; - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0; - } + double alpha = ((double *) src)[3]; + double used_alpha = babl_epsilon_for_zero (alpha); + double reciprocal = 1.0 / used_alpha; ((double *) dst)[0] = babl_trc_to_linear (trc[0], ((double *) src)[0] * reciprocal); ((double *) dst)[1] = babl_trc_to_linear (trc[1], ((double *) src)[1] * reciprocal); @@ -593,10 +561,10 @@ } static void -rgba2rgba_perceptual_premultiplied (Babl *conversion, - char *src, - char *dst, - long samples) +rgba2rgba_perceptual_associated_alpha (Babl *conversion, + char *src, + char *dst, + long samples) { const Babl *trc = perceptual_trc; long n = samples; @@ -604,18 +572,11 @@ while (n--) { double alpha = ((double *) src)[3]; + double used_alpha = babl_epsilon_for_zero (alpha); - if (alpha <= BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } - - ((double *) dst)[0] = babl_trc_from_linear (trc, ((double *) src)[0]) * alpha; - ((double *) dst)[1] = babl_trc_from_linear (trc, ((double *) src)[1]) * alpha; - ((double *) dst)[2] = babl_trc_from_linear (trc, ((double *) src)[2]) * alpha; + ((double *) dst)[0] = babl_trc_from_linear (trc, ((double *) src)[0]) * used_alpha; + ((double *) dst)[1] = babl_trc_from_linear (trc, ((double *) src)[1]) * used_alpha; + ((double *) dst)[2] = babl_trc_from_linear (trc, ((double *) src)[2]) * used_alpha; ((double *) dst)[3] = alpha; src += 4 * sizeof (double); dst += 4 * sizeof (double); @@ -624,28 +585,20 @@ static void -rgba_perceptual_premultiplied2rgba (Babl *conversion, - char *src, - char *dst, - long samples) +rgba_perceptual_associated_alpha2rgba (Babl *conversion, + char *src, + char *dst, + long samples) { const Babl *trc = perceptual_trc; long n = samples; while (n--) { - double alpha, reciprocal; - alpha = ((double *) src)[3]; - if (alpha == 0) - { - reciprocal = 0.0; - } - else - { - reciprocal = 1.0/alpha; - if(alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0; - } + double alpha = ((double *) src)[3]; + double used_alpha = babl_epsilon_for_zero (alpha); + double reciprocal = 1.0/used_alpha; + ((double *) dst)[0] = babl_trc_to_linear (trc, ((double *) src)[0] * reciprocal); ((double *) dst)[1] = babl_trc_to_linear (trc, ((double *) src)[1] * reciprocal); ((double *) dst)[2] = babl_trc_to_linear (trc, ((double *) src)[2] * reciprocal); @@ -731,13 +684,13 @@ babl_conversion_new ( babl_model_from_id (BABL_RGBA), babl_model_from_id (BABL_RGBA_PREMULTIPLIED), - "planar", non_premultiplied_to_premultiplied, + "planar", separate_alpha_to_associated_alpha, NULL ); babl_conversion_new ( babl_model_from_id (BABL_RGBA_PREMULTIPLIED), babl_model_from_id (BABL_RGBA), - "planar", premultiplied_to_non_premultiplied, + "planar", associated_alpha_to_separate_alpha, NULL ); @@ -769,12 +722,12 @@ babl_conversion_new ( babl_model_from_id (BABL_RGBA), babl_model_from_id (BABL_RGBA_NONLINEAR_PREMULTIPLIED), - "linear", rgba2rgba_nonlinear_premultiplied, + "linear", rgba2rgba_nonlinear_associated_alpha, NULL); babl_conversion_new ( babl_model_from_id (BABL_RGBA_NONLINEAR_PREMULTIPLIED), babl_model_from_id (BABL_RGBA), - "linear", rgba_nonlinear_premultiplied2rgba, + "linear", rgba_nonlinear_associated_alpha2rgba, NULL); ////////// @@ -805,12 +758,12 @@ babl_conversion_new ( babl_model_from_id (BABL_RGBA), babl_model_from_id (BABL_RGBA_PERCEPTUAL_PREMULTIPLIED), - "linear", rgba2rgba_perceptual_premultiplied, + "linear", rgba2rgba_perceptual_associated_alpha, NULL); babl_conversion_new ( babl_model_from_id (BABL_RGBA_PERCEPTUAL_PREMULTIPLIED), babl_model_from_id (BABL_RGBA), - "linear", rgba_perceptual_premultiplied2rgba, + "linear", rgba_perceptual_associated_alpha2rgba, NULL); } @@ -1180,7 +1133,7 @@ static void -non_premultiplied_to_premultiplied_float (Babl *conversion, +separate_alpha_to_associated_alpha_float (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -1195,25 +1148,12 @@ while (n--) { float alpha = *(float *) src[src_bands - 1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); int band; - if (alpha < BABL_ALPHA_FLOOR) - { - int non_zero_components = 0; - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - for (band = 0 ; band< src_bands-1; band++) - if (*(float *) src[band] != 0.0f) - non_zero_components++; - if (non_zero_components == 0) - alpha = 0.0f; - } - for (band = 0; band < src_bands - 1; band++) { - *(float *) dst[band] = *(float *) src[band] * alpha; + *(float *) dst[band] = *(float *) src[band] * used_alpha; } *(float *) dst[dst_bands - 1] = alpha; @@ -1223,7 +1163,7 @@ static void -premultiplied_to_non_premultiplied_float (Babl *conversion, +associated_alpha_to_separate_alpha_float (Babl *conversion, int src_bands, char **src, int *src_pitch, @@ -1237,19 +1177,10 @@ BABL_PLANAR_SANITY while (n--) { - float alpha; - float recip_alpha; int band; - - alpha = *(float *) src[src_bands - 1]; - if (alpha == 0.0f) - recip_alpha = 0.0f; - else - { - recip_alpha = 1.0f / alpha; - if (alpha == BABL_ALPHA_FLOOR) - alpha = 0.0f; // making 0 round-trip to zero, causing discontinuity - } + float alpha = *(float *) src[src_bands - 1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + float recip_alpha = 1.0f / used_alpha; for (band = 0; band < src_bands - 1; band++) *(float *) dst[band] = *(float *) src[band] * recip_alpha; @@ -1261,10 +1192,10 @@ static void -rgba2rgba_nonlinear_premultiplied_float (Babl *conversion, - char *src, - char *dst, - long samples) +rgba2rgba_nonlinear_associated_alpha_float (Babl *conversion, + char *src, + char *dst, + long samples) { const Babl *space = babl_conversion_get_destination_space (conversion); const Babl **trc = (void*)space->space.trc; @@ -1273,21 +1204,11 @@ while (n--) { float alpha = ((float *) src)[3]; - if (alpha <= BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - if (((float *) src)[0] == 0.0 && - ((float *) src)[1] == 0.0 && - ((float *) src)[2] == 0.0) - alpha = 0.0; - } - - ((float *) dst)[0] = babl_trc_from_linear (trc[0], ((float *) src)[0]) * alpha; - ((float *) dst)[1] = babl_trc_from_linear (trc[1], ((float *) src)[1]) * alpha; - ((float *) dst)[2] = babl_trc_from_linear (trc[2], ((float *) src)[2]) * alpha; + float used_alpha = babl_epsilon_for_zero_float (alpha); + + ((float *) dst)[0] = babl_trc_from_linear (trc[0], ((float *) src)[0]) * used_alpha; + ((float *) dst)[1] = babl_trc_from_linear (trc[1], ((float *) src)[1]) * used_alpha; + ((float *) dst)[2] = babl_trc_from_linear (trc[2], ((float *) src)[2]) * used_alpha; ((float *) dst)[3] = alpha; src += 4 * sizeof (float); dst += 4 * sizeof (float); @@ -1296,10 +1217,10 @@ static void -rgba_nonlinear_premultiplied2rgba_float (Babl *conversion, - char *src, - char *dst, - long samples) +rgba_nonlinear_associated_alpha2rgba_float (Babl *conversion, + char *src, + char *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); const Babl **trc = (void*)space->space.trc; @@ -1307,18 +1228,9 @@ while (n--) { - float alpha, reciprocal; - alpha = ((float *) src)[3]; - if (alpha == 0.0) - { - reciprocal= 0.0f; - } - else - { - reciprocal= 1.0 / alpha; - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0; - } + float alpha = ((float *) src)[3]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + float reciprocal= 1.0f / used_alpha; ((float *) dst)[0] = babl_trc_to_linear (trc[0], ((float *) src)[0] * reciprocal); ((float *) dst)[1] = babl_trc_to_linear (trc[1], ((float *) src)[1] * reciprocal); @@ -1563,25 +1475,25 @@ babl_conversion_new ( babl_format ("RGBA float"), babl_format ("R'aG'aB'aA float"), - "linear", rgba2rgba_nonlinear_premultiplied_float, + "linear", rgba2rgba_nonlinear_associated_alpha_float, NULL); babl_conversion_new ( babl_format ("R'aG'aB'aA float"), babl_format ("RGBA float"), - "linear", rgba_nonlinear_premultiplied2rgba_float, + "linear", rgba_nonlinear_associated_alpha2rgba_float, NULL); babl_conversion_new ( babl_format ("RGBA float"), babl_format ("RaGaBaA float"), - "planar", non_premultiplied_to_premultiplied_float, + "planar", separate_alpha_to_associated_alpha_float, NULL ); babl_conversion_new ( babl_format ("RaGaBaA float"), babl_format ("RGBA float"), - "planar", premultiplied_to_non_premultiplied_float, + "planar", associated_alpha_to_separate_alpha_float, NULL ); diff -Nru babl-0.1.63+om~1/babl/base/model-ycbcr.c babl-0.1.73+om~1/babl/base/model-ycbcr.c --- babl-0.1.63+om~1/babl/base/model-ycbcr.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/model-ycbcr.c 2019-12-09 16:21:18.000000000 +0000 @@ -63,6 +63,7 @@ { babl_model_new ( "id", BABL_YCBCR, + "doc", "Y'CbCr video format model, NB! math is tuned to sRGB space", babl_component_from_id (BABL_GRAY_NONLINEAR), babl_component_from_id (BABL_CB), babl_component_from_id (BABL_CR), @@ -70,6 +71,7 @@ babl_model_new ( "id", BABL_YCBCR_ALPHA, + "doc", "Y'CbCr video format model, separate alpha NB! math is tuned to sRGB space", babl_component_from_id (BABL_GRAY_NONLINEAR), babl_component_from_id (BABL_CB), babl_component_from_id (BABL_CR), diff -Nru babl-0.1.63+om~1/babl/base/type-float.c babl-0.1.73+om~1/babl/base/type-float.c --- babl-0.1.63+om~1/babl/base/type-float.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/type-float.c 2019-12-09 16:21:18.000000000 +0000 @@ -89,6 +89,7 @@ "float", "id", BABL_FLOAT, "bits", 32, + "doc", "IEEE 754 single precision", NULL); babl_conversion_new ( diff -Nru babl-0.1.63+om~1/babl/base/type-half.c babl-0.1.73+om~1/babl/base/type-half.c --- babl-0.1.63+om~1/babl/base/type-half.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/type-half.c 2019-12-09 16:21:18.000000000 +0000 @@ -401,6 +401,7 @@ "half", "id", BABL_HALF, "bits", 16, + "doc", "IEEE 754 half precision.", NULL); babl_conversion_new ( diff -Nru babl-0.1.63+om~1/babl/base/type-u8.c babl-0.1.73+om~1/babl/base/type-u8.c --- babl-0.1.63+om~1/babl/base/type-u8.c 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/type-u8.c 2019-12-09 16:21:18.000000000 +0000 @@ -208,12 +208,14 @@ "u8", "id", BABL_U8, "bits", 8, + "doc", "uint8_t, 8 bit unsigned integer, values from 0-255", NULL); babl_type_new ( "u8-luma", "id", BABL_U8_LUMA, "bits", 8, + "doc", "8 bit unsigned integer, values from 16-235", NULL ); @@ -227,6 +229,7 @@ "max", (long) 240, "min_val", -0.5, "max_val", 0.5, + "doc", "8 bit unsigned integer -0.5 to 0.5 maps to 16-240", NULL ); babl_conversion_new ( diff -Nru babl-0.1.63+om~1/babl/base/util.h babl-0.1.73+om~1/babl/base/util.h --- babl-0.1.63+om~1/babl/base/util.h 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/babl/base/util.h 2019-12-09 16:21:18.000000000 +0000 @@ -22,13 +22,7 @@ #include #include #include "pow-24.h" - -/* Alpha threshold used in the reference implementation for - * un-pre-multiplication of color data, deprecated in favor of the following - * - * 0.01 / (2^16 - 1) - */ -#define BABL_ALPHA_THRESHOLD 0.000000152590219 +#include #define BABL_PLANAR_SANITY \ @@ -53,6 +47,29 @@ } +static inline double +babl_epsilon_for_zero (double value) +{ + if (value <= BABL_ALPHA_FLOOR && + value >= -BABL_ALPHA_FLOOR) + { + return BABL_ALPHA_FLOOR; + } + return value; +} + +static inline float +babl_epsilon_for_zero_float (float value) +{ + if (value <= BABL_ALPHA_FLOOR_F && + value >= -BABL_ALPHA_FLOOR_F) + { + return BABL_ALPHA_FLOOR_F; + } + return value; +} + + #define BABL_USE_SRGB_GAMMA #ifdef BABL_USE_SRGB_GAMMA diff -Nru babl-0.1.63+om~1/babl/git-version.h.in babl-0.1.73+om~1/babl/git-version.h.in --- babl-0.1.63+om~1/babl/git-version.h.in 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/babl/git-version.h.in 2019-12-09 16:21:18.000000000 +0000 @@ -1,5 +1,6 @@ #ifndef __GIT_VERSION_H__ #define __GIT_VERSION_H__ + #define BABL_GIT_VERSION "@BABL_GIT_VERSION@" -#define BABL_GIT_LAST_COMMIT_YEAR "@BABL_GIT_LAST_COMMIT_YEAR@" + #endif /* __GIT_VERSION_H__ */ diff -Nru babl-0.1.63+om~1/babl/identfilter.py babl-0.1.73+om~1/babl/identfilter.py --- babl-0.1.63+om~1/babl/identfilter.py 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/babl/identfilter.py 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,37 @@ +# Copyright 2014 Emmanuele Bassi +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import sys +import re + +def rename_babl_object(text): + # We need this to rename the Babl type into BablObject + # Otherwise the type clashes with the namespace + if text == 'Babl': + return 'BablObject' + + # Leave the rest unharmed + return text + +if __name__ == '__main__': + in_text = sys.stdin.read() + sys.stdout.write(rename_babl_object(in_text)) diff -Nru babl-0.1.63+om~1/babl/Makefile.am babl-0.1.73+om~1/babl/Makefile.am --- babl-0.1.63+om~1/babl/Makefile.am 2018-11-25 16:12:37.000000000 +0000 +++ babl-0.1.73+om~1/babl/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,144 +0,0 @@ -## Source directory - -if PLATFORM_WIN32 -win32_no_undefined = -no-undefined -endif - -SUBDIRS = base - -c_sources = \ - babl.c \ - babl-cache.c \ - babl-component.c \ - babl-conversion.c \ - babl-core.c \ - babl-db.c \ - babl-extension.c \ - babl-fish-path.c \ - babl-fish-reference.c \ - babl-fish-simple.c \ - babl-fish.c \ - babl-format.c \ - babl-hash-table.c \ - babl-icc.c \ - babl-image.c \ - babl-internal.c \ - babl-introspect.c \ - babl-list.c \ - babl-memory.c \ - babl-model.c \ - babl-mutex.c \ - babl-palette.c \ - babl-polynomial.c \ - babl-ref-pixels.c \ - babl-sampling.c \ - babl-sanity.c \ - babl-space.c \ - babl-trc.c \ - babl-type.c \ - babl-util.c \ - babl-cpuaccel.c \ - babl-version.c - -h_sources = \ - babl.h \ - babl-class.h \ - babl-classes.h \ - babl-component.h \ - babl-conversion.h \ - babl-cpuaccel.h \ - babl-db.h \ - babl-extension.h \ - babl-fish.h \ - babl-format.h \ - babl-hash-table.h \ - babl-ids.h \ - babl-image.h \ - babl-internal.h \ - babl-introspect.h \ - babl-list.h \ - babl-macros.h \ - babl-memory.h \ - babl-model.h \ - babl-matrix.h \ - babl-mutex.h \ - babl-polynomial.h \ - babl-ref-pixels.h \ - babl-sampling.h \ - babl-space.h \ - babl-trc.h \ - babl-type.h \ - babl-types.h \ - babl-util.h - -library_includedir=$(includedir)/babl-$(BABL_API_VERSION)/babl -libinc_hdrs = \ - babl-introspect.h \ - babl-macros.h \ - babl-types.h \ - babl.h - -libinc_generated_hdrs = \ - babl-version.h - -library_include_HEADERS = \ - $(libinc_hdrs) $(libinc_generated_hdrs) - -AM_CPPFLAGS = \ - -DLIBDIR=\""$(libdir)"\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/babl/base - -lib_LTLIBRARIES= libbabl-@BABL_API_VERSION@.la - -libbabl_@BABL_API_VERSION@_la_SOURCES= $(h_sources) $(c_sources) -libbabl_@BABL_API_VERSION@_la_CFLAGS= $(SSE2_EXTRA_CFLAGS) $(LCMS_CFLAGS) - -libbabl_@BABL_API_VERSION@_la_LIBADD= \ - base/libbase.la \ - @LTLIBOBJS@ - - -libbabl_@BABL_API_VERSION@_la_LDFLAGS= \ - ${win32_no_undefined} \ - $(MATH_LIB) $(THREAD_LIB) $(LOG_LIB) \ - $(LCMS_LIBS) \ - -export-symbols $(top_srcdir)/export-symbols \ - -version-info $(BABL_LIBRARY_VERSION) - -EXTRA_DIST = babl-ref-pixels.inc - - -# If git is available, always check if git-version.h should be -# updated. If git is not available, don't do anything if git-version.h -# already exists because then we are probably working with a tarball -# in which case the git-version.h we ship is correct. - -libbabl_generated_sources = git-version.h -BUILT_SOURCES = git-version.h -CLEANFILES = git-version.h - -git-version.h: update-git-version-header - @if test -d "$(top_srcdir)/.git"; then \ - git_version="`git --git-dir=$(top_srcdir)/.git describe --always`"; \ - git_last_commit_year="`git --git-dir=$(top_srcdir)/.git log -n1 --reverse --pretty=%ci | cut -b 1-4`"; \ - elif test ! -f "$@"; then \ - git_version="Unknown, shouldn't happen"; \ - git_last_commit_timestamp=-1; \ - git_last_commit_year="`date -u '+%Y'`"; \ - fi; \ - if test -n "$$git_version"; then \ - echo "#ifndef __GIT_VERSION_H__" > "$@.tmp"; \ - echo "#define __GIT_VERSION_H__" >> "$@.tmp"; \ - echo "#define BABL_GIT_VERSION \"$$git_version\"" >> "$@.tmp"; \ - echo "#define BABL_GIT_LAST_COMMIT_YEAR \"$$git_last_commit_year\"" >> "$@.tmp"; \ - echo "#endif /* __GIT_VERSION_H__ */" >> "$@.tmp"; \ - fi - @if ( test -f "$@.tmp" && test -f "$@" && cmp "$@.tmp" "$@" > /dev/null ); then \ - rm -f "$@.tmp"; \ - elif test -f "$@.tmp"; then \ - mv "$@.tmp" "$@"; \ - echo " git HEAD changed: $@ regenerated"; \ - fi - -.PHONY: update-git-version-header diff -Nru babl-0.1.63+om~1/babl/meson.build babl-0.1.73+om~1/babl/meson.build --- babl-0.1.63+om~1/babl/meson.build 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/babl/meson.build 2019-12-09 16:21:18.000000000 +0000 @@ -1,13 +1,21 @@ bablInclude = include_directories('.') subdir('base') +python = import('python').find_installation() + version_script = 'babl.map' +version_script_clang = 'babl.map.clang' + +babl_gnu_sym_path = join_paths(meson.current_source_dir(), 'test-gnu.map') +babl_clang_sym_path = join_paths(meson.current_source_dir(), 'test-clang.map') + + export_symbols = join_paths(meson.source_root(), 'export-symbols') version_script_target = custom_target(version_script, input : [ export_symbols, ] , output: [ version_script ] , command: [ - 'python', + python, join_paths(meson.source_root(), 'gen_babl_map.py'), export_symbols, version_script, @@ -15,11 +23,22 @@ capture: true, ) +# c compiler arguments +babl_c_args = [ + sse2_cflags, + '-DLIBDIR="@0@"'.format(babl_libdir), + '-fno-unsafe-math-optimizations' +] # Linker arguments -babl_link_args = [ - '-Wl,--version-script,' + version_script, -] +if cc.links('', name: '-Wl,--version-script', args: ['-shared', '-Wl,--version-script=' + babl_gnu_sym_path]) + babl_link_args = ['-Wl,--version-script,' + version_script] +elif host_machine.system() == 'darwin' and cc.has_multi_link_arguments('-Wl,-exported_symbols_list', babl_clang_sym_path) + # Clang on Darwin + babl_link_args = ['-Wl,-exported_symbols_list',version_script_clang] +else + error('Linker doesn\'t support --version-script or -exported_symbols_list') +endif if platform_win32 babl_link_args += '-Wl,--no-undefined' endif @@ -37,40 +56,33 @@ # already exists because then we are probably working with a tarball # in which case the git-version.h we ship is correct. -if test_bin.found() and git_bin.found() - if run_command( - [test_bin.path(), '-d', join_paths(meson.source_root(), '.git')] - ).returncode() == 0 - # git repo and git is available - git_version = run_command([git_bin.path(), 'describe', '--always'] - ).stdout().strip() - git_last_commit_year = run_command([git_bin.path(), - 'log', '-n1', '--date=format:%Y', '--pretty=%cd'] - ).stdout().strip() - endif -else - # Not a git repo so expect git-version.h to exist - if test_bin.found() and git_bin.found() and - run_command( - [test_bin.path(), '-f', 'git-version.h'] - ).returncode() == 0 - git_version_h = 'git-version.h' - else - git_version = 'Unknown, shouldn\'t happen' - git_last_commit_year = 0 - endif -endif -if not is_variable('git_version_h') - git_conf = configuration_data() - git_conf.set('BABL_GIT_VERSION', git_version) - git_conf.set('BABL_GIT_LAST_COMMIT_YEAR', git_last_commit_year) - git_version_h = configure_file( - input: 'git-version.h.in', +is_git_repo = ( + test_bin.found() and + git_bin.found() and + run_command(test_bin, '-d', meson.source_root() / '.git').returncode() == 0 +) + +if is_git_repo + git_version_h = vcs_tag( + input : 'git-version.h.in', output: 'git-version.h', - configuration: git_conf, + replace_string: '@BABL_GIT_VERSION@', + command: [ git_bin.path(), 'describe', '--always' ], + ) + + meson.add_dist_script( + [ 'ninja', 'babl/git-version.h', ], + ) + meson.add_dist_script( + [ 'sh', '-c', ' '.join( + [ 'cp', git_version_h.full_path(), '${MESON_DIST_ROOT}/babl' ] + )] ) -endif +else + git_version_h = files('git-version.h') + +endif babl_sources = [ 'babl-cache.c', @@ -121,13 +133,11 @@ subdir: join_paths(lib_name, 'babl') ) - babl = library( lib_name, babl_sources, include_directories: [ rootInclude, bablBaseInclude], - c_args: [ '-DLIBDIR="' + join_paths(get_option('prefix'), get_option('libdir')) + '"', ], - cpp_args: [ '-DLIBDIR="' + join_paths(get_option('prefix'), get_option('libdir')) + '"', ], + c_args: babl_c_args, link_whole: [ babl_base, ], link_args: [ babl_link_args, ], dependencies: [ math, thread, dl, lcms, ], @@ -135,3 +145,21 @@ version: so_version, install: true, ) + +if get_option('enable-gir') + # identity filter, so GIR doesn't choke on the Babl type + # (since it has the same name as the Babl namespace) + identfilter_py = join_paths(meson.current_source_dir(), 'identfilter.py') + + babl_gir = gnome.generate_gir(babl, + sources: babl_headers, + extra_args: [ + '--identifier-filter-cmd=@0@ @1@'.format(python.path(), identfilter_py), + '-DBABL_IS_BEING_COMPILED', + ], + namespace: 'Babl', + nsversion: '0.1', + header: 'babl.h', + install: true, + ) +endif diff -Nru babl-0.1.63+om~1/babl/test-clang.map babl-0.1.73+om~1/babl/test-clang.map --- babl-0.1.63+om~1/babl/test-clang.map 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/babl/test-clang.map 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1 @@ +babl_* diff -Nru babl-0.1.63+om~1/babl/test-gnu.map babl-0.1.73+om~1/babl/test-gnu.map --- babl-0.1.63+om~1/babl/test-gnu.map 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/babl/test-gnu.map 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,6 @@ +{ + global: + babl_*; + local: + *; +}; diff -Nru babl-0.1.63+om~1/babl.doap babl-0.1.73+om~1/babl.doap --- babl-0.1.63+om~1/babl.doap 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/babl.doap 2019-12-09 16:21:18.000000000 +0000 @@ -6,10 +6,10 @@ babl - babl is a dynamic, any to any, pixel format translation library. + babl is a pixel encoding and color space conversion engine. babl ist eine dynamische Bibliothek zur direkten Umwandlung von Pixelformaten. - babl is a dynamic, any to any, pixel format translation library. + babl is a pixel encoding and color space conversions engine. babl ist eine dynamische Bibliothek zur direkten Umwandlung von Pixelformaten. diff -Nru babl-0.1.63+om~1/configure.ac babl-0.1.73+om~1/configure.ac --- babl-0.1.63+om~1/configure.ac 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/configure.ac 1970-01-01 00:00:00.000000000 +0000 @@ -1,592 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.54) - -# Making releases on the stable branch: -# BABL_MICRO_VERSION += 1; -# BABL_INTERFACE_AGE += 1; -# BABL_BINARY_AGE += 1; -# if any functions have been added, -# set BABL_INTERFACE_AGE to 0. -# if backwards compatibility has been broken, -# set BABL_BINARY_AGE _and_ BABL_INTERFACE_AGE to 0. - - -m4_define([babl_major_version], [0]) -m4_define([babl_minor_version], [1]) -m4_define([babl_micro_version], [63]) -m4_define([babl_real_version], - [babl_major_version.babl_minor_version.babl_micro_version]) -m4_define([babl_version], [babl_real_version]) - -dnl Number of releases since we've added interfaces -m4_define([babl_interface_age], [1]) -m4_define([babl_binary_age], - [m4_eval(100 * babl_minor_version + babl_micro_version)]) - -# This is the X.Y used in -lbabl-X.Y -m4_define([babl_api_version], [babl_major_version.babl_minor_version]) - -m4_define([stability_version_number], - m4_if(m4_eval(babl_major_version || babl_minor_version), [0], - [babl_micro_version], [babl_minor_version])) -m4_define([babl_unstable], - m4_if(m4_eval(stability_version_number % 2), [1], [yes], [no])) -m4_define([babl_stable], - m4_if(m4_eval(stability_version_number % 2), [0], [yes], [no])) - -AC_INIT(babl, babl_major_version.babl_minor_version.babl_micro_version) - -AC_CONFIG_HEADERS([config.h]) -AC_CONFIG_SRCDIR(babl/babl.h) -AC_CONFIG_MACRO_DIR([m4]) - -BABL_MAJOR_VERSION=babl_major_version -BABL_MINOR_VERSION=babl_minor_version -BABL_MICRO_VERSION=babl_micro_version -BABL_INTERFACE_AGE=babl_interface_age -BABL_BINARY_AGE=babl_binary_age -BABL_VERSION=babl_version -BABL_REAL_VERSION=babl_real_version -BABL_API_VERSION=babl_api_version -AC_SUBST(BABL_MAJOR_VERSION) -AC_SUBST(BABL_MINOR_VERSION) -AC_SUBST(BABL_MICRO_VERSION) -AC_SUBST(BABL_INTERFACE_AGE) -AC_SUBST(BABL_BINARY_AGE) -AC_SUBST(BABL_VERSION) -AC_SUBST(BABL_REAL_VERSION) -AC_SUBST(BABL_API_VERSION) - -BABL_RELEASE=babl_api_version -AC_SUBST(BABL_RELEASE) - -dnl The symbol BABL_UNSTABLE is defined above for substitution in -dnl Makefiles and conditionally defined here as a preprocessor symbol -dnl and automake conditional. -BABL_UNSTABLE=babl_unstable -if test "x$BABL_UNSTABLE" = "xyes"; then - AC_DEFINE(BABL_UNSTABLE, 1, - [Define to 1 if this is an unstable version of BABL]) -fi -AM_CONDITIONAL(BABL_UNSTABLE, test "x$BABL_UNSTABLE" = "xyes") -AC_SUBST(BABL_UNSTABLE) - - -# libtool versioning -m4_define([lt_current], [m4_eval(100 * babl_minor_version + babl_micro_version - babl_interface_age)]) -m4_define([lt_revision], [babl_interface_age]) -m4_define([lt_age], [m4_eval(babl_binary_age - babl_interface_age)]) -BABL_LIBRARY_VERSION="lt_current:lt_revision:lt_age" -BABL_CURRENT_MINUS_AGE=m4_eval(lt_current - lt_age) -AC_SUBST(BABL_LIBRARY_VERSION) -AC_SUBST(BABL_CURRENT_MINUS_AGE) - -dnl ========================================================================== - -AC_CANONICAL_SYSTEM -AM_INIT_AUTOMAKE([1.11 foreign no-define dist-bzip2 no-dist-gzip -Wno-portability]) - -# Enable silent build rules by default, requires at least -# Automake-1.11. Disable by either passing --disable-silent-rules to -# configure or passing V=1 to make -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - -# Prefer clang on OSX, because GCC isn't updated - -case "$build_os" in - darwin10.* | darwin9.* | darwin8.*) - ;; - darwin*) - prefered_cc="clang" - prefered_cxx="clang++" - ;; - *) - ;; -esac - -if test -z "$CC" && test -n "$prefered_cc"; then - AC_MSG_NOTICE([setting CC to $prefered_cc for $build_os]) - CC=$prefered_cc -fi - -if test -z "$CXX" && test -n "$prefered_cc"; then - AC_MSG_NOTICE([setting CXX to $prefered_cxx for $build_os]) - CXX=$prefered_cxx -fi - -# Check for programs -AC_PROG_CC -AC_PROG_CC_C99 - -# Initialize libtool -LT_PREREQ([2.2]) -LT_INIT([disable-static win32-dll]) - -BABL_VARIADIC_MACROS - -dnl Initialize maintainer mode -AM_MAINTAINER_MODE([enable]) - -AC_HEADER_STDC -AM_SANITY_CHECK - -WEBSITE_HOST=pippin.gimp.org -AC_SUBST(WEBSITE_HOST) -WEBSITE_LOCATION=public_html/babl/ -AC_SUBST(WEBSITE_LOCATION) - - -if eval "test x$GCC = xyes"; then - case " $CFLAGS " in - *[\ \ ]-Wall[\ \ ]*) ;; - *) CFLAGS="$CFLAGS -Wall" ;; - esac - -BABL_DETECT_CFLAGS(extra_warnings, '-Wdeclaration-after-statement') -CFLAGS="$CFLAGS $extra_warnings" - -BABL_DETECT_CFLAGS(extra_warnings, '-Wmissing-prototypes') -CFLAGS="$CFLAGS $extra_warnings" - -BABL_DETECT_CFLAGS(extra_warnings, '-Wmissing-declarations') -CFLAGS="$CFLAGS $extra_warnings" - -BABL_DETECT_CFLAGS(extra_warnings, '-Winit-self') -CFLAGS="$CFLAGS $extra_warnings" - -BABL_DETECT_CFLAGS(extra_warnings, '-Wpointer-arith') -CFLAGS="$CFLAGS $extra_warnings" - -BABL_DETECT_CFLAGS(extra_warnings, '-Wold-style-definition') -CFLAGS="$CFLAGS $extra_warnings" - -#BABL_DETECT_CFLAGS(extra_warnings, '-Ofast' ) -#CFLAGS="$CFLAGS $extra_warnings" - -fi - -AC_PATH_PROG(RSVG, rsvg-convert, no) -AM_CONDITIONAL(HAVE_RSVG, test "x$RSVG" != "xno") - -AC_PATH_PROG(W3M, w3m, no) -AM_CONDITIONAL(HAVE_W3M, test "x$W3M" != "xno") - -dnl disable docs generation. -AC_ARG_ENABLE([docs], - [ --disable-docs disable docs generation (default=no)],, - enable_docs="yes") - -AM_CONDITIONAL(ENABLE_DOCS, test "x$enable_docs" = "xyes") - -########################### -# Check target architecture -########################### - -AC_MSG_CHECKING([for target architecture]) -case x"$target" in - xNONE | x) - target_or_host="$host" ;; - *) - target_or_host="$target" ;; -esac -AC_MSG_RESULT([$target_or_host]) - -case "$target_or_host" in - i*86-*-*) - have_x86=yes - AC_DEFINE(ARCH_X86, 1, [Define to 1 if you are compiling for ix86.]) - ;; - x86_64-*-*) - have_x86=yes - AC_DEFINE(ARCH_X86, 1, [Define to 1 if you are compiling for ix86.]) - AC_DEFINE(ARCH_X86_64, 1, [Define to 1 if you are compiling for amd64.]) - ;; - ppc-*-* | powerpc-*) - have_ppc=yes - AC_DEFINE(ARCH_PPC, 1, [Define to 1 if you are compiling for PowerPC.]) - ;; - ppc64-*-* | powerpc64-*) - have_ppc=yes - AC_DEFINE(ARCH_PPC, 1, [Define to 1 if you are compiling for PowerPC.]) - AC_DEFINE(ARCH_PPC64, 1, [Define to 1 if you are compiling for PowerPC64.]) - ;; - *) - ;; -esac - -################ -# Check for lcms -################ - -AC_ARG_WITH(lcms, [ --without-lcms build without lcms support]) - -have_lcms="no (lcms support disabled)" -if test "x$with_lcms" != xno; then - have_lcms=yes - PKG_CHECK_MODULES(LCMS, lcms2 >= lcms_required_version, - AC_DEFINE(HAVE_LCMS, 1, [Define to 1 if lcms is available]) - LCMS='lcms$(EXEEXT)', - have_lcms="no (lcms not found or unusable)") -fi - -AC_SUBST(LCMS) -AM_CONDITIONAL(HAVE_LCMS, test "x$have_lcms" = xyes) - - -############################ -# Check how to find plug-ins -############################ - -AC_MSG_CHECKING([the extension for shared libraries]) -case "$target_or_host" in - hppa*-hpux*) # HP/UX - shrext=.sl - ;; - *-*-mingw* | *-*-cygwin*) # windows - shrext=.dll - ;; - *) # linux (and BSD?) - shrext=.so - ;; -esac - -SHREXT=$shrext -AC_SUBST(SHREXT) -AC_DEFINE_UNQUOTED(SHREXT, "$shrext", [File extension for shared libraries]) -AC_MSG_RESULT([$shrext]) - -dnl =========================================================================== - -################# -# Check for Win32 -################# - -AC_MSG_CHECKING([for some Win32 platform]) -case "$target_or_host" in - *-*-mingw* | *-*-cygwin*) - platform_win32=yes - ;; - *) - platform_win32=no - ;; -esac -AC_MSG_RESULT([$platform_win32]) -AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes") - -MATH_LIB=-lm -THREAD_LIB=-lpthread -LOG_LIB= -AC_MSG_CHECKING([for native Win32]) -case "$target_or_host" in - *-*-mingw*) - os_win32=yes - PATH_SEP=';' - DIR_SEP='\\' - MATH_LIB= - THREAD_LIB= - ;; - *-*-android*) - os_win32=no - PATH_SEP=':' - DIR_SEP='/' - THREAD_LIB= - LOG_LIB='-llog' - ;; - *) - os_win32=no - PATH_SEP=':' - DIR_SEP='/' - ;; -esac -AC_MSG_RESULT([$os_win32]) -AC_SUBST(PATH_SEP) -AC_SUBST(DIR_SEP) -AC_SUBST(MATH_LIB) -AC_SUBST(THREAD_LIB) -AC_SUBST(LOG_LIB) - -AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes") -AM_CONDITIONAL(OS_UNIX, test "$os_win32" != "yes") - - -dnl =========================================================================== - - -################# -# Check for some not-so-common features -################# - -# babl_fish_reference(), create_name() would like this -AC_MSG_CHECKING([for __thread]) -AC_LINK_IFELSE([AC_LANG_PROGRAM(, [static __thread char buf[1024];])], - [AC_DEFINE(HAVE_TLS, 1, - Define to 1 if compiler supports __thread) - AC_MSG_RESULT([yes])], - [AC_MSG_RESULT([no])]) - - -dnl =========================================================================== - - -######################## -# Check for MMX assembly -######################## - -AC_ARG_ENABLE(mmx, - [ --enable-mmx enable MMX support (default=auto)],, - enable_mmx=$have_x86) - -AC_ARG_ENABLE(sse, - [ --enable-sse enable SSE support (default=auto)],, - enable_sse=$enable_mmx) - -AC_ARG_ENABLE(sse2, - [ --enable-sse2 enable SSE2 support (default=auto)],, - enable_sse2=$enable_sse) - -AC_ARG_ENABLE(sse3, - [ --enable-sse3 enable SSE3 support (default=auto)],, - enable_sse3=$enable_sse2) - -AC_ARG_ENABLE(sse4_1, - [ --enable-sse4_1 enable SSE4_1 support (default=auto)],, - enable_sse4_1=$enable_sse) - -AC_ARG_ENABLE(f16c, - [ --enable-f16c enable hardware half-float support (default=auto)],, - enable_f16c=$enable_sse) - -if test "x$enable_mmx" = xyes; then - BABL_DETECT_CFLAGS(MMX_EXTRA_CFLAGS, '-mmmx') - SSE_EXTRA_CFLAGS= - SSE2_EXTRA_CFLAGS= - SSE4_1_EXTRA_CFLAGS= - - AC_MSG_CHECKING(whether we can compile MMX code) - - mmx_save_CFLAGS="$CFLAGS" - CFLAGS="$mmx_save_CFLAGS $MMX_EXTRA_CFLAGS" - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[asm ("movq 0, %mm0");])], - - AC_DEFINE(USE_MMX, 1, [Define to 1 if MMX assembly is available.]) - AC_MSG_RESULT(yes) - - if test "x$enable_sse" = xyes; then - BABL_DETECT_CFLAGS(fpmath_flag, '-mfpmath=sse') - if test "x$platform_win32" = xyes; then - BABL_DETECT_CFLAGS(stack_align, '-mstackrealign') - fi - SSE_EXTRA_CFLAGS="$MMX_EXTRA_CFLAGS $stack_align $fpmath_flag" - - BABL_DETECT_CFLAGS(sse_flag, '-msse') - SSE_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $sse_flag" - - AC_MSG_CHECKING(whether we can compile SSE code) - - CFLAGS="$CFLAGS $sse_flag" - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[asm ("movntps %xmm0, 0");])], - AC_DEFINE(USE_SSE, 1, [Define to 1 if SSE assembly is available.]) - AC_MSG_RESULT(yes) - , - enable_sse=no - AC_MSG_RESULT(no) - AC_MSG_WARN([The assembler does not support the SSE command set.]) - ) - - if test "x$enable_sse2" = xyes; then - BABL_DETECT_CFLAGS(sse2_flag, '-msse2') - SSE2_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $sse2_flag" - - AC_MSG_CHECKING(whether we can compile SSE2 code) - - CFLAGS="$CFLAGS $sse2_flag" - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[asm ("punpckhwd %xmm0,%xmm1");])], - AC_DEFINE(USE_SSE2, 1, [Define to 1 if SSE2 assembly is available.]) - AC_MSG_RESULT(yes) - , - enable_sse2=no - AC_MSG_RESULT(no) - AC_MSG_WARN([The assembler does not support the SSE2 command set.]) - ) - - if test "x$enable_sse3" = xyes; then - BABL_DETECT_CFLAGS(sse3_flag, '-msse3') - SSE3_EXTRA_CFLAGS="$SSE2_EXTRA_CFLAGS $sse3_flag" - - AC_MSG_CHECKING(whether we can compile SSE3 code) - - CFLAGS="$CFLAGS $sse3_flag" - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[asm ("addsubpd %xmm0,%xmm1");])], - AC_DEFINE(USE_SSE3, 1, [Define to 1 if SSE3 assembly is available.]) - AC_MSG_RESULT(yes) - , - enable_sse3=no - AC_MSG_RESULT(no) - AC_MSG_WARN([The assembler does not support the SSE3 command set.]) - ) - - if test "x$enable_sse4_1" = xyes; then - BABL_DETECT_CFLAGS(sse4_1_flag, '-msse4.1') - SSE4_1_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $sse4_1_flag" - - AC_MSG_CHECKING(whether we can compile SSE4_1 code) - - CFLAGS="$CFLAGS $sse4_1_flag" - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[asm ("pmovzxbd %xmm0,%xmm1");])], - AC_DEFINE(USE_SSE4_1, 1, [Define to 1 if SSE4_1 assembly is available.]) - AC_MSG_RESULT(yes) - , - enable_sse4_1=no - AC_MSG_RESULT(no) - AC_MSG_WARN([The assembler does not support the SSE4_1 command set.]) - ) - fi - fi - fi - - CFLAGS="$mmx_save_CFLAGS" - - if test "x$enable_f16c" = xyes; then - BABL_DETECT_CFLAGS(f16c_flag, '-mf16c') - F16C_EXTRA_CFLAGS="$SSE_EXTRA_CFLAGS $f16c_flag" - - AC_MSG_CHECKING(whether we can compile half-floating point code) - - CFLAGS="$CFLAGS $sse_flag $f16c_flag" - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include ],[__m128 val = _mm_cvtph_ps ((__m128i)_mm_setzero_ps()); __m128i val2 = _mm_insert_epi64((__m128i)_mm_setzero_ps(), 0, 0);])], - AC_DEFINE(USE_F16C, 1, [Define to 1 if f16c intrinsics are available.]) - AC_MSG_RESULT(yes) - , - enable_f16c=no - AC_MSG_RESULT(no) - AC_MSG_WARN([The compiler does not support f16c intrinsics.]) - ) - fi - - fi - , - enable_mmx=no - AC_MSG_RESULT(no) - AC_MSG_WARN([The assembler does not support the MMX command set.]) - ) - - CFLAGS="$mmx_save_CFLAGS" - - AC_SUBST(MMX_EXTRA_CFLAGS) - AC_SUBST(SSE_EXTRA_CFLAGS) - AC_SUBST(SSE2_EXTRA_CFLAGS) - AC_SUBST(SSE3_EXTRA_CFLAGS) - AC_SUBST(SSE4_1_EXTRA_CFLAGS) - AC_SUBST(F16C_EXTRA_CFLAGS) -fi - - -############################ -# Check for AltiVec assembly -############################ - -AC_ARG_ENABLE(altivec, - [ --enable-altivec enable AltiVec support (default=auto)],, - enable_altivec=$have_ppc) - -if test "x$enable_altivec" = xyes; then - - BABL_DETECT_CFLAGS(altivec_flag, '-faltivec' '-maltivec -mabi=altivec') - - ALTIVEC_EXTRA_CFLAGS= - case "$altivec_flag" in - -maltivec*) - altivec_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$altivec_save_CPPFLAGS $altivec_flag" - AC_CHECK_HEADERS(altivec.h, [ALTIVEC_EXTRA_CFLAGS="$altivec_flag"]) - CPPFLAGS="$altivec_save_CPPFLAGS" - ;; - *) - ALTIVEC_EXTRA_CFLAGS="$altivec_flag" - ;; - esac - AC_SUBST(ALTIVEC_EXTRA_CFLAGS) - - AC_MSG_CHECKING(whether we can compile AltiVec code) - - can_use_altivec=no - if test -z "$ALTIVEC_EXTRA_CFLAGS"; then - AC_MSG_RESULT(no) - AC_MSG_WARN([The compiler does not support the AltiVec command set.]) - else - case "$target_or_host" in - *-*-darwin*) - can_use_altivec=yes - AC_DEFINE(HAVE_ALTIVEC_SYSCTL, 1, - [Define to 1 if the altivec runtime test should use a sysctl.]) - ;; - *) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[asm ("vand %v0, %v0, %v0");])], - can_use_altivec=yes, can_use_altivec=no) - ;; - esac - AC_MSG_RESULT($can_use_altivec) - - if test "x$can_use_altivec" = "xyes"; then - AC_DEFINE(USE_ALTIVEC, 1, [Define to 1 if AltiVec support is available.]) - else - enable_altivec=no - AC_MSG_WARN([The assembler does not support the AltiVec command set.]) - fi - fi - - enable_altivec="$can_use_altivec" -fi - - -################## -# Check for random -################## -have_srandom=no -AC_CHECK_FUNC(srandom, have_srandom=yes) -AM_CONDITIONAL([HAVE_SRANDOM], [test x$have_srandom = xyes]) - -dnl =========================================================================== - -AC_CHECK_HEADERS(dl.h) - -AC_SEARCH_LIBS([dlopen], [dl]) -AC_SEARCH_LIBS([rint], [m]) - -AC_REPLACE_FUNCS(gettimeofday) -AC_CHECK_FUNCS(rint) - -#BABL_PATH_SEPARATOR must be defined as a character. -#BABL_DIR_SEPARATOR must be defined as a string. -AC_DEFINE_UNQUOTED(BABL_PATH_SEPARATOR, '$PATH_SEP', [separator between paths in BABL_PATH]) -AC_DEFINE_UNQUOTED(BABL_DIR_SEPARATOR, "$DIR_SEP", [separator between directories in BABL_PATH]) - -AC_DEFINE_UNQUOTED(BABL_LIBRARY, "$PACKAGE_NAME-$BABL_API_VERSION", [name of BABL library]) - - - -dnl =========================================================================== - -AC_CONFIG_FILES( -Makefile -babl.pc -babl/Makefile -babl/babl-version.h -babl/base/Makefile -docs/Makefile -docs/index-static.html -docs/graphics/Makefile -tests/Makefile -tools/Makefile -extensions/Makefile -INSTALL -) - -AC_OUTPUT diff -Nru babl-0.1.63+om~1/debian/changelog babl-0.1.73+om~1/debian/changelog --- babl-0.1.63+om~1/debian/changelog 2019-03-11 21:58:39.000000000 +0000 +++ babl-0.1.73+om~1/debian/changelog 2019-12-09 22:45:11.000000000 +0000 @@ -1,8 +1,22 @@ -babl (0.1.63+om~1-0ubu18.04.1~ppa) bionic; urgency=high +babl (0.1.73+om~1-0ubu18.04.7.11~ppa) bionic; urgency=high - * https://gitlab.gnome.org/GNOME/babl/commit/2f0765a0d16ef482af27a87e124564614008f1f7 + * https://gitlab.gnome.org/GNOME/babl/tree/master - -- Otto Meier Mon, 11 Mar 2019 22:26:00 +0100 + -- Thorsten Stettin Mon, 09 Dec 2019 23:45:11 +0100 + +babl (0.1.66+om-0ubu18.04.1~ppa) bionic; urgency=high + + * Upstream release + * https://gitlab.gnome.org/GNOME/babl/tree/BABL_0_1_66 + + -- Otto Meier Mon, 17 Jun 2019 15:02:11 +0200 + +babl (0.1.62+om-0ubu19.10.1~ppa) eoan; urgency=high + + * Upstream release + * https://gitlab.gnome.org/GNOME/babl/tree/BABL_0_1_62 + + -- Otto Meier Mon, 30 Apr 2019 11:45:11 +0200 babl (0.1.61+om~7-0ubu19.04.2~ppa) disco; urgency=high diff -Nru babl-0.1.63+om~1/debian/control babl-0.1.73+om~1/debian/control --- babl-0.1.63+om~1/debian/control 2019-03-11 21:50:42.000000000 +0000 +++ babl-0.1.73+om~1/debian/control 2019-12-09 22:31:27.000000000 +0000 @@ -1,27 +1,21 @@ # This file is autogenerated. DO NOT EDIT! -# +# # Modifications should be made to debian/control.in instead. # This file is regenerated automatically in the clean target. Source: babl Section: libs Priority: optional -Maintainer: Otto Meier +Maintainer: Thorsten Stettin XSBC-Maintainer: Debian GNOME Maintainers -Uploaders: Matteo F. Vescovi , Otto Meier , Ross Burton , gregor herrmann -#Build-Depends: debhelper (>= 8.1.3), -# cdbs (>= 0.4.93~), -# gobject-introspection, -# libgirepository1.0-dev, -# pkg-config -Build-Depends: autotools-dev, - cdbs (>= 0.4.93~), - gcc-6 | gcc-5, - debhelper (>= 8.1.3), - build-essential, - gobject-introspection, - libgirepository1.0-dev, - pkg-config, - libtool +Uploaders: +Build-Depends: debhelper (>= 9), + gnome-pkg-tools, + gobject-introspection, + libgirepository1.0-dev, + pkg-config, + meson, + liblcms2-dev, + git Standards-Version: 3.9.6 Vcs-Browser: https://salsa.debian.org/gnome-team/babl Vcs-Git: https://salsa.debian.org/gnome-team/babl.git @@ -69,18 +63,18 @@ also facilitates creation of new and uncommon ones. . This package contains the API documentation. -# -#Package: gir1.2-babl-0.1 -#Section: introspection -#Architecture: any -#Depends: libbabl-0.1-0 (= ${binary:Version}), -# ${misc:Depends}, -# ${gir:Depends} -#Description: GObject introspection data for Babl library -# Babl is a dynamic, any to any, pixel format conversion library. It -# provides conversions between the myriad of buffer types images can be -# stored in. Babl doesn't only help with existing pixel formats, but -# also facilitates creation of new and uncommon ones. -# . -# This package can be used by other packages using the GIRepository format -# to generate dynamic bindings. + +Package: gir1.2-babl-0.1-0 +Section: introspection +Architecture: any +Depends: libbabl-0.1-0 (= ${binary:Version}), + ${misc:Depends}, + ${gir:Depends} +Description: GObject introspection data for Babl library + Babl is a dynamic, any to any, pixel format conversion library. It + provides conversions between the myriad of buffer types images can be + stored in. Babl doesn't only help with existing pixel formats, but + also facilitates creation of new and uncommon ones. + . + This package can be used by other packages using the GIRepository format + to generate dynamic bindings. diff -Nru babl-0.1.63+om~1/debian/control.in babl-0.1.73+om~1/debian/control.in --- babl-0.1.63+om~1/debian/control.in 2019-03-11 21:50:42.000000000 +0000 +++ babl-0.1.73+om~1/debian/control.in 2019-12-09 22:31:27.000000000 +0000 @@ -1,11 +1,10 @@ Source: babl Section: libs Priority: optional -Maintainer: Otto Meier +Maintainer: Thorsten Stettin XSBC-Maintainer: Debian GNOME Maintainers Uploaders: @GNOME_TEAM@ Build-Depends: debhelper (>= 9), - sbuild, gnome-pkg-tools, gobject-introspection, libgirepository1.0-dev, @@ -57,18 +56,18 @@ also facilitates creation of new and uncommon ones. . This package contains the API documentation. -# -#Package: gir1.2-babl-0.1 -#Section: introspection -#Architecture: any -#Depends: libbabl-0.1-0 (= ${binary:Version}), -# ${misc:Depends}, -# ${gir:Depends} -#Description: GObject introspection data for Babl library -# Babl is a dynamic, any to any, pixel format conversion library. It -# provides conversions between the myriad of buffer types images can be -# stored in. Babl doesn't only help with existing pixel formats, but -# also facilitates creation of new and uncommon ones. -# . -# This package can be used by other packages using the GIRepository format -# to generate dynamic bindings. + +Package: gir1.2-babl-0.1-0 +Section: introspection +Architecture: any +Depends: libbabl-0.1-0 (= ${binary:Version}), + ${misc:Depends}, + ${gir:Depends} +Description: GObject introspection data for Babl library + Babl is a dynamic, any to any, pixel format conversion library. It + provides conversions between the myriad of buffer types images can be + stored in. Babl doesn't only help with existing pixel formats, but + also facilitates creation of new and uncommon ones. + . + This package can be used by other packages using the GIRepository format + to generate dynamic bindings. diff -Nru babl-0.1.63+om~1/debian/patches/fuckyou.patch babl-0.1.73+om~1/debian/patches/fuckyou.patch --- babl-0.1.63+om~1/debian/patches/fuckyou.patch 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/debian/patches/fuckyou.patch 2019-12-09 22:31:27.000000000 +0000 @@ -0,0 +1,37 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + babl (0.1.72+om-0ubu18.04.4~ppa) bionic; urgency=high + . + * Upstream release + * https://gitlab.gnome.org/GNOME/babl/tree/BABL_0_1_72 +Author: Thorsten Stettin + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-11-04 + +--- babl-0.1.72+om.orig/babl/meson.build ++++ babl-0.1.72+om/babl/meson.build +@@ -47,7 +47,7 @@ babl_version_h = configure_file( + is_git_repo = ( + test_bin.found() and + git_bin.found() and +- run_command(test_bin, '-d', meson.source_root() / '.git').returncode() == 0 ++ run_command(test_bin, '-d', meson.source_root() / '.git').returncode() == 1 + ) + + if is_git_repo diff -Nru babl-0.1.63+om~1/debian/patches/git.patch babl-0.1.73+om~1/debian/patches/git.patch --- babl-0.1.63+om~1/debian/patches/git.patch 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/debian/patches/git.patch 2019-12-09 22:31:27.000000000 +0000 @@ -0,0 +1,37 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + babl (0.1.66+om-0ubu18.04.1~ppa) bionic; urgency=high + . + * Upstream release + * https://gitlab.gnome.org/GNOME/babl/tree/BABL_0_1_66 +Author: Otto Meier + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-10-29 + +--- babl-0.1.66+om.orig/babl/meson.build ++++ babl-0.1.66+om/babl/meson.build +@@ -45,7 +45,7 @@ babl_version_h = configure_file( + if test_bin.found() and git_bin.found() + if run_command( + [test_bin.path(), '-d', join_paths(meson.source_root(), '.git')] +- ).returncode() == 0 ++ ).returncode() == 1 + # git repo and git is available + git_version = run_command([git_bin.path(), 'describe', '--always'] + ).stdout().strip() diff -Nru babl-0.1.63+om~1/debian/patches/series babl-0.1.73+om~1/debian/patches/series --- babl-0.1.63+om~1/debian/patches/series 2019-03-11 21:50:42.000000000 +0000 +++ babl-0.1.73+om~1/debian/patches/series 2019-12-09 22:31:27.000000000 +0000 @@ -1,2 +1,5 @@ #babl-includes.patch #meson.patch +#git.patch +tests.patch +fuckyou.patch diff -Nru babl-0.1.63+om~1/debian/patches/tests.patch babl-0.1.73+om~1/debian/patches/tests.patch --- babl-0.1.63+om~1/debian/patches/tests.patch 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/debian/patches/tests.patch 2019-12-09 22:31:27.000000000 +0000 @@ -0,0 +1,37 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + babl (0.1.66+om-0ubu18.04.1~ppa) bionic; urgency=high + . + * Upstream release + * https://gitlab.gnome.org/GNOME/babl/tree/BABL_0_1_66 +Author: Otto Meier + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-10-29 + +--- babl-0.1.66+om.orig/meson.build ++++ babl-0.1.66+om/meson.build +@@ -366,7 +366,7 @@ rootInclude = include_directories('.') + + subdir('babl') + subdir('extensions') +-subdir('tests') ++#subdir('tests') + subdir('tools') + if build_docs + subdir('docs') diff -Nru babl-0.1.63+om~1/debian/rules babl-0.1.73+om~1/debian/rules --- babl-0.1.63+om~1/debian/rules 2019-03-11 21:55:53.000000000 +0000 +++ babl-0.1.73+om~1/debian/rules 2019-12-09 22:31:27.000000000 +0000 @@ -3,11 +3,14 @@ #export CC=/usr/bin/gcc-6 %: - dh $@ --buildsystem=autoconf +# +# dh $@ --with meson + dh $@ +#override_dh_auto_configure: +# $(CURDIR)/autogen.sh +#dh_auto_configure -- --prefix=/usr --libdir=/usr/lib/$(DEB_HOST_MULTIARCH) --disable-mmx --disable-sse -override_dh_auto_configure: - $(CURDIR)/autogen.sh - dh_auto_configure -- --prefix=/usr --libdir=/usr/lib/$(DEB_HOST_MULTIARCH) --disable-mmx --disable-sse +override_dh_installdocs: override_dh_auto_test: dh_auto_test || true \ No newline at end of file diff -Nru babl-0.1.63+om~1/docs/babl.css babl-0.1.73+om~1/docs/babl.css --- babl-0.1.63+om~1/docs/babl.css 2016-01-02 15:28:48.000000000 +0000 +++ babl-0.1.73+om~1/docs/babl.css 2019-12-09 16:21:18.000000000 +0000 @@ -2,6 +2,7 @@ body { margin: 0; padding: 0; + font-size: 14pt; } div.paper { background-color: #fff; @@ -60,7 +61,6 @@ } div.expander_content { margin-left: 3em; - display: none; padding-bottom: 1em; } div.expander_content dl{ @@ -150,6 +150,7 @@ span.NULL { color: #555; } + tt { font-size: 110%; } pre.authors { font-size: 100%; font-family: FreeSans, Verdana, sans-serif; @@ -314,3 +315,10 @@ display: none; } } + +.item_title { font-weight: bold; margin-top: 2.5em; margin-bottom: 0.6em; +} + + +.item_body { +} diff -Nru babl-0.1.63+om~1/docs/CMYK-static.html babl-0.1.73+om~1/docs/CMYK-static.html --- babl-0.1.63+om~1/docs/CMYK-static.html 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/docs/CMYK-static.html 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,61 @@ + + + + + + + + CMYK - babl + + + + + + + +
+ +
+ + +
+
+ +

CMYK

+ +

CMYK handling is done using babl-spaces created with ICC profiles +containing CMYK profiles. BablSpaces for these ICC profiles handle color conversions using lcms2 - or if compiled without lcms2 support a naive profile independent fallback.

+

When a babl space derived from a CMYK ICC profile is used to instantiate +RGB formats, the resulting formats are using the default/NULL space for +primaries and TRCs.

+ +

The CMYK formats that use lcms2 for color interchange with the rest of +babl are the following, which are available for all data types, u8, u16, half +and float:

+
+
CMYK
Cyan Magenta Yellow Key, with 0 being white and 1.0 full ink coverage.
+
CMYKA
as previous, with separate alpha channel
+
CaMaYaKaA
as previous but associated alpha
+
cmyk
inverted CMYK, where 0.0 is full ink coverage and 1.0 is none
+
cmykA
as previous, with separate alpha channel
+
camayakaA
as previous but associated alpha
+
+ + + /babl +
+
+ +
+
+  +
+
+ + + diff -Nru babl-0.1.63+om~1/docs/ColorManagement-static.html babl-0.1.73+om~1/docs/ColorManagement-static.html --- babl-0.1.63+om~1/docs/ColorManagement-static.html 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/docs/ColorManagement-static.html 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,64 @@ + + + + + + + + babl color management + + + + + + + + + + + +
+
+

Color Management

+ +

By default the babl API is assuming data to be (unbounded) sRGB data, data + being sRGB defines the conversion to and from gray-scale as well as the gamma + - or Transfer Response Curve, TRC, used for converting between linear and + non-linear variants of the data. +

+ +

babl has API for creating a format for a specific space: + babl_format_with_space("R'G'B' u16", babl_space ("Rec2020")) creates + a 16 bit integer format for the Rec2020 color space. Babl knows internally + about "sRGB", "Rec2020", "Adobe", "Apple" and "ProPhoto" spaces, as they are + defined with constants on their wikipedia pages. +

+ +

Additional spaces can be loaded from monitor-class matrix+TRC ICC v2 and + v4 profiles. Using babl_icc_make_space (see babl.h for details). The space of + a babl format can also be queried with babl_format_get_space. +

+ +

The conversions babl does with ICC profiles are according to what is known + as the relative-colorimetric intent, monitor profiles containing both the + matrices used by babl and 3d CLUTs (color look up tables) sometimes also do + relative-colorimetric transfer for the "perceptual" intent CLUTs, but with + a more flexible and possibly higher accuracy conversions.

+ +

Handling of CMYK is in a separate document.

+ + /babl +
+
+ +
+
+  +
+
+ + + diff -Nru babl-0.1.63+om~1/docs/Glossary-static.html babl-0.1.73+om~1/docs/Glossary-static.html --- babl-0.1.63+om~1/docs/Glossary-static.html 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/docs/Glossary-static.html 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,98 @@ + + + + + + babl - glossary + + + + + + + +
+ +
+ + +
+
+ +

Glossary

+ +

This vocabulary is meant as a guide to the concepts involved in babl to +help with understanding of the code and APIs, and help continued development to +keep the vocabulary small.

+ +
+ +
Alpha
+
Alpha is the name used for transparency in computer programming, two main forms exist associated alpha and separate alpha.
+ +
Associated alpha
+
Alpha in an additive light representation where each component has its +own associated alpha. This representation is useful for avoiding color from +empty pixels bleeding into surroundings. It is also able to represent emittance +in addition to opacity. +Babl uses Unified alpha transformations between separate alpha and associated alpha.
+ + +
BablFish
+
The objects used for processing pixels, it converts between two +BablFormats, the first time a pair of formats are passed to +babl_fish(format_in, format_out) a benchmark is run, and the fastest +combination of conversions available in babl to achieve the conversion within +configured accuracy is returned and cached for subsequent requests.
+ +
BablFormat
+
The data type used to describe a pixel format encoding, it consists of the specific order of components.
+ +
BablSpace
+
a BablSpace describes the specifics of a BablModel - current types of BablSpaces in use in babl are RGB and CMYK based ones; the space encodes the specific parameters like custom TRCs and Primaries.
+ +
BablModel
+
In babl a model describes a specific family of color encodings - with its list of color components. For the RGB and Grayscale spaces, the model also specifies any nonlinearities as TRCs.
+ +
CIE
+ +
ICC Profile
+
A blob/file format from the International Color Consortium, that can be used for specifies RGB or CMYK color spaces, babl has support for v2 and v4 RGB matrix profiles, as well as support for CMYK based profiles by using LCMS2.
+ +
EncodingIn babl, the encoding +refers to the part of a bablformat comprised by model, and choice and order of +components + data type. In other words all the aspects of the format apart from +the BablSpace. A babl format can be recreated from its encoding and - for +relevant spaces - the ICC profile for the space.
+ +
Luminance
+
The photometric measure of luminious intensity of per unit area of light. The luminance in babl is proportional to luminance - though it doesn't use the SI unit of candela per square meter.
+ +
Premultiplied alpha
+
deprecated term, see associated alpha
+ +
Straight alpha
+
Straight or separate alpha has alpha as a fully separate component, +that can be adjusted without affecting the color. +Babl uses symetric alpha transformations between straight and associated alpha.
+ +
TRC
+ +
+ + /babl +
+
+ +
+
+  +
+
+ + + diff -Nru babl-0.1.63+om~1/docs/graphics/Makefile.am babl-0.1.73+om~1/docs/graphics/Makefile.am --- babl-0.1.63+om~1/docs/graphics/Makefile.am 2016-01-02 15:28:48.000000000 +0000 +++ babl-0.1.73+om~1/docs/graphics/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -.SILENT: - -if HAVE_RSVG -PNG_FILES = \ - babl-a4poster.png \ - babl-16x16.png \ - babl-48x48.png -endif - -SVG_FILES = \ - babl-a4poster.svg \ - babl-16x16.svg \ - babl-48x48.svg - -EXTRA_DIST = \ - index.html \ - $(PNG_FILES) \ - $(SVG_FILES) - -MAINTAINERCLEANFILES = $(PNG_FILES) - -all: $(MAINTAINERCLEANFILES) - -RSVG_CMD = echo -n " SVG: $@" ;\ - $(RSVG) -o $@ $< \ - &&\ - echo " [OK]"\ - ||\ - echo " FAIL" - -if HAVE_RSVG -dist-check-rsvg: - -.svg.png: - $(RSVG_CMD) -#-e $@ $< 2>/dev/null - -# the png version of the a4 poster is used as a webgraphic -# , thus it is rendered with the background alpha set to -# 0.0 -babl-a4poster.png: babl-a4poster.svg - echo -n " SVG: $@" ;\ - $(RSVG) -w 256 -o $@ $< \ - &&\ - echo " [OK]"\ - ||\ - echo " FAIL" -else -dist-check-rsvg: - @echo "*** rsvg must be available in order to make dist" - @false -endif - - -dist-hook: dist-check-rsvg diff -Nru babl-0.1.63+om~1/docs/graphics/meson.build babl-0.1.73+om~1/docs/graphics/meson.build --- babl-0.1.63+om~1/docs/graphics/meson.build 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/docs/graphics/meson.build 2019-12-09 16:21:18.000000000 +0000 @@ -7,20 +7,19 @@ graphic_files_install = [] -# Dummy config to copy index.html to build +# Copy index.html to build graphic_files_install += configure_file( input: 'index.html', output: '@PLAINNAME@', - configuration: configuration_data() + copy: true ) - foreach file : graphic_files - # Dummy config to copy svg files to build + # Copy svg files to build graphic_files_install += configure_file( input: file, output: '@PLAINNAME@', - configuration: configuration_data() + copy: true ) endforeach diff -Nru babl-0.1.63+om~1/docs/index-static.html.in babl-0.1.73+om~1/docs/index-static.html.in --- babl-0.1.63+om~1/docs/index-static.html.in 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/docs/index-static.html.in 2019-12-09 16:21:18.000000000 +0000 @@ -1,94 +1,29 @@ - - babl-@BABL_VERSION@ + babl - + - -
+ -
@@ -97,7 +32,7 @@


- babl is a dynamic, any to any, pixel format translation library. + babl is pixel encoding and color space conversion engine in C.

It allows converting between different methods of storing Features

-

GEGL through GeglBuffer provides - tiled buffers with on disk storage as well as linear buffers with accessor - functions for efficient data access transparently using babl fishes for - translation to the desired pixel formats.

+

The pixel data storage in GIMP uses +GEGL's GeglBuffer which internally stores +tiles and provides an API for retrieving and storing pixel data with implicit +conversions using babl formats. +

Download

@@ -142,9 +75,9 @@

Babl uses git. The main repository is hosted by GNOME. - It can be browsed online and cloned with: + It can be browsed online and cloned with:

-
git clone git://git.gnome.org/babl
+
git clone https://gitlab.gnome.org/GNOME/babl.git/

NEWS

@@ -155,10 +88,16 @@ to the GEGL release.

- For more news see git log. + For more detailed changes see git log. + + + +

Usage

+

Most users of babl do not know they are using babl and it is GIMP itself + which uses babl, this is documentation for such uses - and others that might + want to use babl for pixel format or color space conversion in other software. +

- -

Documentation

When using BablFishes to do your conversions, you request a fish to convert between two formats, and an optimal fish to babls capability is provided that you can use to do your conversions. Babl also provides @@ -171,18 +110,17 @@

When performing further extensions to the vocabulary of babl, the internal consistency is governed by reference conversions that operate - on double (64 bit floating point values). The only color model - created during BablCore bootstrap is RGBA (linear light RGB, - 0.0 - 1.0, with a linear 0.0 - 1.0 opacity channel) backed by the - double datatype. Defined similarily to double (64 bit floating point values). Color Spaces can + be created from chromaticity coordinates or ICC profiles. The reference + color space - to maintain fast and bit-accurate conversions on with + sRGB is similar to scRGB using 64bit floating point.

-

If babls conversion isn't fast enough, you can provide - your own conversion shortcut between two formats. The registered - shortcut might also be used by babl as an intermediate conversion when - constructing BablFishes for other conversions. +

To speed up operations, fast path conversions are used. + The registered shortcut might also be used by babl as an intermediate +conversion when constructing BablFishes for other conversions.

Babl extensions are shared objects. If you have already developed @@ -190,9 +128,6 @@ not take much time and will speed up babl for other users as well.

- -

Usage

-
babl_process (babl_fish (source_format, destination_format),
               source_buffer, destination_buffer,
@@ -231,6 +166,7 @@
 
         

If the existing pixel formats are not sufficient for your conversion needs, new ones can be created on the fly. The constructor + needs, new ones can be created on the fly. The constructor will provide the prior created one if duplicates are registered.

const Babl *format = babl_format_new (babl_model ("R'G'B'"),
@@ -256,51 +192,7 @@
 
--> - -

Color Management

-

All pixel formats in babl have a specified color space, if NULL is passed -as a space constants for (unbounded) linear sRGB data is assumed, data being -sRGB defines the conversion to and from gray-scale as well as the gamma - - or Transfer Response Curve, TRC, used for converting between linear and - non-linear variants of the data.

- -

babl has API for creating a format for a specific space: -babl_format_with_space("R'G'B' u16", babl_space ("Rec2020")) creates a -16 bit integer format for the Rec2020 color space. Babl knows internally about -"sRGB", "Rec2020", "Adobe", "Apple", "ProPhoto", "ACEScg" and "ACES2065-1" -spaces, as they are defined with constants on their wikipedia pages or similar upstream references.

- -

Additional spaces can be loaded from monitor-class matrix+TRC ICC v2 and - v4 profiles. Using babl_icc_make_space (see babl.h for details). The space of - a babl format can also be queried with babl_format_get_space. -

- - -

CMYK

- -

CMYK handling is done using babl-spaces created with ICC profiles -containing CMYK profiles. BablSpaces for these ICC profiles handle color conversions using lcms2 - or if compiled without lcms2 support a naive profile independent fallback.

-

When a babl space derived from a CMYK ICC profile is used to instantiate -RGB formats, the resulting formats are using the default/NULL space for -primaries and TRCs.

- -

The CMYK formats that use lcms2 for color interchange with the rest of -babl are the following, which are available for all data types, u8, u16, half -and float:

-
-
CMYK
Cyan Magenta Yellow Key, with 0 being white and 1.0 full ink coverage.
-
CMYKA
as previous, with non-associated alpha channel
-
CaMaYaKaA
as previous but premultiplied/associated alpha
-
cmyk
inverted CMYK, where 0.0 is full ink coverage and 1.0 is none
-
cmykA
as previous, with non-associated alpha channel
-
camayakaA
as previous but premultiplied/associated alpha
-
- - - -

Vocabulary

- - -

Pre-multiplied alpha

- -

babl stores color information in transparent pre-multiplied or associated -alpha pixels in floating point formats. With floating point pixel formats -standard way of handling alpha maintains color information very near fully -transparent pixels - by introducing a limit: BABL_ALPHA_FLOOR which is -1/65536.0, and treating all alphas beteen zero and this value as this value we -maintain color information while the discrepancy in behavior gets concealed by -quantization in 16bit and 8bit formats. -

-

For images that already are in a premultiplied format on import, this change -has no impact on its use for pre-multiplied arithmetic, meaning that -superluminous colors are still supported, it also opens up to GEGL more widely -expect premultiplied data in more operations which will become a speedup when -more filters want to integrate in the layer processing pipeline.

- -

There is a post on patreon with further details about the implementation.

- @@ -405,7 +279,7 @@ - /babl-@BABL_VERSION@ + babl
@@ -415,4 +289,3 @@
- diff -Nru babl-0.1.63+om~1/docs/Makefile.am babl-0.1.73+om~1/docs/Makefile.am --- babl-0.1.63+om~1/docs/Makefile.am 2017-09-30 15:32:15.000000000 +0000 +++ babl-0.1.73+om~1/docs/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -# programs used for doc creation -babl_fish_path_dhtml = $(top_builddir)/tools/babl_fish_path_dhtml$(EXEEXT) -babl_fish_path_fitness = $(top_builddir)/tools/babl_fish_path_fitness$(EXEEXT) -babl_html_dump = $(top_builddir)/tools/babl-html-dump$(EXEEXT) - -.SILENT: -SUBDIRS= graphics -DIST_SUBDIRS= graphics - -# The patterns used for html creation in the babl build system -# is very small, and should probably be documented in a tutorial. -# -# -# -HTML_FILES = index-static.html \ - index.html - -EXTRA_DIST= \ - babl.css \ - tools/xml_insert.sh \ - tools/changelog2rss \ - index-static.html.in \ - COPYING \ - COPYING.LESSER - -BUILT_EXTRA_DIST = index.html - -CLEANFILES = README changelog.rss -DISTCLEANFILES = index-static.html $(BUILT_EXTRA_DIST) - -all: $(HTML_FILES) - -index.html: index-static.html \ - $(babl_html_dump) \ - $(top_srcdir)/AUTHORS \ - $(top_srcdir)/TODO \ - $(top_srcdir)/NEWS \ - Makefile.am - echo -n "HTML: $@" - cp $< $@ - (which mktemp > /dev/null 2>&1 && TMPFILE=`mktemp` || TMPFILE="/tmp/babl_build_tempfile" ;\ - export BABL_PATH="$(top_builddir)/extensions:$(top_builddir)/extensions/.libs"; $(babl_html_dump) > $$TMPFILE;\ - $(SHELL) $(top_srcdir)/docs/tools/xml_insert.sh $@ BablBase $$TMPFILE;\ - rm -f $$TMPFILE ) - echo -n "." - - $(SHELL) $(top_srcdir)/docs/tools/xml_insert.sh $@ AUTHORS $(top_srcdir)/AUTHORS - $(SHELL) $(top_srcdir)/docs/tools/xml_insert.sh $@ TODO $(top_srcdir)/TODO - $(SHELL) $(top_srcdir)/docs/tools/xml_insert.sh $@ NEWS $(top_srcdir)/NEWS - echo " [OK]" - -distclean-local: - if test $(srcdir) = .; then :; else \ - rm -f $(BUILT_EXTRA_DIST); \ - fi - -web: all graphics - echo -n " WEB: " - ping -c 1 $(WEBSITE_HOST) >/dev/null && \ - (\ - scp *.txt *.html *.css\ - "$(WEBSITE_HOST):$(WEBSITE_LOCATION)/" >/dev/null && \ - echo -n "."; \ - scp graphics/*.png graphics/*.html\ - "$(WEBSITE_HOST):$(WEBSITE_LOCATION)/graphics/" >/dev/null\ - &&\ - echo "[OK]"\ - ||\ - echo "FAIL scp failed (does dirs exist?)."\ - )\ - || \ - (\ - echo "FAIL $(WEBSITE_HOST) not reachable."\ - ) diff -Nru babl-0.1.63+om~1/docs/meson.build babl-0.1.73+om~1/docs/meson.build --- babl-0.1.63+om~1/docs/meson.build 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/docs/meson.build 2019-12-09 16:21:18.000000000 +0000 @@ -13,16 +13,22 @@ configuration: conf, ) -babl_css = configure_file(input : 'babl.css', +babl_css = configure_file( + input : 'babl.css', output : 'babl.css', - configuration : configuration_data()) + copy: true +) + +index_html_tmp_env = [ + 'BABL_PATH='+ join_paths(meson.build_root(), 'extensions'), +] index_html_tmp = custom_target('index.html.tmp', input : [ babl_html_dump, ], output: [ 'index.html.tmp', ], command: [ env_bin, - 'BABL_PATH='+ join_paths(meson.build_root(), 'extensions'), + index_html_tmp_env, babl_html_dump ], capture: true, @@ -31,24 +37,113 @@ index_html = custom_target('index.html', input : [ index_static_html, - index_html_tmp, join_paths(meson.source_root(), 'AUTHORS'), join_paths(meson.source_root(), 'TODO'), join_paths(meson.source_root(), 'NEWS'), + 'toc', ], output: [ 'index.html', ], command: [ env_bin, 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'BablBase', '@INPUT1@', - '&&', xml_insert, '@OUTPUT@', 'AUTHORS', '@INPUT2@', - '&&', xml_insert, '@OUTPUT@', 'TODO', '@INPUT3@', - '&&', xml_insert, '@OUTPUT@', 'NEWS', '@INPUT4@', + '&&', xml_insert, '@OUTPUT@', 'AUTHORS', '@INPUT1@', + '&&', xml_insert, '@OUTPUT@', 'TODO', '@INPUT2@', + '&&', xml_insert, '@OUTPUT@', 'NEWS', '@INPUT3@', + '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT4@', + ], + build_by_default: true, +) + +Reference_html = custom_target('Reference.html', + input : [ + 'Reference-static.html', + 'toc', + index_html_tmp, + ], + output: [ 'Reference.html', ], + command: [ + env_bin, + 'cp', '@INPUT0@', '@OUTPUT@', + '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', + '&&', xml_insert, '@OUTPUT@', 'BablBase', '@INPUT2@', ], build_by_default: true, ) +CMYK_html = custom_target('CMYK.html', + input : [ + 'CMYK-static.html', + 'toc', + ], + output: [ 'CMYK.html', ], + command: [ + env_bin, + 'cp', '@INPUT0@', '@OUTPUT@', + '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', + ], + build_by_default: true, +) + +OldNews_html = custom_target('OldNews.html', + input : [ + 'OldNews-static.html', + 'toc', + ], + output: [ 'OldNews.html', ], + command: [ + env_bin, + 'cp', '@INPUT0@', '@OUTPUT@', + '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', + ], + build_by_default: true, +) + + + +Glossary_html = custom_target('Glossary.html', + input : [ + 'Glossary-static.html', + 'toc', + ], + output: [ 'Glossary.html', ], + command: [ + env_bin, + 'cp', '@INPUT0@', '@OUTPUT@', + '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', + ], + build_by_default: true, +) + + +ColorManagement_html = custom_target('ColorManagement.html', + input : [ + 'ColorManagement-static.html', + 'toc', + ], + output: [ 'ColorManagement.html', ], + command: [ + env_bin, + 'cp', '@INPUT0@', '@OUTPUT@', + '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', + ], + build_by_default: true, +) + +UnifiedAlpha_html = custom_target('UnifiedAlpha.html', + input : [ + 'UnifiedAlpha-static.html', + 'toc', + ], + output: [ 'UnifiedAlpha.html', ], + command: [ + env_bin, + 'cp', '@INPUT0@', '@OUTPUT@', + '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', + ], + build_by_default: true, +) + run_target('push_web', command: [ 'scp', index_html, index_static_html, babl_css, scptarget, diff -Nru babl-0.1.63+om~1/docs/OldNews-static.html babl-0.1.73+om~1/docs/OldNews-static.html --- babl-0.1.63+om~1/docs/OldNews-static.html 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/docs/OldNews-static.html 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,236 @@ + + + + + + babl - old releases + + + + + + + +
+ +
+ + +
+
+

old babl releases

+
+ +2018-10-05 babl-0.1.60
+Improved thread safety, acceleration for R'G'B'A u8 -> cairo-ARGB32 conversion. +
+2018-10-05 babl-0.1.58
+Preserve color of transparent pixels in conversion to premultiplied alpha, +Added single precision code-paths for faster fallback/reference conversions. +New BABL_ICC_INTENT_PERFORMANCE bitflag for combining with intent as bitflags, +use of matrix+trc when relative colorimetric CLUT is present. New color model +and formats, CIE xyY. + +
+2018-08-14 babl-0.1.56
+Improvements to the caching of profiled conversion chains between invocations +by ignoring unknown bits in cache file and remember which conversions yielded +reference fishes. + +2018-07-23 babl-0.1.54
+
+Export babl_space_get_icc, babl_space_get, babl_model_with_space, +babl_space_with_trc, babl_format_get_encoding, babl_model_is, SSE2 versions of +YA float and Y float to CIE L float. +
+2018-06-02 babl-0.1.52
+Concurrency fixes and fixes to handling of 0/1 entry palettes, do not +pre-equalize XYZ conversion matrices for sRGB, internal clean-ups, pre-define +ACES2065-1 and ACEScg BablSpaces, add R~G~B~ set of spaces, which for all +BablSpaces mean use sRGB TRC. +
+2018-05-20 babl-0.1.50
+Improvements to speed and precision of indexed code, improvements to meson +build. +
+2018-05-15 babl-0.1.48
+fix u8 <-> double conversions for chroma, SSE2 version of RGBA float to +CIE L / Lab. Build with -Ofast by default. +
+2018-04-10 babl-0.1.46
+added extensions with more coverage for u32, half and other utilit fast paths +improving fast path coverage. +
+2018-02-18 babl-0.1.44
+Fix bug in custom primaries/ICC fast paths, improve meson build
+
+2018-01-23 babl-0.1.42
+Fully initialize fishes when loading from cache.
+
+2018-01-16 babl-0.1.40
+Added format "CIE XYZ alpha" color model and formats. +New API babl_process_rows for reduced overhead in some scenarios; though bigger +gains seen also for regular babl_process with reimplemented branch-free +dispatch, and faster cbrt. Added meson build; being tested in parallel with +auotmake, Improved reference conversions for formats skipping some of models +components, Fixed gamma handling in indexed/palettized formats and improved +gamma precision consistenct in sse2 conversions.
+
+2017-11-15 babl-0.1.38
+Added format "CIE L float", a couple of protections against division by 0.0 +
+2017-11-10 babl-0.1.36
+Optimized customized primary aware code paths for CIE Lab<->RGB conversions, +improved accuracy of gamma approximations. New API babl_format_exists() for +checking validity of babl format name, crash proofing of cache handling and use +of environment variables. +
+2017-10-06 babl-0.1.34
+Brown paper bag release, Fix indexed / custom primaries conflict, and re-export +a symbol used by old GEGL/GIMPs. +
+2017-10-03 babl-0.1.32
+Added custom primaries and TRC support through ICC parsing, improved +float<->half performance, rewrite of all conversions functions to adhere to new +signature. +
+2017-07-15 babl-0.1.30
+Thread stability for palette modes, stricter alpha preservation, now +cross-compilable on android. +
+2017-05-30 babl-0.1.28
+Fast paths for Lav <-> Lch, release triggered by pending GIMP release. +
+2017-05-09 babl-0.1.26
+Build and install HCY color space, platform independences fixes to fish cache. +
+2017-02-01 babl-0.1.24
+Improvements to profile cache persistance, fast paths that improve actual GIMP +use on various precisions, use single precision constants for some more of CIE +computions. +
+2016-11-05 babl-0.1.22
+Added cache of profiled conversions, added HCY color model, some precision and +performance updated for fast paths. +
+2016-11-05 babl-0.1.20
+Fix run-time errors, leaks, and race conditions. Add conditional fast paths. +
+2016-06-13 babl-0.1.18
+Bugfix: take alpha threshold in consideration when processing floats in SSE2. +
+2016-02-12 babl-0.1.16
+Improvements to half float reference, SIMD, and fast-paths, and CIE float fast +paths; cleanups of fast path extensions. +
+2015-11-19 babl-0.1.14
+sRGB precision tuning, stability fixes, locale fix for setting error tolerance. +
+2015-02-03 babl-0.1.12
+optimizations for floating point conversions, HSV and HSL color models, +removal of dead code, fixed CIE Lab conversions. +
+2012-03-30 babl-0.1.10
+LUT based speedups for gamma correction / uncorrection. +
+2012-03-30 babl-0.1.8
+Added support for indexed/pallette based formats, constified API. +
+2011-11-18 babl-0.1.6
+Build improvements, remove blatantly wrong conversions from extensions, +made it possible to distinguish format_n formats from others, improvements +to vala/gobject introspection support. + +
+2011-01-20 babl-0.1.4
+Improved cross platform build ability, added code to handle n-component formats, +remove extraenous runtime profiling that impacted performance. + +
+2010-01-15 babl-0.1.2
+Made babl mostly threadsafe (sufficient for GIMP/GEGLs needs). Streamlined core functionality, reducing number of function calls and removing overeager instrumentation. +
+2009-05-20 babl-0.1.0
+Support for RGBA representation in the frequency domain, +un-pre-multiply close-to-zero alpha values to complete black instead +of slightly brighter than black, add a BABL_ALPHA_THRESHOLD constant +to the API, do a complete overhaul of the babl API and do some +changes to increase portability of the library. +
+2008-06-12 babl-0.0.22
+Speed improvements due to: coalesced hashing, early bail out upon creation of +duplicate formats, caching of non existing paths. Large amounts of the core has +also been reviewed and refactored. Improved conversion coverage in the matrix. +
+2008-02-27 babl-0.0.20
+Builds on OSX +Check <0.0 and >1.0 values conversions for accuracy as well. + +
+ + + + + babl + + + + + + + + + + + +
+ +
+ + + +
+
+
+ + +

Vocabulary

+ + + + + /babl +
+
+
+
+  +
+
+ + + diff -Nru babl-0.1.63+om~1/docs/toc babl-0.1.73+om~1/docs/toc --- babl-0.1.63+om~1/docs/toc 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/docs/toc 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,27 @@ + diff -Nru babl-0.1.63+om~1/docs/UnifiedAlpha-static.html babl-0.1.73+om~1/docs/UnifiedAlpha-static.html --- babl-0.1.63+om~1/docs/UnifiedAlpha-static.html 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/docs/UnifiedAlpha-static.html 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,110 @@ + + + + + + + + Unified Alpha - babl + + + + + + + +
+ +
+ + +
+
+ +

Symmetric transformations for floating point alpha

+ + +

babl clamps the alpha used when going from separate alpha to associated +alpha or from associated alpha to separate alpha to BABL_ALPHA_FLOOR. This +replaces asymptotic behavior and direct precision loss of color precision when +multiplying or dividing by alphas near 0.0 with a consistent symmetric +transformation.

+ +

Original intent of data as well as non-asymptotic precision loss is thus +maintained when the processing chain might temporarily use the other alpha +representation.

+ +
+    #define BABL_ALPHA_FLOOR    (1.0/65536.0)
+    #define BABL_ALPHA_FLOOR_F  (1.0f/65536.0f)
+
+ +

The deviation from not clamping near 0.0 is within the quantization margin +of 16bit integer alpha, thus no adaptations for any SIMD or and similar 8bit +and 16bit extensions of pixel format conversions are needed. +

+ +

This is the clamping function in use:

+
+static inline float
+babl_epsilon_for_zero_float (float value)
+{
+ if (value <= BABL_ALPHA_FLOOR_F &&
+     value >= -BABL_ALPHA_FLOOR_F)
+   return BABL_ALPHA_FLOOR_F;
+ else
+   return value;
+}
+
+

And an example use of this clamping function that is consistent with babls behavior:

+
+static inline void
+associated_to_separate_rgba (const float *associated_rgba,
+                                   float *separate_rgba)
+{
+  float alpha = associated_rgba[3];
+  float reciprocal_alpha = 1.0f / babl_epsilon_for_zero_float (alpha);
+
+  separate_rgba[0] = associated_rgba[0] * reciprocal_alpha;
+  separate_rgba[1] = associated_rgba[1] * reciprocal_alpha;
+  separate_rgba[2] = associated_rgba[2] * reciprocal_alpha;
+  separate_rgba[3] = alpha;
+}
+
+
+static inline void
+separate_to_associated_rgba (const float *separate_rgba,
+                                   float *associated_rgba)
+{
+  float alpha = associated_rgba[3];
+  float limited_alpha = babl_epsilon_for_zero_float (alpha);
+
+  associated_rgba[0] = separate_rgba[0] * limited_alpha;
+  associated_rgba[1] = separate_rgba[1] * limited_alpha;
+  associated_rgba[2] = separate_rgba[2] * limited_alpha;
+  associated_rgba[3] = alpha;
+}
+
+ + +

For more detils see the commit message of the most recent refinement as well as blog post with further background.

+ + + + /babl +
+
+ +
+
+  +
+
+ + + diff -Nru babl-0.1.63+om~1/export-symbols babl-0.1.73+om~1/export-symbols --- babl-0.1.63+om~1/export-symbols 2019-01-12 08:13:24.000000000 +0000 +++ babl-0.1.73+om~1/export-symbols 2019-12-09 16:21:18.000000000 +0000 @@ -47,13 +47,15 @@ babl_space_from_chromaticities babl_space_from_icc babl_space_get -babl_space_get_rgbtoxyz babl_space_get_icc +babl_space_get_rgbtoxyz +babl_space_get_rgb_luminance babl_space_to_xyz babl_space_from_xyz babl_space_to_icc babl_space_with_trc babl_space_is_cmyk +babl_space_is_gray babl_icc_make_space babl_icc_get_key babl_ticks diff -Nru babl-0.1.63+om~1/extensions/avx2-int8.c babl-0.1.73+om~1/extensions/avx2-int8.c --- babl-0.1.63+om~1/extensions/avx2-int8.c 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/extensions/avx2-int8.c 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,426 @@ +/* babl - dynamically extendable universal pixel conversion library. + * Copyright (C) 2019 Ell + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, see + * . + */ + +#include "config.h" + +#if defined(USE_AVX2) + +/* AVX 2 */ +#include + +#include +#include + +#include "babl.h" +#include "babl-cpuaccel.h" +#include "extensions/util.h" +#include "extensions/avx2-int8-tables.h" + +#define TABLE_SIZE (sizeof (linear_to_gamma) / sizeof (linear_to_gamma[0])) +#define SCALE ((float) (TABLE_SIZE - 1)) + +#define CVT1(src, dst) \ + do \ + { \ + float x = *src; \ + \ + if (x < 0.0f) \ + *dst = 0; \ + else if (x <= 1.0f) \ + *dst = linear_to_gamma[(int) (SCALE * x + 0.5f)]; \ + else /* x > 1.0f || isnan (x) */ \ + *dst = 255; \ + \ + src++; \ + dst++; \ + } \ + while (0) + +#define CVTA1(src, dst) \ + do \ + { \ + float x = *src; \ + \ + if (x < 0.0f) \ + *dst = 0; \ + else if (x <= 1.0f) \ + *dst = 255.0f * x + 0.5f; \ + else /* x > 1.0f || isnan (x) */ \ + *dst = 255; \ + \ + src++; \ + dst++; \ + } \ + while (0) + +static inline void +conv_yF_linear_y8_gamma (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) +{ + const __v8sf *src_vec; + __m256i *dst_vec; + const __v8sf scale = _mm256_set1_ps (SCALE); + const __v8sf zero = _mm256_setzero_ps (); + const __v8sf half = _mm256_set1_ps (0.5f); + + while ((uintptr_t) src % 32 && samples > 0) + { + CVT1 (src, dst); + + samples--; + } + + src_vec = (const __v8sf *) src; + dst_vec = (__m256i *) dst; + + while (samples >= 32) + { + __m256i i32_0, i32_1, i32_2, i32_3; + __m256i i16_01, i16_23; + __m256i i8_0123; + + #define CVT8(i) \ + do \ + { \ + __v8sf yyyyyyyy; \ + \ + yyyyyyyy = scale * src_vec[i] + half; \ + yyyyyyyy = _mm256_max_ps (yyyyyyyy, zero); \ + yyyyyyyy = _mm256_min_ps (yyyyyyyy, scale); \ + i32_##i = _mm256_cvttps_epi32 (yyyyyyyy); \ + i32_##i = _mm256_i32gather_epi32 (linear_to_gamma, i32_##i, 4); \ + } \ + while (0) + + CVT8 (0); + CVT8 (1); + + i16_01 = _mm256_packus_epi32 (i32_0, i32_1); + + CVT8 (2); + CVT8 (3); + + i16_23 = _mm256_packus_epi32 (i32_2, i32_3); + + i8_0123 = _mm256_packus_epi16 (i16_01, i16_23); + i8_0123 = _mm256_permutevar8x32_epi32 ( + i8_0123, + _mm256_setr_epi32 (0, 4, 1, 5, + 2, 6, 3, 7)); + + _mm256_storeu_si256 (dst_vec, i8_0123); + + #undef CVT8 + + src_vec += 4; + dst_vec++; + + samples -= 32; + } + + src = (const float *) src_vec; + dst = (uint8_t *) dst_vec; + + while (samples > 0) + { + CVT1 (src, dst); + + samples--; + } +} + +static inline void +conv_yaF_linear_ya8_gamma (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) +{ + if ((uintptr_t) src % 8 == 0) + { + const __v8sf *src_vec; + __m256i *dst_vec; + const __v8sf scale = _mm256_setr_ps (SCALE, 255.0f, SCALE, 255.0f, + SCALE, 255.0f, SCALE, 255.0f); + const __v8sf zero = _mm256_setzero_ps (); + const __v8sf half = _mm256_set1_ps (0.5f); + const __m256i mask = _mm256_setr_epi32 (-1, 0, -1, 0, + -1, 0, -1, 0); + + while ((uintptr_t) src % 32 && samples > 0) + { + CVT1 (src, dst); + CVTA1 (src, dst); + + samples--; + } + + src_vec = (const __v8sf *) src; + dst_vec = (__m256i *) dst; + + while (samples >= 16) + { + __m256i i32_0, i32_1, i32_2, i32_3; + __m256i i16_01, i16_23; + __m256i i8_0123; + + #define CVT8(i) \ + do \ + { \ + __v8sf yayayaya; \ + \ + yayayaya = scale * src_vec[i] + half; \ + yayayaya = _mm256_max_ps (yayayaya, zero); \ + yayayaya = _mm256_min_ps (yayayaya, scale); \ + i32_##i = _mm256_cvttps_epi32 (yayayaya); \ + i32_##i = _mm256_mask_i32gather_epi32 (i32_##i, \ + linear_to_gamma, \ + i32_##i, mask, 4); \ + } \ + while (0) + + CVT8 (0); + CVT8 (1); + + i16_01 = _mm256_packus_epi32 (i32_0, i32_1); + + CVT8 (2); + CVT8 (3); + + i16_23 = _mm256_packus_epi32 (i32_2, i32_3); + + i8_0123 = _mm256_packus_epi16 (i16_01, i16_23); + i8_0123 = _mm256_permutevar8x32_epi32 ( + i8_0123, + _mm256_setr_epi32 (0, 4, 1, 5, + 2, 6, 3, 7)); + + _mm256_storeu_si256 (dst_vec, i8_0123); + + #undef CVT8 + + src_vec += 4; + dst_vec++; + + samples -= 16; + } + + src = (const float *) src_vec; + dst = (uint8_t *) dst_vec; + } + + while (samples > 0) + { + CVT1 (src, dst); + CVTA1 (src, dst); + + samples--; + } +} + +static void +conv_rgbF_linear_rgb8_gamma (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) +{ + conv_yF_linear_y8_gamma (conversion, src, dst, 3 * samples); +} + +static inline void +conv_rgbaF_linear_rgba8_gamma (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) +{ + if ((uintptr_t) src % 16 == 0) + { + const __v8sf *src_vec; + __m256i *dst_vec; + const __v8sf scale = _mm256_setr_ps (SCALE, SCALE, SCALE, 255.0f, + SCALE, SCALE, SCALE, 255.0f); + const __v8sf zero = _mm256_setzero_ps (); + const __v8sf half = _mm256_set1_ps (0.5f); + const __m256i mask = _mm256_setr_epi32 (-1, -1, -1, 0, + -1, -1, -1, 0); + + while ((uintptr_t) src % 32 && samples > 0) + { + CVT1 (src, dst); + CVT1 (src, dst); + CVT1 (src, dst); + CVTA1 (src, dst); + + samples--; + } + + src_vec = (const __v8sf *) src; + dst_vec = (__m256i *) dst; + + while (samples >= 8) + { + __m256i i32_0, i32_1, i32_2, i32_3; + __m256i i16_01, i16_23; + __m256i i8_0123; + + #define CVT8(i) \ + do \ + { \ + __v8sf rgbargba; \ + \ + rgbargba = scale * src_vec[i] + half; \ + rgbargba = _mm256_max_ps (rgbargba, zero); \ + rgbargba = _mm256_min_ps (rgbargba, scale); \ + i32_##i = _mm256_cvttps_epi32 (rgbargba); \ + i32_##i = _mm256_mask_i32gather_epi32 (i32_##i, \ + linear_to_gamma, \ + i32_##i, mask, 4); \ + } \ + while (0) + + CVT8 (0); + CVT8 (1); + + i16_01 = _mm256_packus_epi32 (i32_0, i32_1); + + CVT8 (2); + CVT8 (3); + + i16_23 = _mm256_packus_epi32 (i32_2, i32_3); + + i8_0123 = _mm256_packus_epi16 (i16_01, i16_23); + i8_0123 = _mm256_permutevar8x32_epi32 ( + i8_0123, + _mm256_setr_epi32 (0, 4, 1, 5, + 2, 6, 3, 7)); + + _mm256_storeu_si256 (dst_vec, i8_0123); + + #undef CVT8 + + src_vec += 4; + dst_vec++; + + samples -= 8; + } + + src = (const float *) src_vec; + dst = (uint8_t *) dst_vec; + } + + while (samples > 0) + { + CVT1 (src, dst); + CVT1 (src, dst); + CVT1 (src, dst); + CVTA1 (src, dst); + + samples--; + } +} + +#undef CVT1 +#undef CVTA1 + +#endif /* defined(USE_AVX2) */ + +int init (void); + +int +init (void) +{ +#if defined(USE_AVX2) + + const Babl *yF_linear = babl_format_new ( + babl_model ("Y"), + babl_type ("float"), + babl_component ("Y"), + NULL); + const Babl *y8_gamma = babl_format_new ( + babl_model ("Y'"), + babl_type ("u8"), + babl_component ("Y'"), + NULL); + const Babl *yaF_linear = babl_format_new ( + babl_model ("YA"), + babl_type ("float"), + babl_component ("Y"), + babl_component ("A"), + NULL); + const Babl *ya8_gamma = babl_format_new ( + babl_model ("Y'A"), + babl_type ("u8"), + babl_component ("Y'"), + babl_component ("A"), + NULL); + const Babl *rgbF_linear = babl_format_new ( + babl_model ("RGB"), + babl_type ("float"), + babl_component ("R"), + babl_component ("G"), + babl_component ("B"), + NULL); + const Babl *rgb8_gamma = babl_format_new ( + babl_model ("R'G'B'"), + babl_type ("u8"), + babl_component ("R'"), + babl_component ("G'"), + babl_component ("B'"), + NULL); + const Babl *rgbaF_linear = babl_format_new ( + babl_model ("RGBA"), + babl_type ("float"), + babl_component ("R"), + babl_component ("G"), + babl_component ("B"), + babl_component ("A"), + NULL); + const Babl *rgba8_gamma = babl_format_new ( + babl_model ("R'G'B'A"), + babl_type ("u8"), + babl_component ("R'"), + babl_component ("G'"), + babl_component ("B'"), + babl_component ("A"), + NULL); + +#define CONV(src, dst) \ + do \ + { \ + babl_conversion_new (src ## _linear, \ + dst ## _gamma, \ + "linear", \ + conv_ ## src ## _linear_ ## dst ## _gamma, \ + NULL); \ + } \ + while (0) + + if ((babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_AVX2)) + { + CONV (yF, y8); + CONV (yaF, ya8); + CONV (rgbF, rgb8); + CONV (rgbaF, rgba8); + } + +#endif /* defined(USE_AVX2) */ + + return 0; +} + diff -Nru babl-0.1.63+om~1/extensions/avx2-int8-tables.h babl-0.1.73+om~1/extensions/avx2-int8-tables.h --- babl-0.1.63+om~1/extensions/avx2-int8-tables.h 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/extensions/avx2-int8-tables.h 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,4100 @@ +/* Gamma table generated from a babl conversion of Y to Y' */ +static const int32_t linear_to_gamma[65536] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, +101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, +102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, +103, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, +104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, +105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, +106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, +107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, +108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, +109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, +110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, +111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, +113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, +114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, +115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, +117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, +118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, +119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, +120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, +121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, +122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, +123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, +124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, +125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, +126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, +127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, +128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, +129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, +131, 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, +133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, +134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, +135, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, +136, 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, +137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, +138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, +139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, +140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, +141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, +142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, +143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, +144, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, +145, 145, 145, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, +146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, +149, 149, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, +151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, +152, 152, 152, 152, 152, 152, 152, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, +153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +154, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, +155, 155, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, +156, 156, 156, 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, +158, 158, 158, 158, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, +160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, +161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, +163, 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, +164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, +165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, +166, 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, +167, 167, 167, 167, 167, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, +168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, +169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, +170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, +171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, +172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, +173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, +174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, +175, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, +176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, +177, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, +178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, +179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, +180, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, +181, 181, 181, 181, 181, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, +183, 183, 183, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, +184, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, +185, 185, 185, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, +186, 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, +187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, +188, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, +189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, +190, 190, 190, 190, 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, +191, 191, 191, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, +192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, +194, 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, +195, 195, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, +198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, +199, 199, 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, +200, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, +202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, +203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, +204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, +205, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, +206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, +207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, +208, 208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, +209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, +210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, +211, 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, +212, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, +213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, +214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, +216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, +217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, +218, 218, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, +219, 219, 219, 219, 219, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, +220, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, +221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, +222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, +223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, +224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, +225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, +226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, +228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, +229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, +230, 230, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, +231, 231, 231, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, +232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, +233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, +234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, +235, 235, 235, 235, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, +236, 236, 236, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, +237, 237, 237, 237, 237, 237, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, +238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, +239, 239, 239, 239, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, +241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, +243, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, +244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, +245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, +246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, +247, 247, 247, 247, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, +248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, +249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, +250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, +251, 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, +252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, +253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, +254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 +}; diff -Nru babl-0.1.63+om~1/extensions/cairo.c babl-0.1.73+om~1/extensions/cairo.c --- babl-0.1.63+om~1/extensions/cairo.c 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/extensions/cairo.c 2019-12-09 16:21:18.000000000 +0000 @@ -27,7 +27,10 @@ int init (void); static void -conv_rgba8_cairo24_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_cairo24_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; uint32_t *srci = (void *)src; @@ -45,7 +48,10 @@ } static void -conv_rgb8_cairo24_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_cairo24_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -64,7 +70,10 @@ #if 0 static void -conv_rgbA8_premul_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbA8_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -83,7 +92,10 @@ #else static void -conv_rgbA8_premul_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbA8_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; uint32_t *srci = (void *)src; @@ -101,7 +113,11 @@ } #endif -static void conv_cairo32_rgbA8_premul_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +static void +conv_cairo32_rgbA8_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -118,7 +134,11 @@ } } -static void conv_cairo32_rgba8_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +static void +conv_cairo32_rgba8_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -162,7 +182,11 @@ } -static void conv_cairo32_rgbAF_premul_le (const Babl *conversion,unsigned char *src, unsigned char *dst_char, long samples) +static void +conv_cairo32_rgbAF_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst_char, + long samples) { long n = samples; float *dst = (void*)dst_char; @@ -180,8 +204,58 @@ } } + +static void +conv_cairo32_rgbaF_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst_char, + long samples) +{ + long n = samples; + float *dst = (void*)dst_char; + while (n--) + { + unsigned char blue = *src++; + unsigned char green = *src++; + unsigned char red = *src++; + unsigned char alpha = *src++; + + float reciprocal_alpha = 0.0f; + + if (alpha) + reciprocal_alpha = 1.0f/(alpha/255.0f) / 255.0f; + + + *dst++ = red * reciprocal_alpha; + *dst++ = green * reciprocal_alpha; + *dst++ = blue * reciprocal_alpha; + *dst++ = alpha / 255.0; + } +} + + +static void +conv_cairo24_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + long n = samples; + while (n--) + { + *dst++ = (*src++); + *dst++ = (*src++); + *dst++ = (*src++); + *dst++ = 255; src++; + } +} + + static void -conv_rgba8_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; uint32_t *dsti = (void*) dst; @@ -220,7 +294,10 @@ } static void -conv_rgb8_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -240,7 +317,10 @@ static void -conv_yA8_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_yA8_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -261,7 +341,10 @@ } static void -conv_yA16_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_yA16_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; uint16_t *ssrc = (void*) src; @@ -278,7 +361,10 @@ } static void -conv_y8_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_y8_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -292,7 +378,10 @@ } static void -conv_y16_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_y16_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; uint16_t *s16 = (void*)src; @@ -310,7 +399,8 @@ } static void -conv_rgbA_gamma_float_cairo32_le (const Babl *conversion,unsigned char *src, +conv_rgbA_gamma_float_cairo32_le (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -382,7 +472,8 @@ static void -conv_yafloat_cairo32_le (const Babl *conversion,unsigned char *src, +conv_yafloat_cairo32_le (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -423,6 +514,49 @@ } } + +static void +conv_yafloat_nl_cairo32_le (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + float *fsrc = (float *) src; + unsigned char *cdst = (unsigned char *) dst; + int n = samples; + + while (n--) + { + float gray = *fsrc++; + float alpha = *fsrc++; + if (alpha >= 1.0) + { + int val = gray * 0xff + 0.5f; + val = val >= 0xff ? 0xff : val <= 0 ? 0 : val; + *cdst++ = val; + *cdst++ = val; + *cdst++ = val; + *cdst++ = 0xff; + } + else if (alpha <= 0.0) + { + (*(uint32_t*)cdst)=0; + cdst+=4; + } + else + { + float balpha = alpha * 0xff; + int val = gray * balpha + 0.5f; + val = val >= 0xff ? 0xff : val <= 0 ? 0 : val; + *cdst++ = val; + *cdst++ = val; + *cdst++ = val; + *cdst++ = balpha + 0.5f; + } + } +} + + int init (void) { @@ -434,6 +568,7 @@ { const Babl *f32 = babl_format_new ( "name", "cairo-ARGB32", + "doc", "endianness adaptive native cairo format with alpha", babl_model ("R'aG'aB'aA"), babl_type ("u8"), babl_component ("B'a"), @@ -445,6 +580,7 @@ const Babl *f24 = babl_format_new ( "name", "cairo-RGB24", + "doc", "endianness adaptive native cairo format without alpha", babl_model ("R'G'B'"), babl_type ("u8"), babl_component ("B'"), @@ -455,16 +591,24 @@ ); babl_conversion_new (f32, babl_format ("R'aG'aB'aA float"), "linear", - conv_cairo32_rgbAF_premul_le, NULL); + conv_cairo32_rgbAF_le, NULL); + babl_conversion_new (f32, babl_format ("R'aG'aB'aA u8"), "linear", - conv_cairo32_rgbA8_premul_le, NULL); + conv_cairo32_rgbA8_le, NULL); babl_conversion_new (f32, babl_format ("R'G'B'A u8"), "linear", conv_cairo32_rgba8_le, NULL); + + babl_conversion_new (f32, babl_format ("R'G'B'A float"), "linear", + conv_cairo32_rgbaF_le, NULL); + + babl_conversion_new (f24, f32, "linear", + conv_cairo24_cairo32_le, NULL); + babl_conversion_new (babl_format ("R'aG'aB'aA u8"), f32, "linear", - conv_rgbA8_premul_cairo32_le, NULL); + conv_rgbA8_cairo32_le, NULL); babl_conversion_new (babl_format ("R'G'B'A u8"), f32, "linear", conv_rgba8_cairo32_le, NULL); @@ -487,6 +631,8 @@ conv_rgbafloat_cairo32_le, NULL); babl_conversion_new (babl_format ("YA float"), f32, "linear", conv_yafloat_cairo32_le, NULL); + babl_conversion_new (babl_format ("Y'A float"), f32, "linear", + conv_yafloat_nl_cairo32_le, NULL); babl_conversion_new (babl_format ("R'aG'aB'aA float"), f32, "linear", conv_rgbA_gamma_float_cairo32_le, NULL); @@ -500,6 +646,7 @@ { babl_format_new ( "name", "cairo-ARGB32", + "doc", "endianness adaptive native cairo format with alpha", babl_model ("R'aG'aB'aA"), babl_type ("u8"), babl_component ("A"), @@ -510,6 +657,7 @@ ); babl_format_new ( "name", "cairo-RGB24", + "doc", "endianness adaptive native cairo format without alpha", babl_model ("R'G'B'"), babl_type ("u8"), babl_component ("PAD"), @@ -538,6 +686,7 @@ if (littleendian) { babl_format_new ("name", "cairo-ACMK32", + "doc", "3 component CMYK subset format, to be used to two-pass CMYK processing/rendering with cairo.", babl_model ("camayakaA"), babl_type ("u8"), babl_component ("ka"), @@ -546,6 +695,7 @@ babl_component ("A"), NULL); babl_format_new ("name", "cairo-ACYK32", + "doc", "3 component CMYK subset format, to be used to two-pass CMYK processing/rendering with cairo.", babl_model ("camayakaA"), babl_type ("u8"), babl_component ("ka"), @@ -557,6 +707,7 @@ else { babl_format_new ("name", "cairo-ACMK32", + "doc", "3 component CMYK subset format, to be used to two-pass CMYK processing/rendering with cairo.", babl_model ("camayakaA"), babl_type ("u8"), babl_component ("A"), @@ -565,6 +716,7 @@ babl_component ("ka"), NULL); babl_format_new ("name", "cairo-ACYK32", + "doc", "3 component CMYK subset format, to be used to two-pass CMYK processing/rendering with cairo.", babl_model ("camayakaA"), babl_type ("u8"), babl_component ("A"), @@ -577,6 +729,7 @@ /* companion subset formats for setting pango u16 RGB color values from cmykA * */ babl_format_new ("name", "cykA u16", + "doc", "3 component CMYK subset format, to be used to two-pass CMYK processing/rendering with pango.", babl_model ("cmykA"), babl_type ("u16"), babl_component ("cyan"), @@ -585,6 +738,7 @@ babl_component ("A"), NULL); babl_format_new ("name", "cmkA u16", + "doc", "3 component CMYK subset format, to be used to two-pass CMYK processing/rendering with pango.", babl_model ("cmykA"), babl_type ("u16"), babl_component ("cyan"), diff -Nru babl-0.1.63+om~1/extensions/CIE.c babl-0.1.73+om~1/extensions/CIE.c --- babl-0.1.63+om~1/extensions/CIE.c 2018-11-27 14:48:14.000000000 +0000 +++ babl-0.1.73+om~1/extensions/CIE.c 2019-12-09 16:21:18.000000000 +0000 @@ -1,7 +1,7 @@ /* babl - dynamically extendable universal pixel conversion library. - * Copyright (C) 2005, 2014 Øyvind Kolås. + * Copyright (C) 2005, 2014, 2019 Øyvind Kolås. * Copyright (C) 2009, Martin Nordholts - * Copyright (C) 2014, Elle Stone + * Copyright (C) 2014, 2019 Elle Stone * Copyright (C) 2017, 2018 Red Hat, Inc. * * This library is free software; you can redistribute it and/or @@ -57,6 +57,8 @@ #define D50_WHITE_REF_Z 0.824905400f #define NEAR_ZERO 0.0000000001f +#define near_zero(a) ((a) < NEAR_ZERO && (a) > -NEAR_ZERO) + #define D50_WHITE_REF_x 0.345702921222f #define D50_WHITE_REF_y 0.358537532290f @@ -83,16 +85,19 @@ static void components (void) { - babl_component_new ("CIE L", NULL); - babl_component_new ("CIE a", "chroma", NULL); - babl_component_new ("CIE b", "chroma", NULL); - babl_component_new ("CIE C(ab)", "chroma", NULL); - babl_component_new ("CIE H(ab)", "chroma", NULL); + babl_component_new ("CIE L", "doc", "Luminance, range 0.0-100.0 in float", NULL); + babl_component_new ("CIE a", "chroma", "doc", "chroma component 0.0 is no saturation", NULL); + babl_component_new ("CIE b", "chroma", "doc", "chroma component 0.0 is no saturation", NULL); + babl_component_new ("CIE C(ab)", "chroma", "doc", "chrominance/saturation", NULL); + babl_component_new ("CIE H(ab)", "chroma", "doc", "hue value range 0.0-360.0", NULL); babl_component_new ("CIE X", NULL); babl_component_new ("CIE Y", NULL); babl_component_new ("CIE Z", NULL); babl_component_new ("CIE x", NULL); babl_component_new ("CIE y", NULL); + /* CIE 1976 UCS */ + babl_component_new ("CIE u", NULL); + babl_component_new ("CIE v", NULL); /* babl_component_new ("CIE z", NULL);*/ } @@ -101,6 +106,7 @@ { babl_model_new ( "name", "CIE Lab", + "doc", "CIE Lab color model, a perceptually uniform space, euclidian distance in this space represents delta E.", babl_component ("CIE L"), babl_component ("CIE a"), babl_component ("CIE b"), @@ -109,6 +115,7 @@ babl_model_new ( "name", "CIE Lab alpha", + "doc", "CIE Lab color model, with separate alpha", babl_component ("CIE L"), babl_component ("CIE a"), babl_component ("CIE b"), @@ -119,6 +126,7 @@ babl_model_new ( "name", "CIE LCH(ab)", + "doc", "CIE LCH color model, using cylindrical coordinates", babl_component ("CIE L"), babl_component ("CIE C(ab)"), babl_component ("CIE H(ab)"), @@ -127,6 +135,7 @@ babl_model_new ( "name", "CIE LCH(ab) alpha", + "doc", "CIE LCH color model, using cylindrical coordinates, with separate alpha", babl_component ("CIE L"), babl_component ("CIE C(ab)"), babl_component ("CIE H(ab)"), @@ -155,6 +164,7 @@ babl_model_new ( "name", "CIE xyY", + "doc", "the coordinate system often used for drawing chromaticity diagrams. Y is luminance.", babl_component ("CIE x"), babl_component ("CIE y"), babl_component ("CIE Y"), @@ -163,6 +173,7 @@ babl_model_new ( "name", "CIE xyY alpha", + "doc", "the coordinate system often used for drawing chromaticity diagrams. Y is luminance, with separate alpha", babl_component ("CIE x"), babl_component ("CIE y"), babl_component ("CIE Y"), @@ -170,6 +181,24 @@ "CIE", "alpha", NULL); + +/* CIE 1976 UCS */ + babl_model_new ( + "name", "CIE Yuv", + "doc", "A newer more perceptually uniform space than xyY for chromaticity diagrams.", + babl_component ("CIE Y"), + babl_component ("CIE u"), + babl_component ("CIE v"), + NULL); + + babl_model_new ( + "name", "CIE Yuv alpha", + "doc", "A newer more perceptually uniform space than xyY for chromaticity diagrams, with separate alpha.", + babl_component ("CIE Y"), + babl_component ("CIE u"), + babl_component ("CIE v"), + babl_component ("A"), + NULL); } static void rgbcie_init (void); @@ -186,42 +215,59 @@ double *to_a, double *to_b); -static inline void XYZ_to_LAB (double X, - double Y, - double Z, +static inline void XYZ_to_LAB (double X, + double Y, + double Z, double *to_L, double *to_a, double *to_b ); -static inline void LAB_to_XYZ (double L, - double a, - double b, +static inline void LAB_to_XYZ (double L, + double a, + double b, double *to_X, double *to_Y, double *to_Z ); -static inline void XYZ_to_xyY (double X, - double Y, - double Z, +static inline void XYZ_to_xyY (double X, + double Y, + double Z, double *to_x, double *to_y, double *to_Y ); -static inline void xyY_to_XYZ (double x, - double y, +static inline void xyY_to_XYZ (double x, + double y, + double Y, + double *to_X, + double *to_Y, + double *to_Z + ); + +/* CIE 1976 UCS */ +static inline void XYZ_to_Yuv (double X, double Y, + double Z, + double *to_Y, + double *to_u, + double *to_v + ); + +static inline void Yuv_to_XYZ (double Y, + double u, + double v, double *to_X, double *to_Y, double *to_Z ); static inline void -XYZ_to_LAB (double X, - double Y, - double Z, +XYZ_to_LAB (double X, + double Y, + double Z, double *to_L, double *to_a, double *to_b) @@ -240,9 +286,9 @@ } static inline void -LAB_to_XYZ (double L, - double a, - double b, +LAB_to_XYZ (double L, + double a, + double b, double *to_X, double *to_Y, double *to_Z) @@ -265,22 +311,22 @@ *to_Z = zr * D50_WHITE_REF_Z; } - +/* CIE xyY */ static inline void -XYZ_to_xyY (double X, - double Y, - double Z, +XYZ_to_xyY (double X, + double Y, + double Z, double *to_x, double *to_y, double *to_Y) { double sum = X + Y + Z; - if (sum < NEAR_ZERO) + if (near_zero (sum)) { *to_Y = 0.0; *to_x = D50_WHITE_REF_x; *to_y = D50_WHITE_REF_y; } - else + else { *to_x = X / sum; *to_y = Y / sum; @@ -289,19 +335,20 @@ } static inline void -xyY_to_XYZ (double x, - double y, - double Y, +xyY_to_XYZ (double x, + double y, + double Y, double *to_X, double *to_Y, double *to_Z) { - if ( Y < NEAR_ZERO ) - { *to_X = 0.0; + if (near_zero (Y)) + { + *to_X = 0.0; *to_Y = 0.0; *to_Z = 0.0; } - else + else { *to_X = (x * Y) / y; *to_Y = Y; @@ -310,12 +357,65 @@ } +/* CIE 1976 UCS */ + +/* Code for near-zero XYZ and RGB for CIE 1976 UCS patterned + * after code written by and used with kind permission of Graeme Gill. + * Graeme Gill's code is in "icc.c" + * downloadable from http://argyllcms.com/ */ + +static inline void +XYZ_to_Yuv (double X, + double Y, + double Z, + double *to_Y, + double *to_u, + double *to_v) +{ + double sum = X + (15.0 * Y) + (3.0 * Z); + if (near_zero (sum)) + { + *to_Y = 0.0; + *to_u = 4.0/19.0; + *to_v = 9.0/19.0; + } + else + { + *to_Y = Y; + *to_u = (4.0 * X) / sum; + *to_v = (9.0 * Y) / sum; + } +} + +static inline void +Yuv_to_XYZ (double Y, + double u, + double v, + double *to_X, + double *to_Y, + double *to_Z) +{ + if (near_zero (v)) + { + *to_X = 0.0; + *to_Y = 0.0; + *to_Z = 0.0; + } + else + { + *to_X = ((9.0 * u * Y)/(4.0 * v)); + *to_Y = Y; + *to_Z = -(((20.0 * v + 3.0 * u - 12.0) * Y)/(4.0 * v)); + } +} + /* rgb <-> XYZ */ static void -rgba_to_xyz (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_xyz (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); while (n--) @@ -331,9 +431,10 @@ } static void -xyz_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +xyz_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_destination_space (conversion); while (n--) @@ -379,11 +480,11 @@ /* rgb -> xyY */ - static void -rgba_to_xyY (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_xyY (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); while (n--) @@ -429,6 +530,60 @@ } } + + +/* rgb -> Yuv */ +static void +rgba_to_Yuv (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + while (n--) + { + double XYZ[3], Y, u, v; + + babl_space_to_xyz (space, (double*)src, XYZ); + XYZ_to_Yuv (XYZ[0], XYZ[1], XYZ[2], &Y, &u, &v); + + ((double *) dst)[0] = Y; + ((double *) dst)[1] = u; + ((double *) dst)[2] = v; + + src += sizeof (double) * 4; + dst += sizeof (double) * 3; + } +} + +static void +rgba_to_Yuva (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + while (n--) + { + double alpha = ((double *) src)[3]; + double XYZ[3], Y, u, v; + + //convert RGB to XYZ + babl_space_to_xyz (space, (double*)src, XYZ); + + //convert XYZ to Yuv + XYZ_to_Yuv (XYZ[0], XYZ[1], XYZ[2], &Y, &u, &v); + + ((double *) dst)[0] = Y; + ((double *) dst)[1] = u; + ((double *) dst)[2] = v; + ((double *) dst)[3] = alpha; + + src += sizeof (double) * 4; + dst += sizeof (double) * 4; + } +} + + +/* rgbf <->xyYf */ static void rgbaf_to_xyYaf (const Babl *conversion, float *src, @@ -455,7 +610,7 @@ b = src[2]; a = src[3]; - if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) + if (near_zero(r) && near_zero(g) && near_zero(b)) { Y = 0.0f; x = D50_WHITE_REF_x; @@ -505,7 +660,7 @@ g = src[1]; b = src[2]; - if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) + if (near_zero(r) && near_zero(g) && near_zero(b)) { Y = 0.0f; x = D50_WHITE_REF_x; @@ -556,7 +711,7 @@ g = src[1]; b = src[2]; - if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) + if (near_zero(r) && near_zero(g) && near_zero(b)) { Y = 0.0f; x = D50_WHITE_REF_x; @@ -582,12 +737,173 @@ } + +/* rgbf -> Yuv */ +static void +rgbaf_to_Yuvaf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; + float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X; + float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X; + float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; + float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y; + float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y; + float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z; + float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z; + float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float u, v, X, Y, Z, r, g, b, a, sum; + r = src[0]; + g = src[1]; + b = src[2]; + a = src[3]; + + if (near_zero(r) && near_zero(g) && near_zero(b)) + { + Y = 0.0f; + u = 4.0/19.0; + v = 9.0/19.0; + } + else + { + X = m_0_0 * r + m_0_1 * g + m_0_2 * b; + Y = m_1_0 * r + m_1_1 * g + m_1_2 * b; + Z = m_2_0 * r + m_2_1 * g + m_2_2 * b; + + sum = (X + 15.0 * Y + 3.0 * Z); + u = (4.0 * X) / sum; + v = (9.0 * Y) / sum; + } + + dst[0] = Y; + dst[1] = u; + dst[2] = v; + dst[3] = a; + + src += 4; + dst += 4; + } +} + +static void +rgbf_to_Yuvf (const Babl *conversion,float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; + float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X; + float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X; + float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; + float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y; + float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y; + float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z; + float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z; + float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float u, v, X, Y, Z, r, g, b, sum; + r = src[0]; + g = src[1]; + b = src[2]; + + if (near_zero(r) && near_zero(g) && near_zero(b)) + { + Y = 0.0f; + u = 4.0/19.0; + v = 9.0/19.0; + } + else + { + X = m_0_0 * r + m_0_1 * g + m_0_2 * b; + Y = m_1_0 * r + m_1_1 * g + m_1_2 * b; + Z = m_2_0 * r + m_2_1 * g + m_2_2 * b; + + sum = (X + 15.0 * Y + 3.0 * Z); + u = (4.0 * X) / sum; + v = (9.0 * Y) / sum; + } + + dst[0] = Y; + dst[1] = u; + dst[2] = v; + + src += 3; + dst += 3; + } +} + + +static void +rgbaf_to_Yuvf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; + float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X; + float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X; + float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; + float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y; + float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y; + float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z; + float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z; + float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float u, v, X, Y, Z, r, g, b, sum; + r = src[0]; + g = src[1]; + b = src[2]; + + if (near_zero(r) && near_zero(g) && near_zero(b)) + { + Y = 0.0f; + u = 4.0/19.0; + v = 9.0/19.0; + } + else + { + X = m_0_0 * r + m_0_1 * g + m_0_2 * b; + Y = m_1_0 * r + m_1_1 * g + m_1_2 * b; + Z = m_2_0 * r + m_2_1 * g + m_2_2 * b; + + sum = (X + 15.0 * Y + 3.0 * Z); + u = (4.0 * X) / sum; + v = (9.0 * Y) / sum; + } + + dst[0] = Y; + dst[1] = u; + dst[2] = v; + + src += 4; + dst += 3; + } +} + + + + /* xyY -> rgb */ static void -xyY_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +xyY_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_destination_space (conversion); while (n--) @@ -637,8 +953,80 @@ double X, Z; - //convert xyY to XYZ - xyY_to_XYZ (x, y, Y, &X, &Y, &Z); + //convert xyY to XYZ + xyY_to_XYZ (x, y, Y, &X, &Y, &Z); + + { + //convert XYZ to RGB + double XYZ[3] = {X,Y,Z}; + babl_space_from_xyz (space, XYZ, (double*)dst); + } + ((double *) dst)[3] = alpha; + + src += sizeof (double) * 4; + dst += sizeof (double) * 4; + } +} + + + +/* Yuv -> rgb */ + +static void +Yuv_to_rgba (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + while (n--) + { + double Y = ((double *) src)[0]; + double u = ((double *) src)[1]; + double v = ((double *) src)[2]; + + double R, G, B, X, Z; + + //convert Yuv to XYZ + Yuv_to_XYZ (Y, u, v, &X, &Y, &Z); + + //convert XYZ to RGB + { + double XYZ[3] = {X,Y,Z}; + double RGB[3]; + babl_space_from_xyz (space, XYZ, RGB); + R = RGB[0]; + G = RGB[1]; + B = RGB[2]; + } + + ((double *) dst)[0] = R; + ((double *) dst)[1] = G; + ((double *) dst)[2] = B; + ((double *) dst)[3] = 1.0; + + src += sizeof (double) * 3; + dst += sizeof (double) * 4; + } +} + + +static void +Yuva_to_rgba (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + while (n--) + { + double Y = ((double *) src)[0]; + double u = ((double *) src)[1]; + double v = ((double *) src)[2]; + double alpha = ((double *) src)[3]; + + double X, Z; + + //convert Yuv to XYZ + Yuv_to_XYZ (Y, u, v, &X, &Y, &Z); { //convert XYZ to RGB @@ -653,6 +1041,8 @@ } +/* xyYf -> rgbf */ + static void xyYf_to_rgbf (const Babl *conversion,float *src, float *dst, @@ -677,7 +1067,7 @@ float y = src[1]; float Y = src[2]; - if ( Y < NEAR_ZERO ) + if (near_zero (y)) { X = 0.0f; Y = 0.0f; @@ -686,7 +1076,7 @@ else { X = (x * Y) / y; - Y = Y; + //Y = Y; Z = ((1 - x - y) * Y) / y; } @@ -731,7 +1121,7 @@ float Y = src[2]; - if ( Y < NEAR_ZERO ) + if (near_zero (Y)) { X = 0.0f; Y = 0.0f; @@ -740,7 +1130,7 @@ else { X = (x * Y) / y; - Y = Y; + //Y = Y; Z = ((1 - x - y) * Y) / y; } @@ -784,7 +1174,7 @@ float Y = src[2]; float a = src[3]; - if ( Y < NEAR_ZERO ) + if (near_zero (Y)) { X = 0.0f; Y = 0.0f; @@ -793,7 +1183,7 @@ else { X = (x * Y) / y; - Y = Y; + //Y = Y; Z = ((1 - x - y) * Y) / y; } @@ -812,12 +1202,174 @@ } + +/* Yuvf -> rgbf */ + +static void +Yuvf_to_rgbf (const Babl *conversion,float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; + float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y; + float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z; + float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X; + float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y; + float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z; + float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X; + float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y; + float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float X, Z, r, g, b; + float Y = src[0]; + float u = src[1]; + float v = src[2]; + + if (near_zero (v)) + { + X = 0.0f; + Y = 0.0f; + Z = 0.0f; + } + else + { + X = ((9.0 * u * Y)/(4.0 * v)); + //Y = Y; + Z = -(((20.0 * v + 3.0 * u - 12.0) * Y)/(4.0 * v)); + } + + r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z; + g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z; + b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z; + + dst[0] = r; + dst[1] = g; + dst[2] = b; + + src += 3; + dst += 3; + } +} + + + +static void +Yuvf_to_rgbaf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; + float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y; + float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z; + float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X; + float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y; + float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z; + float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X; + float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y; + float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float X, Z, r, g, b; + float Y = src[0]; + float u = src[1]; + float v = src[2]; + + if (near_zero (v)) + { + X = 0.0f; + Y = 0.0f; + Z = 0.0f; + } + else + { + X = ((9.0 * u * Y)/(4.0 * v)); + //Y = Y; + Z = -(((20.0 * v + 3.0 * u - 12.0) * Y)/(4.0 * v)); + } + + r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z; + g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z; + b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z; + + dst[0] = r; + dst[1] = g; + dst[2] = b; + dst[3] = 1.0f; + + src += 3; + dst += 4; + } +} + +static void +Yuvaf_to_rgbaf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; + float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y; + float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z; + float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X; + float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y; + float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z; + float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X; + float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y; + float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float X, Z, r, g, b; + float Y = src[0]; + float u = src[1]; + float v = src[2]; + float a = src[3]; + + if (near_zero (v)) + { + X = 0.0f; + Y = 0.0f; + Z = 0.0f; + } + else + { + X = ((9.0 * u * Y)/(4.0 * v)); + //Y = Y; + Z = -(((20.0 * v + 3.0 * u - 12.0) * Y)/(4.0 * v)); + } + + r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z; + g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z; + b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z; + + dst[0] = r; + dst[1] = g; + dst[2] = b; + dst[3] = a; + + src += 4; + dst += 4; + } +} + + /* rgb <-> LAB */ static void -rgba_to_lab (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_lab (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); while (n--) @@ -838,9 +1390,10 @@ static void -lab_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +lab_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_destination_space (conversion); while (n--) @@ -875,9 +1428,10 @@ } static void -rgba_to_laba (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_laba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); while (n--) @@ -902,9 +1456,10 @@ } static void -laba_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +laba_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_destination_space (conversion); while (n--) @@ -959,9 +1514,10 @@ } static void -rgba_to_lchab (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_lchab (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); @@ -989,9 +1545,10 @@ } static void -lchab_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +lchab_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); @@ -1022,9 +1579,10 @@ } static void -rgba_to_lchaba (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_lchaba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_source_space (conversion); @@ -1053,9 +1611,10 @@ } static void -lchaba_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +lchaba_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { const Babl *space = babl_conversion_get_destination_space (conversion); while (n--) @@ -1118,9 +1677,10 @@ } static void -Yf_to_Lf (const Babl *conversion,float *src, - float *dst, - long samples) +Yf_to_Lf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1137,9 +1697,10 @@ } static void -Yaf_to_Lf (const Babl *conversion,float *src, - float *dst, - long samples) +Yaf_to_Lf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1156,9 +1717,10 @@ } static void -Yaf_to_Laf (const Babl *conversion,float *src, - float *dst, - long samples) +Yaf_to_Laf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1177,9 +1739,10 @@ } static void -rgbf_to_Labf (const Babl *conversion,float *src, - float *dst, - long samples) +rgbf_to_Labf (const Babl *conversion, + float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; @@ -1221,9 +1784,10 @@ } static void -rgbaf_to_Lf (const Babl *conversion,float *src, - float *dst, - long samples) +rgbaf_to_Lf (const Babl *conversion, + float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; @@ -1248,9 +1812,10 @@ } static void -rgbaf_to_Labf (const Babl *conversion,float *src, - float *dst, - long samples) +rgbaf_to_Labf (const Babl *conversion, + float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; @@ -1292,9 +1857,10 @@ } static void -rgbaf_to_Labaf (const Babl *conversion,float *src, - float *dst, - long samples) +rgbaf_to_Labaf (const Babl *conversion, + float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; @@ -1338,9 +1904,10 @@ } static void -Labf_to_Lf (const Babl *conversion,float *src, - float *dst, - long samples) +Labf_to_Lf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1354,9 +1921,10 @@ } static void -Labaf_to_Lf (const Babl *conversion,float *src, - float *dst, - long samples) +Labaf_to_Lf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1370,9 +1938,10 @@ } static void -Labf_to_rgbf (const Babl *conversion,float *src, - float *dst, - long samples) +Labf_to_rgbf (const Babl *conversion, + float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; @@ -1460,9 +2029,10 @@ } static void -Labaf_to_rgbaf (const Babl *conversion,float *src, - float *dst, - long samples) +Labaf_to_rgbaf (const Babl *conversion, + float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; @@ -1506,9 +2076,10 @@ } static void -Labf_to_Lchabf (const Babl *conversion,float *src, - float *dst, - long samples) +Labf_to_Lchabf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1535,9 +2106,10 @@ } static void -Lchabf_to_Labf (const Babl *conversion,float *src, - float *dst, - long samples) +Lchabf_to_Labf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1560,9 +2132,10 @@ } static void -Labaf_to_Lchabaf (const Babl *conversion,float *src, - float *dst, - long samples) +Labaf_to_Lchabaf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1591,9 +2164,10 @@ } static void -Lchabaf_to_Labaf (const Babl *conversion,float *src, - float *dst, - long samples) +Lchabaf_to_Labaf (const Babl *conversion, + float *src, + float *dst, + long samples) { long n = samples; @@ -1704,7 +2278,10 @@ } static void -Yf_to_Lf_sse2 (const Babl *conversion, const float *src, float *dst, long samples) +Yf_to_Lf_sse2 (const Babl *conversion, + const float *src, + float *dst, + long samples) { long i = 0; long remainder; @@ -1742,7 +2319,10 @@ } static void -Yaf_to_Lf_sse2 (const Babl *conversion, const float *src, float *dst, long samples) +Yaf_to_Lf_sse2 (const Babl *conversion, + const float *src, + float *dst, + long samples) { long i = 0; long remainder; @@ -1783,7 +2363,10 @@ } static void -rgbaf_to_Lf_sse2 (const Babl *conversion, const float *src, float *dst, long samples) +rgbaf_to_Lf_sse2 (const Babl *conversion, + const float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); const float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; @@ -1846,7 +2429,10 @@ } static void -rgbaf_to_Labaf_sse2 (const Babl *conversion, const float *src, float *dst, long samples) +rgbaf_to_Labaf_sse2 (const Babl *conversion, + const float *src, + float *dst, + long samples) { const Babl *space = babl_conversion_get_source_space (conversion); const float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; @@ -2034,6 +2620,8 @@ "linear", xyza_to_rgba, NULL ); + + /* CIE xyY */ babl_conversion_new ( babl_model ("RGBA"), babl_model ("CIE xyY"), @@ -2059,6 +2647,32 @@ NULL ); + /* CIE 1976 UCS */ + babl_conversion_new ( + babl_model ("RGBA"), + babl_model ("CIE Yuv"), + "linear", rgba_to_Yuv, + NULL + ); + babl_conversion_new ( + babl_model ("CIE Yuv"), + babl_model ("RGBA"), + "linear", Yuv_to_rgba, + NULL + ); + babl_conversion_new ( + babl_model ("RGBA"), + babl_model ("CIE Yuv alpha"), + "linear", rgba_to_Yuva, + NULL + ); + babl_conversion_new ( + babl_model ("CIE Yuv alpha"), + babl_model ("RGBA"), + "linear", Yuva_to_rgba, + NULL + ); + /* babl_format */ babl_conversion_new ( @@ -2157,6 +2771,8 @@ "linear", Lchabaf_to_Labaf, NULL ); + + /* CIE xyY */ babl_conversion_new ( babl_format ("RGB float"), babl_format ("CIE xyY float"), @@ -2164,9 +2780,9 @@ NULL ); babl_conversion_new ( - babl_format ("CIE xyY float"), - babl_format ("RGB float"), - "linear", xyYf_to_rgbf, + babl_format ("RGBA float"), + babl_format ("CIE xyY alpha float"), + "linear", rgbaf_to_xyYaf, NULL ); babl_conversion_new ( @@ -2177,14 +2793,14 @@ ); babl_conversion_new ( babl_format ("CIE xyY float"), - babl_format ("RGBA float"), - "linear", xyYf_to_rgbaf, + babl_format ("RGB float"), + "linear", xyYf_to_rgbf, NULL ); babl_conversion_new ( + babl_format ("CIE xyY float"), babl_format ("RGBA float"), - babl_format ("CIE xyY alpha float"), - "linear", rgbaf_to_xyYaf, + "linear", xyYf_to_rgbaf, NULL ); babl_conversion_new ( @@ -2193,7 +2809,43 @@ "linear", xyYaf_to_rgbaf, NULL ); - + /* CIE 1976 UCS */ + babl_conversion_new ( + babl_format ("RGB float"), + babl_format ("CIE Yuv float"), + "linear", rgbf_to_Yuvf, + NULL + ); + babl_conversion_new ( + babl_format ("RGBA float"), + babl_format ("CIE Yuv alpha float"), + "linear", rgbaf_to_Yuvaf, + NULL + ); + babl_conversion_new ( + babl_format ("RGBA float"), + babl_format ("CIE Yuv float"), + "linear", rgbaf_to_Yuvf, + NULL + ); + babl_conversion_new ( + babl_format ("CIE Yuv float"), + babl_format ("RGB float"), + "linear", Yuvf_to_rgbf, + NULL + ); + babl_conversion_new ( + babl_format ("CIE Yuv float"), + babl_format ("RGBA float"), + "linear", Yuvf_to_rgbaf, + NULL + ); + babl_conversion_new ( + babl_format ("CIE Yuv alpha float"), + babl_format ("RGBA float"), + "linear", Yuvaf_to_rgbaf, + NULL + ); #if defined(USE_SSE2) if (babl_cpu_accel_get_support () & BABL_CPU_ACCEL_X86_SSE2) @@ -2354,6 +3006,28 @@ babl_component ("CIE Y"), babl_component ("A"), NULL); + + /* CIE 1976 UCS */ + babl_format_new ( + "name", "CIE Yuv float", + babl_model ("CIE Yuv"), + + babl_type ("float"), + babl_component ("CIE Y"), + babl_component ("CIE u"), + babl_component ("CIE v"), + NULL); + + babl_format_new ( + "name", "CIE Yuv alpha float", + babl_model ("CIE Yuv alpha"), + + babl_type ("float"), + babl_component ("CIE Y"), + babl_component ("CIE u"), + babl_component ("CIE v"), + babl_component ("A"), + NULL); } @@ -2362,9 +3036,9 @@ /******** begin integer RGB/CIE color space conversions **************/ static inline void -convert_double_u8_scaled (const Babl *conversion, - double min_val, - double max_val, +convert_double_u8_scaled (const Babl *conversion, + double min_val, + double max_val, unsigned char min, unsigned char max, char *src, @@ -2392,7 +3066,7 @@ } static inline void -convert_u8_double_scaled (const Babl *conversion, +convert_u8_double_scaled (const Babl *conversion, double min_val, double max_val, unsigned char min, @@ -2452,16 +3126,16 @@ #undef MAKE_CONVERSIONS static inline void -convert_float_u8_scaled (const Babl *conversion, +convert_float_u8_scaled (const Babl *conversion, float min_val, float max_val, - unsigned char min, - unsigned char max, - char *src, - char *dst, - int src_pitch, - int dst_pitch, - long n) + unsigned char min, + unsigned char max, + char *src, + char *dst, + int src_pitch, + int dst_pitch, + long n) { while (n--) { @@ -2482,9 +3156,9 @@ } static inline void -convert_u8_float_scaled (const Babl *conversion, - float min_val, - float max_val, +convert_u8_float_scaled (const Babl *conversion, + float min_val, + float max_val, unsigned char min, unsigned char max, char *src, @@ -2618,7 +3292,7 @@ } static inline void -convert_double_u16_scaled (const Babl *conversion, +convert_double_u16_scaled (const Babl *conversion, double min_val, double max_val, unsigned short min, @@ -2648,7 +3322,7 @@ } static inline void -convert_u16_double_scaled (const Babl *conversion, +convert_u16_double_scaled (const Babl *conversion, double min_val, double max_val, unsigned short min, @@ -2706,9 +3380,9 @@ static inline void -convert_float_u16_scaled (const Babl *conversion, - float min_val, - float max_val, +convert_float_u16_scaled (const Babl *conversion, + float min_val, + float max_val, unsigned short min, unsigned short max, char *src, @@ -2736,9 +3410,9 @@ } static inline void -convert_u16_float_scaled (const Babl *conversion, - float min_val, - float max_val, +convert_u16_float_scaled (const Babl *conversion, + float min_val, + float max_val, unsigned short min, unsigned short max, char *src, diff -Nru babl-0.1.63+om~1/extensions/double.c babl-0.1.73+om~1/extensions/double.c --- babl-0.1.63+om~1/extensions/double.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/double.c 2019-12-09 16:21:18.000000000 +0000 @@ -28,7 +28,8 @@ static void -conv_rgbaD_linear_rgbAD_gamma (const Babl *conversion,unsigned char *src, +conv_rgbaD_linear_rgbAD_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -42,16 +43,10 @@ while (n--) { double alpha = fsrc[3]; - if (alpha <= BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } - *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * alpha; - *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * alpha; - *fdst++ = babl_trc_from_linear (trc[2], *fsrc++) * alpha; + double used_alpha = babl_epsilon_for_zero (alpha); + *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * used_alpha; + *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * used_alpha; + *fdst++ = babl_trc_from_linear (trc[2], *fsrc++) * used_alpha; *fdst++ = alpha; fsrc++; } @@ -93,7 +88,8 @@ } static void -conv_rgbaD_linear_rgbaD_gamma (const Babl *conversion,unsigned char *src, +conv_rgbaD_linear_rgbaD_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -116,7 +112,8 @@ #define conv_rgbaD_linear_rgbD_linear conv_rgbaD_gamma_rgbD_gamma static void -conv_rgbaD_linear_rgbD_linear (const Babl *conversion,unsigned char *src, +conv_rgbaD_linear_rgbD_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -135,7 +132,8 @@ static void -conv_rgbD_linear_rgbD_gamma (const Babl *conversion,unsigned char *src, +conv_rgbD_linear_rgbD_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -155,7 +153,8 @@ static void -conv_rgbaD_gamma_rgbaD_linear (const Babl *conversion,unsigned char *src, +conv_rgbaD_gamma_rgbaD_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -175,7 +174,8 @@ } static void -conv_rgbD_gamma_rgbD_linear (const Babl *conversion,unsigned char *src, +conv_rgbD_gamma_rgbD_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -195,7 +195,8 @@ static void -conv_rgbD_linear_rgbaD_linear (const Babl *conversion,unsigned char *src, +conv_rgbD_linear_rgbaD_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { diff -Nru babl-0.1.63+om~1/extensions/fast-float.c babl-0.1.73+om~1/extensions/fast-float.c --- babl-0.1.63+om~1/extensions/fast-float.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/fast-float.c 2019-12-09 16:21:18.000000000 +0000 @@ -36,19 +36,19 @@ { BablLookupFunction function; void *data; - int shift; - uint32_t positive_min, positive_max, negative_min, negative_max; - uint32_t bitmask[babl_LOOKUP_MAX_ENTRIES/32]; - int entries; - float table[]; + int shift; + uint32_t positive_min, positive_max, negative_min, negative_max; + uint32_t bitmask[babl_LOOKUP_MAX_ENTRIES/32]; + int entries; + float table[]; } BablLookup; -static BablLookup *babl_lookup_new (BablLookupFunction function, - void * data, - float start, - float end, - float precision); +static BablLookup *babl_lookup_new (BablLookupFunction function, + void * data, + float start, + float end, + float precision); #if 0 static void babl_lookup_free (BablLookup *lookup); #endif @@ -286,7 +286,8 @@ #endif static void -conv_rgbaF_linear_rgbAF_gamma (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgbAF_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -309,16 +310,10 @@ } else { - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } - *fdst++ = linear_to_gamma_2_2_lut (red) * alpha; - *fdst++ = linear_to_gamma_2_2_lut (green) * alpha; - *fdst++ = linear_to_gamma_2_2_lut (blue) * alpha; + float used_alpha = babl_epsilon_for_zero_float (alpha); + *fdst++ = linear_to_gamma_2_2_lut (red) * used_alpha; + *fdst++ = linear_to_gamma_2_2_lut (green) * used_alpha; + *fdst++ = linear_to_gamma_2_2_lut (blue) * used_alpha; *fdst++ = alpha; } } @@ -327,7 +322,8 @@ static void -conv_rgbaF_linear_rgba8_gamma (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgba8_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -363,7 +359,8 @@ } static void -conv_rgbaF_linear_rgbA8_gamma (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgbA8_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -481,7 +478,8 @@ } static void -conv_rgbAF_linear_rgbAF_gamma (const Babl *conversion,unsigned char *src, +conv_rgbAF_linear_rgbAF_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -515,7 +513,8 @@ } static void -conv_rgbaF_linear_rgbaF_gamma (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgbaF_gamma (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -551,7 +550,8 @@ static void -conv_rgbaF_gamma_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_rgbaF_gamma_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -569,7 +569,8 @@ } static void -conv_rgbF_gamma_rgbF_linear (const Babl *conversion,unsigned char *src, +conv_rgbF_gamma_rgbF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { diff -Nru babl-0.1.63+om~1/extensions/float.c babl-0.1.73+om~1/extensions/float.c --- babl-0.1.63+om~1/extensions/float.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/float.c 2019-12-09 16:21:18.000000000 +0000 @@ -28,8 +28,52 @@ static const Babl *trc_srgb = NULL; + +static void +conv_yaF_linear_yAF_linear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { + float alpha = fsrc[1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + *fdst++ = (*fsrc++) * used_alpha; + *fdst++ = alpha; + fsrc++; + } +} + + static void -conv_rgbaF_linear_rgbAF_nonlinear (const Babl *conversion,unsigned char *src, +conv_yAF_linear_yaF_linear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { + float alpha = fsrc[1]; + float alpha_reciprocal = 1.0f/babl_epsilon_for_zero_float (alpha); + *fdst++ = (*fsrc++) * alpha_reciprocal; + *fdst++ = alpha; + fsrc++; + } +} + + +static void +conv_yaF_linear_yAF_nonlinear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -42,24 +86,42 @@ while (n--) { + float alpha = fsrc[1]; + float used_alpha = babl_epsilon_for_zero_float (alpha); + *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * used_alpha; + *fdst++ = alpha; + fsrc++; + } +} + +static void +conv_rgbaF_linear_rgbAF_nonlinear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl **trc = (void*)space->space.trc; + + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { float alpha = fsrc[3]; - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } - *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * alpha; - *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * alpha; - *fdst++ = babl_trc_from_linear (trc[2], *fsrc++) * alpha; + float used_alpha = babl_epsilon_for_zero_float (alpha); + *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * used_alpha; + *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * used_alpha; + *fdst++ = babl_trc_from_linear (trc[2], *fsrc++) * used_alpha; *fdst++ = alpha; fsrc++; } } static void -conv_rgbaF_linear_rgbAF_perceptual (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgbAF_perceptual (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -70,16 +132,10 @@ while (n--) { float alpha = fsrc[3]; - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } - *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * alpha; - *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * alpha; - *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * alpha; + float used_alpha = babl_epsilon_for_zero (alpha); + *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * used_alpha; + *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * used_alpha; + *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * used_alpha; *fdst++ = alpha; fsrc++; } @@ -121,6 +177,42 @@ } } + +static void +conv_yAF_linear_yAF_nonlinear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl **trc = (void*)space->space.trc; + + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { + float alpha = fsrc[1]; + if (alpha == 0) + { + *fdst++ = 0.0; + *fdst++ = 0.0; + *fdst++ = 0.0; + *fdst++ = 0.0; + fsrc+=4; + } + else + { + float alpha_recip = 1.0 / alpha; + *fdst++ = babl_trc_from_linear (trc[0], *fsrc++ * alpha_recip) * alpha; + *fdst++ = *fsrc++; + } + } +} + + + static void conv_rgbAF_linear_rgbAF_perceptual (const Babl *conversion, unsigned char *src, @@ -156,7 +248,28 @@ static void -conv_rgbaF_linear_rgbaF_nonlinear (const Babl *conversion,unsigned char *src, +conv_yaF_linear_yaF_nonlinear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl **trc = (void*)space->space.trc; + + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { + *fdst++ = babl_trc_from_linear (trc[0], *fsrc++); + *fdst++ = *fsrc++; + } +} + +static void +conv_rgbaF_linear_rgbaF_nonlinear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -177,7 +290,8 @@ } static void -conv_rgbaF_linear_rgbaF_perceptual (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgbaF_perceptual (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -194,9 +308,28 @@ } } +static void +conv_yF_linear_yF_nonlinear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl **trc = (void*)space->space.trc; + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { + *fdst++ = babl_trc_from_linear (trc[0], *fsrc++); + } +} + static void -conv_rgbF_linear_rgbF_nonlinear (const Babl *conversion,unsigned char *src, +conv_rgbF_linear_rgbF_nonlinear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -215,7 +348,8 @@ } static void -conv_rgbF_linear_rgbF_perceptual (const Babl *conversion,unsigned char *src, +conv_rgbF_linear_rgbF_perceptual (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -231,9 +365,9 @@ } } - static void -conv_rgbaF_nonlinear_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_rgbaF_nonlinear_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -252,8 +386,30 @@ } } + static void -conv_rgbaF_perceptual_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_yaF_nonlinear_yaF_linear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl **trc = (void*)space->space.trc; + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { + *fdst++ = babl_trc_to_linear (trc[0], *fsrc++); + *fdst++ = *fsrc++; + } +} + + +static void +conv_rgbaF_perceptual_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -272,7 +428,8 @@ static void -conv_rgbF_nonlinear_rgbF_linear (const Babl *conversion,unsigned char *src, +conv_rgbF_nonlinear_rgbF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -290,8 +447,28 @@ } } + +static void +conv_yF_nonlinear_yF_linear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + const Babl **trc = (void*)space->space.trc; + float *fsrc = (float *) src; + float *fdst = (float *) dst; + int n = samples; + + while (n--) + { + *fdst++ = babl_trc_to_linear (trc[0], *fsrc++); + } +} + static void -conv_rgbF_perceptual_rgbF_linear (const Babl *conversion,unsigned char *src, +conv_rgbF_perceptual_rgbF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -316,6 +493,24 @@ int init (void) { + const Babl *yaF_linear = babl_format_new ( + babl_model ("YA"), + babl_type ("float"), + babl_component ("Y"), + babl_component ("A"), + NULL); + const Babl *yAF_linear = babl_format_new ( + babl_model ("YaA"), + babl_type ("float"), + babl_component ("Ya"), + babl_component ("A"), + NULL); + const Babl *yaF_nonlinear = babl_format_new ( + babl_model ("Y'A"), + babl_type ("float"), + babl_component ("Y'"), + babl_component ("A"), + NULL); const Babl *rgbaF_linear = babl_format_new ( babl_model ("RGBA"), babl_type ("float"), @@ -348,6 +543,12 @@ babl_component ("B~"), babl_component ("A"), NULL); + const Babl *yAF_nonlinear = babl_format_new ( + babl_model ("Y'aA"), + babl_type ("float"), + babl_component ("Y'a"), + babl_component ("A"), + NULL); const Babl *rgbAF_nonlinear = babl_format_new ( babl_model ("R'aG'aB'aA"), babl_type ("float"), @@ -364,6 +565,16 @@ babl_component ("B~a"), babl_component ("A"), NULL); + const Babl *yF_linear = babl_format_new ( + babl_model ("Y"), + babl_type ("float"), + babl_component ("Y"), + NULL); + const Babl *yF_nonlinear = babl_format_new ( + babl_model ("Y'"), + babl_type ("float"), + babl_component ("Y'"), + NULL); const Babl *rgbF_linear = babl_format_new ( babl_model ("RGB"), babl_type ("float"), @@ -394,6 +605,16 @@ o (rgbF_linear, rgbF_nonlinear); o (rgbF_nonlinear, rgbF_linear); + + o (yaF_linear, yAF_linear); + o (yAF_linear, yaF_linear); + o (yAF_linear, yAF_nonlinear); + o (yaF_linear, yAF_nonlinear); + o (yaF_linear, yaF_nonlinear); + o (yaF_nonlinear, yaF_linear); + o (yF_linear, yF_nonlinear); + o (yF_nonlinear, yF_linear); + o (rgbAF_linear, rgbAF_perceptual); o (rgbaF_linear, rgbAF_perceptual); o (rgbaF_linear, rgbaF_perceptual); diff -Nru babl-0.1.63+om~1/extensions/gegl-fixups.c babl-0.1.73+om~1/extensions/gegl-fixups.c --- babl-0.1.63+om~1/extensions/gegl-fixups.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/gegl-fixups.c 2019-12-09 16:21:18.000000000 +0000 @@ -144,7 +144,10 @@ } static inline void -conv_F_8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -161,7 +164,10 @@ static inline void -conv_F_8g (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_8g (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -178,7 +184,10 @@ static inline void __attribute__((unused)) -conv_8_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_8_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -194,7 +203,10 @@ static void -conv_rgbaF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -221,7 +233,10 @@ static void __attribute__((unused)) -conv_rgbaF_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -252,13 +267,19 @@ #define conv_rgbaF_rgbP8 conv_rgbaF_rgba8 static void __attribute__((unused)) -conv_rgbF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8g (conversion, src, dst, samples * 3); } static void __attribute__((unused)) -conv_gaF_ga8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 2); } @@ -269,7 +290,10 @@ static void -conv_rgba8_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -294,7 +318,38 @@ } static void -conv_rgb8_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + long n = samples; + + while (n--) + { + float gray = table_8g_F[*(unsigned char *) src]; + (*(float *) dst) = gray; + dst += 4; + src += 1; + + (*(float *) dst) = gray; + dst += 4; + + (*(float *) dst) = gray; + dst += 4; + + (*(float *) dst) = table_8_F[*(unsigned char *) src]; + dst += 4; + src += 1; + } +} + + +static void +conv_rgb8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -318,7 +373,8 @@ } static void -conv_rgbAF_rgb8 (const Babl *conversion,unsigned char *srcc, +conv_rgbAF_rgb8 (const Babl *conversion, + unsigned char *srcc, unsigned char *dstc, long samples) { @@ -348,7 +404,8 @@ } static void -conv_bgrA8_rgba8 (const Babl *conversion,unsigned char *srcc, +conv_bgrA8_rgba8 (const Babl *conversion, + unsigned char *srcc, unsigned char *dstc, long samples) { @@ -369,7 +426,8 @@ } static void -conv_rgbaF_rgbAF (const Babl *conversion,unsigned char *srcc, +conv_rgbaF_rgbAF (const Babl *conversion, + unsigned char *srcc, unsigned char *dstc, long samples) { @@ -380,16 +438,10 @@ while (n--) { float alpha = src[3]; - if (alpha < BABL_ALPHA_FLOOR) - { - if (alpha >= 0.0f) - alpha = BABL_ALPHA_FLOOR; - else if (alpha >= -BABL_ALPHA_FLOOR) - alpha = -BABL_ALPHA_FLOOR; - } - dst[0] = src[0] * alpha; - dst[1] = src[1] * alpha; - dst[2] = src[2] * alpha; + float used_alpha = babl_epsilon_for_zero_float (alpha); + dst[0] = src[0] * used_alpha; + dst[1] = src[1] * used_alpha; + dst[2] = src[2] * used_alpha; dst[3] = alpha; src += 4; dst += 4; @@ -397,7 +449,8 @@ } static void -conv_rgbAF_rgbaF (const Babl *conversion,unsigned char *srcc, +conv_rgbAF_rgbaF (const Babl *conversion, + unsigned char *srcc, unsigned char *dstc, long samples) { @@ -408,17 +461,13 @@ while (n--) { float alpha = src[3]; - float recip; - if (alpha == 0.0f) - recip = 0.0f; - else - recip = 1.0f/alpha; + float used_alpha = babl_epsilon_for_zero_float (alpha); + float recip = 1.0f/used_alpha; dst[0] = src[0] * recip; dst[1] = src[1] * recip; dst[2] = src[2] * recip; - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0f; + dst[3] = alpha; src += 4; dst += 4; @@ -427,7 +476,8 @@ static void -conv_rgbAF_lrgba8 (const Babl *conversion,unsigned char *srcc, +conv_rgbAF_lrgba8 (const Babl *conversion, + unsigned char *srcc, unsigned char *dstc, long samples) { @@ -438,27 +488,23 @@ while (n--) { float alpha = src[3]; - if (alpha == 0.0f) - { - dst[0] = dst[1] = dst[2] = dst[3] = 0; - } - else - { - float recip = (1.0/alpha); - if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) - alpha = 0.0f; - dst[0] = table_F_8[gggl_float_to_index16 (src[0] * recip)]; - dst[1] = table_F_8[gggl_float_to_index16 (src[1] * recip)]; - dst[2] = table_F_8[gggl_float_to_index16 (src[2] * recip)]; - dst[3] = table_F_8[gggl_float_to_index16 (alpha)]; - } + float used_alpha = babl_epsilon_for_zero_float (alpha); + float recip = (1.0f/used_alpha); + + dst[0] = table_F_8[gggl_float_to_index16 (src[0] * recip)]; + dst[1] = table_F_8[gggl_float_to_index16 (src[1] * recip)]; + dst[2] = table_F_8[gggl_float_to_index16 (src[2] * recip)]; + dst[3] = table_F_8[gggl_float_to_index16 (alpha)]; src += 4; dst += 4; } } static void -conv_rgba8_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples - 1; @@ -549,6 +595,12 @@ babl_component ("G'"), babl_component ("B'"), NULL); + const Babl *ga8 = babl_format_new ( + babl_model ("Y'A"), + babl_type ("u8"), + babl_component ("Y'"), + babl_component ("A"), + NULL); table_init (); @@ -567,6 +619,7 @@ o (rgbAF, rgb8); o (bgrA8, rgba8); o (rgba8, rgb8); + o (ga8, rgbaF); return 0; } diff -Nru babl-0.1.63+om~1/extensions/gggl.c babl-0.1.73+om~1/extensions/gggl.c --- babl-0.1.63+om~1/extensions/gggl.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/gggl.c 2019-12-09 16:21:18.000000000 +0000 @@ -50,7 +50,10 @@ */ static void -conv_F_8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -69,7 +72,10 @@ } static void -conv_F_16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -94,7 +100,10 @@ } static void -conv_8_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_8_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -107,7 +116,10 @@ } static void -conv_16_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_16_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -120,7 +132,10 @@ } static void -conv_rgbaF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -145,7 +160,10 @@ } static void -conv_F_D (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_D (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -158,7 +176,10 @@ } static void -conv_D_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_D_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -171,7 +192,10 @@ } static void -conv_16_8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_16_8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -196,7 +220,10 @@ } static inline void -conv_8_16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_8_16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; while (n--) @@ -210,19 +237,28 @@ /*********/ static void -conv_rgbaF_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 4); } static void -conv_rgbF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 2); } @@ -232,19 +268,28 @@ #define conv_gAF_gA8 conv_gaF_ga8 static void -conv_rgbaF_rgba16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 4); } static void -conv_rgbF_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 2); } @@ -254,20 +299,29 @@ #define conv_gAF_gA16 conv_gaF_ga16 static void -conv_rgba8_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 4); } static void -conv_rgb8_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 3); } static void -conv_ga8_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga8_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 2); } @@ -277,31 +331,46 @@ #define conv_g8_gF conv_8_F static void -conv_rgbaF_rgbaD (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgbaD (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_D (conversion, src, dst, samples * 4); } static void -conv_rgbaD_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaD_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_D_F (conversion, src, dst, samples * 4); } static void -conv_rgba16_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba16_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 4); } static void -conv_rgb16_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb16_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 3); } static void -conv_ga16_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga16_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 2); } @@ -311,19 +380,28 @@ #define conv_g16_gF conv_16_F static void -conv_rgba16_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba16_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_8 (conversion, src, dst, samples * 4); } static void -conv_rgb16_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb16_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_8 (conversion, src, dst, samples * 3); } static void -conv_ga16_ga8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga16_ga8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_8 (conversion, src, dst, samples * 2); } @@ -333,19 +411,28 @@ #define conv_g16_g8 conv_16_8 static void -conv_rgba8_rgba16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgba16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_16 (conversion, src, dst, samples * 4); } static void -conv_rgb8_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_16 (conversion, src, dst, samples * 3); } static void -conv_ga8_ga16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga8_ga16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_16 (conversion, src, dst, samples * 2); } @@ -357,7 +444,10 @@ /* alpha conversions */ static void -conv_gaF_gAF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_gAF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -375,7 +465,10 @@ } static void -conv_gAF_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gAF_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -398,7 +491,10 @@ /* alpha stripping and adding */ static void -conv_rgbaF_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -418,7 +514,10 @@ } static void -conv_rgbF_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; float *fsrc = (void*) src; @@ -437,7 +536,10 @@ static void -conv_gaF_gF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_gF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -451,7 +553,10 @@ } static void -conv_gF_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gF_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -472,7 +577,10 @@ /* colorchannel dropping and adding */ static void -conv_gF_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gF_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -490,7 +598,10 @@ } static void -conv_g8_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_g8_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -505,7 +616,10 @@ } #define conv_g8_rgbA8 conv_g8_rgba8 static void -conv_g8_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_g8_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -521,7 +635,10 @@ } static void -conv_gaF_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -547,7 +664,10 @@ static void -conv_rgbaF_rgbA8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgbA8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -569,7 +689,10 @@ } static void -conv_rgbaF_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -593,7 +716,10 @@ } static void -conv_rgbA16_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbA16_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -621,7 +747,10 @@ } static void -conv_gF_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gF_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -721,7 +850,10 @@ } */ static void -conv_rgba8_rgbA8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgbA8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -749,7 +881,10 @@ } static void -conv_rgbA8_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbA8_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -781,7 +916,10 @@ } static void -conv_rgb8_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples-1; while (n--) @@ -799,7 +937,10 @@ #define conv_rgb8_rgbA8 conv_rgb8_rgba8 static void -conv_rgba8_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -814,7 +955,10 @@ } static void -conv_rgbA8_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbA8_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -869,7 +1013,10 @@ static void -conv_yuvaF_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_yuvaF_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { float *src_f = (float *) src; float *dst_f = (float *) dst; @@ -900,7 +1047,10 @@ static void -conv_yuvF_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_yuvF_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { float *src_f = (float *) src; float *dst_f = (float *) dst; diff -Nru babl-0.1.63+om~1/extensions/gggl-lies.c babl-0.1.73+om~1/extensions/gggl-lies.c --- babl-0.1.63+om~1/extensions/gggl-lies.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/gggl-lies.c 2019-12-09 16:21:18.000000000 +0000 @@ -49,7 +49,10 @@ */ static void -conv_F_8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -74,7 +77,10 @@ } static void -conv_F_16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -101,7 +107,10 @@ static void -conv_8_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_8_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -114,7 +123,10 @@ } static void -conv_16_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_16_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -127,7 +139,10 @@ } static void -conv_F_D (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_D (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -140,7 +155,10 @@ } static void -conv_D_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_D_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -153,7 +171,10 @@ } static void -conv_16_8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_16_8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -178,7 +199,10 @@ } static void -conv_8_16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_8_16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -192,7 +216,10 @@ /*********/ static void -conv_rgbaF_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 4); } @@ -200,13 +227,19 @@ #define conv_rgbaF_rgbP8 conv_rgbaF_rgba8 static void -conv_rgbF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 2); } @@ -216,31 +249,46 @@ #define conv_gAF_gA8 conv_gaF_ga8 static void -conv_rgbaF_rgba16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 4); } static void -conv_rgbaF_rgbaD (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgbaD (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_D (conversion, src, dst, samples * 4); } static void -conv_rgbaD_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaD_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_D_F (conversion, src, dst, samples * 4); } static void -conv_rgbF_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 2); } @@ -252,19 +300,28 @@ #define conv_gAF_gA16 conv_gaF_ga16 static void -conv_rgba8_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 4); } static void -conv_rgb8_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 3); } static void -conv_ga8_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga8_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 2); } @@ -274,19 +331,28 @@ #define conv_g8_gF conv_8_F static void -conv_rgba16_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba16_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 4); } static void -conv_rgb16_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb16_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 3); } static void -conv_ga16_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga16_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 2); } @@ -296,19 +362,28 @@ #define conv_g16_gF conv_16_F static void -conv_rgba16_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba16_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_8 (conversion, src, dst, samples * 4); } static void -conv_rgb16_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb16_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_8 (conversion, src, dst, samples * 3); } static void -conv_ga16_ga8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga16_ga8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_8 (conversion, src, dst, samples * 2); } @@ -318,19 +393,28 @@ #define conv_g16_g8 conv_16_8 static void -conv_rgba8_rgba16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgba16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_16 (conversion, src, dst, samples * 4); } static void -conv_rgb8_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_16 (conversion, src, dst, samples * 3); } static void -conv_ga8_ga16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga8_ga16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_16 (conversion, src, dst, samples * 2); } @@ -342,7 +426,10 @@ /* alpha conversions */ static void -conv_gaF_gAF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_gAF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -360,7 +447,10 @@ } static void -conv_gAF_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gAF_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -383,7 +473,10 @@ /* alpha stripping and adding */ static void -conv_rgbaF_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -404,7 +497,10 @@ static void -conv_gF_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gF_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -425,7 +521,10 @@ #define conv_gF_rgbAF conv_gF_rgbaF static void -conv_rgbF_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -446,7 +545,10 @@ } static void -conv_gaF_gF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_gF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -460,7 +562,10 @@ } static void -conv_gF_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gF_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -481,7 +586,10 @@ /* colorchannel dropping and adding */ static void -conv_gF_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gF_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -499,7 +607,10 @@ } static void -conv_gaF_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -524,7 +635,10 @@ /* other conversions coded for some optimisation reason or sumthin */ static void -conv_rgbaF_rgbA8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgbA8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -546,7 +660,10 @@ } static void -conv_rgbaF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -565,7 +682,10 @@ } static void -conv_rgbaF_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -584,7 +704,10 @@ } static void -conv_rgba8_rgbA8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgbA8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -612,7 +735,10 @@ } static void -conv_rgbA8_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbA8_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -641,7 +767,10 @@ } static void -conv_rgb8_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -660,7 +789,10 @@ #define conv_rgb8_rgbA8 conv_rgb8_rgba8 static void -conv_rgba8_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; diff -Nru babl-0.1.63+om~1/extensions/gggl-table.c babl-0.1.73+om~1/extensions/gggl-table.c --- babl-0.1.63+om~1/extensions/gggl-table.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/gggl-table.c 2019-12-09 16:21:18.000000000 +0000 @@ -144,7 +144,10 @@ } static void -conv_F_8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -161,7 +164,10 @@ static void -conv_F_16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -177,7 +183,10 @@ } static void -conv_8_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_8_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -192,7 +201,10 @@ } static void -conv_rgb8_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -215,7 +227,10 @@ } static void -conv_16_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_16_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -230,7 +245,10 @@ } static void -conv_rgbaF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -258,19 +276,28 @@ /*********/ static void -conv_rgbaF_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 4); } static void -conv_rgbF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 2); } @@ -280,19 +307,28 @@ #define conv_gAF_gA8 conv_gaF_ga8 static void -conv_rgbaF_rgba16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 4); } static void -conv_rgbF_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 2); } @@ -302,20 +338,29 @@ #define conv_gAF_gA16 conv_gaF_ga16 static void -conv_rgba8_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 4); } static void -conv_rgb8_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 3); } static void -conv_ga8_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga8_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 2); } @@ -325,19 +370,28 @@ #define conv_g8_gF conv_8_F static void -conv_rgba16_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba16_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 4); } static void -conv_rgb16_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb16_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 3); } static void -conv_ga16_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga16_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 2); } diff -Nru babl-0.1.63+om~1/extensions/gggl-table-lies.c babl-0.1.73+om~1/extensions/gggl-table-lies.c --- babl-0.1.63+om~1/extensions/gggl-table-lies.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/gggl-table-lies.c 2019-12-09 16:21:18.000000000 +0000 @@ -152,7 +152,10 @@ static void -conv_F_8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -168,7 +171,10 @@ } static void -conv_F_16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_F_16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -184,7 +190,10 @@ } static void -conv_8_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_8_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -199,7 +208,10 @@ } static void -conv_16_F (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_16_F (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { long n = samples; @@ -215,7 +227,10 @@ /*********/ static void -conv_rgbaF_rgba8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 4); } @@ -223,13 +238,19 @@ #define conv_rgbaF_rgbP8 conv_rgbaF_rgba8 static void -conv_rgbF_rgb8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga8 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga8 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_8 (conversion, src, dst, samples * 2); } @@ -239,19 +260,28 @@ #define conv_gAF_gA8 conv_gaF_ga8 static void -conv_rgbaF_rgba16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbaF_rgba16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 4); } static void -conv_rgbF_rgb16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgbF_rgb16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 3); } static void -conv_gaF_ga16 (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_gaF_ga16 (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_F_16 (conversion, src, dst, samples * 2); } @@ -261,19 +291,28 @@ #define conv_gAF_gA16 conv_gaF_ga16 static void -conv_rgba8_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba8_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 4); } static void -conv_rgb8_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb8_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 3); } static void -conv_ga8_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga8_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_8_F (conversion, src, dst, samples * 2); } @@ -283,19 +322,28 @@ #define conv_g8_gF conv_8_F static void -conv_rgba16_rgbaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgba16_rgbaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 4); } static void -conv_rgb16_rgbF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_rgb16_rgbF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 3); } static void -conv_ga16_gaF (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples) +conv_ga16_gaF (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { conv_16_F (conversion, src, dst, samples * 2); } @@ -305,7 +353,8 @@ #define conv_g16_gF conv_16_F static void -conv_rgbafloat_linear_cairo32_le (const Babl *conversion,unsigned char *src_char, +conv_rgbafloat_linear_cairo32_le (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { diff -Nru babl-0.1.63+om~1/extensions/gimp-8bit.c babl-0.1.73+om~1/extensions/gimp-8bit.c --- babl-0.1.63+om~1/extensions/gimp-8bit.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/gimp-8bit.c 2019-12-09 16:21:18.000000000 +0000 @@ -68,7 +68,8 @@ } static inline void -u8_linear_to_float_linear (const Babl *conversion,unsigned char *src, +u8_linear_to_float_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -81,9 +82,10 @@ static void -u8_linear_to_float_linear_premul (const Babl *conversion,unsigned char *src, - unsigned char *dst, - long samples) +u8_linear_to_float_linear_assoc (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { float *d = (float *) dst; long n = samples; @@ -101,7 +103,8 @@ } static inline void -u8_gamma_2_2_to_float_linear (const Babl *conversion,unsigned char *src, +u8_gamma_2_2_to_float_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -114,7 +117,8 @@ } static void -conv_rgba8_linear_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_rgba8_linear_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -122,16 +126,18 @@ } static void -conv_rgba8_linear_ragabaaF_linear (const Babl *conversion,unsigned char *src, - unsigned char *dst, - long samples) +conv_rgba8_linear_ragabaaF_linear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) { - u8_linear_to_float_linear_premul (conversion, src, dst, samples); + u8_linear_to_float_linear_assoc (conversion, src, dst, samples); } static void -conv_rgba8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_rgba8_gamma_2_2_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -149,7 +155,8 @@ } static void -conv_rgb8_linear_rgbF_linear (const Babl *conversion,unsigned char *src, +conv_rgb8_linear_rgbF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -157,7 +164,8 @@ } static void -conv_rgb8_gamma_2_2_rgbF_linear (const Babl *conversion,unsigned char *src, +conv_rgb8_gamma_2_2_rgbF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -165,7 +173,8 @@ } static void -conv_rgb8_linear_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_rgb8_linear_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -184,7 +193,8 @@ #define conv_rgb8_linear_ragabaaF_linear conv_rgb8_linear_rgbaF_linear static void -conv_rgb8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_rgb8_gamma_2_2_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -202,7 +212,8 @@ } static void -conv_ga8_linear_gaF_linear (const Babl *conversion,unsigned char *src, +conv_ga8_linear_gaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -210,7 +221,8 @@ } static void -conv_ga8_gamma_2_2_gaF_linear (const Babl *conversion,unsigned char *src, +conv_ga8_gamma_2_2_gaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -226,7 +238,8 @@ } static void -conv_ga8_gamma_2_2_rgba8_gamma_2_2 (const Babl *conversion,unsigned char *src, +conv_ga8_gamma_2_2_rgba8_gamma_2_2 (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -242,7 +255,8 @@ } static void -conv_ga8_linear_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_ga8_linear_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -261,7 +275,8 @@ } static void -conv_ga8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_ga8_gamma_2_2_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -281,7 +296,8 @@ } static void -conv_g8_linear_gF_linear (const Babl *conversion,unsigned char *src, +conv_g8_linear_gF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -289,7 +305,8 @@ } static void -conv_g8_gamma_2_2_gF_linear (const Babl *conversion,unsigned char *src, +conv_g8_gamma_2_2_gF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -297,7 +314,8 @@ } static void -conv_g8_linear_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_g8_linear_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -316,7 +334,8 @@ } static void -conv_g8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src, +conv_g8_gamma_2_2_rgbaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -336,7 +355,8 @@ } static void -conv_rgbaF_linear_rgb8_linear (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgb8_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -360,7 +380,8 @@ } static void -conv_rgbaF_linear_rgba8_linear (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_rgba8_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { diff -Nru babl-0.1.63+om~1/extensions/grey.c babl-0.1.73+om~1/extensions/grey.c --- babl-0.1.63+om~1/extensions/grey.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/grey.c 2019-12-09 16:21:18.000000000 +0000 @@ -25,7 +25,8 @@ #include "extensions/util.h" static void -conv_rgbaF_linear_y8_linear (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_y8_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -53,7 +54,8 @@ } static void -conv_rgbaF_linear_yF_linear (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_yF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -79,7 +81,8 @@ } static void -conv_rgbaF_linear_yaF_linear (const Babl *conversion,unsigned char *src, +conv_rgbaF_linear_yaF_linear (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -104,6 +107,28 @@ } } +static void +conv_yaF_linear_rgbaF_linear (const Babl *conversion, + unsigned char *src, + unsigned char *dst, + long samples) +{ + float *s = (float *) src; + float *d = (float *) dst; + long n = samples; + + while (n--) + { + float value; + value = *s++; + *d++ = value; + *d++ = value; + *d++ = value; + *d++ = *s++; /* alpha */ + } +} + + int init (void); int @@ -127,5 +152,24 @@ conv_rgbaF_linear_yaF_linear, NULL); + + babl_conversion_new (babl_format ("YA float"), + babl_format ("RGBA float"), + "linear", + conv_yaF_linear_rgbaF_linear, + NULL); + + babl_conversion_new (babl_format ("YaA float"), + babl_format ("RaGaBaA float"), + "linear", + conv_yaF_linear_rgbaF_linear, + NULL); + + babl_conversion_new (babl_format ("Y'A float"), + babl_format ("R'G'B'A float"), + "linear", + conv_yaF_linear_rgbaF_linear, + NULL); + return 0; } diff -Nru babl-0.1.63+om~1/extensions/half.c babl-0.1.73+om~1/extensions/half.c --- babl-0.1.63+om~1/extensions/half.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/half.c 2019-12-09 16:21:18.000000000 +0000 @@ -75,7 +75,10 @@ #include "babl.h" #include "extensions/util.h" -static void halfp2singles_fun(void *target, const void *source, long numel) +static void +halfp2singles_fun(void *target, + const void *source, + long numel) { uint16_t *hp = (uint16_t *) source; // Type pun input as an unsigned 16-bit int uint32_t *xp = (uint32_t *) target; // Type pun output as an unsigned 32-bit int @@ -124,7 +127,10 @@ static float half_float_table[65536]; -static void halfp2singles(void *target, const void *source, long numel) +static void +halfp2singles(void *target, + const void *source, + long numel) { uint16_t *src = (uint16_t *) source; float *dst = (float *) target; @@ -204,7 +210,8 @@ 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,13 }; -static inline unsigned short float_to_half_float(float f) +static inline unsigned short +float_to_half_float(float f) { // See Blink::Source/platform/graphics/gpu/WebGLImageConversion.cpp::convertFloatToHalfFloat() and http://crbug.com/491784 union { @@ -219,7 +226,10 @@ return half_float_base_table[signexp] + ((temp & 0x007fffff) >> half_float_shift_table[signexp]); } -static void singles2halfp(void *target, const void *source, long numel) +static void +singles2halfp(void *target, + const void *source, + long numel) { const float *src = source; uint16_t *dst = target; @@ -229,25 +239,37 @@ } static inline void -conv_yHalf_yF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_yHalf_yF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { halfp2singles(dst, src, samples); } static void -conv_yaHalf_yaF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_yaHalf_yaF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { conv_yHalf_yF (conversion, src, dst, samples * 2); } static void -conv_rgbHalf_rgbF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_rgbHalf_rgbF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { conv_yHalf_yF (conversion, src, dst, samples * 3); } static void -conv_rgbaHalf_rgbaF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_rgbaHalf_rgbaF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { conv_yHalf_yF (conversion, src, dst, samples * 4); } @@ -255,32 +277,47 @@ #define conv_rgbAHalf_rgbAF conv_rgbaHalf_rgbaF static void -conv_yF_yHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_yF_yHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { singles2halfp (dst, src, samples); } static void -conv_yaF_yaHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_yaF_yaHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv_yF_yHalf (conversion, src, dst, samples * 2); } static void -conv_rgbF_rgbHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_rgbF_rgbHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv_yF_yHalf (conversion, src, dst, samples * 3); } static void -conv_rgbaF_rgbaHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_rgbaF_rgbaHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv_yF_yHalf (conversion, src, dst, samples * 4); } #define conv_rgbAF_rgbAHalf conv_rgbaF_rgbaHalf -static void singles2halfp2(void *target, const void *source, long numel) +static void +singles2halfp2(void *target, + const void *source, + long numel) { uint16_t *hp = (uint16_t *) target; // Type pun output as an unsigned 16-bit int uint32_t *xp = (uint32_t *) source; // Type pun input as an unsigned 32-bit int @@ -336,29 +373,44 @@ } static void -conv2_yF_yHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv2_yF_yHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { singles2halfp2 (dst, src, samples); } static void -conv2_yaF_yaHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv2_yaF_yaHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv2_yF_yHalf (conversion, src, dst, samples * 2); } static void -conv2_rgbF_rgbHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv2_rgbF_rgbHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv2_yF_yHalf (conversion, src, dst, samples * 3); } static void -conv2_rgbaF_rgbaHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv2_rgbaF_rgbaHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv2_yF_yHalf (conversion, src, dst, samples * 4); } +#define conv_yAF_yAHalf conv_yaF_yaHalf +#define conv_yAHalf_yAF conv_yaHalf_yaF + int init (void); int @@ -464,24 +516,48 @@ babl_component ("Y"), babl_component ("A"), NULL); + const Babl *yAF_linear = babl_format_new ( + babl_model ("YaA"), + babl_type ("float"), + babl_component ("Ya"), + babl_component ("A"), + NULL); const Babl *yaHalf_linear = babl_format_new ( babl_model ("YA"), babl_type ("half"), babl_component ("Y"), babl_component ("A"), NULL); + const Babl *yAHalf_linear = babl_format_new ( + babl_model ("YaA"), + babl_type ("half"), + babl_component ("Ya"), + babl_component ("A"), + NULL); const Babl *yaF_gamma = babl_format_new ( babl_model ("Y'A"), babl_type ("float"), babl_component ("Y'"), babl_component ("A"), NULL); + const Babl *yAF_gamma = babl_format_new ( + babl_model ("Y'aA"), + babl_type ("float"), + babl_component ("Y'a"), + babl_component ("A"), + NULL); const Babl *yaHalf_gamma = babl_format_new ( babl_model ("Y'A"), babl_type ("half"), babl_component ("Y'"), babl_component ("A"), NULL); + const Babl *yAHalf_gamma = babl_format_new ( + babl_model ("Y'aA"), + babl_type ("half"), + babl_component ("Y'a"), + babl_component ("A"), + NULL); const Babl *yF_linear = babl_format_new ( babl_model ("Y"), babl_type ("float"), @@ -532,6 +608,10 @@ CONV(rgbF, rgbHalf); CONV(yaF, yaHalf); CONV(yF, yHalf); + + CONV(yAF, yAHalf); + CONV(yAHalf, yAF); + CONV2(rgbaF, rgbaHalf); CONV2(rgbF, rgbHalf); CONV2(yaF, yaHalf); diff -Nru babl-0.1.63+om~1/extensions/HCY.c babl-0.1.73+om~1/extensions/HCY.c --- babl-0.1.63+om~1/extensions/HCY.c 2018-11-27 14:48:14.000000000 +0000 +++ babl-0.1.73+om~1/extensions/HCY.c 2019-12-09 16:21:18.000000000 +0000 @@ -29,33 +29,37 @@ #include "babl.h" #include "base/util.h" -/* Rec. 601 as in original code //Rec. 709 */ -#define RGB_LUMA_RED 0.299 //0.2126 -#define RGB_LUMA_GREEN 0.587 //0.7152 -#define RGB_LUMA_BLUE 0.114 //0.0722 #define EPSILON 1e-10 -static void rgba_to_hcya (const Babl *conversion,char *src, - char *dst, - long samples); - -static void hcya_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples); - -static void rgba_to_hcy (const Babl *conversion,char *src, - char *dst, - long samples); - -static void hcy_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples); +static void rgba_to_hcya (const Babl *conversion, + char *src, + char *dst, + long samples); + +static void hcya_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples); + +static void rgba_to_hcy (const Babl *conversion, + char *src, + char *dst, + long samples); + +static void hcy_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples); -static void rgba_to_hcy_step (char *src, - char *dst); +static void +rgba_to_hcy_step (char *src, + char *dst, + const double weights[3]); -static void hcy_to_rgba_step (char *src, - char *dst); +static void +hcy_to_rgba_step (char *src, + char *dst, + const double weights[3]); static void components (void); static void models (void); @@ -142,33 +146,34 @@ static void formats (void) { + babl_format_new ( - "name", "HCYA float", - babl_model ("HCYA"), + "name", "HCY float", + babl_model ("HCY"), babl_type ("float"), babl_component ("hue"), babl_component ("HCY chroma"), babl_component ("HCY luma"), - babl_component ("alpha"), NULL ); babl_format_new ( - "name", "HCY float", - babl_model ("HCY"), + "name", "HCYA float", + babl_model ("HCYA"), babl_type ("float"), babl_component ("hue"), babl_component ("HCY chroma"), babl_component ("HCY luma"), + babl_component ("alpha"), NULL ); } static void rgba_to_hcy_step (char *src, - char *dst) + char *dst, + const double weights[3]) { - static const double weights[3] = {RGB_LUMA_RED,RGB_LUMA_GREEN,RGB_LUMA_BLUE}; double hue, chroma, luma; double X, Y_peak = 0.; int H_sec = 4, t = -1; @@ -213,7 +218,8 @@ static void hcy_to_rgba_step (char *src, - char *dst) + char *dst, + const double weights[3]) { double red, green, blue; double Y_peak = 0., H_insec, X, m; @@ -233,50 +239,50 @@ { case 0: H_insec = hue - H_sec; - Y_peak = RGB_LUMA_RED + H_insec * RGB_LUMA_GREEN; + Y_peak = weights[0] + H_insec * weights[1]; chroma *= luma < Y_peak ? luma/Y_peak : (1. - luma)/(1. - Y_peak); X = chroma * H_insec; - m = luma - (RGB_LUMA_RED * chroma + RGB_LUMA_GREEN * X); + m = luma - (weights[0] * chroma + weights[1] * X); red = m + chroma; green = m + X; blue = m; break; case 1: H_insec = 1. - (hue - H_sec); - Y_peak = RGB_LUMA_GREEN + H_insec * RGB_LUMA_RED; + Y_peak = weights[1] + H_insec * weights[0]; chroma *= luma < Y_peak ? luma/Y_peak : (1. - luma)/(1. - Y_peak); X = chroma * H_insec; - m = luma - (RGB_LUMA_RED * X + RGB_LUMA_GREEN * chroma); + m = luma - (weights[0] * X + weights[1] * chroma); red = m + X; green = m + chroma; blue = m; break; case 2: H_insec = hue - H_sec; - Y_peak = RGB_LUMA_GREEN + H_insec * RGB_LUMA_BLUE; + Y_peak = weights[1] + H_insec * weights[2]; chroma *= luma < Y_peak ? luma/Y_peak : (1. - luma)/(1. - Y_peak); X = chroma * H_insec; - m = luma - (RGB_LUMA_GREEN * chroma + RGB_LUMA_BLUE * X); + m = luma - (weights[1] * chroma + weights[2] * X); red = m; green = m + chroma; blue = m + X; break; case 3: H_insec = 1. - (hue - H_sec); - Y_peak = RGB_LUMA_BLUE + H_insec * RGB_LUMA_GREEN; + Y_peak = weights[2] + H_insec * weights[1]; chroma *= luma < Y_peak ? luma/Y_peak : (1. - luma)/(1. - Y_peak); X = chroma * H_insec; - m = luma - (RGB_LUMA_GREEN * X + RGB_LUMA_BLUE * chroma); + m = luma - (weights[1] * X + weights[2] * chroma); red = m; green = m + X; blue = m + chroma; break; case 4: H_insec = hue - H_sec; - Y_peak = RGB_LUMA_BLUE + H_insec * RGB_LUMA_RED; + Y_peak = weights[2] + H_insec * weights[0]; chroma *= luma < Y_peak ? luma/Y_peak : (1. - luma)/(1. - Y_peak); X = chroma * H_insec; - m = luma - (RGB_LUMA_RED * X + RGB_LUMA_BLUE * chroma); + m = luma - (weights[0] * X + weights[2] * chroma); red = m + X; green = m; blue = m + chroma; break; default: H_insec = 1. - (hue - H_sec); - Y_peak = RGB_LUMA_RED + H_insec * RGB_LUMA_BLUE; + Y_peak = weights[0] + H_insec * weights[2]; chroma *= luma < Y_peak ? luma/Y_peak : (1. - luma)/(1. - Y_peak); X = chroma * H_insec; - m = luma - (RGB_LUMA_RED * chroma + RGB_LUMA_BLUE * X); + m = luma - (weights[0] * chroma + weights[2] * X); red = m + chroma; green = m; blue = m + X; break; } @@ -288,17 +294,23 @@ } static void -rgba_to_hcya (const Babl *conversion,char *src, - char *dst, - long samples) +rgba_to_hcya (const Babl *conversion, + char *src, + char *dst, + long samples) { + const Babl *space = babl_conversion_get_source_space (conversion); long n = samples; + double weights[3]; + + + babl_space_get_rgb_luminance (space, &weights[0], &weights[1], &weights[2]); while (n--) { double alpha = ((double *) src)[3]; - rgba_to_hcy_step (src, dst); + rgba_to_hcy_step (src, dst, weights); ((double *) dst)[3] = alpha; @@ -312,13 +324,18 @@ char *dst, long samples) { + const Babl *space = babl_conversion_get_source_space (conversion); long n = samples; + double weights[3]; + + space = babl_conversion_get_source_space (conversion); + babl_space_get_rgb_luminance (space, &weights[0], &weights[1], &weights[2]); while (n--) { double alpha = ((double *) src)[3]; - hcy_to_rgba_step (src, dst); + hcy_to_rgba_step (src, dst, weights); ((double *) dst)[3] = alpha; @@ -328,15 +345,21 @@ } static void -rgba_to_hcy (const Babl *conversion,char *src, - char *dst, - long samples) +rgba_to_hcy (const Babl *conversion, + char *src, + char *dst, + long samples) { + const Babl *space = babl_conversion_get_source_space (conversion); long n = samples; + double weights[3]; + + space = babl_conversion_get_source_space (conversion); + babl_space_get_rgb_luminance (space, &weights[0], &weights[1], &weights[2]); while (n--) { - rgba_to_hcy_step (src, dst); + rgba_to_hcy_step (src, dst, weights); src += 4 * sizeof (double); dst += 3 * sizeof (double); @@ -344,15 +367,21 @@ } static void -hcy_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples) +hcy_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples) { + const Babl *space = babl_conversion_get_source_space (conversion); long n = samples; + double weights[3]; + + space = babl_conversion_get_source_space (conversion); + babl_space_get_rgb_luminance (space, &weights[0], &weights[1], &weights[2]); while (n--) { - hcy_to_rgba_step (src, dst); + hcy_to_rgba_step (src, dst, weights); ((double *) dst)[3] = 1.0; diff -Nru babl-0.1.63+om~1/extensions/HSL.c babl-0.1.73+om~1/extensions/HSL.c --- babl-0.1.63+om~1/extensions/HSL.c 2018-11-27 14:48:14.000000000 +0000 +++ babl-0.1.73+om~1/extensions/HSL.c 2019-12-09 16:21:18.000000000 +0000 @@ -27,25 +27,40 @@ #define MAX(a,b) ((a < b) ? b : a) #define EPSILON 1.0e-10 -static void rgba_to_hsla (const Babl *conversion,char *src, - char *dst, - long samples); -static void hsla_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples); -static void rgba_to_hsl (const Babl *conversion,char *src, - char *dst, - long samples); -static void hsl_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples); -static void rgb_to_hsl_step (double *src, - double *dst); -static void hsl_to_rgb_step (double *src, - double *dst); -static inline double hue2cpn (double p, - double q, - double hue); +static void +rgba_to_hsla (const Babl *conversion, + char *src, + char *dst, + long samples); +static void +hsla_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples); +static void +rgba_to_hsl (const Babl *conversion, + char *src, + char *dst, + long samples); +static void +hsl_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples); + +static void +rgb_to_hsl_step (double *src, + double *dst); + +static void +hsl_to_rgb_step (double *src, + double *dst); + +static inline double +hue2cpn (double p, + double q, + double hue); + int init (void); @@ -57,17 +72,19 @@ babl_component_new ("lightness", NULL); babl_component_new ("alpha", NULL); - babl_model_new ("name", "HSLA", + babl_model_new ("name", "HSL", + "doc", "HSL - Hue Saturation Lightness, an improvement over HSV; which uses lightness; defined as (MAX(R,G,B) + MIN(R,G,B))/2 for the grayscale axis; better than HSV, but look into the CIE based spaces for better perceptual uniformity. The HSL space is relative to the RGB space associated with the format.", babl_component ("hue"), babl_component ("saturation"), babl_component ("lightness"), - babl_component ("alpha"), - "alpha", NULL); - babl_model_new ("name", "HSL", + babl_model_new ("name", "HSLA", + "doc", "HSL - with separate alpha component.", babl_component ("hue"), babl_component ("saturation"), babl_component ("lightness"), + babl_component ("alpha"), + "alpha", NULL); @@ -159,9 +176,10 @@ static void -rgba_to_hsla (const Babl *conversion,char *src, - char *dst, - long samples) +rgba_to_hsla (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; @@ -180,9 +198,10 @@ static void -rgba_to_hsl (const Babl *conversion,char *src, - char *dst, - long samples) +rgba_to_hsl (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; @@ -197,7 +216,9 @@ static inline double -hue2cpn (double p, double q, double hue) +hue2cpn (double p, + double q, + double hue) { if (hue < 0.0) hue += 1.0; if (hue > 1.0) hue -= 1.0; @@ -242,9 +263,10 @@ static void -hsla_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples) +hsla_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; @@ -263,9 +285,10 @@ static void -hsl_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples) +hsl_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; diff -Nru babl-0.1.63+om~1/extensions/HSV.c babl-0.1.73+om~1/extensions/HSV.c --- babl-0.1.63+om~1/extensions/HSV.c 2018-11-27 14:48:14.000000000 +0000 +++ babl-0.1.73+om~1/extensions/HSV.c 2019-12-09 16:21:18.000000000 +0000 @@ -32,27 +32,37 @@ #define MAX(a,b) (a < b) ? b : a; #define EPSILON 1.0e-10 -static void rgba_to_hsva (const Babl *conversion,char *src, - char *dst, - long samples); - -static void hsva_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples); - -static void rgba_to_hsv (const Babl *conversion,char *src, - char *dst, - long samples); - -static void hsv_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples); +static void +rgba_to_hsva (const Babl *conversion, + char *src, + char *dst, + long samples); + +static void +hsva_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples); + +static void +rgba_to_hsv (const Babl *conversion, + char *src, + char *dst, + long samples); + +static void +hsv_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples); -static void rgba_to_hsv_step (char *src, - char *dst); +static void +rgba_to_hsv_step (char *src, + char *dst); -static void hsv_to_rgba_step (char *src, - char *dst); +static void +hsv_to_rgba_step (char *src, + char *dst); static void components (void); static void models (void); @@ -85,21 +95,23 @@ static void models (void) { + babl_model_new ( - "name", "HSVA", + "name", "HSV", babl_component ("hue"), babl_component ("saturation"), babl_component ("value"), - babl_component ("alpha"), - "alpha", + "doc", "A legacy color model that exists for compatibility with old GIMP code, V is MAX(R,G,B).", NULL ); - babl_model_new ( - "name", "HSV", + "name", "HSVA", babl_component ("hue"), babl_component ("saturation"), babl_component ("value"), + babl_component ("alpha"), + "alpha", + "doc", "HSV with separate alpha.", NULL ); } @@ -276,9 +288,10 @@ } static void -rgba_to_hsva (const Babl *conversion,char *src, - char *dst, - long samples) +rgba_to_hsva (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; @@ -296,9 +309,10 @@ } static void -hsva_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples) +hsva_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; @@ -316,9 +330,10 @@ } static void -rgba_to_hsv (const Babl *conversion,char *src, - char *dst, - long samples) +rgba_to_hsv (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; @@ -332,9 +347,10 @@ } static void -hsv_to_rgba (const Babl *conversion,char *src, - char *dst, - long samples) +hsv_to_rgba (const Babl *conversion, + char *src, + char *dst, + long samples) { long n = samples; diff -Nru babl-0.1.63+om~1/extensions/Makefile.am babl-0.1.73+om~1/extensions/Makefile.am --- babl-0.1.63+om~1/extensions/Makefile.am 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/extensions/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -if PLATFORM_WIN32 -AM_LDFLAGS = -module -avoid-version -no-undefined -else -AM_LDFLAGS = -module -avoid-version -endif - -noinst_HEADERS = util.h - - -AM_CPPFLAGS = \ - -I$(top_builddir) \ - -I$(top_srcdir) \ - -I$(top_srcdir)/babl \ - -I$(top_srcdir)/extensions \ - $(LCMS_CFLAGS) - -extdir = $(libdir)/babl-@BABL_API_VERSION@ -ext_LTLIBRARIES = \ - u16.la \ - u32.la \ - cairo.la \ - CIE.la \ - half.la \ - gegl-fixups.la \ - gggl-lies.la \ - gggl-table.la \ - gggl-table-lies.la \ - gggl.la \ - gimp-8bit.la \ - grey.la \ - double.la \ - float.la \ - fast-float.la \ - naive-CMYK.la \ - HCY.la \ - HSL.la \ - HSV.la \ - simple.la \ - sse2-float.la \ - sse2-int8.la \ - sse2-int16.la \ - sse4-int8.la \ - sse-half.la \ - two-table.la \ - ycbcr.la - -cairo_la_SOURCES = cairo.c -CIE_la_SOURCES = CIE.c -simple_la_SOURCES = simple.c -float_half_la_SOURCES = float-half.c -gegl_fixups_la_SOURCES = gegl-fixups.c -gggl_lies_la_SOURCES = gggl-lies.c -gggl_table_lies_la_SOURCES = gggl-table-lies.c -gggl_table_la_SOURCES = gggl-table.c -gggl_la_SOURCES = gggl.c -gimp_8bit_la_SOURCES = gimp-8bit.c -grey_la_SOURCES = grey.c -naive_CMYK_la_SOURCES = naive-CMYK.c -HCY_la_SOURCES = HCY.c -HSL_la_SOURCES = HSL.c -HSV_la_SOURCES = HSV.c -sse2_float_la_SOURCES = sse2-float.c -sse2_int8_la_SOURCES = sse2-int8.c -sse2_int16_la_SOURCES = sse2-int16.c -sse4_int8_la_SOURCES = sse4-int8.c -sse_half_la_SOURCES = sse-half.c -two_table_la_SOURCES = two-table.c two-table-tables.h -ycbcr_la_SOURCES = ycbcr.c -float_la_SOURCES = float.c -fast_float_la_SOURCES = fast-float.c - -LIBS = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \ - $(MATH_LIB) $(THREAD_LIB) - -CIE_la_CFLAGS = $(SSE2_EXTRA_CFLAGS) -sse2_float_la_CFLAGS = $(SSE2_EXTRA_CFLAGS) -sse2_int8_la_CFLAGS = $(SSE2_EXTRA_CFLAGS) -sse2_int16_la_CFLAGS = $(SSE2_EXTRA_CFLAGS) -sse4_int8_la_CFLAGS = $(SSE4_1_EXTRA_CFLAGS) -sse_half_la_CFLAGS = $(SSE4_1_EXTRA_CFLAGS) $(F16C_EXTRA_CFLAGS) diff -Nru babl-0.1.63+om~1/extensions/meson.build babl-0.1.73+om~1/extensions/meson.build --- babl-0.1.63+om~1/extensions/meson.build 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/meson.build 2019-12-09 16:21:18.000000000 +0000 @@ -24,7 +24,7 @@ ['u16', no_cflags], ['u32', no_cflags], ['cairo', no_cflags], - ['CIE', no_cflags], + ['CIE', sse2_cflags], ['double', no_cflags], ['fast-float', no_cflags], ['half', no_cflags], @@ -46,6 +46,7 @@ ['sse2-int16', sse2_cflags], ['sse2-int8', sse2_cflags], ['sse4-int8', sse4_1_cflags], + ['avx2-int8', avx2_cflags], ['two-table', sse2_cflags], ['ycbcr', sse2_cflags], ] diff -Nru babl-0.1.63+om~1/extensions/simple.c babl-0.1.73+om~1/extensions/simple.c --- babl-0.1.63+om~1/extensions/simple.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/simple.c 2019-12-09 16:21:18.000000000 +0000 @@ -6,7 +6,10 @@ static inline void -float_to_u8_x1 (const Babl *conversion,unsigned char *src_char, unsigned char *dst, long samples) +float_to_u8_x1 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst, + long samples) { float *src = (float *)src_char; long n = samples; @@ -20,19 +23,28 @@ } static inline void -float_to_u8_x4 (const Babl *conversion,unsigned char *src_char, unsigned char *dst, long samples) +float_to_u8_x4 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst, + long samples) { float_to_u8_x1 (conversion, src_char, dst, samples * 4); } static inline void -float_to_u8_x3 (const Babl *conversion,unsigned char *src_char, unsigned char *dst, long samples) +float_to_u8_x3 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst, + long samples) { float_to_u8_x1 (conversion, src_char, dst, samples * 3); } static inline void -float_to_u8_x2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst, long samples) +float_to_u8_x2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst, + long samples) { float_to_u8_x1 (conversion, src_char, dst, samples * 2); } @@ -40,7 +52,10 @@ static inline void -float_pre_to_u8_pre (const Babl *conversion,unsigned char *src_char, unsigned char *dst, long samples) +float_pre_to_u8_pre (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst, + long samples) { float *src = (float *)src_char; long n = samples; @@ -70,7 +85,10 @@ } static inline void -float_to_u16_x1 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u16_x1 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float *src = (float *)src_char; uint16_t *dst = (uint16_t *)dst_char; @@ -84,23 +102,35 @@ } } static inline void -float_to_u16_x2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u16_x2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float_to_u16_x1 (conversion, src_char, dst_char, samples * 2); } static inline void -float_to_u16_x3 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u16_x3 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float_to_u16_x1 (conversion, src_char, dst_char, samples * 3); } static inline void -float_to_u16_x4 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u16_x4 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float_to_u16_x1 (conversion, src_char, dst_char, samples * 4); } static inline void -float_pre_to_u16_pre (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_pre_to_u16_pre (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float *src = (float *)src_char; uint16_t *dst = (uint16_t *)dst_char; @@ -112,13 +142,6 @@ float b = src[2]; float a = src[3]; - if (a > 1.0f) { - r /= a; - g /= a; - b /= a; - a /= a; - } - dst[0] = (r >= 1.0f) ? 0xFFFF : ((r <= 0.0f) ? 0x0 : 0xFFFF * r + 0.5f); dst[1] = (g >= 1.0f) ? 0xFFFF : ((g <= 0.0f) ? 0x0 : 0xFFFF * g + 0.5f); dst[2] = (b >= 1.0f) ? 0xFFFF : ((b <= 0.0f) ? 0x0 : 0xFFFF * b + 0.5f); @@ -130,7 +153,10 @@ } static inline void -float_pre_to_u32_pre (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_pre_to_u32_pre (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float *src = (float *)src_char; uint32_t *dst = (uint32_t *)dst_char; @@ -142,13 +168,6 @@ float b = src[2]; float a = src[3]; - if (a > 1.0f) { - r /= a; - g /= a; - b /= a; - a /= a; - } - dst[0] = (r >= 1.0f) ? 0xFFFFFFFF : ((r <= 0.0f) ? 0x0 : 0xFFFFFFFF * r + 0.5f); dst[1] = (g >= 1.0f) ? 0xFFFFFFFF : ((g <= 0.0f) ? 0x0 : 0xFFFFFFFF * g + 0.5f); dst[2] = (b >= 1.0f) ? 0xFFFFFFFF : ((b <= 0.0f) ? 0x0 : 0xFFFFFFFF * b + 0.5f); @@ -161,7 +180,10 @@ static inline void -float_to_u32_x1 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u32_x1 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float *src = (float *)src_char; uint32_t *dst = (uint32_t *)dst_char; @@ -177,24 +199,36 @@ } } static void -float_to_u32_x2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u32_x2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float_to_u32_x1 (conversion, src_char, dst_char, samples * 2); } static void -float_to_u32_x3 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u32_x3 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float_to_u32_x1 (conversion, src_char, dst_char, samples * 3); } static void -float_to_u32_x4 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +float_to_u32_x4 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { float_to_u32_x1 (conversion, src_char, dst_char, samples * 4); } static inline void -u32_to_float (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u32_to_float (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { uint32_t *src = (uint32_t *)src_char; float *dst = (float *)dst_char; @@ -208,27 +242,39 @@ } static void -u32_to_float_x4 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u32_to_float_x4 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { u32_to_float (conversion, src_char, dst_char, samples * 4); } static void -u32_to_float_x3 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u32_to_float_x3 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { u32_to_float (conversion, src_char, dst_char, samples * 3); } static void -u32_to_float_x2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u32_to_float_x2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { u32_to_float (conversion, src_char, dst_char, samples * 2); } static inline void -u16_to_float (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u16_to_float (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { uint16_t *src = (uint16_t *)src_char; float *dst = (float *)dst_char; @@ -242,26 +288,38 @@ } static void -u16_to_float_x4 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u16_to_float_x4 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { u16_to_float (conversion, src_char, dst_char, samples * 4); } static void -u16_to_float_x3 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u16_to_float_x3 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { u16_to_float (conversion, src_char, dst_char, samples * 3); } static void -u16_to_float_x2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +u16_to_float_x2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { u16_to_float (conversion, src_char, dst_char, samples * 2); } static inline void -yau16_rgbaf (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +yau16_rgbaf (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) { uint16_t *src = (uint16_t *)src_char; float *dst = (float *)dst_char; @@ -278,6 +336,146 @@ } +static inline void +u8_to_float (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + float *dst = (float *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0] / 255.0f; + dst ++; + src ++; + } +} + +static void +u8_to_float_x4 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + u8_to_float (conversion, src_char, dst_char, samples * 4); +} + +static void +u8_to_float_x3 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + u8_to_float (conversion, src_char, dst_char, samples * 3); +} + + +static void +u8_to_float_x2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + u8_to_float (conversion, src_char, dst_char, samples * 2); +} + +static inline void +yau8_rgbaf (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + float *dst = (float *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0] / 255.0f; + dst[1] = src[0] / 255.0f; + dst[2] = src[0] / 255.0f; + dst[3] = src[1] / 255.0f; + dst +=4; + src +=2; + } +} + + +static inline void +yu8_yau8 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + uint8_t *dst = (uint8_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst[1] = 255; + dst += 2; + src += 1; + } +} + + +static inline void +yau8_yu8 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + uint8_t *dst = (uint8_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst += 1; + src += 2; + } +} + + + +static inline void +yu16_yau16 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint16_t *src = (uint16_t *)src_char; + uint16_t *dst = (uint16_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst[1] = 65535; + dst += 2; + src += 1; + } +} + +static inline void +yau16_yu16 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint16_t *src = (uint16_t *)src_char; + uint16_t *dst = (uint16_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst += 1; + src += 2; + } +} + + int init (void) { @@ -528,5 +726,105 @@ "linear", yau16_rgbaf, NULL); + + + babl_conversion_new (babl_format ("YA u8"), + babl_format ("YA float"), + "linear", + u8_to_float_x2, + NULL); + babl_conversion_new (babl_format ("Y'A u8"), + babl_format ("Y'A float"), + "linear", + u8_to_float_x2, + NULL); + babl_conversion_new (babl_format ("Y u8"), + babl_format ("Y float"), + "linear", + u8_to_float, + NULL); + babl_conversion_new (babl_format ("Y' u8"), + babl_format ("Y' float"), + "linear", + u8_to_float, + NULL); + babl_conversion_new (babl_format ("RGBA u8"), + babl_format ("RGBA float"), + "linear", + u8_to_float_x4, + NULL); + babl_conversion_new (babl_format ("R'G'B'A u8"), + babl_format ("R'G'B'A float"), + "linear", + u8_to_float_x4, + NULL); + + babl_conversion_new (babl_format ("RGB u8"), + babl_format ("RGB float"), + "linear", + u8_to_float_x3, + NULL); + babl_conversion_new (babl_format ("R'G'B' u8"), + babl_format ("R'G'B' float"), + "linear", + u8_to_float_x3, + NULL); + babl_conversion_new (babl_format ("Y'A u8"), + babl_format ("R'G'B'A float"), + "linear", + yau8_rgbaf, + NULL); + + + babl_conversion_new (babl_format ("Y' u8"), + babl_format ("Y'A u8"), + "linear", + yu8_yau8, + NULL); + + babl_conversion_new (babl_format ("Y u8"), + babl_format ("YA u8"), + "linear", + yu8_yau8, + NULL); + + babl_conversion_new (babl_format ("Y' u16"), + babl_format ("Y'A u16"), + "linear", + yu16_yau16, + NULL); + + babl_conversion_new (babl_format ("Y u16"), + babl_format ("YA u16"), + "linear", + yu16_yau16, + NULL); + + + babl_conversion_new (babl_format ("Y'A u8"), + babl_format ("Y' u8"), + "linear", + yau8_yu8, + NULL); + + babl_conversion_new (babl_format ("YA u8"), + babl_format ("Y u8"), + "linear", + yau8_yu8, + NULL); + + babl_conversion_new (babl_format ("Y'A u16"), + babl_format ("Y' u16"), + "linear", + yau16_yu16, + NULL); + + babl_conversion_new (babl_format ("YA u16"), + babl_format ("Y u16"), + "linear", + yau16_yu16, + NULL); + + return 0; } diff -Nru babl-0.1.63+om~1/extensions/sse2-float.c babl-0.1.73+om~1/extensions/sse2-float.c --- babl-0.1.63+om~1/extensions/sse2-float.c 2018-10-03 16:10:18.000000000 +0000 +++ babl-0.1.73+om~1/extensions/sse2-float.c 2019-12-09 16:21:18.000000000 +0000 @@ -35,10 +35,13 @@ #define Q(a) { a, a, a, a } -static const float BABL_ALPHA_THRESHOLD_FLOAT = (float)BABL_ALPHA_THRESHOLD; +static const float BABL_ALPHA_FLOOR_FLOAT = (float)BABL_ALPHA_FLOOR; static void -conv_rgbaF_linear_rgbAF_linear (const Babl *conversion,const float *src, float *dst, long samples) +conv_rgbaF_linear_rgbAF_linear (const Babl *conversion, + const float *src, + float *dst, + long samples) { long i = 0; long remainder; @@ -53,21 +56,9 @@ { float alpha0 = ((float *)s)[3]; float alpha1 = ((float *)s)[7]; + float used_alpha0 = babl_epsilon_for_zero_float (alpha0); + float used_alpha1 = babl_epsilon_for_zero_float (alpha1); - if (alpha0 < BABL_ALPHA_FLOOR) - { - if (alpha0 >= 0.0f) - alpha0 = BABL_ALPHA_FLOOR; - else - alpha0 = -BABL_ALPHA_FLOOR; - } - if (alpha1 < BABL_ALPHA_FLOOR) - { - if (alpha1 >= 0.0f) - alpha1 = BABL_ALPHA_FLOOR; - else - alpha1 = -BABL_ALPHA_FLOOR; - } { __v4sf rbaa0, rbaa1; @@ -76,13 +67,16 @@ /* Expand alpha */ - __v4sf aaaa0 = (__v4sf)_mm_set1_ps(alpha0); - __v4sf aaaa1 = (__v4sf)_mm_set1_ps(alpha1); + __v4sf aaaa0 = (__v4sf)_mm_set1_ps(used_alpha0); + __v4sf aaaa1 = (__v4sf)_mm_set1_ps(used_alpha1); /* Premultiply */ rgba0 = rgba0 * aaaa0; rgba1 = rgba1 * aaaa1; - + + aaaa0 = (__v4sf)_mm_set1_ps(alpha0); + aaaa1 = (__v4sf)_mm_set1_ps(alpha1); + /* Shuffle the original alpha value back in */ rbaa0 = _mm_shuffle_ps(rgba0, aaaa0, _MM_SHUFFLE(0, 0, 2, 0)); rbaa1 = _mm_shuffle_ps(rgba1, aaaa1, _MM_SHUFFLE(0, 0, 2, 0)); @@ -103,16 +97,10 @@ while (remainder--) { float a = src[3]; - if (a <= BABL_ALPHA_FLOOR) - { - if (a >= 0.0f) - a = BABL_ALPHA_FLOOR; - else if (a >= -BABL_ALPHA_FLOOR) - a = -BABL_ALPHA_FLOOR; - } - dst[0] = src[0] * a; - dst[1] = src[1] * a; - dst[2] = src[2] * a; + float used_alpha = babl_epsilon_for_zero_float (a); + dst[0] = src[0] * used_alpha; + dst[1] = src[1] * used_alpha; + dst[2] = src[2] * used_alpha; dst[3] = a; src += 4; @@ -121,7 +109,10 @@ } static void -conv_rgbAF_linear_rgbaF_linear_shuffle (const Babl *conversion,const float *src, float *dst, long samples) +conv_rgbAF_linear_rgbaF_linear_shuffle (const Babl *conversion, + const float *src, + float *dst, + long samples) { long i = 0; long remainder; @@ -137,16 +128,11 @@ __v4sf pre_rgba0, rgba0, rbaa0, raaaa0; float alpha0 = ((float *)s)[3]; + float used_alpha0 = babl_epsilon_for_zero_float (alpha0); pre_rgba0 = *s; - if (alpha0 == 0.0f) - { - /* Zero RGB */ - rgba0 = _mm_setzero_ps(); - } - else { - float recip0 = 1.0f/alpha0; + float recip0 = 1.0f/used_alpha0; /* Expand reciprocal */ raaaa0 = _mm_load1_ps(&recip0); @@ -159,9 +145,6 @@ rbaa0 = _mm_shuffle_ps(rgba0, pre_rgba0, _MM_SHUFFLE(3, 3, 2, 0)); rgba0 = _mm_shuffle_ps(rgba0, rbaa0, _MM_SHUFFLE(2, 1, 1, 0)); - if (alpha0 == BABL_ALPHA_FLOOR || alpha0 == -BABL_ALPHA_FLOOR) - ((float *)d)[3] = 0.0f; - s++; *d++ = rgba0; } @@ -190,17 +173,20 @@ } static void -conv_rgbAF_linear_rgbaF_linear_spin (const Babl *conversion,const float *src, float *dst, long samples) +conv_rgbAF_linear_rgbaF_linear_spin (const Babl *conversion, + const float *src, + float *dst, + long samples) { long i = 0; long remainder; - // XXX : not ported to color preserving premul + // XXX : not ported to zero preserving alpha transforms if (((uintptr_t)src % 16) + ((uintptr_t)dst % 16) == 0) { const long n = samples; const __v4sf *s = (const __v4sf*) src; __v4sf *d = (__v4sf*)dst; - const __v4sf zero = _mm_set_ss (BABL_ALPHA_THRESHOLD_FLOAT); + const __v4sf zero = _mm_set_ss (BABL_ALPHA_FLOOR_FLOAT); const __v4sf one = _mm_set_ss(1.0f); for ( ; i < n; i += 1) @@ -409,7 +395,10 @@ GAMMA_RGBA(conv_rgbaF_linear_rgbaF_gamma, linear_to_gamma_2_2_sse2) GAMMA_RGBA(conv_rgbaF_gamma_rgbaF_linear, gamma_2_2_to_linear_sse2) -static void conv_rgbaF_linear_rgbAF_gamma (const Babl *conversion,const float *src, float *dst, long samples) +static void conv_rgbaF_linear_rgbAF_gamma (const Babl *conversion, + const float *src, + float *dst, + long samples) { float *tmp = alloca (sizeof(float)*4*samples); conv_rgbaF_linear_rgbaF_gamma (conversion, src, tmp, samples); @@ -435,7 +424,10 @@ }\ static void -conv_yaF_linear_yaF_gamma (const Babl *conversion,const float *src, float *dst, long samples) +conv_yaF_linear_yaF_gamma (const Babl *conversion, + const float *src, + float *dst, + long samples) { const __v4sf *s = (const __v4sf*)src; __v4sf *d = (__v4sf*)dst; @@ -470,7 +462,10 @@ static void -conv_yaF_gamma_yaF_linear (const Babl *conversion,const float *src, float *dst, long samples) +conv_yaF_gamma_yaF_linear (const Babl *conversion, + const float *src, + float *dst, + long samples) { const __v4sf *s = (const __v4sf*)src; __v4sf *d = (__v4sf*)dst; @@ -504,7 +499,10 @@ } static inline void -conv_yF_linear_yF_gamma (const Babl *conversion,const float *src, float *dst, long samples) +conv_yF_linear_yF_gamma (const Babl *conversion, + const float *src, + float *dst, + long samples) { const __v4sf *s = (const __v4sf*)src; __v4sf *d = (__v4sf*)dst; @@ -541,7 +539,10 @@ } static inline void -conv_yF_gamma_yF_linear (const Babl *conversion,const float *src, float *dst, long samples) +conv_yF_gamma_yF_linear (const Babl *conversion, + const float *src, + float *dst, + long samples) { const __v4sf *s = (const __v4sf*)src; __v4sf *d = (__v4sf*)dst; @@ -579,14 +580,20 @@ static void -conv_rgbF_linear_rgbF_gamma (const Babl *conversion,const float *src, float *dst, long samples) +conv_rgbF_linear_rgbF_gamma (const Babl *conversion, + const float *src, + float *dst, + long samples) { conv_yF_linear_yF_gamma (conversion, src, dst, samples * 3); } static void -conv_rgbF_gamma_rgbF_linear (const Babl *conversion,const float *src, float *dst, long samples) +conv_rgbF_gamma_rgbF_linear (const Babl *conversion, + const float *src, + float *dst, + long samples) { conv_yF_gamma_yF_linear (conversion, src, dst, samples * 3); } diff -Nru babl-0.1.63+om~1/extensions/sse2-int16.c babl-0.1.73+om~1/extensions/sse2-int16.c --- babl-0.1.63+om~1/extensions/sse2-int16.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/sse2-int16.c 2019-12-09 16:21:18.000000000 +0000 @@ -35,7 +35,10 @@ static const __v4sf u16_float = Q (1.f / 65535); static void -conv_rgba16_rgbaF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_rgba16_rgbaF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { long i = 0; @@ -69,7 +72,10 @@ } static void -conv_rgba16_rgbAF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_rgba16_rgbAF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { long i = 0; long remainder; diff -Nru babl-0.1.63+om~1/extensions/sse2-int8.c babl-0.1.73+om~1/extensions/sse2-int8.c --- babl-0.1.63+om~1/extensions/sse2-int8.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/sse2-int8.c 2019-12-09 16:21:18.000000000 +0000 @@ -31,7 +31,10 @@ #include "extensions/util.h" static inline void -conv_yF_y8 (const Babl *conversion,const float *src, uint8_t *dst, long samples) +conv_yF_y8 (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) { const __v4sf *s_vec; __m128i *d_vec; @@ -126,26 +129,38 @@ } static void -conv_yaF_ya8 (const Babl *conversion,const float *src, uint8_t *dst, long samples) +conv_yaF_ya8 (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) { conv_yF_y8 (conversion, src, dst, samples * 2); } static void -conv_rgbF_rgb8 (const Babl *conversion,const float *src, uint8_t *dst, long samples) +conv_rgbF_rgb8 (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) { conv_yF_y8 (conversion, src, dst, samples * 3); } static void -conv_rgbaF_rgba8 (const Babl *conversion,const float *src, uint8_t *dst, long samples) +conv_rgbaF_rgba8 (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) { conv_yF_y8 (conversion, src, dst, samples * 4); } static void -conv_rgbAF_rgbA8 (const Babl *conversion,const float *src, uint8_t *dst, long samples) +conv_rgbAF_rgbA8 (const Babl *conversion, + const float *src, + uint8_t *dst, + long samples) { conv_yF_y8 (conversion, src, dst, samples * 4); } diff -Nru babl-0.1.63+om~1/extensions/sse4-int8.c babl-0.1.73+om~1/extensions/sse4-int8.c --- babl-0.1.63+om~1/extensions/sse4-int8.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/sse4-int8.c 2019-12-09 16:21:18.000000000 +0000 @@ -31,7 +31,10 @@ #include "extensions/util.h" static inline void -conv_y8_yF (const Babl *conversion,const uint8_t *src, float *dst, long samples) +conv_y8_yF (const Babl *conversion, + const uint8_t *src, + float *dst, + long samples) { const float factor = 1.0f / 255.0f; const __v4sf factor_vec = {1.0f / 255.0f, 1.0f / 255.0f, 1.0f / 255.0f, 1.0f / 255.0f}; @@ -65,19 +68,28 @@ } static void -conv_ya8_yaF (const Babl *conversion,const uint8_t *src, float *dst, long samples) +conv_ya8_yaF (const Babl *conversion, + const uint8_t *src, + float *dst, + long samples) { conv_y8_yF (conversion, src, dst, samples * 2); } static void -conv_rgb8_rgbF (const Babl *conversion,const uint8_t *src, float *dst, long samples) +conv_rgb8_rgbF (const Babl *conversion, + const uint8_t *src, + float *dst, + long samples) { conv_y8_yF (conversion, src, dst, samples * 3); } static void -conv_rgba8_rgbaF (const Babl *conversion,const uint8_t *src, float *dst, long samples) +conv_rgba8_rgbaF (const Babl *conversion, + const uint8_t *src, + float *dst, + long samples) { conv_y8_yF (conversion, src, dst, samples * 4); } diff -Nru babl-0.1.63+om~1/extensions/sse-half.c babl-0.1.73+om~1/extensions/sse-half.c --- babl-0.1.63+om~1/extensions/sse-half.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/sse-half.c 2019-12-09 16:21:18.000000000 +0000 @@ -30,7 +30,10 @@ #include "extensions/util.h" static inline void -conv_yHalf_yF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_yHalf_yF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { const uint64_t *s_vec; __v4sf *d_vec; @@ -61,25 +64,37 @@ } static void -conv_yaHalf_yaF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_yaHalf_yaF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { conv_yHalf_yF (conversion, src, dst, samples * 2); } static void -conv_rgbHalf_rgbF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_rgbHalf_rgbF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { conv_yHalf_yF (conversion, src, dst, samples * 3); } static void -conv_rgbaHalf_rgbaF (const Babl *conversion,const uint16_t *src, float *dst, long samples) +conv_rgbaHalf_rgbaF (const Babl *conversion, + const uint16_t *src, + float *dst, + long samples) { conv_yHalf_yF (conversion, src, dst, samples * 4); } static inline void -conv_yF_yHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_yF_yHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { const __v4sf *s_vec; uint64_t *d_vec; @@ -110,19 +125,31 @@ } static void -conv_yaF_yaHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_yaF_yaHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv_yF_yHalf (conversion, src, dst, samples * 2); } +#define conv_yAF_yAHalf conv_yaF_yaHalf +#define conv_yAHalf_yAF conv_yaHalf_yaF + static void -conv_rgbF_rgbHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_rgbF_rgbHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv_yF_yHalf (conversion, src, dst, samples * 3); } static void -conv_rgbaF_rgbaHalf (const Babl *conversion,const float *src, uint16_t *dst, long samples) +conv_rgbaF_rgbaHalf (const Babl *conversion, + const float *src, + uint16_t *dst, + long samples) { conv_yF_yHalf (conversion, src, dst, samples * 4); } @@ -219,6 +246,30 @@ babl_component ("Y'"), babl_component ("A"), NULL); + const Babl *yAF_linear = babl_format_new ( + babl_model ("YaA"), + babl_type ("float"), + babl_component ("Ya"), + babl_component ("A"), + NULL); + const Babl *yAHalf_linear = babl_format_new ( + babl_model ("YaA"), + babl_type ("half"), + babl_component ("Ya"), + babl_component ("A"), + NULL); + const Babl *yAF_gamma = babl_format_new ( + babl_model ("Y'aA"), + babl_type ("float"), + babl_component ("Y'a"), + babl_component ("A"), + NULL); + const Babl *yAHalf_gamma = babl_format_new ( + babl_model ("Y'aA"), + babl_type ("half"), + babl_component ("Y'a"), + babl_component ("A"), + NULL); const Babl *yF_linear = babl_format_new ( babl_model ("Y"), babl_type ("float"), @@ -252,10 +303,12 @@ CONV(rgbaHalf, rgbaF); CONV(rgbHalf, rgbF); CONV(yaHalf, yaF); + CONV(yAHalf, yAF); CONV(yHalf, yF); CONV(rgbaF, rgbaHalf); CONV(rgbF, rgbHalf); CONV(yaF, yaHalf); + CONV(yAF, yAHalf); CONV(yF, yHalf); } diff -Nru babl-0.1.63+om~1/extensions/two-table.c babl-0.1.73+om~1/extensions/two-table.c --- babl-0.1.63+om~1/extensions/two-table.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/extensions/two-table.c 2019-12-09 16:21:18.000000000 +0000 @@ -25,25 +25,34 @@ static inline unsigned char conv_float_u8_two_table_map (float value) { - unsigned short index; - unsigned char result; if (value < 0.0f) - return 0; - else if (value > 1.0f) - return 0xFF; - index = (unsigned short)(value * 0xFFFF); - result = linear_to_gamma[index]; + { + return 0; + } + else if (value <= 1.0f) + { + unsigned short index; + unsigned char result; - if (value < u8_gamma_minimums[result]) - result -= 1; - else if (value >= u8_gamma_minimums[result+1]) - result += 1; + index = (unsigned short) (value * 0xFFFF); + result = linear_to_gamma[index]; - return result; + if (value < u8_gamma_minimums[result]) + result -= 1; + else if (value >= u8_gamma_minimums[result+1]) + result += 1; + + return result; + } + else /* value > 1.0f || isnan (value) */ + { + return 0xFF; + } } static void -conv_rgbafloat_linear_cairo24_le (const Babl *conversion,unsigned char *src_char, +conv_rgbafloat_linear_cairo24_le (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { @@ -61,7 +70,8 @@ } static void -conv_rgbfloat_linear_cairo24_le (const Babl *conversion,unsigned char *src_char, +conv_rgbfloat_linear_cairo24_le (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { @@ -80,7 +90,8 @@ } static void -conv_rgbafloat_linear_rgbu8_gamma (const Babl *conversion,unsigned char *src_char, +conv_rgbafloat_linear_rgbu8_gamma (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { @@ -89,18 +100,9 @@ while (n--) { - if (src[3] <= BABL_ALPHA_FLOOR) - { - dst[0] = 0; - dst[1] = 0; - dst[2] = 0; - } - else - { - dst[0] = conv_float_u8_two_table_map (src[0]); - dst[1] = conv_float_u8_two_table_map (src[1]); - dst[2] = conv_float_u8_two_table_map (src[2]); - } + dst[0] = conv_float_u8_two_table_map (src[0]); + dst[1] = conv_float_u8_two_table_map (src[1]); + dst[2] = conv_float_u8_two_table_map (src[2]); src += 4; dst += 3; } @@ -108,7 +110,8 @@ static void -conv_rgbafloat_linear_rgbau8_gamma (const Babl *conversion,unsigned char *src_char, +conv_rgbafloat_linear_rgbau8_gamma (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { @@ -127,7 +130,8 @@ } static void -conv_rgbfloat_linear_rgbu8_gamma (const Babl *conversion,unsigned char *src_char, +conv_rgbfloat_linear_rgbu8_gamma (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { @@ -146,7 +150,8 @@ } static void -conv_yfloat_linear_yu8_gamma (const Babl *conversion,unsigned char *src_char, +conv_yfloat_linear_yu8_gamma (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { @@ -160,7 +165,8 @@ } static void -conv_yafloat_linear_yau8_gamma (const Babl *conversion,unsigned char *src_char, +conv_yafloat_linear_yau8_gamma (const Babl *conversion, + unsigned char *src_char, unsigned char *dst, long samples) { diff -Nru babl-0.1.63+om~1/extensions/u16.c babl-0.1.73+om~1/extensions/u16.c --- babl-0.1.63+om~1/extensions/u16.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/u16.c 2019-12-09 16:21:18.000000000 +0000 @@ -26,7 +26,8 @@ #include "extensions/util.h" static void -conv_rgbu16_rgbau16 (const Babl *conversion,unsigned char *src, +conv_rgbu16_rgbau16 (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) @@ -46,7 +47,8 @@ } static void -conv_yu16_yau16 (const Babl *conversion,unsigned char *src, +conv_yu16_yau16 (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) diff -Nru babl-0.1.63+om~1/extensions/u32.c babl-0.1.73+om~1/extensions/u32.c --- babl-0.1.63+om~1/extensions/u32.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/extensions/u32.c 2019-12-09 16:21:18.000000000 +0000 @@ -63,7 +63,7 @@ static void -conv_yau32_yau16 (const Babl *conversion, +conv_yau32_yau16 (const Babl *conversion, unsigned char *src, unsigned char *dst, long samples) @@ -96,7 +96,7 @@ } static void -conv_yau16_yau32 (const Babl *conversion, +conv_yau16_yau32 (const Babl *conversion, unsigned char *src, unsigned char *dst, long samples) @@ -150,7 +150,8 @@ } static inline void -conv_rgb32_rgba32 (const Babl *conversion,unsigned char *src, +conv_rgb32_rgba32 (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { @@ -169,7 +170,8 @@ static inline void -conv_yu32_yau32 (const Babl *conversion,unsigned char *src, +conv_yu32_yau32 (const Babl *conversion, + unsigned char *src, unsigned char *dst, long samples) { diff -Nru babl-0.1.63+om~1/extensions/ycbcr.c babl-0.1.73+om~1/extensions/ycbcr.c --- babl-0.1.63+om~1/extensions/ycbcr.c 2018-11-27 14:48:14.000000000 +0000 +++ babl-0.1.73+om~1/extensions/ycbcr.c 2019-12-09 16:21:18.000000000 +0000 @@ -73,9 +73,10 @@ static void -rgba_to_ycbcra709 (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_ycbcra709 (const Babl *conversion, + char *src, + char *dst, + long n) { while (n--) { @@ -106,9 +107,10 @@ static void -rgba_to_ycbcr709 (const Babl *conversion,char *src, - char *dst, - long n) +rgba_to_ycbcr709 (const Babl *conversion, + char *src, + char *dst, + long n) { while (n--) { @@ -137,9 +139,10 @@ static void -ycbcra709_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +ycbcra709_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { while (n--) { @@ -170,9 +173,10 @@ static void -ycbcr709_to_rgba (const Babl *conversion,char *src, - char *dst, - long n) +ycbcr709_to_rgba (const Babl *conversion, + char *src, + char *dst, + long n) { while (n--) { diff -Nru babl-0.1.63+om~1/gen_babl_map.py babl-0.1.73+om~1/gen_babl_map.py --- babl-0.1.63+om~1/gen_babl_map.py 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/gen_babl_map.py 2019-12-09 16:21:18.000000000 +0000 @@ -2,6 +2,7 @@ export_symbols=sys.argv[1] version_file=sys.argv[2] +version_file_clang=sys.argv[2] + ".clang" with open(export_symbols, 'r') as syms, \ open(version_file, 'w') as version: @@ -9,3 +10,8 @@ for sym in syms: version.write(" {};\n".format(sym.strip())) version.write(" local:\n *;\n};\n") + +with open(export_symbols, 'r') as syms, \ + open(version_file_clang, 'w') as version: + for sym in syms: + version.write("_{}\n".format(sym.strip())) diff -Nru babl-0.1.63+om~1/INSTALL.in babl-0.1.73+om~1/INSTALL.in --- babl-0.1.63+om~1/INSTALL.in 2016-01-02 15:28:48.000000000 +0000 +++ babl-0.1.73+om~1/INSTALL.in 2019-12-09 16:21:18.000000000 +0000 @@ -13,9 +13,12 @@ ------------------------------------------------------------ foo$ wget ftp://ftp.gtk.org/pub/babl/0.1/babl-@BABL_VERSION@.tar.bz2 - foo$ tar jxf babl-@BABL_VERSION@.tar.gz + foo$ tar xvf babl-@BABL_VERSION@.tar.gz foo$ cd babl-@BABL_VERSION@ - foo/babl-@BABL_VERSION@$ ./configure && make && sudo make install + foo/babl-@BABL_VERSION@$ meson build + foo/babl-@BABL_VERSION@$ cd build + foo/babl-@BABL_VERSION@/build$ ninja && ninja install + ------------------------------------------------------------ diff -Nru babl-0.1.63+om~1/Makefile.am babl-0.1.73+om~1/Makefile.am --- babl-0.1.63+om~1/Makefile.am 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} - -SUBDIRS = \ - babl \ - extensions \ - tools \ - tests - -if ENABLE_DOCS -SUBDIRS+= docs -endif - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = babl.pc - -built_dist_files = README - -EXTRA_DIST = \ - $(built_dist_files) \ - AUTHORS \ - COPYING \ - INSTALL \ - NEWS \ - TODO \ - autogen.sh \ - babl.pc.in \ - export-symbols - -DISTCLEANFILES = \ - $(built_dist_files) \ - babl.pc - -.PHONY: snapshot - - -if HAVE_W3M -README: all docs/index.html - $(W3M) -cols 72 -dump docs/index.html > $@ -else -README: - @echo "*** w3m must be available in order to make dist" - @false -endif - -snapshot: - $(MAKE) dist distdir=$(PACKAGE)-`date +"%Y%m%d"` -snapcheck: - $(MAKE) distcheck distdir=$(PACKAGE)-`date +"%Y%m%d"` - -distclean-local: - if test $(srcdir) = .; then :; else \ - rm -f $(BUILT_EXTRA_DIST); \ - fi - diff -Nru babl-0.1.63+om~1/meson.build babl-0.1.73+om~1/meson.build --- babl-0.1.63+om~1/meson.build 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/meson.build 2019-12-09 16:21:18.000000000 +0000 @@ -1,12 +1,12 @@ project('babl', 'c', license: 'LGPL3+', - version: '0.1.63', - meson_version: '>=0.40.0', + version: '0.1.73', + meson_version: '>=0.50.0', default_options: [ - 'libdir=lib', 'sysconfdir=/etc', 'localstatedir=/var', - 'sharedstatedir=/var/lib' + 'sharedstatedir=/var/lib', + 'buildtype=debugoptimized' ], # https://gitlab.gnome.org/GNOME/babl/issues/ ) @@ -26,11 +26,15 @@ pkgconfig = import('pkgconfig') i18n = import('i18n') gnome = import('gnome') +python = import('python') cc = meson.get_compiler('c') prefix = get_option('prefix') buildtype = get_option('buildtype') +babl_prefix = get_option('prefix') +babl_libdir = join_paths(babl_prefix, get_option('libdir')) + ################################################################################ # Projects infos @@ -53,7 +57,8 @@ stability_version_number = (major_version != 0 ? minor_version : micro_version) stable = (stability_version_number % 2 == 0) -conf.set10('BABL_UNSTABLE', not stable) +conf.set10('BABL_UNSTABLE', not stable, Description: + 'Define to 1 if this is an unstable version of BABL.') conf.set ('BABL_MAJOR_VERSION', '@0@'.format(major_version)) conf.set ('BABL_MINOR_VERSION', '@0@'.format(minor_version)) @@ -75,25 +80,24 @@ platform_osx = false platform_win32 = false -host_cpu = host_machine.cpu() -message('Architecture: ' + host_cpu) +host_cpu_family = host_machine.cpu_family() +message('Host machine cpu family: ' + host_cpu_family) -if host_cpu.startswith('i') and host_cpu.endswith('86') +host_cpu_family = host_machine.cpu_family() +if host_cpu_family == 'x86' have_x86 = true conf.set10('ARCH_X86', true) -elif host_cpu == 'x86_64' +elif host_cpu_family == 'x86_64' have_x86 = true conf.set10('ARCH_X86', true) conf.set10('ARCH_X86_64', true) -elif host_cpu == 'ppc' or host_cpu == 'powerpc' +elif host_cpu_family == 'ppc' have_ppc = true conf.set10('ARCH_PPC', true) -elif host_cpu == 'ppc64' or host_cpu == 'powerpc64' +elif host_cpu_family == 'ppc64' have_ppc = true conf.set10('ARCH_PPC', true) conf.set10('ARCH_PPC64', true) -else - error('Unknown host architecture') endif host_os = host_machine.system() @@ -114,11 +118,20 @@ path_sep = ( platform_win32 ? ';' : ':' ) dirs_sep = ( platform_win32 ? '\\\\' : '/' ) -lib_ext = ( platform_win32 ? '.dll' : '.so' ) +if platform_win32 + lib_ext = '.dll' +elif platform_osx + lib_ext = '.dylib' +else + lib_ext = '.so' +endif -conf.set ('BABL_PATH_SEPARATOR', '\'' + path_sep + '\'') -conf.set_quoted('BABL_DIR_SEPARATOR', dirs_sep) -conf.set_quoted('SHREXT', lib_ext) +conf.set('BABL_PATH_SEPARATOR', '\'' + path_sep + '\'', description: + 'separator between paths in BABL_PATH') +conf.set_quoted('BABL_DIR_SEPARATOR', dirs_sep, description: + 'separator between directories in BABL_PATH') +conf.set_quoted('SHREXT', lib_ext, description: + 'File extension for shared libraries') # assume *nix if not android/osx/win32 platform_unix = not ( @@ -135,9 +148,17 @@ build_os.startswith('cygwin') or build_os.startswith('windows')) +# Only run cross compile objects if we have exe wrapper +cc_can_run = not meson.is_cross_build() or meson.has_exe_wrapper() ################################################################################ -# Extra warnings +# Compiler arguments + +common_c_flags = [] + +if buildtype == 'debugoptimized' or buildtype == 'release' + common_c_flags += cc.get_supported_arguments(['-Ofast']) +endif extra_warnings_list = [ '-Wdeclaration-after-statement', @@ -147,17 +168,20 @@ '-Wold-style-definition', '-Wpointer-arith', ] -extra_warnings = [] -foreach warning : extra_warnings_list - if cc.has_argument(warning) - extra_warnings += warning - endif -endforeach +common_c_flags += cc.get_supported_arguments(extra_warnings_list) +add_project_arguments(common_c_flags, language: 'c') ################################################################################ # Check for compiler CPU extensions +# intialize these to nothing, so meson doesn't complain on non-x86 + +sse2_cflags = [] +f16c_cflags = [] +sse4_1_cflags = [] +avx2_cflags = [] + # mmx assembly if cc.has_argument('-mmmx') and get_option('enable-mmx') if cc.compiles('asm ("movq 0, %mm0");') @@ -167,7 +191,7 @@ 'Define to 1 if MMX assembly is available.') # sse assembly - if cc.has_argument('-msse') and get_option('enable-sse') + if cc.has_argument('-msse') and get_option('enable-sse') if cc.compiles('asm ("movntps %xmm0, 0");') add_project_arguments('-msse', language: 'c') message('sse assembly available') @@ -200,6 +224,16 @@ conf.set('USE_SSE4_1', 1, description: 'Define to 1 if sse4.1 assembly is available.') endif + + # avx2 assembly + if cc.has_argument('-mavx2') and get_option('enable-avx2') + if cc.compiles('asm ("vpgatherdd %ymm0,(%eax,%ymm1,4),%ymm2");') + message('avx2 assembly available') + avx2_cflags = '-mavx2' + conf.set('USE_AVX2', 1, description: + 'Define to 1 if avx2 assembly is available.') + endif + endif endif endif endif @@ -235,7 +269,7 @@ endif foreach header: check_headers if cc.has_header(header[1]) - conf.set(header[0], 1, description: + conf.set(header[0], 1, description: 'Define to 1 if the <@0@> header is available'.format(header[1])) endif endforeach @@ -244,12 +278,13 @@ # Check functions # general check_functions = [ - ['HAVE_GETTIMEOFDAY', 'gettimeofday'], - ['HAVE_SRANDOM', 'srandom' ], + ['HAVE_GETTIMEOFDAY', 'gettimeofday', ''], + ['HAVE_RINT', 'rint' , ''], + ['HAVE_SRANDOM', 'srandom' , ''], ] foreach func: check_functions - if cc.has_function(func[1]) - conf.set(func[0], 1, description: + if cc.has_function(func[1], prefix: '#include ' + func[2]) + conf.set(func[0], 1, description: 'Define to 1 if the @0@() function is available'.format(func[1])) endif endforeach @@ -268,37 +303,53 @@ # Dependencies # LCMS -with_lcms = get_option('with-lcms') -if with_lcms - lcms = cc.find_library('lcms2', required : true) +if get_option('with-lcms') + lcms = dependency('lcms2', required: true, native: false) if lcms.found() - conf.set('HAVE_LCMS', 1, description: 'Define to 1 if liblcms2 is available') + conf.set('HAVE_LCMS', 1, description: + 'Define to 1 if liblcms2 is available') endif else - lcms = dependency('', required : false) + lcms = declare_dependency() endif math = cc.find_library('m', required: false) -log = cc.find_library('log', required: false) -if platform_win32 +thread = dependency('threads', required: false) +if platform_android + log = cc.find_library('log', required: false) +else + log = [] +endif +if platform_win32 dl = [] else dl = cc.find_library('dl', required: false) endif -thread = dependency('threads', required: false) - ################################################################################ # Build utilities -env_bin = find_program('env', required: true, native: true) +env_bin = find_program('env', required: false, native: true) git_bin = find_program('git', required: false, native: true) rsvg_convert_bin = find_program('rsvg-convert', required: false, native: true) test_bin = find_program('test', required: false, native: true) w3m_bin = find_program('w3m', required: false, native: true) +################################################################################ +# Build flags + +build_docs = false + +if get_option('with-docs') + if cc_can_run and env_bin.found() and not platform_win32 + build_docs = true + else + warning('Unable to generate docs in this environment') + endif +endif + ################################################################################ # Configuration files @@ -309,22 +360,6 @@ configuration: conf ) -# pkg-config file -pkgconfig.generate(filebase: 'babl', - name: 'babl', - description: 'Dynamic, any to any, pixel format conversion library', - version: meson.project_version(), - libraries: [ - '-L${libdir}', - '-l' + lib_name, - ], - libraries_private: [ - '-lm', '-lpthread', - ], - subdirs: [ - lib_name, - ], -) ################################################################################ # Subdirs @@ -335,15 +370,14 @@ subdir('extensions') subdir('tests') subdir('tools') -if get_option('with-docs') +if build_docs subdir('docs') endif - -if w3m_bin.found() +if w3m_bin.found() and build_docs custom_target('README', - input : [ join_paths('docs', 'index.html'), ] , - output: [ 'README' ] , + input: index_html, + output: 'README', command: [ w3m_bin, '-cols', '72', @@ -353,3 +387,18 @@ capture: true, ) endif + + +# pkg-config file +pkgconfig.generate(filebase: 'babl', + name: 'babl', + description: 'Pixel encoding and color space conversion engine.', + version: meson.project_version(), + libraries: [ babl ], + libraries_private: [ + '-lm', + ], + subdirs: [ + lib_name, + ], +) diff -Nru babl-0.1.63+om~1/meson_options.txt babl-0.1.73+om~1/meson_options.txt --- babl-0.1.63+om~1/meson_options.txt 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/meson_options.txt 2019-12-09 16:21:18.000000000 +0000 @@ -3,6 +3,8 @@ option('enable-sse2', type: 'boolean', value: true, description: 'enable SSE2 support') option('enable-sse3', type: 'boolean', value: true, description: 'enable SSE3 support') option('enable-sse4_1', type: 'boolean', value: true, description: 'enable SSE4.1 support') +option('enable-avx2', type: 'boolean', value: true, description: 'enable AVX2 support') option('enable-f16c', type: 'boolean', value: true, description: 'enable hardware half-float support') +option('enable-gir', type: 'boolean', value: true, description: 'enable GObject-Introspection (GIR)') option('with-docs', type: 'boolean', value: true, description: 'build website') option('with-lcms', type: 'boolean', value: true, description: 'build with lcms') diff -Nru babl-0.1.63+om~1/NEWS babl-0.1.73+om~1/NEWS --- babl-0.1.63+om~1/NEWS 2019-03-11 21:48:23.000000000 +0000 +++ babl-0.1.73+om~1/NEWS 2019-12-09 16:21:18.000000000 +0000 @@ -3,6 +3,35 @@ the news section both in the README and the webpage. --> +2019-08-22 babl-0.1.72
+Added handling for grayscale ICC profiles and gobject introspection support. +Optimizations for many format conversions for u8, u16 and half formats. And +fixed a crash for NANs in float to u8 conversions. +
+2019-08-02 babl-0.1.70
+Build fixes making the meson build work with more architectures. +
+2019-07-25 babl-0.1.68
+Added Yu'v' (CIE 1976 UCS) color model. Fixed a severe non-initialised memory +issue - that kept us from using fast paths for many babl spaces loaded from +profile. More fully symmetric conversions between associated and separate +alpha. Added more converters, both SSE2 and non-SSE2 for matrix-conversion +between different RGB spaces. Improvements to website/documentation; babl is +now using the terms associated alpha and separate alpha, all of: +nonpremultiplied-, premultiplied- and nonassociated- alpha are now considered +deprecated API. HCY luminance is now relative to the RGB space used - no change +for sRGB related pixel formats. AVX2 acceleration for some linear to float +conversions. +
+2019-06-12 babl-0.1.66
+Added API call, babl_space_get_rgb_luminance, +Make most SIMD code-paths optional again on i686. +
+2019-05-25 babl-0.1.64
+Support for Hygon Dhyana, and Y~aA formats for symmetric completeness. +Code consistency, gitlab CI, autotools and meson build improvements. + +
2019-02-01 babl-0.1.62
Continuous integration with gitlab. Initial CMYK spaces with lcms2 based ICC support, much room for optimization. @@ -11,201 +40,3 @@ Model introspection API permitting low overhead checks whether a format/model is RGB, CMYK type of alpha and similar.
-2018-10-05 babl-0.1.60
-Improved thread safety, acceleration for R'G'B'A u8 -> cairo-ARGB32 conversion. -
-2018-10-05 babl-0.1.58
-Preserve color of transparent pixels in conversion to premultiplied alpha, -Added single precision code-paths for faster fallback/reference conversions. -New BABL_ICC_INTENT_PERFORMANCE bitflag for combining with intent as bitflags, -use of matrix+trc when relative colorimetric CLUT is present. New color model -and formats, CIE xyY. - -
-2018-08-14 babl-0.1.56
-Improvements to the caching of profiled conversion chains between invocations -by ignoring unknown bits in cache file and remember which conversions yielded -reference fishes. - -2018-07-23 babl-0.1.54
-
-Export babl_space_get_icc, babl_space_get, babl_model_with_space, -babl_space_with_trc, babl_format_get_encoding, babl_model_is, SSE2 versions of -YA float and Y float to CIE L float. -
-2018-06-02 babl-0.1.52
-Concurrency fixes and fixes to handling of 0/1 entry palettes, do not -pre-equalize XYZ conversion matrices for sRGB, internal clean-ups, pre-define -ACES2065-1 and ACEScg BablSpaces, add R~G~B~ set of spaces, which for all -BablSpaces mean use sRGB TRC. -
-2018-05-20 babl-0.1.50
-Improvements to speed and precision of indexed code, improvements to meson -build. -
-2018-05-15 babl-0.1.48
-fix u8 <-> double conversions for chroma, SSE2 version of RGBA float to -CIE L / Lab. Build with -Ofast by default. -
-2018-04-10 babl-0.1.46
-added extensions with more coverage for u32, half and other utilit fast paths -improving fast path coverage. -
-2018-02-18 babl-0.1.44
-Fix bug in custom primaries/ICC fast paths, improve meson build
-
-2018-01-23 babl-0.1.42
-Fully initialize fishes when loading from cache.
-
-2018-01-16 babl-0.1.40
-Added format "CIE XYZ alpha" color model and formats. -New API babl_process_rows for reduced overhead in some scenarios; though bigger -gains seen also for regular babl_process with reimplemented branch-free -dispatch, and faster cbrt. Added meson build; being tested in parallel with -auotmake, Improved reference conversions for formats skipping some of models -components, Fixed gamma handling in indexed/palettized formats and improved -gamma precision consistenct in sse2 conversions.
-
-2017-11-15 babl-0.1.38
-Added format "CIE L float", a couple of protections against division by 0.0 -
-2017-11-10 babl-0.1.36
-Optimized customized primary aware code paths for CIE Lab<->RGB conversions, -improved accuracy of gamma approximations. New API babl_format_exists() for -checking validity of babl format name, crash proofing of cache handling and use -of environment variables. -
-2017-10-06 babl-0.1.34
-Brown paper bag release, Fix indexed / custom primaries conflict, and re-export -a symbol used by old GEGL/GIMPs. -
-2017-10-03 babl-0.1.32
-Added custom primaries and TRC support through ICC parsing, improved -float<->half performance, rewrite of all conversions functions to adhere to new -signature. -
-2017-07-15 babl-0.1.30
-Thread stability for palette modes, stricter alpha preservation, now -cross-compilable on android. -
-2017-05-30 babl-0.1.28
-Fast paths for Lav <-> Lch, release triggered by pending GIMP release. -
-2017-05-09 babl-0.1.26
-Build and install HCY color space, platform independences fixes to fish cache. -
-2017-02-01 babl-0.1.24
-Improvements to profile cache persistance, fast paths that improve actual GIMP -use on various precisions, use single precision constants for some more of CIE -computions. -
-2016-11-05 babl-0.1.22
-Added cache of profiled conversions, added HCY color model, some precision and -performance updated for fast paths. -
-2016-11-05 babl-0.1.20
-Fix run-time errors, leaks, and race conditions. Add conditional fast paths. -
-2016-06-13 babl-0.1.18
-Bugfix: take alpha threshold in consideration when processing floats in SSE2. -
-2016-02-12 babl-0.1.16
-Improvements to half float reference, SIMD, and fast-paths, and CIE float fast -paths; cleanups of fast path extensions. -
-2015-11-19 babl-0.1.14
-sRGB precision tuning, stability fixes, locale fix for setting error tolerance. -
-2015-02-03 babl-0.1.12
-optimizations for floating point conversions, HSV and HSL color models, -removal of dead code, fixed CIE Lab conversions. -
-2012-03-30 babl-0.1.10
-LUT based speedups for gamma correction / uncorrection. -
-2012-03-30 babl-0.1.8
-Added support for indexed/pallette based formats, constified API. -
-2011-11-18 babl-0.1.6
-Build improvements, remove blatantly wrong conversions from extensions, -made it possible to distinguish format_n formats from others, improvements -to vala/gobject introspection support. - -
-2011-01-20 babl-0.1.4
-Improved cross platform build ability, added code to handle n-component formats, -remove extraenous runtime profiling that impacted performance. - -
-2010-01-15 babl-0.1.2
-Made babl mostly threadsafe (sufficient for GIMP/GEGLs needs). Streamlined core functionality, reducing number of function calls and removing overeager instrumentation. -
-2009-05-20 babl-0.1.0
-Support for RGBA representation in the frequency domain, -un-pre-multiply close-to-zero alpha values to complete black instead -of slightly brighter than black, add a BABL_ALPHA_THRESHOLD constant -to the API, do a complete overhaul of the babl API and do some -changes to increase portability of the library. -
-2008-06-12 babl-0.0.22
-Speed improvements due to: coalesced hashing, early bail out upon creation of -duplicate formats, caching of non existing paths. Large amounts of the core has -also been reviewed and refactored. Improved conversion coverage in the matrix. -
-2008-02-27 babl-0.0.20
-Builds on OSX -Check <0.0 and >1.0 values conversions for accuracy as well. - -
- - diff -Nru babl-0.1.63+om~1/tests/alpha_symmetric_transform.c babl-0.1.73+om~1/tests/alpha_symmetric_transform.c --- babl-0.1.63+om~1/tests/alpha_symmetric_transform.c 1970-01-01 00:00:00.000000000 +0000 +++ babl-0.1.73+om~1/tests/alpha_symmetric_transform.c 2019-12-09 16:21:18.000000000 +0000 @@ -0,0 +1,111 @@ +/* babl - dynamically extendable universal pixel conversion library. + * Copyright (C) 2005, 2017 Øyvind Kolås. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, see + * . + */ + +#include "config.h" +#include +#include "babl-internal.h" + +#define TOLERANCE 0.001 +#define PIXELS 12 + +float source_buf [PIXELS * 4] = +{ 10.0, 1.0, 0.1, 1.0, + 10.0, 1.0, 0.1, 0.5, + 10.0, 1.0, 0.1, 0.1, + 10.0, 1.0, 0.1, 0.01, + 10.0, 1.0, 0.1, -0.01, + 10.0, 1.0, 0.1, 1.5, + 10.0, 1.0, 0.0001, 0.000001, + 10.0, 1.0, 0.1 , -0.00001, + 10.0, 1.0, 0.1, 0.0, + 10.0, 1.0, 0.1, -0.5, + 1000.0,10000.0, 100000.0, 0.001, + 5000.0,50000.0, 500000.0, 0.01, +}; + +float bounce_buf [PIXELS * 4]; +float destination_buf [PIXELS * 4]; + +static int +test (void) +{ + int i; + int OK = 1; + + babl_process (babl_fish ("RGBA float", "RaGaBaA float"), + source_buf, bounce_buf, + PIXELS); + babl_process (babl_fish ("RaGaBaA float", "RGBA float"), + bounce_buf, destination_buf, + PIXELS); + + for (i = 0; i < PIXELS; i++) + { + for (int c = 0; c < 4; c++) + { + if (fabs (destination_buf[i*4+c] - source_buf[i*4+c]) > TOLERANCE) + { + babl_log ("separate alpha %i.%i: %.9f!=%.9f(ref) ", i, c, destination_buf[i*4+c], + source_buf[i*4+c]); + OK = 0; + } + // fprintf (stdout, "%.19f ", destination_buf[i*4+c]); + } + // fprintf (stdout, "\n"); + } + + fprintf (stdout, "\n"); + + babl_process (babl_fish ("RaGaBaA float", "RGBA float"), + source_buf, bounce_buf, + PIXELS); + babl_process (babl_fish ("RGBA float", "RaGaBaA float"), + bounce_buf, destination_buf, + PIXELS); + + for (i = 0; i < PIXELS; i++) + { + for (int c = 0; c < 4; c++) + { + if (fabs (destination_buf[i*4+c] - source_buf[i*4+c]) > TOLERANCE) + { + babl_log ("associatd-alpha %i.%i: %.9f!=%.9f(ref) ", i, c, destination_buf[i*4+c], + source_buf[i*4+c]); + OK = 0; + } + // fprintf (stdout, "%.19f ", destination_buf[i*4+c]); + } + // fprintf (stdout, "\n"); + } + + + if (!OK) + return -1; + return 0; +} + +int +main (int argc, + char **argv) +{ + babl_init (); + if (test ()) + return -1; + babl_exit (); + return 0; +} diff -Nru babl-0.1.63+om~1/tests/cairo_cmyk_hack.c babl-0.1.73+om~1/tests/cairo_cmyk_hack.c --- babl-0.1.63+om~1/tests/cairo_cmyk_hack.c 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/tests/cairo_cmyk_hack.c 2019-12-09 16:21:18.000000000 +0000 @@ -57,7 +57,7 @@ for (i = 0; i < PIXELS * 5; i++) { - if (fabs (dest_buf[i] - source_buf[i]) > TOLERANCE) + if (fabs (dest_buf[i] - source_buf[i] * 1.0) > TOLERANCE) { fprintf (stderr, "%i is wrong\n", i); OK = 0; diff -Nru babl-0.1.63+om~1/tests/Makefile.am babl-0.1.73+om~1/tests/Makefile.am --- babl-0.1.63+om~1/tests/Makefile.am 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/tests/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -if OS_UNIX -CONCURRENCY_STRESS_TESTS = \ - concurrency-stress-test \ - palette-concurrency-stress-test -endif - -C_TESTS = \ - cairo_cmyk_hack \ - grayscale_to_rgb \ - chromaticities \ - rgb_to_bgr \ - rgb_to_ycbcr \ - srgb_to_lab_u8 \ - sanity \ - babl_class_name \ - extract \ - floatclamp \ - float-to-8bit \ - hsl \ - hsva \ - types \ - format_with_space \ - palette \ - extract \ - nop \ - n_components \ - n_components_cast \ - models \ - cairo-RGB24 \ - transparent \ - $(CONCURRENCY_STRESS_TESTS) - -TESTS = \ - $(C_TESTS) - -TESTS_ENVIRONMENT = LD_LIBRARY_PATH=$(top_builddir)/babl:$LD_LIBRARY_PATH GI_TYPELIB_PATH=$(top_builddir)/babl BABL_PATH=$(top_builddir)/extensions/.libs - -AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl $(LCMS_CFLAGS) -AM_LDFLAGS = $(THREAD_LIB) -no-install - -LDADD = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \ - $(MATH_LIB) $(THREAD_LIB) - -EXTRA_DIST=common.inc - -noinst_PROGRAMS = \ - $(C_TESTS) diff -Nru babl-0.1.63+om~1/tests/meson.build babl-0.1.73+om~1/tests/meson.build --- babl-0.1.63+om~1/tests/meson.build 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/tests/meson.build 2019-12-09 16:21:18.000000000 +0000 @@ -1,17 +1,19 @@ test_names = [ 'babl_class_name', + 'cairo_cmyk_hack', 'cairo-RGB24', 'chromaticities', 'extract', - 'float-to-8bit', 'floatclamp', + 'float-to-8bit', + 'format_with_space', 'grayscale_to_rgb', 'hsl', 'hsva', 'models', - 'n_components_cast', 'n_components', + 'n_components_cast', 'nop', 'palette', 'rgb_to_bgr', @@ -19,6 +21,7 @@ 'sanity', 'srgb_to_lab_u8', 'transparent', + 'alpha_symmetric_transform', 'types', ] if platform_unix diff -Nru babl-0.1.63+om~1/tests/srgb_to_lab_u8.c babl-0.1.73+om~1/tests/srgb_to_lab_u8.c --- babl-0.1.63+om~1/tests/srgb_to_lab_u8.c 2018-11-25 16:12:37.000000000 +0000 +++ babl-0.1.73+om~1/tests/srgb_to_lab_u8.c 2019-12-09 16:21:18.000000000 +0000 @@ -53,7 +53,7 @@ for (i = 0; i < PIXELS * 3; i++) { - if (fabs (destination_buf[i] - reference_buf[i]) > TOLERANCE) + if (fabs (1.0 * destination_buf[i] - reference_buf[i]) > TOLERANCE) { fprintf (stderr, "%2i (%2i%%3=%i, %2i/3=%i) is %i should be %i", i, i, i % 3, i, i / 3, destination_buf[i], reference_buf[i]); diff -Nru babl-0.1.63+om~1/TODO babl-0.1.73+om~1/TODO --- babl-0.1.63+om~1/TODO 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/TODO 2019-12-09 16:21:18.000000000 +0000 @@ -1,5 +1,12 @@

TODO

+

These are among desired or expected changes to babl, that are missing.

+
    +
  • extensions for many SIMD variants for many archiectures.
  • +
  • Spectral pixel formats - with configurable spectral mapping to tristimulus with configurable illuminant + observer
  • +
  • Spectral substrate + ink/paint job configuration as a pixel format, +combined with above to achieve soft proofing, and stochastic sparse LUT for +separation.
  • Support for datatypes that are not a multiple of 8bit.
diff -Nru babl-0.1.63+om~1/tools/babl-benchmark.c babl-0.1.73+om~1/tools/babl-benchmark.c --- babl-0.1.63+om~1/tools/babl-benchmark.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/tools/babl-benchmark.c 2019-12-09 16:21:18.000000000 +0000 @@ -25,7 +25,7 @@ #define random rand #endif -int ITERATIONS = 2; +int ITERATIONS = 1; #define N_PIXELS (512*1024) // a too small batch makes the test set live // in l2 cache skewing results @@ -34,7 +34,9 @@ #define N_BYTES N_PIXELS * (4 * 8) -static const char *unicode_hbar (int width, double fraction) +static const char * +unicode_hbar (int width, + double fraction) { static char ret[200]=""; const char *block[9]= {" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉","█"}; @@ -78,12 +80,20 @@ babl_format_with_space("RGBA float", babl_space("ProPhoto")), babl_format_with_space("R'G'B' u16", babl_space("ProPhoto")), #endif - //babl_format("R'G'B'A u8"), - //babl_format("R'G'B'A u16"), - babl_format_with_space("R'G'B'A u8", babl_space("ProPhoto")), - babl_format_with_space("R'G'B'A half", babl_space("ProPhoto")), + //babl_format("R'G'B'A u8"), + babl_format("R'G'B'A u16"), + //babl_format_with_space("R'G'B'A u8", babl_space("ProPhoto")), + //babl_format_with_space("Y'A u8", babl_space("ProPhoto")), + babl_format_with_space("Y'A u16", babl_space("ProPhoto")), + babl_format_with_space("Y' u16", babl_space("ProPhoto")), + //babl_format_with_space("Y' u8", babl_space("ProPhoto")), + babl_format_with_space("Y float", babl_space("ProPhoto")), + babl_format_with_space("YaA float", babl_space("ProPhoto")), + babl_format_with_space("YA float", babl_space("ProPhoto")), + //babl_format_with_space("YA u16", babl_space("ProPhoto")), + //babl_format_with_space("R'G'B'A half", babl_space("ProPhoto")), babl_format_with_space("R'G'B'A float", babl_space("ProPhoto")), - babl_format_with_space("R'G'B'A double", babl_space("ProPhoto")), + babl_format_with_space("RaGaBaA float", babl_space("ProPhoto")), babl_format_with_space("cairo-RGB24", babl_space("Adobe")), babl_format_with_space("cairo-ARGB32", babl_space("Adobe")), @@ -91,7 +101,7 @@ int n_formats = sizeof (formats) / sizeof (formats[0]); const Babl *fishes[50 * 50]; double mbps[50 * 50] = {0,}; - int n; + long n; double max = 0.0; assert (n_formats < 50); diff -Nru babl-0.1.63+om~1/tools/babl_fish_path_fitness.c babl-0.1.73+om~1/tools/babl_fish_path_fitness.c --- babl-0.1.63+om~1/tools/babl_fish_path_fitness.c 2018-09-09 16:06:53.000000000 +0000 +++ babl-0.1.73+om~1/tools/babl_fish_path_fitness.c 2019-12-09 16:21:18.000000000 +0000 @@ -62,17 +62,21 @@ static char test_pixels_out[NUM_TEST_PIXELS * 6 * 8]; -static double rand_double (void) +static double +rand_double (void) { return (double) random () / RAND_MAX; } -static double rand_range_double (double min, double max) +static double +rand_range_double (double min, + double max) { return rand_double () * (max - min) + min; } -static void init_test_pixels (void) +static void +init_test_pixels (void) { static int done = 0; int i = 0; @@ -227,7 +231,8 @@ return 0; } -int main (void) +int +main (void) { babl_init (); diff -Nru babl-0.1.63+om~1/tools/babl-gen-test-pixels.c babl-0.1.73+om~1/tools/babl-gen-test-pixels.c --- babl-0.1.63+om~1/tools/babl-gen-test-pixels.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/tools/babl-gen-test-pixels.c 2019-12-09 16:21:18.000000000 +0000 @@ -37,17 +37,21 @@ BABL_COMPONENT_FMT_STR ", " \ BABL_COMPONENT_FMT_STR -static double rand_double (void) +static double +rand_double (void) { return (double) random () / RAND_MAX; } -static double rand_range_double (double min, double max) +static double +rand_range_double (double min, + double max) { return rand_double () * (max - min) + min; } -static void gen_path_pixels (void) +static void +gen_path_pixels (void) { int i; srandom (20050728); @@ -119,7 +123,8 @@ printf ("static const double *babl_format_test_pixels = babl_path_test_pixels;\n\n"); } -static void gen_model_pixels (void) +static void +gen_model_pixels (void) { int i; srandom (20050728); @@ -141,7 +146,8 @@ printf ("};\n\n"); } -static void gen_type_pixels (void) +static void +gen_type_pixels (void) { int i; srandom (20050728); @@ -163,7 +169,9 @@ printf ("};\n\n"); } -int main (int argc, char **argv) +int +main (int argc, + char **argv) { printf ( "/* babl - dynamically extendable universal pixel conversion library.\n" diff -Nru babl-0.1.63+om~1/tools/babl-html-dump.c babl-0.1.73+om~1/tools/babl-html-dump.c --- babl-0.1.63+om~1/tools/babl-html-dump.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/tools/babl-html-dump.c 2019-12-09 16:21:18.000000000 +0000 @@ -16,62 +16,49 @@ * . * */ - + #include "config.h" #include "babl-internal.h" /* needed for babl_log */ -static void model_html (Babl *babl); -static void type_html (Babl *babl); -static void format_html (Babl *babl); -static void conversion_html (Babl *babl); - -static int each_item (Babl *babl, - void *user_data); -static int show_item (Babl *babl, - void *user_data); -static int hide_item (Babl *babl, - void *user_data); +static void +model_html (Babl *babl); + +static void +type_html (Babl *babl); + +static void +format_html (Babl *babl); +static void +space_html (Babl *babl); +static void +conversion_html (Babl *babl); + +static int +each_item (Babl *babl, + void *user_data); + int main (void) { babl_init (); - printf ("
+"); - - printf ("-"); - - printf ("
"); - printf ("
\n"); + printf ("
"); + printf ("

Types

"); babl_type_class_for_each (each_item, NULL); printf ("
\n"); - printf ("
\n"); - printf ("
"); - printf ("
\n"); + printf ("
"); + printf ("

Models

"); babl_model_class_for_each (each_item, NULL); printf ("
\n"); - printf ("
\n"); - printf ("
"); - printf ("
\n"); + printf ("
"); + printf ("

Pixelformats

"); babl_format_class_for_each (each_item, NULL); printf ("
\n"); - printf ("
\n"); /* printf ("
"); @@ -88,7 +75,8 @@ static char normalized_buf[512]; -static const char *normalize (const char *str) +static const char * +normalize (const char *str) { char *s = normalized_buf; @@ -101,6 +89,9 @@ (*s >= '0' && *s <= '9')) { } + else if (*s == '~') + { + } else { *s = '_'; @@ -112,31 +103,27 @@ static int -show_item (Babl *babl, - void *user_data) -{ - printf ("show(\"x_%s\");", normalize (babl->instance.name)); - return 0; -} - - -static int -hide_item (Babl *babl, - void *user_data) -{ - printf ("hide(\"x_%s\");", normalize (babl->instance.name)); - return 0; -} - -static int each_item (Babl *babl, void *user_data) { - printf ("
"); - printf ("\n", - normalize (babl->instance.name), babl->instance.name); - printf ("
\n", - normalize (babl->instance.name)); + const char *fun_pre = "babl_type"; + const char *fun_post = ")"; + + switch (babl->class_type) + { + case BABL_MODEL: fun_pre = "babl_model"; break; + case BABL_FORMAT: fun_pre = "babl_format_with_space"; + fun_post = ", space|NULL)"; + break; + } + + printf ("
\n", + normalize (babl->instance.name), + normalize (babl->instance.name), + fun_pre, + babl->instance.name, + fun_post); + printf ("
"); switch (babl->class_type) @@ -153,6 +140,10 @@ format_html (babl); break; + case BABL_SPACE: + space_html (babl); + break; + case BABL_CONVERSION: case BABL_CONVERSION_LINEAR: case BABL_CONVERSION_PLANE: @@ -170,9 +161,64 @@ } static void +model_doc (const Babl *babl) +{ + if (babl->instance.doc) + printf ("%s", babl->instance.doc); + else + { + BablModelFlag flags = babl_get_model_flags (babl); + if (flags & BABL_MODEL_FLAG_RGB) + { + printf ("RGB"); + + if (flags & BABL_MODEL_FLAG_LINEAR) + printf (" linear"); + if (flags & BABL_MODEL_FLAG_NONLINEAR) + printf (" with TRC from space"); + if (flags & BABL_MODEL_FLAG_PERCEPTUAL) + printf (" with perceptual (sRGB) TRC"); + } + else if (flags & BABL_MODEL_FLAG_GRAY) + { + if (flags & BABL_MODEL_FLAG_LINEAR) + printf (" Luminance"); + if (flags & BABL_MODEL_FLAG_NONLINEAR) + printf (" Grayscale with TRC from space"); + if (flags & BABL_MODEL_FLAG_PERCEPTUAL) + printf (" Grayscale with perceptual (sRGB) TRC"); + } + else if (flags & BABL_MODEL_FLAG_CMYK) + { + if (flags & BABL_MODEL_FLAG_INVERTED) + printf ("CMYK with inverted color components (0.0=full coverage), for additive compositing"); + else + printf ("CMYK"); + } + + if (flags & BABL_MODEL_FLAG_ALPHA) + { + if (flags & BABL_MODEL_FLAG_ASSOCIATED) + { + printf (", associated alpha"); + } + else + { + printf (", separate alpha"); + } + } + + } +} + + +static void model_html (Babl *babl) { int i; + printf ("

"); + model_doc (babl); + printf ("

"); printf ("
"); printf ("
components
"); @@ -188,6 +234,9 @@ static void type_html (Babl *babl) { + if (babl->instance.doc) + printf ("

%s

", babl->instance.doc); + printf ("
bits
%i
", babl->type.bits); printf ("
bytes
%i
", babl->type.bits / 8); } @@ -196,22 +245,46 @@ static void conversion_html (Babl *babl) { - printf ("\n"); + printf ("%s
\n", babl->instance.name); +} + +static void +space_html (Babl *babl) +{ + printf ("%s
\n", babl->instance.name); } static void format_html (Babl *babl) { int i; + const Babl *model = BABL (babl->format.model); + + printf ("

"); + if (babl->instance.doc) + printf ("%s", babl->instance.doc); + else + { + //const Babl *type = BABL (babl->format.type[0]); + model_doc (model); + //if (type->instance.doc) + // printf (" %s", type->instance.doc); + //else + // printf (" %s", type->instance.name); + } + printf ("

"); printf ("
"); printf ("
bytes/pixel
%i
", babl->format.bytes_per_pixel); - printf ("
model
%s
", BABL (babl->format.model)->instance.name); + printf ("
model
%s
", + normalize( BABL (babl->format.model)->instance.name), + BABL (babl->format.model)->instance.name); printf ("
components
"); for (i = 0; i < babl->format.components; i++) { - printf ("", + printf ("", + normalize(BABL (babl->format.type[i])->instance.name), BABL (babl->format.type[i])->instance.name, BABL (babl->format.component[i])->instance.name); } diff -Nru babl-0.1.63+om~1/tools/babl-icc-dump.c babl-0.1.73+om~1/tools/babl-icc-dump.c --- babl-0.1.63+om~1/tools/babl-icc-dump.c 2017-08-24 22:35:21.000000000 +0000 +++ babl-0.1.73+om~1/tools/babl-icc-dump.c 2019-12-09 16:21:18.000000000 +0000 @@ -22,7 +22,10 @@ #define ICC_HEADER_LEN 128 #define TAG_COUNT_OFF ICC_HEADER_LEN -static int load_u8 (const char *icc, int length, int offset) +static int +load_u8 (const char *icc, + int length, + int offset) { /* all reading functions take both the char *pointer and the length of the * buffer, and all reads thus gets protected by this condition. @@ -33,7 +36,10 @@ return *(uint8_t*) (&icc[offset]); } -static int load_s8 (const char *icc, int length, int offset) +static int +load_s8 (const char *icc, + int length, + int offset) { if (offset < 0 || offset > length) return 0; @@ -41,53 +47,74 @@ return *(int8_t*) (&icc[offset]); } -static int16_t load_u1f15 (const char *icc, int length, int offset) +static int16_t +load_u1f15 (const char *icc, + int length, + int offset) { return load_u8 (icc, length, offset + 1) + (load_s8 (icc, length, offset + 0) << 8); } -static uint16_t load_u16 (const char *icc, int length, int offset) +static uint16_t +load_u16 (const char *icc, + int length, + int offset) { return load_u8 (icc, length, offset + 1) + (load_u8 (icc, length, offset + 0) << 8); } -static u8f8_t load_u8f8_ (const char *icc, int length, int offset) +static u8f8_t +load_u8f8_ (const char *icc, + int length, + int offset) { u8f8_t ret ={load_u8 (icc, length, offset), load_u8 (icc, length, offset + 1)}; return ret; } -static s15f16_t load_s15f16_ (const char *icc, int length, int offset) +static s15f16_t +load_s15f16_ (const char *icc, + int length, + int offset) { s15f16_t ret ={load_u1f15 (icc, length, offset), load_u16 (icc, length, offset + 2)}; return ret; } -static double s15f16_to_d (s15f16_t fix) +static double +s15f16_to_d (s15f16_t fix) { return fix.integer + fix.fraction / 65535.0; } -static double u8f8_to_d (u8f8_t fix) +static double +u8f8_to_d (u8f8_t fix) { return fix.integer + fix.fraction / 255.0; } -static double load_s15f16 (const char *icc, int length, int offset) +static double +load_s15f16 (const char *icc, + int length, + int offset) { return s15f16_to_d (load_s15f16_ (icc, length, offset)); } -static double load_u8f8 (const char *icc, int length, int offset) +static double +load_u8f8 (const char *icc, + int length, + int offset) { return u8f8_to_d (load_u8f8_ (icc, length, offset)); } -static void print_u8f8 (u8f8_t fix) +static void +print_u8f8 (u8f8_t fix) { int i; uint32_t foo; @@ -101,7 +128,8 @@ } } -static void print_s15f16 (s15f16_t fix) +static void +print_s15f16 (s15f16_t fix) { int i; uint32_t foo; @@ -131,7 +159,10 @@ } } -static uint32_t load_u32 (const char *icc, int length, int offset) +static uint32_t +load_u32 (const char *icc, + int length, + int offset) { return load_u8 (icc, length, offset + 3) + (load_u8 (icc, length, offset + 2) << 8) + @@ -139,8 +170,11 @@ (load_u8 (icc, length, offset + 0) << 24); } -static void load_sign (const char *icc, int length, - int offset, char *sign) +static void +load_sign (const char *icc, + int length, + int offset, + char *sign) { sign[0]=load_u8(icc, length, offset); sign[1]=load_u8(icc, length, offset + 1); @@ -151,8 +185,12 @@ /* looks up offset and length for a specific icc tag */ -static int icc_tag (const char *icc, int length, - const char *tag, int *offset, int *el_length) +static int +icc_tag (const char *icc, + int length, + const char *tag, + int *offset, + int *el_length) { int tag_count = load_u32 (icc, length, TAG_COUNT_OFF); int t; @@ -276,7 +314,10 @@ int exact = 0; -static int load_icc_from_memory (const char *icc, long length, char **error) +static int +load_icc_from_memory (const char *icc, + long length, + char **error) { int tag_count = load_u32 (icc, length, TAG_COUNT_OFF); int profile_size = load_u32 (icc, length, 0); @@ -591,7 +632,9 @@ return 0; } -static int load_icc (const char *path, char **error) +static int +load_icc (const char *path, + char **error) { char *icc = NULL; long length = 0; @@ -643,7 +686,9 @@ return 0; } -int main (int argc, char **argv) +int +main (int argc, + char **argv) { int i = 1; if (argc < 2) diff -Nru babl-0.1.63+om~1/tools/babl-icc-rewrite.c babl-0.1.73+om~1/tools/babl-icc-rewrite.c --- babl-0.1.63+om~1/tools/babl-icc-rewrite.c 2018-07-28 22:27:58.000000000 +0000 +++ babl-0.1.73+om~1/tools/babl-icc-rewrite.c 2019-12-09 16:21:18.000000000 +0000 @@ -26,7 +26,10 @@ long *length, void *error); -void file_set_contents (const char *path, const char *data, long length); +void +file_set_contents (const char *path, + const char *data, + long length); int main (int argc, @@ -181,7 +184,10 @@ return 0; } -void file_set_contents (const char *path, const char *data, long length) +void +file_set_contents (const char *path, + const char *data, + long length) { FILE *fp = fopen (path, "wb"); if (length == -1) diff -Nru babl-0.1.63+om~1/tools/babl-verify.c babl-0.1.73+om~1/tools/babl-verify.c --- babl-0.1.63+om~1/tools/babl-verify.c 2018-11-27 14:48:14.000000000 +0000 +++ babl-0.1.73+om~1/tools/babl-verify.c 2019-12-09 16:21:18.000000000 +0000 @@ -3,10 +3,67 @@ #include "../config.h" #include "babl/babl-internal.h" -int main (int argc, char **argv) +//#define SPACE1 babl_space("ProPhoto") +#define SPACE1 babl_space("Apple") +//#define SPACE1 babl_space("sRGB") +//#define SPACE2 babl_space("Apple") + +static int +file_get_contents (const char *path, + char **contents, + long *length, + void *error) +{ + FILE *file; + long size; + char *buffer; + + file = fopen (path,"rb"); + + if (!file) + return -1; + + if (fseek (file, 0, SEEK_END) == -1 || (size = ftell (file)) == -1) + { + fclose (file); + return -1; + } + if (length) *length = size; + rewind (file); + if ((size_t) size > SIZE_MAX - 8) + { + fclose (file); + return -1; + } + buffer = calloc(size + 8, 1); + + if (!buffer) + { + fclose(file); + return -1; + } + + size -= fread (buffer, 1, size, file); + if (size) + { + fclose (file); + free (buffer); + return -1; + } + fclose (file); + *contents = buffer; + return 0; +} + +int +main (int argc, + char **argv) { int final = 0; const Babl *fish; + const Babl *SPACE2 = NULL; + + if (argc < 3) { fprintf (stderr, "need two args, from and to babl-formats\n"); @@ -23,22 +80,42 @@ babl_init (); - fish = babl_fish (babl_format(argv[1]), babl_format (argv[2])); +#define ICC_PATH "/tmp/my.icc" +//#define ICC_PATH "/usr/share/color/icc/colord/AppleRGB.icc" +//#define ICC_PATH "/tmp/ACEScg-elle-V2-labl.icc" +//#define ICC_PATH "/tmp/ACEScg-elle-V2-g10.icc" +//#define ICC_PATH "/tmp/ACEScg-elle-V4-g10.icc" +//#define ICC_PATH "/tmp/ACEScg-elle-V4-g22.icc" + + + { + char *icc_data = NULL; + long length = 0; + file_get_contents (ICC_PATH, &icc_data, &length, NULL); + SPACE2 = babl_space_from_icc (icc_data, length, BABL_ICC_INTENT_RELATIVE_COLORIMETRIC, NULL); + //SPACE2 = babl_space ("sRGB"); + } + + fish = babl_fish (babl_format_with_space(argv[1], SPACE1), babl_format_with_space (argv[2], SPACE2)); if (!fish) + { + fprintf (stderr, "!!!! %s %s\n", argv[1], argv[2]); return -1; + } if (final) switch (fish->class_type) { case BABL_FISH: - fprintf (stderr, "%s\n", babl_get_name (fish)); + fprintf (stderr, ">%s\n", babl_get_name (fish)); break; case BABL_FISH_PATH: - fprintf (stderr, "chosen %s to %s: steps: %i error: %f cost: %f\n", argv[1], argv[2], fish->fish_path.conversion_list->count, fish->fish.error, fish->fish_path.cost); + fprintf (stderr, "chosen %s to %s: steps: %i error: %.12f cost: %f\n", argv[1], argv[2], fish->fish_path.conversion_list->count, fish->fish.error, fish->fish_path.cost); for (int i = 0; i < fish->fish_path.conversion_list->count; i++) { - fprintf (stderr, "\t%s\n", - babl_get_name(fish->fish_path.conversion_list->items[i] )); + fprintf (stderr, "\t%s (cost: %li)\n", + babl_get_name(fish->fish_path.conversion_list->items[i] ), + fish->fish_path.conversion_list->items[i]->conversion.cost); } break; } diff -Nru babl-0.1.63+om~1/tools/formats.c babl-0.1.73+om~1/tools/formats.c --- babl-0.1.63+om~1/tools/formats.c 2017-09-30 15:32:15.000000000 +0000 +++ babl-0.1.73+om~1/tools/formats.c 2019-12-09 16:21:18.000000000 +0000 @@ -7,14 +7,16 @@ #include "babl-internal.h" -static int format_check (Babl *babl, - void *userdata) +static int +format_check (Babl *babl, + void *userdata) { babl_log ("%s\tloss: %f", babl->instance.name, babl->format.loss); return 0; } -int main (void) +int +main (void) { babl_init (); diff -Nru babl-0.1.63+om~1/tools/Makefile.am babl-0.1.73+om~1/tools/Makefile.am --- babl-0.1.63+om~1/tools/Makefile.am 2018-12-26 23:08:12.000000000 +0000 +++ babl-0.1.73+om~1/tools/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl $(LCMS_CFLAGS) -AM_LDFLAGS = -no-install - -LDADD = $(top_builddir)/babl/libbabl-@BABL_API_VERSION@.la \ - $(MATH_LIB) $(THREAD_LIB) - -noinst_PROGRAMS = \ - babl-verify \ - babl-benchmark \ - babl-icc-dump \ - babl-icc-rewrite \ - trc-validator \ - introspect \ - babl_fish_path_fitness \ - babl-html-dump \ - conversions \ - formats -if HAVE_SRANDOM -noinst_PROGRAMS += \ - babl-gen-test-pixels -endif diff -Nru babl-0.1.63+om~1/tools/trc-validator.c babl-0.1.73+om~1/tools/trc-validator.c --- babl-0.1.63+om~1/tools/trc-validator.c 2017-09-19 17:52:29.000000000 +0000 +++ babl-0.1.73+om~1/tools/trc-validator.c 2019-12-09 16:21:18.000000000 +0000 @@ -141,7 +141,8 @@ #define DEGREE 6 #define SCALE 2 -static inline float from_linear (float x) +static inline float +from_linear (float x) { if (x >= X0 && x <= X1) { @@ -155,7 +156,8 @@ return powf (x, 1.0f/GAMMA); } -static inline float to_linear (float x) +static inline float +to_linear (float x) { if (x >= X0 && x <= X1) { @@ -170,17 +172,21 @@ } #endif -static inline float from_linear_ref (float x) +static inline float +from_linear_ref (float x) { return powf (x, 1.0/GAMMA); } -static inline float to_linear_ref (float x) +static inline float +to_linear_ref (float x) { return powf (x, GAMMA); } -int main (int argc, char **argv) +int +main (int argc, + char **argv) { int i; float max_diff = 0.0;
%s%s
%s%s