commit cd8d166c0c9b0f7dca30f0e5039e273cb11a3120 Author: Krzosa Karol Date: Tue Nov 18 08:40:36 2025 +0100 new repo for codebase diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f439910 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +build/ +backup +subl.bat +multimedia.c +multimedia.h +playground.py +ui_notes.txt +run_linux.bat +l.log +vendor + +*.10x +*.wasm +*.o +*sublime-project* +*sublime-workspace* \ No newline at end of file diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..f51706c --- /dev/null +++ b/build.bat @@ -0,0 +1,20 @@ +@echo off + +for %%a in (%*) do set "%%~a=1" + + +set common=-I ../src/ -g -fdiagnostics-absolute-paths -Wno-unsequenced -Wno-single-bit-bitfield-constant-conversion -Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers +set wasm_flags=--target=wasm32 -nostdlib -mbulk-memory -msimd128 -Wl,-export-dynamic,--allow-undefined,--import-memory,--no-entry,--initial-memory=131072000,--max-memory=4294967296 + +if not exist build ( + mkdir build +) +pushd build +if "%testing%"=="1" echo [testing] && set didbuild=1 && clang ../src/testing/testing_main.c -o testing.exe %common% || exit 1 /b +if "%scratch%"=="1" echo [scratch] && set didbuild=1 && clang ../src/scratch/scratch_main.c -o ../src/scratch/main.wasm %common% %wasm_flags% || exit 1 /b +popd + +if "%didbuild%"=="" ( + echo [WARNING] no valid build target specified + exit /b 1 +) diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..46a9de1 --- /dev/null +++ b/build.sh @@ -0,0 +1,17 @@ +cd "$(dirname "$0")" + +if [ ! -d build ]; then + mkdir build +fi +pushd build +clang ../src/testing/testing_main.c -g +popd + +# if [ ! -f build/build_tool.exe ]; then +# echo build_tool rebuild +# cd build +# clang ../src/meta/build_tool.c -ldl -lbacktrace -o build_tool.exe -g -fdiagnostics-absolute-paths -Wno-single-bit-bitfield-constant-conversion -Wno-unsequenced +# cd .. +# fi + +# ./build/build_tool.exe clang ../build_file.c -o build_file.exe -ldl -lm -lbacktrace -g -Wall -Wextra -Wno-missing-braces -Wno-missing-field-initializers -Wno-single-bit-bitfield-constant-conversion -fdiagnostics-absolute-paths -Wno-writable-strings -Wno-unsequenced diff --git a/src/core/core.c b/src/core/core.c new file mode 100644 index 0000000..f3e4eaf --- /dev/null +++ b/src/core/core.c @@ -0,0 +1,15 @@ +#include "core_platform.c" +#include "core_intrin.c" +#include "core_unicode.c" +#include "core_math.c" +#include "core_arena.c" +#include "stb_sprintf.c" +#include "core_string.c" +#include "core_string16.c" +#include "core_log.c" +#include "core_lexer.c" +#include "core_type_info.c" +#include "core_hash_table.c" +#include "core_array.c" +#include "core_math.gen.c" +#include "core_ctx.c" diff --git a/src/core/core.h b/src/core/core.h new file mode 100644 index 0000000..b90573e --- /dev/null +++ b/src/core/core.h @@ -0,0 +1,14 @@ +#include "core_basic.h" +#include "core_unicode.h" +#include "core_arena.h" +#include "core_string.h" +#include "core_string16.h" +#include "core_math.h" +#include "core_type_info.h" +#include "core_lexer.h" +#include "core_log.h" +#include "core_intrin.h" +#include "core_platform.h" +#include "core_hash_table.h" +#include "core_ctx.h" +#include "core_array.h" diff --git a/src/core/core_arena.c b/src/core/core_arena.c new file mode 100644 index 0000000..1f67652 --- /dev/null +++ b/src/core/core_arena.c @@ -0,0 +1,202 @@ +#include "core_arena.h" +#include "core_platform.h" +#include "core_intrin.h" +#include "core_ctx.h" + +#if PLATFORM_ADDRESS_SANITIZER + #include +#endif + +#if !defined(ASAN_POISON_MEMORY_REGION) + #define MA_ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) + #define MA_ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) +#else + #define MA_ASAN_POISON_MEMORY_REGION(addr, size) ASAN_POISON_MEMORY_REGION(addr, size) + #define MA_ASAN_UNPOISON_MEMORY_REGION(addr, size) ASAN_UNPOISON_MEMORY_REGION(addr, size) +#endif + +fn b32 is_pow2(usize x) { + b32 result = (((x) & ((x)-1)) == 0); + return result; +} + +fn usize get_align_offset(usize size, usize align) { + assert(is_pow2(align)); + if (align == 0) return 0; + + usize mask = align - 1; + usize val = size & mask; + if (val) { + val = align - val; + } + return val; +} + +fn usize align_up(usize size, usize align) { + usize result = size + get_align_offset(size, align); + return result; +} + +fn usize align_down(usize size, usize align) { + size += 1; // Make sure when align is 8 doesn't get rounded down to 0 + usize result = size - (align - get_align_offset(size, align)); + return result; +} + +fn void ma_init(ma_arena_t *arena, usize reserve) { + reserve = align_up(reserve, ma_page_size); + arena->align = ma_default_alignment; + arena->data = (u8 *)os_vmem_reserve(reserve); + if (arena->data) { + arena->reserve = reserve; + } +} + +fn ma_arena_t *ma_create(usize reserve) { + ma_arena_t *result = NULL; + + void *data = os_vmem_reserve(reserve); + if (!data) return result; + + b32 success = os_vmem_commit(data, ma_page_size); + if (!success) { + os_vmem_release(data); + return result; + } + + result = (ma_arena_t *)data; + result->data = (u8 *)data; + result->reserve = reserve; + result->commit = ma_page_size; + result->len = result->base_len = sizeof(ma_arena_t); + result->align = ma_default_alignment; + return result; +} + +fn void *ma_push_size_ex(ma_arena_t *arena, usize size) { + // base_len is used for bootstraping arenas, it denotes the + // space occupied by the arena. If len is smaller then base_len then + // we start to overwrite the arena itself - pure barbarism. + assert(arena->len >= arena->base_len); + + usize align_offset = 0; + if (arena->align) { + align_offset = get_align_offset((usize)arena->data + arena->len, arena->align); + } + usize size_with_alignment = size + align_offset; + usize new_len = arena->len + size_with_alignment; + if (new_len > arena->commit) { + if (arena->reserve == 0) { + ma_init(arena, ma_default_reserve_size); + } + usize new_len_aligned_to_page_size = align_up(new_len, ma_page_size); + usize to_commit = new_len_aligned_to_page_size - arena->commit; + usize to_commit_clamped = CLAMP_TOP(to_commit, arena->reserve); + if (to_commit_clamped > 0) { + b32 success = os_vmem_commit(arena->data + arena->commit, to_commit_clamped); + if (success) { + MA_ASAN_UNPOISON_MEMORY_REGION(arena->data + arena->commit, to_commit_clamped); + arena->commit += to_commit_clamped; + } + } + if (new_len > arena->commit) { + invalid_codepath; + return NULL; + } + } + u8 *result = arena->data + arena->len + align_offset; + arena->len = new_len; + MA_ASAN_UNPOISON_MEMORY_REGION(result, size); + return (void *)result; +} + +fn void *ma_push_size(ma_arena_t *arena, usize size) { + void *result = ma_push_size_ex(arena, size); + if (result) memory_zero(result, size); + return result; +} + +fn void ma_push_arena_ex(ma_arena_t *allocator, ma_arena_t *result, usize size) { + result->data = (u8 *)ma_push_size(allocator, size); + result->reserve = size; + result->commit = size; + result->align = ma_default_alignment; +} + +fn ma_arena_t *ma_push_arena(ma_arena_t *allocator, usize size) { + ma_arena_t *result = ma_push_type(allocator, ma_arena_t); + ma_push_arena_ex(allocator, result, size); + return result; +} + +fn void ma_destroy(ma_arena_t *arena) { + if (arena == NULL || arena->data == NULL) return; + b32 zero_memory = (u8 *)arena != arena->data; + os_vmem_release(arena->data); + if (zero_memory) memory_zero(arena, sizeof(ma_arena_t)); +} + +fn void ma_set_len(ma_arena_t *arena, usize pos) { + // base_len is used for bootstraping arenas, it denotes the + // space occupied by the arena. If len is smaller then base_len then + // we start to overwrite the arena itself - pure barbarism. + assert(arena->len >= arena->base_len); + + pos = CLAMP(pos, arena->base_len, arena->len); + usize size = arena->len - pos; + arena->len = pos; + MA_ASAN_POISON_MEMORY_REGION(arena->data + arena->len, size); +} + +fn void ma_pop(ma_arena_t *arena, usize size) { ma_set_len(arena, arena->len - size); } +fn ma_temp_t ma_begin_temp(ma_arena_t *arena) { return (ma_temp_t){arena, arena->len}; } +fn void ma_end_temp(ma_temp_t temp) { ma_set_len(temp.arena, temp.len); } +fn void ma_set0(ma_arena_t *arena) { ma_set_len(arena, 0); } + +// +// Scratch arena +fn ma_temp_t ma_begin_scratch_ex(ma_arena_t **conflicts, int conflict_count) { + ma_arena_t *unoccupied = 0; + for (int i = 0; i < lengthof(tcx->scratch); i += 1) { + ma_arena_t *from_pool = tcx->scratch + i; + unoccupied = from_pool; + for (int conflict_i = 0; conflict_i < conflict_count; conflict_i += 1) { + ma_arena_t *from_conflict = conflicts[conflict_i]; + if (from_pool == from_conflict) { + unoccupied = 0; + break; + } + } + + if (unoccupied) { + break; + } + } + + assert(unoccupied); // failed to get free scratch memory, this is a fatal error, this shouldnt happen + ma_temp_t result = ma_begin_temp(unoccupied); + return result; +} + +fn ma_temp_t ma_begin_scratch(void) { + ma_temp_t result = ma_begin_temp(tcx->scratch + 0); + return result; +} + +fn ma_temp_t ma_begin_scratch1(ma_arena_t *conflict) { + ma_arena_t *conflicts[] = {conflict}; + return ma_begin_scratch_ex(conflicts, 1); +} + +fn ma_temp_t ma_begin_scratch2(ma_arena_t *a, ma_arena_t *b) { + ma_arena_t *conflicts[] = {a, b}; + return ma_begin_scratch_ex(conflicts, 2); +} + +fn void *ma_push__copy(ma_arena_t *arena, void *data, u64 size) { + void *result = ma_push_size_ex(arena, size); + if (result) { + memory_copy(result, data, size); + } + return result; +} diff --git a/src/core/core_arena.h b/src/core/core_arena.h new file mode 100644 index 0000000..927ea70 --- /dev/null +++ b/src/core/core_arena.h @@ -0,0 +1,59 @@ +#pragma once +#include "core_basic.h" + +static const usize ma_page_size = 4096; +static const usize ma_default_alignment = sizeof(void *); +static const usize ma_default_reserve_size = mib(256); + +typedef struct ma_arena_t ma_arena_t; +struct ma_arena_t { + u8 *data; + usize len; + usize base_len; // to prevent self deleting the arena + usize reserve; + usize commit; + usize align; +}; + +typedef struct ma_temp_t ma_temp_t; +struct ma_temp_t { + ma_arena_t *arena; + usize len; +}; + +// +// constructors +fn void ma_init(ma_arena_t *arena, usize reserve); +fn ma_arena_t *ma_create(usize reserve); +fn void ma_destroy(ma_arena_t *arena); + +// +// push +fn void *ma_push_size(ma_arena_t *arena, usize size); +fn void *ma_push_size_ex(ma_arena_t *arena, usize size); +fn ma_arena_t *ma_push_arena(ma_arena_t *allocator, usize size); +fn void ma_push_arena_ex(ma_arena_t *allocator, ma_arena_t *result, usize size); +#define ma_push_type(arena, Type) (Type *)ma_push_size((arena), sizeof(Type)) +#define ma_push_array(arena, Type, count) (Type *)ma_push_size((arena), sizeof(Type) * (count)) +#define ma_push_type_copy(ma, data) ma_push__copy((ma), (data), sizeof(*(data))) +#define ma_push_array_copy(ma, data, count) ma_push__copy((ma), (data), (count) * sizeof(*(data))) + +// +// pop +fn void ma_set_len(ma_arena_t *arena, usize pos); +fn void ma_pop(ma_arena_t *arena, usize size); +fn void ma_set0(ma_arena_t *arena); + +// +// temp +fn ma_temp_t ma_begin_temp(ma_arena_t *arena); +fn void ma_end_temp(ma_temp_t temp); +#define ma_temp_scope(name, InArena) for (ma_temp_t name = ma_begin_temp(InArena); name.arena; (ma_end_temp(name), name.arena = 0)) + +// +// scratch +fn ma_temp_t ma_begin_scratch_ex(ma_arena_t **conflicts, int conflict_count); +fn ma_temp_t ma_begin_scratch(void); +fn ma_temp_t ma_begin_scratch1(ma_arena_t *conflict); +#define ma_end_scratch(x) ma_end_temp(x) +#define ma_scratch_scope(x) for (ma_temp_t x = ma_begin_scratch(); x.arena; (ma_end_temp(x), x.arena = 0)) diff --git a/src/core/core_array.c b/src/core/core_array.c new file mode 100644 index 0000000..ede5c70 --- /dev/null +++ b/src/core/core_array.c @@ -0,0 +1,122 @@ +#include "core_array.h" +#include "core_basic.h" +#include "core_platform.h" +#include "core_ctx.h" +#include "core_intrin.h" + +fn void array__init(alo_t alo, array_void_t *this, size_t item_size, i64 count) { + assert_expr(this->data == NULL); + this->data = alloc_size(alo, item_size * count); + this->cap = count; + this->len = 0; + this->alo = alo; +} + +fn void array__copy(alo_t alo, array_void_t *dst, array_void_t *src, size_t item_size) { + dst->data = alloc_size(alo, item_size * src->cap); + memory_copy(dst->data, src->data, item_size * src->len); + dst->cap = src->cap; + dst->len = src->len; + dst->alo = alo; +} + +fn void array__grow(array_void_t *this, size_t item_size, i64 item_count) { + if (this->len + 1 > this->cap) { + i64 new_cap = this->cap == 0 ? 16 : (this->cap + item_count - 1) * 2; + void *new_data = alloc_size(this->alo, new_cap * item_size); + if (this->data) { + memory_copy(new_data, this->data, this->len*item_size); + dealloc(this->alo, this->data); + } + this->data = new_data; + this->cap = new_cap; + } +} + +fn void array__del(array_void_t *this, size_t item_size, i64 idx, i64 count) { + if (count == 0) return; + assert(idx >= 0 && idx < this->len); + assert((idx + count) > 0 && (idx + count) <= this->len); + i64 right_len = this->len - idx - count; + u8 *data = (u8 *)this->data; + memory_move(data + idx * item_size, data + (idx + count) * item_size, right_len * item_size); + this->len -= count; +} + +fn void array__insert(array_void_t *this, size_t item_size, i64 idx) { + array__grow(this, item_size, 1); + assert(idx >= 0); + assert(idx <= this->len); + assert(this->alo.object); + + u8 *data = (u8 *)this->data; + i64 right_len = this->len - idx; + memory_move(data + (idx + 1) * item_size, data + idx * item_size, item_size * right_len); + this->len += 1; +} + +fn_test void test_array(void) { + ma_temp_t scratch = ma_begin_scratch(); + { + array_i64_t arr = (array_i64_t){.alo = malot(scratch)}; + for (int i = 0; i < 512; i += 1) { + array_add(&arr, i); + } + for (int i = 0; i < 512; i += 1) { + assert(arr.data[i] == i); + } + assert(arr.len == 512); + assert(arr.cap == 512); + for (int i = 511; i >= 0; i -= 1) { + i64 a = array_pop(&arr); + assert(a == i); + } + assert(arr.len == 0); + array_dealloc(&arr); + } + + { + array_i64_t arr = (array_i64_t){.alo = malot(scratch)}; + i64 *i = array_addn(&arr, 10); + assert(arr.len == 10 && arr.cap == 16); + i64 *j = array_addn(&arr, 2); + assert(i == arr.data); + assert(j == arr.data + 10); + array_dealloc(&arr); + } + + { + array_i64_t arr = (array_i64_t){.alo = malot(scratch)}; + for (int i = 0; i < 512; i += 1) { + array_add(&arr, i); + } + + array_insert(&arr, 256, 111); + assert(arr.data[256] == 111); + assert(arr.data[255] == 255); + assert(arr.data[257] == 256); + assert(arr.len == 513); + + array_insert(&arr, 4, 222); + assert(arr.len == 514); + assert(arr.data[4] == 222); + assert(arr.data[3] == 3); + assert(arr.data[5] == 4); + + array_swapdel(&arr, 2); + assert(arr.len == 513); + assert(arr.data[2] == 511); + assert(arr.data[1] == 1); + assert(arr.data[3] == 3); + + array_i64_t copy = {0}; + array_copy(malot(scratch), ©, &arr); + for (i64 i = 0; i < arr.len; i += 1) { + assert(arr.data[i] == copy.data[i]); + } + assert(copy.len == arr.len); + + } + + ma_end_scratch(scratch); +} diff --git a/src/core/core_array.h b/src/core/core_array.h new file mode 100644 index 0000000..2687322 --- /dev/null +++ b/src/core/core_array.h @@ -0,0 +1,27 @@ +#pragma once +#include "core_basic.h" + +#define array(type) struct { alo_t alo; type *data; i64 len; i64 cap; } +typedef array(void) array_void_t; +typedef array(i64) array_i64_t; + +#define arrisz(x) sizeof((x)->data[0]) +#define arrcst(x) ((array_void_t *)(x)) +#define array_init(a, this, count) (array__init((a), arrcst(this), arrisz(this), (count))) +#define array_add(this, ...) (array__grow(arrcst(this), arrisz(this), 1), (this)->data[(this)->len++] = __VA_ARGS__) +#define array_pop(this) (assert_expr((this)->len > 0), (this)->data[--(this)->len]) +#define array_dealloc(this) (dealloc((this)->alo, (this)->data)) +#define array_addn(this, n) (array__grow(arrcst(this), arrisz(this), (n)), (this)->len += (n), &(this)->data[(this)->len - (n)]) +#define array_insert(this, i, item) (array__insert(arrcst(this), arrisz(this), (i)), (this)->data[(i)] = (item)) +#define array_swapdel(this, i) (assert_expr((i) < (this)->len), (this)->data[(i)] = (this)->data[--(this)->len]) +#define array_del(this, i) (array__del(arrcst(this), arrisz(this), (i), 1)) +#define array_deln(this, i, count) (array__del(arrcst(this), arrisz(this), (i), (count))) +#define array_copy(alo, dst, src) (array__copy((alo), arrcst(dst), (array_void_t *)(src), arrisz(dst))) +#define array_last(x) ((x)->data[(x)->len - 1]) +#define array_for(type, it, array) for (type *it = (array)->data; it < (array)->data + (array)->len; it += 1) + +fn void array__init(alo_t alo, array_void_t *, size_t item_size, i64 count); +fn void array__copy(alo_t alo, array_void_t *dst, array_void_t *src, size_t item_size); +fn void array__grow(array_void_t *, size_t item_size, i64 item_count); +fn void array__del(array_void_t *, size_t item_size, i64 idx, i64 count); +fn void array__insert(array_void_t *, size_t item_size, i64 idx); diff --git a/src/core/core_basic.h b/src/core/core_basic.h new file mode 100644 index 0000000..88c9644 --- /dev/null +++ b/src/core/core_basic.h @@ -0,0 +1,422 @@ +#pragma once + +#ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(__APPLE__) && defined(__MACH__) + #define PLATFORM_MAC_OS 1 + #define PLATFORM_POSIX 1 +#elif defined(_WIN32) + #define PLATFORM_WINDOWS 1 +#elif defined(__linux__) + #define PLATFORM_POSIX 1 + #define PLATFORM_LINUX 1 +#elif defined(__wasm) + #define PLATFORM_WASM 1 +#endif + +#if defined(__clang__) + #define PLATFORM_CLANG 1 +#elif defined(__GNUC__) || defined(__GNUG__) + #define PLATFORM_GCC 1 +#elif defined(_MSC_VER) + #define PLATFORM_CL 1 +#elif defined(__TINYC__) + #define PLATFORM_TCC 1 +#endif + +#if defined(__EMSCRIPTEN__) +#define PLATFORM_EMSCRIPTEN 1 +#endif + +#ifndef PLATFORM_EMSCRIPTEN +#define PLATFORM_EMSCRIPTEN 0 +#endif + +#ifndef PLATFORM_WASM +#define PLATFORM_WASM 0 +#endif + +#ifndef PLATFORM_WINDOWS +#define PLATFORM_WINDOWS 0 +#endif + +#ifndef PLATFORM_LINUX +#define PLATFORM_LINUX 0 +#endif + +#ifndef PLATFORM_POSIX +#define PLATFORM_POSIX 0 +#endif + +#ifndef PLATFORM_MAC_OS +#define PLATFORM_MAC_OS 0 +#endif + +#ifndef PLATFORM_CLANG +#define PLATFORM_CLANG 0 +#endif + +#ifndef PLATFORM_GCC +#define PLATFORM_GCC 0 +#endif + +#ifndef PLATFORM_CL +#define PLATFORM_CL 0 +#endif + +#ifndef PLATFORM_TCC +#define PLATFORM_TCC 0 +#endif + +#ifndef PLATFORM_ADDRESS_SANITIZER +#define PLATFORM_ADDRESS_SANITIZER 0 +#endif + +#ifndef PLATFORM_DEBUG_ASSERT +#define PLATFORM_DEBUG_ASSERT 1 +#endif + +#if PLATFORM_WINDOWS +#define SWITCH_PLATFORM_WINDOWS_WASM_ELSE(WINDOWS, WASM, ELSE) WINDOWS +#elif PLATFORM_WASM +#define SWITCH_PLATFORM_WINDOWS_WASM_ELSE(WINDOWS, WASM, ELSE) WASM +#else +#define SWITCH_PLATFORM_WINDOWS_WASM_ELSE(WINDOWS, WASM, ELSE) ELSE +#endif + +#if PLATFORM_CLANG +#define IF_PLATFORM_CLANG_ELSE(IF, ELSE) IF +#else +#define IF_PLATFORM_CLANG_ELSE(IF, ELSE) ELSE +#endif + +#if PLATFORM_WINDOWS +#define IF_PLATFORM_WINDOWS(x) x +#else +#define IF_PLATFORM_WINDOWS(x) +#endif + +#if PLATFORM_LINUX && !defined(_GNU_SOURCE) + #define _GNU_SOURCE +#endif + + +#include +#include +#include + +typedef uintptr_t usize; +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef intptr_t isize; +typedef int64_t i64; +typedef int32_t i32; +typedef int16_t i16; +typedef int8_t i8; + +typedef int64_t b64; +typedef int32_t b32; +typedef int16_t b16; +typedef int8_t b8; + +typedef float f32; +typedef double f64; + +#define f32_max FLT_MAX +#define f32_min FLT_MIN +#define f64_max DBL_MAX +#define f64_min DBL_MIN + +#define i8_max INT8_MAX +#define i8_min INT8_MIN +#define i16_max INT16_MAX +#define i16_min INT16_MIN +#define i32_max INT32_MAX +#define i32_min INT32_MIN +#define i64_max INT64_MAX +#define i64_min INT64_MIN + +#define u8_max UINT8_MAX +#define u8_min 0 +#define u16_max UINT16_MAX +#define u16_min 0 +#define u32_max UINT32_MAX +#define u32_min 0 +#define u64_max UINT64_MAX +#define u64_min 0 + +#ifndef true +#define true 1 +#endif +#ifndef false +#define false 0 +#endif + +#define fn +#define fn_test +#define gb +#define locl static + +typedef union convert_f64_u64_t convert_f64_u64_t; +union convert_f64_u64_t { f64 f; u64 i; }; +typedef union convert_f64_i64_t convert_f64_i64_t; +union convert_f64_i64_t { f64 f; i64 i; }; +typedef union convert_f32_u32_t convert_f32_u32_t; +union convert_f32_u32_t { f32 f; u32 i; }; +typedef union convert_f32_i32_t convert_f32_i32_t; +union convert_f32_i32_t { f32 f; i32 i; }; + +#define U64_TO_F64(x) (((convert_f64_u64_t) { .i = (x) }).f) +#define U32_TO_F32(x) (((convert_f32_u32_t) { .i = (x) }).f) +#define F64_TO_U64(x) (((convert_f64_u64_t) { .f = (x) }).i) +#define F32_TO_U32(x) (((convert_f32_u32_t) { .f = (x) }).i) + +#define I64_TO_F64(x) (((convert_f64_i64_t) { .i = (x) }).f) +#define I32_TO_F32(x) (((convert_f32_i32_t) { .i = (x) }).f) +#define F64_TO_I64(x) (((convert_f64_i64_t) { .f = (x) }).i) +#define F32_TO_I32(x) (((convert_f32_i32_t) { .f = (x) }).i) + +#define MIN(x,y) ((x) > (y) ? (y) : (x)) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + +#define CLAMP_TOP(A,X) MIN(A,X) +#define CLAMP_BOT(X,B) MAX(X,B) +#define CLAMP(x,a,b) (((x)<(a))?(a):((x)>(b))?(b):(x)) + +#define set_bit(x) (1ULL << (x)) +#define lengthof(x) ((int)(sizeof((x))/sizeof((x)[0]))) +#ifndef offsetof +#define offsetof(st, m) ((usize)&(((st *)0)->m)) +#endif +#define expect(x) if (!(x)) +#define unused(x) (void)(x) + +#define kib(x) (1024ULL * (x##ULL)) +#define mib(x) (1024ULL * kib(x)) +#define gib(x) (1024ULL * mib(x)) +#define thousand(n) ((n)*1000) +#define million(n) ((n)*1000000) +#define billion(n) ((n)*1000000000) + +#define zero_struct(x) memory_zero((x), sizeof(*(x))) + + +#define defer_if(begin, cond_end) for (b32 PASTE(_i_, __LINE__) = !!begin; PASTE(_i_, __LINE__); PASTE(_i_, __LINE__) = (cond_end, 0)) +#define defer_block(begin, end) for (i32 PASTE(_i_, __LINE__) = (begin, 0); !PASTE(_i_, __LINE__); PASTE(_i_, __LINE__) += (end, 1)) + +#define stack_t(type, size) struct { type data[size]; i32 len; } +#define STACK_CAP(stack) (lengthof((stack).data)) +#define STACK_EMPTY(stack) ((stack).len == 0) +#define STACK_FULL(stack) ((stack).len == STACK_CAP(stack)) +#define STACK_PUSH(stack, ...) (assert_expr(!STACK_FULL(stack)), (stack).data[(stack).len++] = __VA_ARGS__) +#define STACK_POP(stack) (assert_expr(!STACK_EMPTY(stack)), (stack).data[--(stack).len]) +#define STACK_TOP(stack) (assert_expr(!STACK_EMPTY(stack)), (stack).data[((stack).len-1)]) + +#define STRINGIFY_(S) #S +#define STRINGIFY(S) STRINGIFY_(S) +#define PASTE_(a, b) a##b +#define PASTE(a, b) PASTE_(a, b) +#define SWAP(t, a, b) do { t PASTE(temp__, __LINE__) = a; a = b; b = PASTE(temp__, __LINE__); } while(0) +#define SWAP_PTR(t, a, b) do { t PASTE(temp__, __LINE__) = *a; *a = *b; *b = PASTE(temp__, __LINE__); } while(0) +#define CODE(...) #__VA_ARGS__ + +#if PLATFORM_CL || (PLATFORM_CLANG && PLATFORM_WINDOWS) + #pragma section(".rdata$", read) + #define gb_read_only __declspec(allocate(".rdata$")) +#elif PLATFORM_CLANG && PLATFORM_LINUX + #define gb_read_only __attribute__((section(".rodata"))) +#else + #define gb_read_only +#endif + +#if PLATFORM_CL + #define fn_inline __forceinline +#elif PLATFORM_CLANG || PLATFORM_GCC + #define fn_inline __attribute__((always_inline)) +#else + #define fn_inline +#endif + +#ifndef FILE_AND_LINE_GCC_FORMAT +#define FILE_AND_LINE __FILE__ "(" STRINGIFY(__LINE__) ")" +#else +#define FILE_AND_LINE __FILE__ ":" STRINGIFY(__LINE__) +#endif + +#if PLATFORM_WINDOWS +int IsDebuggerPresent(void); + #define debug__break() (IsDebuggerPresent() && (__debugbreak(), 1)) +#elif PLATFORM_UNIX + // https://github.com/r-lyeh/tinybits/blob/master/tinyassert.c + #include + static void os_unix_sigtrap(int signum) { signal(SIGTRAP, SIG_DFL); } + #define debug__break() (signal(SIGTRAP, os_unix_sigtrap), raise(SIGTRAP)) +#else +#define debug__break() __builtin_trap() +#endif +#define debug_break() (debug__break(), 1) + +#if PLATFORM_WASM + #define gb_thread +#elif PLATFORM_GCC | PLATFORM_CLANG + #define gb_thread __thread +#elif PLATFORM_CL + #define gb_thread __declspec(thread) +#else + #define gb_thread _Thread_local +#endif + +#if PLATFORM_CL + #pragma warning(disable: 4116) +#endif + +// Single linked list Queue +#define SLLQ_APPEND_EX(f, l, n, next) \ + do { \ + assert_expr((n)->next == NULL); \ + if ((f) == 0) { \ + (f) = (l) = (n); \ + } else { \ + (l) = (l)->next = (n); \ + } \ + } while (0) +#define SLLQ_APPEND(f, l, n) SLLQ_APPEND_EX(f, l, n, next) + +#define SLLQ_PREPEND_EX(f, l, n, next) \ + do { \ + assert_expr((n)->next == NULL); \ + if ((f) == 0) { \ + (f) = (l) = (n); \ + } else { \ + (n)->next = (f); \ + (f) = (n); \ + } \ + } while (0) +#define SLLQ_PREPEND(f, l, n) SLLQ_PREPEND_EX(f, l, n, next) + +#define SLLQ_REMOVE_FIRST_EX(f, l, next) \ + do { \ + if ((f) == (l)) { \ + (f) = (l) = 0; \ + } else { \ + (f) = (f)->next; \ + } \ + } while (0) +#define SLLQ_REMOVE_FIRST(f, l) SLLQ_REMOVE_FIRST_EX(f, l, next) + +// Singly linked list stack +#define SLLS_PUSH_EX(stack_base, new_stack_base, next) \ + do { \ + (new_stack_base)->next = (stack_base); \ + (stack_base) = (new_stack_base); \ + } while (0) +#define SLLS_PUSH(stack_base, new_stack_base) \ + SLLS_PUSH_EX(stack_base, new_stack_base, next) + +#define SLLS_POP(stack_base) ((stack_base) = (stack_base)->next) +#define SLLS_POP_AND_STORE(stack_base, out_node) \ + do { \ + if (stack_base) { \ + (out_node) = (stack_base); \ + (stack_base) = (stack_base)->next; \ + (out_node)->next = 0; \ + } \ + } while (0) + +// Doubly linked list Queue +#define DLLQ_APPEND_EX(f, l, node, next, prev) \ + do { \ + assert_expr((node)->next == NULL); \ + assert_expr((node)->prev == NULL); \ + if ((f) == 0) { \ + (f) = (l) = (node); \ + } else { \ + (l)->next = (node); \ + (node)->prev = (l); \ + (l) = (node); \ + } \ + } while (0) +#define DLLQ_APPEND(f, l, node) DLLQ_APPEND_EX(f, l, node, next, prev) + +#define DLLQ_PREPEND_EX(f, l, node, next, prev) \ + do { \ + assert_expr((node)->next == NULL); \ + assert_expr((node)->prev == NULL); \ + if ((f) == 0) { \ + (f) = (l) = (node); \ + } else { \ + (node)->next = (f); \ + (f)->prev = (node); \ + (f) = (node); \ + } \ + } while (0) +#define DLLQ_PREPEND(f, l, node) DLLQ_PREPEND_EX(f, l, node, next, prev) + +#define DLLQ_CONTAINS(f, l, n, next, prev) for ( + +#define DLLQ_REMOVE_EX(first, last, node, next, prev) \ + do { \ + if ((first) == (last)) { \ + assert_expr((node) == (first)); \ + (first) = (last) = 0; \ + } else if ((last) == (node)) { \ + (last) = (last)->prev; \ + (last)->next = 0; \ + } else if ((first) == (node)) { \ + (first) = (first)->next; \ + (first)->prev = 0; \ + } else { \ + (node)->prev->next = (node)->next; \ + (node)->next->prev = (node)->prev; \ + } \ + if (node) { \ + (node)->prev = 0; \ + (node)->next = 0; \ + } \ + } while (0) +#define DLLQ_REMOVE(first, last, node) DLLQ_REMOVE_EX(first, last, node, next, prev) + +// Doubly linked list Stack +#define DLLS_PUSH_EX(first, node, next, prev) \ + do { \ + assert_expr((node)->next == NULL); \ + assert_expr((node)->prev == NULL); \ + (node)->next = (first); \ + if ((first)) \ + (first)->prev = (node); \ + (first) = (node); \ + } while (0) +#define DLLS_PUSH(first, node) DLLS_PUSH_EX(first, node, next, prev) +#define DLLS_REMOVE_EX(first, node, next, prev) \ + do { \ + if ((node) == (first)) { \ + (first) = (first)->next; \ + if ((first)) \ + (first)->prev = 0; \ + } else { \ + (node)->prev->next = (node)->next; \ + if ((node)->next) \ + (node)->next->prev = (node)->prev; \ + } \ + if (node) { \ + (node)->prev = 0; \ + (node)->next = 0; \ + } \ + } while (0) +#define DLLS_REMOVE(first, node) DLLS_REMOVE_EX(first, node, next, prev) + +typedef enum { + alokind_alloc, + alokind_dealloc, +} alokind_t; + +typedef struct alo_t alo_t; +struct alo_t { + void *object; + void *(*proc)(alo_t alo, alokind_t kind, void *ptr, size_t size); +}; diff --git a/src/core/core_ctx.c b/src/core/core_ctx.c new file mode 100644 index 0000000..504fc45 --- /dev/null +++ b/src/core/core_ctx.c @@ -0,0 +1,30 @@ +#include "core_ctx.h" +#include "core_platform.h" + +gb_thread thread_ctx_t *tcx; + +fn void *ma_arena_alo_proc(alo_t alo, alokind_t kind, void *ptr, size_t size) { + unused(ptr); + if (kind == alokind_alloc) { + return ma_push_size(alo.object, size); + } else if (kind == alokind_dealloc) { + return NULL; + } else_is_invalid; + return NULL; +} + +fn alo_t malo(ma_arena_t *arena) { + return (alo_t){arena, ma_arena_alo_proc}; +} + +fn alo_t malot(ma_temp_t temp) { + return malo(temp.arena); +} + +fn void dealloc(alo_t alo, void *ptr) { + alo.proc(alo, alokind_dealloc, ptr, 0); +} + +fn void *alloc_size(alo_t alo, size_t size) { + return alo.proc(alo, alokind_alloc, NULL, size); +} diff --git a/src/core/core_ctx.h b/src/core/core_ctx.h new file mode 100644 index 0000000..0b3062b --- /dev/null +++ b/src/core/core_ctx.h @@ -0,0 +1,34 @@ +#pragma once +#include "core_arena.h" +#include "core_log.h" + +typedef struct thread_ctx_t thread_ctx_t; +struct thread_ctx_t { + ma_arena_t scratch[3]; + ma_arena_t temp; // application specific arena + + // I probably want to discourage using it implicitly like: tcx.perm, instead just pass it around + // to functions that allocate pernament memory. temp and scratch very nicely create reusable code + // perm is basically gb state so it would be nice to annotate which functions are reusable + // and which functions have state + ma_arena_t perm; + + void *app_ctx; + void *rn_ctx; + void *ui_ctx; + void *te_ctx; + void *user_ctx; + + logger_t log; + int thread_index; +}; + +#define alloc_type(alo, type) (type *)alloc_size((aloc), sizeof(type)) +#define alloc_array(alo, type, count) (type *)alloc_size((alo), sizeof(type) * (count)) +fn alo_t malo(ma_arena_t *arena); +fn alo_t malot(ma_temp_t temp); +fn void dealloc(alo_t alo, void *ptr); +fn void *alloc_size(alo_t alo, size_t size); +fn int tcx_alloc_id(void); + +extern gb_thread thread_ctx_t *tcx; diff --git a/src/core/core_hash_table.c b/src/core/core_hash_table.c new file mode 100644 index 0000000..2307149 --- /dev/null +++ b/src/core/core_hash_table.c @@ -0,0 +1,217 @@ +#include "core_hash_table.h" +#include "core_platform.h" + +// xorshift64 +fn u64 get_random_u64(random_seed_t *seed) { + u64 x = seed->a; + x ^= x << 13; + x ^= x >> 7; + x ^= x << 17; + return seed->a = x; +} + +fn u64 get_random_in_range_u64(random_seed_t *seed, u64 start, u64 one_past_end) { + u64 r = get_random_u64(seed); + u64 diff = one_past_end - start; + u64 rr = r % diff; + u64 rrr = rr + start; + return rrr; +} + +fn i64 get_random_in_range_i64(random_seed_t *seed, i64 start, i64 one_past_end) { + u64 r = get_random_u64(seed); + i64 diff = one_past_end - start; + u64 rr = r % diff; + i64 rrr = (i64)rr + start; + return rrr; +} + +fn f64 get_random_f64(random_seed_t *seed) { + f64 random = (f64)get_random_in_range_u64(seed, 0, UINT32_MAX); + f64 result = random / (f64)(UINT32_MAX - 1u); + return result; +} + +fn u64 hash_data(s8_t string) { + u8 *data = (u8 *)string.str; + u64 hash = (u64)14695981039346656037ULL; + for (i64 i = 0; i < string.len; i++) { + hash = hash ^ (u64)(data[i]); + hash = hash * (u64)1099511628211ULL; + } + return hash; +} + +fn u64 hash_mix(u64 x, u64 y) { + x ^= y; + x *= 0xff51afd7ed558ccd; + x ^= x >> 32; + return x; +} + +fn ht_t *ht_create(ma_arena_t *arena, i32 size) { + ht_t *result = ma_push_type(arena, ht_t); + result->buckets = ma_push_array(arena, ht_bucket_t, size); + result->bucket_count = size; + result->arena = arena; + return result; +} + +fn ht_node_t *ht_insert_kv(ht_t *ht, u64 hash, ht_key_value_t kv) { + ht_node_t *result = ma_push_type(ht->arena, ht_node_t); + result->kv = kv; + i64 idx = hash % ht->bucket_count; + SLLQ_APPEND(ht->buckets[idx].first, ht->buckets[idx].last, result); + ht->item_count += 1; + return result; +} + +fn ht_node_t *ht_insert_u64(ht_t *ht, u64 key, u64 value) { + u64 hash = hash_data(s8_struct(key)); + return ht_insert_kv(ht, hash, (ht_key_value_t){.key_u64 = key, .value_u64 = value}); +} + +fn ht_node_t *ht_insert_ptr(ht_t *ht, void *key, void *value) { + return ht_insert_u64(ht, (u64)key, (u64)value); +} + +fn ht_node_t *ht_insert_string(ht_t *ht, s8_t key, s8_t value) { + u64 hash = hash_data(key); + return ht_insert_kv(ht, hash, (ht_key_value_t){.key_string = key, .value_string = value}); +} + +fn ht_node_t *ht_insert_string_ptr(ht_t *ht, s8_t key, void *value) { + u64 hash = hash_data(key); + return ht_insert_kv(ht, hash, (ht_key_value_t){.key_string = key, .value_ptr = value}); +} + +fn ht_node_t *ht_search_u64_ex(ht_t *ht, u64 key) { + u64 hash = hash_data(s8_struct(key)); + i64 idx = hash % ht->bucket_count; + ht_bucket_t *bucket = ht->buckets + idx; + for (ht_node_t *it = bucket->first; it; it = it->next) { + if (it->kv.key_u64 == key) { + return it; + } + } + return NULL; +} + +fn ht_node_t *ht_search_ptr_ex(ht_t *ht, void *key) { + u64 hash = hash_data(s8_struct(key)); + i64 idx = hash % ht->bucket_count; + ht_bucket_t *bucket = ht->buckets + idx; + for (ht_node_t *it = bucket->first; it; it = it->next) { + if (it->kv.key_ptr == key) { + return it; + } + } + return NULL; +} + +fn ht_node_t *ht_search_string_ex(ht_t *ht, s8_t key) { + u64 hash = hash_data(key); + i64 idx = hash % ht->bucket_count; + ht_bucket_t *bucket = ht->buckets + idx; + for (ht_node_t *it = bucket->first; it; it = it->next) { + if (s8_are_equal(it->kv.key_string, key)) { + return it; + } + } + return NULL; +} + +fn u64 *ht_search_u64(ht_t *ht, u64 key) { + ht_node_t *node = ht_search_u64_ex(ht, key); + if (node) return &node->kv.value_u64; + return NULL; +} + +fn void **ht_search_ptr(ht_t *ht, void *key) { + ht_node_t *node = ht_search_ptr_ex(ht, key); + if (node) return &node->kv.value_ptr; + return NULL; +} + +fn s8_t *ht_search_string(ht_t *ht, s8_t key) { + ht_node_t *node = ht_search_string_ex(ht, key); + if (node) return &node->kv.value_string; + return NULL; +} + +fn void **ht_search_string_ptr(ht_t *ht, s8_t key) { + ht_node_t *node = ht_search_string_ex(ht, key); + if (node) return &node->kv.value_ptr; + return NULL; +} + +/////////////////////////////// +// string interning +fn s8i_t *intern_string(ht_t *ht, s8_t string) { + s8_t *item = ht_search_string(ht, string); + if (!item) { + string = s8_copy(ht->arena, string); + ht_node_t *node = ht_insert_string(ht, string, string); + item = &node->kv.value_string; + } + return item; +} + +fn s8i_t *internf(ht_t *ht, char *str, ...) { + S8_FMT(ht->arena, str, string); + return intern_string(ht, string); +} + +/////////////////////////////// +// testing + +fn_test void test_hash_table(void) { + ma_temp_t scratch = ma_begin_scratch(); + { + ht_t *ht = ht_create(scratch.arena, 16); + + for (u64 i = 0; i < 128; i += 1) { + ht_insert_u64(ht, i, i); + ht_node_t *node = ht_search_u64_ex(ht, i); + assert_expr(node->kv.value_u64 == i); + assert(node->kv.key_u64 == i); + } + for (u64 i = 0; i < 128; i += 1) { + ht_node_t *node = ht_search_u64_ex(ht, i); + assert(node->kv.value_u64 == i); + assert(node->kv.key_u64 == i); + } + + ht_node_t *node = ht_search_u64_ex(ht, 1111); + assert(node == NULL); + } + { + ht_t *ht = ht_create(scratch.arena, 16); + + for (i32 i = 0; i < 128; i += 1) { + s8_t s = s8_printf(scratch.arena, "%d", i); + ht_insert_string(ht, s, s); + ht_node_t *node = ht_search_string_ex(ht, s); + assert(s8_are_equal(node->kv.value_string, s)); + assert(s8_are_equal(node->kv.key_string, s)); + } + + ht_node_t *node = ht_search_string_ex(ht, s8("memes")); + assert(node == NULL); + } + + ma_end_scratch(scratch); +} + +fn_test void test_intern_table(void) { + ma_temp_t scratch = ma_begin_scratch(); + ht_t *ht = ht_create(scratch.arena, 4); + assert(internf(ht, "asd") == internf(ht, "asd")); + assert(internf(ht, "asdf") != internf(ht, "asd")); + assert(internf(ht, "asdf") == internf(ht, "asdf")); + assert(internf(ht, "123asdf") == internf(ht, "123asdf")); + assert(internf(ht, "123asdf") != internf(ht, "133asdf")); + assert(internf(ht, "") == internf(ht, "")); + assert(internf(ht, "") != internf(ht, "a")); + ma_end_scratch(scratch); +} diff --git a/src/core/core_hash_table.h b/src/core/core_hash_table.h new file mode 100644 index 0000000..9952401 --- /dev/null +++ b/src/core/core_hash_table.h @@ -0,0 +1,73 @@ +#pragma once +#include "core_basic.h" +#include "core_arena.h" +#include "core_string.h" + +typedef struct ht_key_value_t ht_key_value_t; +struct ht_key_value_t { + union { + s8_t key_string; + u64 key_u64; + void *key_ptr; + }; + union { + s8_t value_string; + void *value_ptr; + u64 value_u64; + }; +}; + +typedef struct ht_node_t ht_node_t; +struct ht_node_t { + ht_node_t *next; + ht_key_value_t kv; +}; + +typedef struct ht_bucket_t ht_bucket_t; +struct ht_bucket_t { + ht_node_t *first; + ht_node_t *last; +}; + +typedef struct ht_t ht_t; +struct ht_t { + ma_arena_t *arena; + i32 item_count; + i32 bucket_count; + ht_bucket_t *buckets; +}; + +fn ht_t *ht_create (ma_arena_t *arena, i32 size); +fn ht_node_t *ht_insert_kv (ht_t *ht, u64 hash, ht_key_value_t kv); +fn ht_node_t *ht_insert_u64 (ht_t *ht, u64 key, u64 value); +fn ht_node_t *ht_insert_ptr (ht_t *ht, void *key, void *value); +fn ht_node_t *ht_insert_string (ht_t *ht, s8_t key, s8_t value); +fn ht_node_t *ht_insert_string_ptr (ht_t *ht, s8_t key, void *value); +fn u64 *ht_search_u64 (ht_t *ht, u64 key); +fn void **ht_search_ptr (ht_t *ht, void *key); +fn s8_t *ht_search_string (ht_t *ht, s8_t key); +fn void **ht_search_string_ptr (ht_t *ht, s8_t key); +fn ht_node_t *ht_search_u64_ex (ht_t *ht, u64 key); +fn ht_node_t *ht_search_ptr_ex (ht_t *ht, void *key); +fn ht_node_t *ht_search_string_ex (ht_t *ht, s8_t key); + +/////////////////////////////// +// string interning +#define s8i_t s8_t +fn s8i_t *intern_string(ht_t *ht, s8_t string); +fn s8i_t *internf(ht_t *ht, char *str, ...); + + +/////////////////////////////// +// Hashing +typedef struct random_seed_t random_seed_t; +struct random_seed_t { + u64 a; +}; + +fn u64 get_random_u64(random_seed_t *seed); +fn u64 get_random_in_range_u64(random_seed_t *seed, u64 start, u64 one_past_end); +fn i64 get_random_in_range_i64(random_seed_t *seed, i64 start, i64 one_past_end); +fn f64 get_random_f64(random_seed_t *seed); +fn u64 hash_data(s8_t string); +fn u64 hash_mix(u64 x, u64 y); \ No newline at end of file diff --git a/src/core/core_intrin.c b/src/core/core_intrin.c new file mode 100644 index 0000000..84e1fb2 --- /dev/null +++ b/src/core/core_intrin.c @@ -0,0 +1,242 @@ +#include "core_intrin.h" +#include "core_basic.h" +#include "core_platform.h" + +fn void memory_copy(void *dst, void *src, usize n) { + IF_PLATFORM_CLANG_ELSE(__builtin_memcpy(dst, src, n), memcpy(dst, src, n)); +} + +fn void memory_move(void *dest, const void *src, usize n) { + IF_PLATFORM_CLANG_ELSE(__builtin_memmove(dest, src, n), memmove(dest, src, n)); +} + +fn void memory_set(void *dst, i32 c, usize size) { + IF_PLATFORM_CLANG_ELSE(__builtin_memset(dst, c, size), memset(dst, c, size)); +} + +fn int bad_memory__compare(void *left, void *right, usize size) { + u8 *l = left; + u8 *r = right; + for (usize i = 0; i < size; i += 1) { + if (l[i] != r[i]) return 1; + } + return 0; +} + +fn b32 memory_equal(void *left, void *right, usize size) { + int cmp = IF_PLATFORM_CLANG_ELSE(bad_memory__compare(left, right, size), memcmp(left, right, size)); + return cmp == 0; +} + +fn void memory_zero(void *dst, usize size) { + memory_set(dst, 0, size); +} + +fn f32 f32_sqrt(f32 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_sqrtf(x), sqrtf(x)); } +fn f64 f64_sqrt(f64 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_sqrt(x), sqrt(x)); } +fn f32 f32_ceil(f32 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_ceilf(x), ceilf(x)); } +fn f64 f64_ceil(f64 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_ceil(x), ceil(x)); } +fn f32 f32_floor(f32 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_floorf(x), floorf(x)); } +fn f64 f64_floor(f64 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_floor(x), floor(x)); } +fn f32 f32_abs(f32 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_fabsf(x), fabsf(x)); } +fn f64 f64_abs(f64 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_fabs(x), fabs(x)); } +// fn f32 f32_round(f32 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_roundf(x), roundf(x)); } +fn f64 f64_round(f64 x) { return IF_PLATFORM_CLANG_ELSE(__builtin_round(x), round(x)); } +fn f64 f64_mod(f64 a, f64 b) { return IF_PLATFORM_CLANG_ELSE(__builtin_fmod(a, b), fmod(a, b)); } +fn f32 f32_mod(f32 a, f32 b) { return IF_PLATFORM_CLANG_ELSE(__builtin_fmodf(a, b), fmodf(a, b)); } + +/* https://gitlab.com/nakst/essence/-/blob/master/shared/math.cpp +** +** 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. +** +*/ + +fn f64 f64_exp2(f64 x) { + f64 a = f64_floor(x * 8); + int64_t ai = (i64)a; + + if (ai < -1024) { + return 0; + } + + f64 b = x - a / 8; + + f64 y = U64_TO_F64(0x3FF0000000000000) + + b * (U64_TO_F64(0x3FE62E42FEFA3A00) + + b * (U64_TO_F64(0x3FCEBFBDFF829140) + + b * (U64_TO_F64(0x3FAC6B08D73C4A40) + + b * (U64_TO_F64(0x3F83B2AB53873280) + + b * (U64_TO_F64(0x3F55D88F363C6C00) + + b * (U64_TO_F64(0x3F242C003E4A2000) + + b * U64_TO_F64(0x3EF0B291F6C00000))))))); + + f64 m[8] = { + U64_TO_F64(0x3FF0000000000000), + U64_TO_F64(0x3FF172B83C7D517B), + U64_TO_F64(0x3FF306FE0A31B715), + U64_TO_F64(0x3FF4BFDAD5362A27), + U64_TO_F64(0x3FF6A09E667F3BCD), + U64_TO_F64(0x3FF8ACE5422AA0DB), + U64_TO_F64(0x3FFAE89F995AD3AD), + U64_TO_F64(0x3FFD5818DCFBA487), + }; + + y *= m[ai & 7]; + + convert_f64_u64_t c; + c.f = y; + c.i += (ai >> 3) << 52; + return c.f; +} + +fn f32 f32_exp2(f32 x) { + f32 a = f32_floor(x); + i32 ai = (i32)a; + + if (ai < -128) { + return 0; + } + + f32 b = x - a; + + f32 y = U32_TO_F32(0x3F7FFFFE) + b * (U32_TO_F32(0x3F31729A) + b * (U32_TO_F32(0x3E75E700) + b * (U32_TO_F32(0x3D64D520) + b * (U32_TO_F32(0x3C128280) + b * U32_TO_F32(0x3AF89400))))); + + convert_f32_u32_t c; + c.f = y; + c.i += ai << 23; + return c.f; +} + +fn f64 f64_log2(f64 x) { + convert_f64_u64_t c; + c.f = x; + int64_t e = ((c.i >> 52) & 2047) - 0x3FF; + c.i = (c.i & ~((uint64_t)0x7FF << 52)) + ((uint64_t)0x3FF << 52); + x = c.f; + + f64 a; + + if (x < 1.125) { + a = 0; + } else if (x < 1.250) { + x *= 1.125 / 1.250; + a = U64_TO_F64(0xBFC374D65D9E608E); + } else if (x < 1.375) { + x *= 1.125 / 1.375; + a = U64_TO_F64(0xBFD28746C334FECB); + } else if (x < 1.500) { + x *= 1.125 / 1.500; + a = U64_TO_F64(0xBFDA8FF971810A5E); + } else if (x < 1.625) { + x *= 1.125 / 1.625; + a = U64_TO_F64(0xBFE0F9F9FFC8932A); + } else if (x < 1.750) { + x *= 1.125 / 1.750; + a = U64_TO_F64(0xBFE465D36ED11B11); + } else if (x < 1.875) { + x *= 1.125 / 1.875; + a = U64_TO_F64(0xBFE79538DEA712F5); + } else { + x *= 1.125 / 2.000; + a = U64_TO_F64(0xBFEA8FF971810A5E); + } + + f64 y = U64_TO_F64(0xC00FF8445026AD97) + x * (U64_TO_F64(0x40287A7A02D9353F) + x * (U64_TO_F64(0xC03711C58D55CEE2) + x * (U64_TO_F64(0x4040E8263C321A26) + x * (U64_TO_F64(0xC041EB22EA691BB3) + x * (U64_TO_F64(0x403B00FB376D1F10) + x * (U64_TO_F64(0xC02C416ABE857241) + x * (U64_TO_F64(0x40138BA7FAA3523A) + x * (U64_TO_F64(0xBFF019731AF80316) + x * U64_TO_F64(0x3FB7F1CD3852C200))))))))); + + return y - a + e; +} + +fn f32 f32_log2(f32 x) { + // TODO f32_log2(0.9999971379999999f) gives 0.00000143051147460938 (should be negative!!). + + convert_f32_u32_t c; + c.f = x; + i32 e = ((c.i >> 23) & 255) - 0x7F; + c.i = (c.i & ~(0xFF << 23)) + (0x7F << 23); + x = c.f; + + f32 y = U32_TO_F32(0xC05B5154) + x * (U32_TO_F32(0x410297C6) + x * (U32_TO_F32(0xC1205CEB) + x * (U32_TO_F32(0x4114DF63) + x * (U32_TO_F32(0xC0C0DBBB) + x * (U32_TO_F32(0x402942C6) + x * (U32_TO_F32(0xBF3FF98A) + x * (U32_TO_F32(0x3DFE1050) + x * U32_TO_F32(0xBC151480)))))))); + + return y + e; +} + +fn f64 f64_pow(f64 x, f64 y) { + return f64_exp2(y * f64_log2(x)); +} + +fn f32 f32_pow(f32 x, f32 y) { + return f32_exp2(y * f32_log2(x)); +} + +// +/* https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=newlib/libm/common/s_round.c;hb=master + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== +**/ +fn f32 f32_round(f32 x) { + u32 w = F32_TO_U32(x); + /* Most significant word, least significant word. */ + int exponent_less_127; + + /* Extract exponent field. */ + exponent_less_127 = (int)((w & 0x7f800000) >> 23) - 127; + + if (exponent_less_127 < 23) { + if (exponent_less_127 < 0) { + w &= 0x80000000; + if (exponent_less_127 == -1) + /* Result is +1.0 or -1.0. */ + w |= ((u32)127 << 23); + } else { + unsigned int exponent_mask = 0x007fffff >> exponent_less_127; + if ((w & exponent_mask) == 0) + /* x has an integral value. */ + return x; + + w += 0x00400000 >> exponent_less_127; + w &= ~exponent_mask; + } + } else { + if (exponent_less_127 == 128) + /* x is NaN or infinite. */ + return x + x; + else + return x; + } + x = U32_TO_F32(w); + return x; +} + +/////////////////////////////// +// other +fn u32 u32_safe_cast(u64 v) { + assert_expr(v <= u32_max); + return (u32)v; +} + +fn u16 u16_safe_cast(u64 v) { + assert(v <= u16_max); + return (u16)v; +} + +fn u8 u8_safe_cast(u64 v) { + assert(v <= u8_max); + return (u8)v; +} + +fn i32 i32_safe_cast(i64 v) { + assert(v >= i32_min && v <= i32_max); + return (i32)v; +} diff --git a/src/core/core_intrin.h b/src/core/core_intrin.h new file mode 100644 index 0000000..f877b33 --- /dev/null +++ b/src/core/core_intrin.h @@ -0,0 +1,32 @@ +#pragma once +#include "core_basic.h" + +fn void memory_copy(void *dst, void *src, usize n); +fn void memory_move(void *dest, const void *src, usize n); +fn void memory_set(void *dst, i32 c, usize size); +fn b32 memory_equal(void *left, void *right, usize size); +fn void memory_zero(void *dst, usize size); + +fn f32 f32_sqrt(f32 x); +fn f64 f64_sqrt(f64 x); +fn f32 f32_ceil(f32 x); +fn f64 f64_ceil(f64 x); +fn f32 f32_floor(f32 x); +fn f64 f64_floor(f64 x); +fn f32 f32_abs(f32 x); +fn f64 f64_abs(f64 x); +fn f32 f32_round(f32 x); +fn f64 f64_round(f64 x); +fn f64 f64_mod(f64 a, f64 b); +fn f32 f32_mod(f32 a, f32 b); +fn f64 f64_exp2(f64 x); +fn f32 f32_exp2(f32 x); +fn f64 f64_log2(f64 x); +fn f32 f32_log2(f32 x); +fn f64 f64_pow(f64 x, f64 y); +fn f32 f32_pow(f32 x, f32 y); +fn f32 f32_round(f32 x); +fn u32 u32_safe_cast(u64 v); +fn u16 u16_safe_cast(u64 v); +fn u8 u8_safe_cast(u64 v); +fn i32 i32_safe_cast(i64 v); diff --git a/src/core/core_lexer.c b/src/core/core_lexer.c new file mode 100644 index 0000000..a26ceb7 --- /dev/null +++ b/src/core/core_lexer.c @@ -0,0 +1,469 @@ +#include "core_lexer.h" +#include "core_log.h" +#include "core_platform.h" +#include "core_ctx.h" + +#define lex_error(TOKEN, STRING) do {\ + errorf(STRING);\ + TOKEN->kind = lex_kind_error;\ + TOKEN->string = s8(STRING);\ +} while (0) + +fn lexer_t lex_make(s8_t stream, char *file_name) { + lexer_t result = {.at = stream.str, .end = stream.str + stream.len, .file = file_name}; + return result; +} + +fn b32 lex_at_end(lexer_t *lex) { + b32 result = lex->at >= lex->end; + return result; +} + +fn void lex_advance(lexer_t *lex) { + if (lex_at_end(lex)) return; + if (lex->at[0] == '\n') { lex->column = 0; lex->line += 1; } + lex->column += 1; + lex->at += 1; +} + +fn b32 lex_match(lexer_t *lex, char c) { + if (lex->at[0] == c) { + lex_advance(lex); + return true; + } + return false; +} + +fn void lex_eat_whitespace(lexer_t *lex) { + for (;;) { + if (char_is_whitespace(lex->at[0])) { + if (lex->at[0] == '\n') lex->inside_macro = false; + lex_advance(lex); + } else if (lex->at[0] == '\\' && lex->at[1] == '\n') { + lex_advance(lex); lex_advance(lex); + } else if (lex->at[0] == '\\' && lex->at[1] == '\r' && lex->at[2] == '\n') { + lex_advance(lex); lex_advance(lex); lex_advance(lex); + } else { + break; + } + } +} + +fn void lex_eat_macro_whitespace(lexer_t *lex) { + while (lex->at[0] == ' ' || lex->at[0] == '\t') lex_advance(lex); +} + +fn void lex_suffix(lexer_t *lex, lex_t *token) { + if (lex_match(lex, 'f')) { + token->kind = lex_kind_real; + token->suffix = lex_suffix_f; + } else if (lex_match(lex, 'd')) { + token->kind = lex_kind_real; + token->suffix = lex_suffix_d; + } else if (token->kind == lex_kind_integer && ((lex->at[0] == 'u' && lex->at[1] == 'l' && lex->at[2] == 'l') || (lex->at[0] == 'U' && lex->at[1] == 'L' && lex->at[2] == 'L'))) { + token->suffix = lex_suffix_ull; + lex_advance(lex); lex_advance(lex); lex_advance(lex); + } else if (token->kind == lex_kind_integer && ((lex->at[0] == 'u' && lex->at[1] == 'l') || (lex->at[0] == 'U' && lex->at[1] == 'L'))) { + token->suffix = lex_suffix_ul; + lex_advance(lex); lex_advance(lex); + } else if (token->kind == lex_kind_integer && (lex->at[0] == 'l' || lex->at[0] == 'L')) { + token->suffix = lex_suffix_l; + lex_advance(lex); + } else if (token->kind == lex_kind_integer && ((lex->at[0] == 'l' && lex->at[1] == 'l') || (lex->at[0] == 'L' && lex->at[1] == 'L'))) { + token->suffix = lex_suffix_ll; + lex_advance(lex); lex_advance(lex); + } +} + +fn void lex_eat_number(lexer_t *lex, lex_t *token) { + token->kind = lex_kind_integer; + for (;;) { + if (char_is_digit(lex->at[0])) { + lex_advance(lex); + continue; + } + + if (lex_match(lex, '.')) { + if (token->kind == lex_kind_real) { + lex_error(token, "multiple '.' periods in floating point number literal"); + return; + } + token->kind = lex_kind_real; + continue; + } + + break; + } + + lex_suffix(lex, token); +} + +fn void lex_eat_until(lexer_t *lex, char c) { + while (lex->at[0] != c && !lex_at_end(lex)) lex_advance(lex); +} + +fn void lex_eat_string(lexer_t *lex, lex_t *token) { + token->kind = lex_kind_string; + for (;;) { + if (lex->at[0] == '\\') { + lex_advance(lex); + } else if (lex_match(lex, token->str[0])) { + break; + } + + if (lex->at[0] == 0) { + lex_error(token, "unclosed string"); + return; + } + + lex_advance(lex); + } +} + +fn b32 lex_macro(lexer_t *lex, lex_t *token) { + lex_eat_macro_whitespace(lex); + token->str = lex->at; + while (char_is_alphabetic(lex->at[0])) lex_advance(lex); + token->len = (i32)(lex->at - token->str); + + if (s8_are_equal(token->string, s8("define"))) { + token->kind = lex_kind_preproc_define; + } else if (s8_are_equal(token->string, s8("ifdef"))) { + token->kind = lex_kind_preproc_ifdef; + } else if (s8_are_equal(token->string, s8("ifndef"))) { + token->kind = lex_kind_preproc_ifndef; + } else if (s8_are_equal(token->string, s8("include"))) { + token->kind = lex_kind_preproc_include; + lex_eat_macro_whitespace(lex); + char end = 0; + if (lex_match(lex, '"')) { + end = '"'; + } else if (lex_match(lex, '<')) { + end = '>'; + token->system_include = true; + } else { + lex_error(token, "invalid include directive, should be followed by string or '<'"); + return false; + } + + token->str = lex->at; + while (lex->at[0] != end) { + if (lex_at_end(lex)) { + lex_error(token, "invalid include directive, reached end of file"); + return false; + } + if (lex->at[0] == '\n') { + lex_error(token, "invalid include directive, reached end of line"); + return false; + } + lex_advance(lex); + } + lex_advance(lex); + } else if (s8_are_equal(token->string, s8("if"))) { + token->kind = lex_kind_preproc_if; + } else if (s8_are_equal(token->string, s8("endif"))) { + token->kind = lex_kind_preproc_endif; + } else if (s8_are_equal(token->string, s8("error"))) { + token->kind = lex_kind_preproc_error; + lex_eat_macro_whitespace(lex); + token->str = lex->at; + lex_eat_until(lex, '\n'); + } else if (s8_are_equal(token->string, s8("else"))) { + token->kind = lex_kind_preproc_else; + } else if (s8_are_equal(token->string, s8("elif"))) { + token->kind = lex_kind_preproc_elif; + } else if (s8_are_equal(token->string, s8("pragma"))) { + token->kind = lex_kind_preproc_pragma; + } else if (s8_are_equal(token->string, s8("undef"))) { + token->kind = lex_kind_preproc_undef; + } else { + return false; + } + + return true; +} + +#define LEX_CASE3(C1, K1, C2, K2, C3, K3) \ + case C1: { \ + token->kind = K1; \ + if (lex_match(lex, C2)) { \ + lex_advance(lex); \ + token->kind = K2; \ + } else if (lex_match(lex, C3)) { \ + lex_advance(lex); \ + token->kind = K3; \ + } \ + } break + +fn void lex_token_ex(lexer_t *lex, lex_t *token) { + lex_eat_whitespace(lex); + *token = (lex_t){.str = lex->at, .file = lex->file, .line = lex->line, .column = lex->column}; + lex_advance(lex); + + switch (token->str[0]) { + case '\0': token->kind = lex_kind_eof; break; + case '{': token->kind = lex_kind_open_brace; break; + case '}': token->kind = lex_kind_close_brace; break; + case '(': token->kind = lex_kind_open_paren; break; + case ')': token->kind = lex_kind_close_paren; break; + case '[': token->kind = lex_kind_open_bracket; break; + case ']': token->kind = lex_kind_close_bracket; break; + case '~': token->kind = lex_kind_bit_negation; break; + case ';': token->kind = lex_kind_semicolon; break; + case ':': token->kind = lex_kind_colon; break; + case ',': token->kind = lex_kind_comma; break; + case '@': token->kind = lex_kind_tag; break; + case '?': token->kind = lex_kind_question; break; + case '\\': token->kind = lex_kind_escape; break; + case '"': lex_eat_string(lex, token); break; + case '`': lex_eat_string(lex, token); break; + case '\'': lex_eat_string(lex, token); break; + + LEX_CASE3('^', lex_kind_bit_xor, '=', lex_kind_bit_xor_assign, /*ignored option*/'=', lex_kind_bit_xor_assign); + LEX_CASE3('=', lex_kind_assign, '=', lex_kind_equals, /*ignored option*/'=', lex_kind_equals); + LEX_CASE3('!', lex_kind_negation, '=', lex_kind_not_equals, /*ignored option*/'=', lex_kind_not_equals); + LEX_CASE3('%', lex_kind_modulo, '=', lex_kind_modulo_assign, /*ignored option*/'=', lex_kind_modulo_assign); + LEX_CASE3('*', lex_kind_multiply, '=', lex_kind_multiply_assign, /*ignored option*/'=', lex_kind_multiply_assign); + LEX_CASE3('+', lex_kind_plus, '+', lex_kind_increment, '=', lex_kind_plus_assign); + LEX_CASE3('-', lex_kind_minus, '-', lex_kind_decrement, '=', lex_kind_minus_assign); + LEX_CASE3('&', lex_kind_bit_and, '&', lex_kind_and, '=', lex_kind_bit_and_assign); + LEX_CASE3('|', lex_kind_bit_or, '|', lex_kind_or, '=', lex_kind_bit_or_assign); + + case '.': { + token->kind = lex_kind_dot; + if (lex->at[0] == '.' && lex->at[1] == '.') { + lex_advance(lex); + lex_advance(lex); + token->kind = lex_kind_three_dots; + } + } break; + + case '/': { + token->kind = lex_kind_divide; + if (lex_match(lex, '/')) { + token->kind = lex_kind_comment; + lex_eat_until(lex, '\n'); + } else if (lex_match(lex, '*')) { + token->kind = lex_kind_comment; + for (;;) { + if (lex->at[0] == '*' && lex->at[1] == '/') { + break; + } + if (lex->at[0] == 0) { + lex_error(token, "unclosed block comment"); + return; + } + lex_advance(lex); + } + lex_advance(lex); + lex_advance(lex); + } else if (lex_match(lex, '=')) { + token->kind = lex_kind_divide_assign; + } + } break; + + case '>': { + token->kind = lex_kind_greater; + if (lex_match(lex, '=')) { + token->kind = lex_kind_greater_or_equal; + } else if (lex_match(lex, '>')) { + token->kind = lex_kind_bit_right_shift; + if (lex_match(lex, '=')) { + token->kind = lex_kind_bit_right_shift_assign; + } + } + } break; + + case '<': { + token->kind = lex_kind_lesser; + if (lex_match(lex, '=')) { + token->kind = lex_kind_lesser_or_equal; + } else if (lex_match(lex, '<')) { + token->kind = lex_kind_bit_left_shift; + if (lex_match(lex, '=')) { + token->kind = lex_kind_bit_left_shift_assign; + } + } + } break; + + case '#': { + if (lex_match(lex, '#')) { + token->kind = lex_kind_preproc_concat; + } else { + b32 inside_macro = lex_macro(lex, token); + if (inside_macro) { + lex->inside_macro = true; + } else { + if (!lex->inside_macro) { + lex_error(token, "invalid preprocessor directive"); + return; + } + token->kind = lex_kind_preproc_stringify; + token->str = lex->at; + // this is slighly wrong, first letter can't be number + while (char_is_alphanumeric(lex->at[0]) || lex->at[0] == '_') lex_advance(lex); + } + } + } break; + + case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': { + lex_eat_number(lex, token); + } break; + + case 'A': case 'a': case 'B': case 'b': case 'C': case 'c': + case 'D': case 'd': case 'E': case 'e': case 'F': case 'f': + case 'G': case 'g': case 'H': case 'h': case 'I': case 'i': + case 'J': case 'j': case 'K': case 'k': case 'L': case 'l': + case 'M': case 'm': case 'N': case 'n': case 'O': case 'o': + case 'P': case 'p': case 'Q': case 'q': case 'R': case 'r': + case 'S': case 's': case 'T': case 't': case 'U': case 'u': + case 'V': case 'v': case 'W': case 'w': case 'X': case 'x': + case 'Y': case 'y': case 'Z': case 'z': case '_': { + token->kind = lex_kind_ident; + while (char_is_alphanumeric(lex->at[0]) || lex->at[0] == '_') lex_advance(lex); + } break; + + default: { + lex_error(token, "found invalid character in the token stream"); + } + } + + token->len = (i32)(lex->at - token->str); + + if (token->kind == lex_kind_integer) { + s8_t string_to_lex = token->string; + if (token->suffix != lex_suffix_none) { + s8_t string_value = ti_enum_value_to_name(token->suffix, type(lex_suffix_t)); + s8_t prefix = s8("lex_suffix_"); + string_to_lex.len -= string_value.len - prefix.len; + } + token->integer = u64_from_s8(string_to_lex, 10); + } else if (token->kind == lex_kind_real) { + s8_t string_to_lex = token->string; + if (token->suffix != lex_suffix_none) { + s8_t string_value = ti_enum_value_to_name(token->suffix, type(lex_suffix_t)); + s8_t prefix = s8("lex_suffix_"); + string_to_lex.len -= string_value.len - prefix.len; + } + token->real = f64_from_s8(string_to_lex); + } else if (token->kind == lex_kind_string) { + token->str += 1; + token->len -= 2; + } else if (token->kind == lex_kind_preproc_include) { + token->len -= 1; + } + if (lex->inside_macro) token->inside_macro = true; +} + +fn lex_t lex_token(lexer_t *lex) { + lex_t result = {0}; + lex_token_ex(lex, &result); + return result; +} + +fn lex_array_t lex_tokens(ma_arena_t *arena, char *file_name, s8_t stream) { + usize align = arena->align; + arena->align = 0; + + lex_array_t token_array = {0}; + lexer_t l = lex_make(stream, file_name); + for (;;) { + lex_t *token = ma_push_type(arena, lex_t); + if (token_array.data == NULL) { + token_array.data = token; + } + token_array.len += 1; + + do { + lex_token_ex(&l, token); + } while (token->kind == lex_kind_comment); + if (token->kind == lex_kind_eof) break; + } + + arena->align = align; + return token_array; +} + +gb_read_only s8_t lex_kind_simple_strings[] = { +#define X(KIND, STR, SIMPLE) s8_const(SIMPLE), + LEX_KIND_XLIST +#undef X +}; + +fn s8_t lex_kind_to_simple_s8(lex_kind_t kind) { + assert_expr(kind >= 0 && kind < lex_kind_count); + return lex_kind_simple_strings[kind]; +} + +gb_read_only s8_t lex_kind_strings[] = { +#define X(KIND, STR, SIMPLE) s8_const(STR), + LEX_KIND_XLIST +#undef X +}; + +fn s8_t lex_kind_to_s8(lex_kind_t kind) { + assert(kind >= 0 && kind < lex_kind_count); + return lex_kind_strings[kind]; +} + +fn lex_t *parser_next(parser_t *par) { + lex_t *result = par->at; + if (result->kind != lex_kind_eof) par->at += 1; + return result; +} + +fn lex_t *parser_match(parser_t *par, lex_kind_t kind) { + if (par->at->kind == kind) { + return parser_next(par); + } else { + return NULL; + } +} + +fn lex_t *parser_matchi(parser_t *par, s8_t str) { + if (par->at->kind == lex_kind_ident && s8_are_equal(par->at->string, str)) { + return parser_next(par); + } else { + return NULL; + } +} + +fn void parser_panicf(b32 print_only_file, lex_t *token, const char *str, ...) { + ma_temp_t scratch = ma_begin_scratch(); + b8 p = tcx->log.print_file_and_line; + tcx->log.print_file_and_line = false; + + S8_FMT(scratch.arena, str, str8); + if (print_only_file) { + fatalf("%s: error: %S", token->file, str8); + } else { + fatalf("%s(%d): error: %S", token->file, token->line, str8); + } + + + tcx->log.print_file_and_line = p; + ma_end_scratch(scratch); +} + +fn lex_t *parser_expect(parser_t *par, lex_kind_t kind) { + lex_t *token = parser_match(par, kind); + if (!token) parser_panicf(par->print_only_file, par->at, "expected token kind: %S, got instead: %S", lex_kind_to_s8(kind), lex_kind_to_s8(par->at->kind)); + return token; +} + +fn lex_t *parser_expecti(parser_t *par, s8_t ident) { + lex_t *token = parser_matchi(par, ident); + if (!token) parser_panicf(par->print_only_file, par->at, "expected identifier: '%S'", ident); + return token; +} + +fn void parser_eat_until(parser_t *par, lex_kind_t kind) { + while (par->at->kind != kind && par->at->kind != lex_kind_eof) { + parser_next(par); + } +} + +fn void parser_eat_including(parser_t *par, lex_kind_t kind) { + parser_eat_until(par, kind); + parser_next(par); +} diff --git a/src/core/core_lexer.h b/src/core/core_lexer.h new file mode 100644 index 0000000..60e20d1 --- /dev/null +++ b/src/core/core_lexer.h @@ -0,0 +1,182 @@ +#pragma once +#include "core_basic.h" +#include "core_string.h" +#include "core_arena.h" +#include "core_type_info.h" + +typedef enum lex_kind_t { + #define LEX_KIND_XLIST\ + X(lex_kind_eof , "end of file" , "---" )\ + X(lex_kind_error , "error" , "---" )\ + X(lex_kind_integer , "integer" , "---" )\ + X(lex_kind_real , "real" , "---" )\ + X(lex_kind_ident , "identifier" , "---" )\ + X(lex_kind_string , "string" , "---" )\ + X(lex_kind_comment , "comment" , "---" )\ + X(lex_kind_open_brace , "'{' open brace" , "{" )\ + X(lex_kind_close_brace , "'}' close brace" , "}" )\ + X(lex_kind_open_paren , "'(' open parenthesis" , "(" )\ + X(lex_kind_close_paren , "')' close parenthesis" , ")" )\ + X(lex_kind_open_bracket , "'[' open bracket" , "[" )\ + X(lex_kind_close_bracket , "']' close bracket" , "]" )\ + X(lex_kind_plus , "'+' plus" , "+" )\ + X(lex_kind_minus , "'-' minus" , "-" )\ + X(lex_kind_divide , "'/' division sign" , "/" )\ + X(lex_kind_multiply , "'*' multiplication sign" , "*" )\ + X(lex_kind_modulo , "'%' modulo" , "%" )\ + X(lex_kind_or , "'||' logical or" , "||" )\ + X(lex_kind_and , "'&&' logical and" , "&&" )\ + X(lex_kind_negation , "'!' logical negation" , "!" )\ + X(lex_kind_bit_negation , "'~' bit negation" , "~" )\ + X(lex_kind_bit_left_shift , "'<<' bit left shift" , "<<" )\ + X(lex_kind_bit_right_shift , "'>>' bit right shift" , ">>" )\ + X(lex_kind_bit_or , "'|' bit or" , "|" )\ + X(lex_kind_bit_and , "'&' bit and" , "&" )\ + X(lex_kind_bit_xor , "'^' bit xor" , "^" )\ + X(lex_kind_decrement , "'--' decrement" , "--" )\ + X(lex_kind_increment , "'++' increment" , "++" )\ + X(lex_kind_post_decrement , "'--' post decrement" , "--" )\ + X(lex_kind_post_increment , "'++' post increment" , "++" )\ + X(lex_kind_assign , "'=' assignment" , "=" )\ + X(lex_kind_divide_assign , "'/=' divide assignment" , "/=" )\ + X(lex_kind_multiply_assign , "'*=' multiply assignment" , "*=" )\ + X(lex_kind_plus_assign , "'+=' plus assignment" , "+=" )\ + X(lex_kind_minus_assign , "'-=' minus assignment" , "-=" )\ + X(lex_kind_modulo_assign , "'%=' modulo assignment" , "%=" )\ + X(lex_kind_bit_and_assign , "'&=' bit and assignment" , "&=" )\ + X(lex_kind_bit_or_assign , "'|=' bit or assignment" , "|=" )\ + X(lex_kind_bit_xor_assign , "'^=' bit xor assignment" , "^=" )\ + X(lex_kind_bit_left_shift_assign , "'<<=' bit left shift assignment" , "<<=" )\ + X(lex_kind_bit_right_shift_assign , "'>>=' bit right shift assignment" , ">>=" )\ + X(lex_kind_equals , "'==' equals sign" , "==" )\ + X(lex_kind_not_equals , "'!=' not equals sign" , "!=" )\ + X(lex_kind_lesser , "'<' lesser then" , "<" )\ + X(lex_kind_greater , "'>' greater then" , ">" )\ + X(lex_kind_lesser_or_equal , "'<=' lesser then or equal" , "<=" )\ + X(lex_kind_greater_or_equal , "'>=' greater then or equal" , ">=" )\ + X(lex_kind_comma , "',' comma" , "," )\ + X(lex_kind_dot , "'.' dot" , "." )\ + X(lex_kind_three_dots , "'...' three dots" , "..." )\ + X(lex_kind_semicolon , "';' semicolon" , ";" )\ + X(lex_kind_colon , "':' colon" , ":" )\ + X(lex_kind_arrow , "'->' arrow" , "->" )\ + X(lex_kind_question , "'?' question mark" , "?" )\ + X(lex_kind_tag , "'@' tag sign" , "@" )\ + X(lex_kind_escape , "'\\' escape" , "\\" )\ + X(lex_kind_preproc_null , "preproc_null" , "---" )\ + X(lex_kind_preproc_define , "preproc_define" , "---" )\ + X(lex_kind_preproc_ifdef , "preproc_ifdef" , "---" )\ + X(lex_kind_preproc_ifndef , "preproc_ifndef" , "---" )\ + X(lex_kind_preproc_include , "preproc_include" , "---" )\ + X(lex_kind_preproc_endif , "preproc_endif" , "---" )\ + X(lex_kind_preproc_if , "preproc_if" , "---" )\ + X(lex_kind_preproc_pragma , "preproc_pragma" , "---" )\ + X(lex_kind_preproc_error , "preproc_error" , "---" )\ + X(lex_kind_preproc_else , "preproc_else" , "---" )\ + X(lex_kind_preproc_elif , "preproc_elif" , "---" )\ + X(lex_kind_preproc_undef , "preproc_undef" , "---" )\ + X(lex_kind_preproc_concat , "preproc_concat" , "---" )\ + X(lex_kind_preproc_stringify , "preproc_stringify" , "---" )\ + + #define X(KIND, STR, SIMPLE) KIND, + LEX_KIND_XLIST + #undef X + + lex_kind_count, +} lex_kind_t; + +typedef enum lex_suffix_t { + #define LEX_SUFFIX_XLIST\ + X(lex_suffix_none) \ + X(lex_suffix_f) \ + X(lex_suffix_d) \ + X(lex_suffix_u) \ + X(lex_suffix_ul) \ + X(lex_suffix_ull) \ + X(lex_suffix_l) \ + X(lex_suffix_ll) \ + + #define X(KIND) KIND, + LEX_SUFFIX_XLIST + #undef X + + lex_suffix_count, +} lex_suffix_t; + +typedef struct lex_t lex_t; +struct lex_t { + lex_kind_t kind; + lex_suffix_t suffix; + struct { + b8 inside_macro: 1; + b8 system_include: 1; + }; + + union { + struct {char *str; i64 len;}; + s8_t string; + }; + + i32 line; + i32 column; + char *file; + + union { + u64 integer; + f64 real; + char *error; + }; +}; + +typedef struct lexer_t lexer_t; +struct lexer_t { + char *at; + char *end; + char *file; + i32 line; + i32 column; + + b8 inside_macro; +}; + +typedef struct lex_array_t lex_array_t; +struct lex_array_t { + lex_t *data; + i32 len; +}; + +fn lex_array_t lex_tokens(ma_arena_t *arena, char *filename, s8_t stream); +fn s8_t lex_kind_to_simple_s8(lex_kind_t kind); +fn s8_t lex_kind_to_s8(lex_kind_t kind); + +typedef struct parser_t parser_t; +struct parser_t { + ma_arena_t *arena; + lex_t *at; + b8 print_only_file; +}; + +#define parser_make(ARENA, TOKEN) &(parser_t){.arena = ARENA, .at = TOKEN} +fn lex_t *parser_next(parser_t *par); +fn lex_t *parser_match(parser_t *par, lex_kind_t kind); +fn lex_t *parser_matchi(parser_t *par, s8_t str); +fn lex_t *parser_expect(parser_t *par, lex_kind_t kind); +fn void parser_panicf(b32 print_only_file, lex_t *token, const char *str, ...); +fn void parser_eat_until(parser_t *par, lex_kind_t kind); +fn void parser_eat_including(parser_t *par, lex_kind_t kind); + +static gb_read_only lex_t lex_null; + +static gb_read_only type_member_t members__lex_kind_t[] = { +#define X(KIND, STR, SIMPLE) {.name = s8_const("lex_kind_" #KIND), .value = KIND}, + LEX_KIND_XLIST +#undef X +}; +static DEFINE_ENUM(lex_kind_t); + +static gb_read_only type_member_t members__lex_suffix_t[] = { +#define X(KIND) {.name = s8_const(#KIND), .value = KIND}, + LEX_SUFFIX_XLIST +#undef X +}; +static DEFINE_ENUM(lex_suffix_t); diff --git a/src/core/core_log.c b/src/core/core_log.c new file mode 100644 index 0000000..d496712 --- /dev/null +++ b/src/core/core_log.c @@ -0,0 +1,42 @@ +#include "core_log.h" +#include "core_ctx.h" +#include "core_platform.h" + +fn void log_basef(log_level_t level, s8_t file_and_line, const char *str, ...) { + ma_temp_t scratch = ma_begin_scratch(); + S8_FMT(scratch.arena, str, string); + tcx->log.log_proc(level, file_and_line, string); + ma_end_scratch(scratch); +} + +fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string) { + ma_temp_t scratch = ma_begin_scratch(); + + char *colon = ": "; + if (tcx->log.print_file_and_line == false) { + file_and_line.len = 0; + colon = ""; + } + + switch(level) { + case log_level_debug: + case log_level_info: { + os_console_log(s8_printf(scratch.arena, "%S\n", string).str); + } break; + case log_level_warning: { + os_console_log(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str); + if (tcx->log.break_on_warning) debug_break(); + } break; + case log_level_error: { + os_console_log(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str); + if (tcx->log.break_on_error) debug_break(); + } break; + case log_level_fatal: { + os_error_box(s8_printf(scratch.arena, "%S%s%S\n", file_and_line, colon, string).str); + if (tcx->log.break_on_fatal) debug_break(); + } break; + default_is_invalid; + } + + ma_end_scratch(scratch); +} diff --git a/src/core/core_log.h b/src/core/core_log.h new file mode 100644 index 0000000..ac5ba92 --- /dev/null +++ b/src/core/core_log.h @@ -0,0 +1,30 @@ +#pragma once +#include "core_basic.h" +#include "core_string.h" + +typedef enum { + log_level_debug, + log_level_info, + log_level_warning, + log_level_error, + log_level_fatal, +} log_level_t; + +typedef struct logger_t logger_t; +struct logger_t { + void (*log_proc)(log_level_t level, s8_t file_and_line, s8_t string); + void *user_data; + b8 break_on_fatal; + b8 break_on_error; + b8 break_on_warning; + b8 print_file_and_line; +}; + +/////////////////////////////// +// main api +#define debugf(...) log_basef(log_level_debug, S8_FILE_AND_LINE, __VA_ARGS__) +#define errorf(...) log_basef(log_level_error, S8_FILE_AND_LINE, __VA_ARGS__) +#define fatalf(...) (log_basef(log_level_fatal, S8_FILE_AND_LINE, __VA_ARGS__), 0) + +fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string); +fn void log_basef(log_level_t level, s8_t file_and_line, const char *str, ...); diff --git a/src/core/core_math.c b/src/core/core_math.c new file mode 100644 index 0000000..c87ccff --- /dev/null +++ b/src/core/core_math.c @@ -0,0 +1,555 @@ +#include "core_math.h" +#include "core_intrin.h" + +/* + * Converts an RGB color value to HSL. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * also https://gist.github.com/ciembor/1494530 + * alpha is ignored + */ +fn v3f32_t v3f32_rgb_to_hsl(v3f32_t color) { + v3f32_t result; + f32 max = MAX(MAX(color.r, color.g), color.b); + f32 min = MIN(MIN(color.r, color.g), color.b); + + result.h = result.s = result.l = (max + min) / 2.f; + + if (max == min) { + result.h = result.s = 0.f; // achromatic + } else { + f32 d = max - min; + result.s = (result.l > 0.5f) ? d / (2.f - max - min) : d / (max + min); + + if (max == color.r) { + result.h = (color.g - color.b) / d + (color.g < color.b ? 6.f : 0.f); + } else if (max == color.g) { + result.h = (color.b - color.r) / d + 2.f; + } else if (max == color.b) { + result.h = (color.r - color.g) / d + 4.f; + } + + result.h /= 6.f; + } + + return result; +} + +/* + * Converts an HUE to r, g or b. + * returns f32 in the set [0, 1]. + */ +fn f32 f32_hue_to_rgb(f32 p, f32 q, f32 t) { + if (t < 0.f) + t += 1.f; + if (t > 1.f) + t -= 1.f; + if (t < 1.f / 6.f) + return p + (q - p) * 6.f * t; + if (t < 1.f / 2.f) + return q; + if (t < 2.f / 3.f) + return p + (q - p) * (2.f / 3.f - t) * 6.f; + return p; +} + +fn v3f32_t v3f32_hsl_to_rgb(v3f32_t color) { + v3f32_t result; + + if (0 == color.s) { + result.r = result.g = result.b = color.l; // achromatic + } else { + f32 q = color.l < 0.5f ? color.l * (1.f + color.s) + : color.l + color.s - color.l * color.s; + f32 p = 2.f * color.l - q; + result.r = f32_hue_to_rgb(p, q, color.h + 1.f / 3.f); + result.g = f32_hue_to_rgb(p, q, color.h); + result.b = f32_hue_to_rgb(p, q, color.h - 1.f / 3.f); + } + return result; +} + +fn v4f32_t v4f32_rgba_to_hsla(v4f32_t rgba) { + v3f32_t result = v3f32_rgb_to_hsl(rgba.xyz); + return (v4f32_t){result.r, result.g, result.b, rgba.a}; +} + +fn v4f32_t v4f32_hsla_to_rgba(v4f32_t color) { + v3f32_t result = v3f32_hsl_to_rgb(color.xyz); + return (v4f32_t){result.r, result.g, result.b, color.a}; +} + +/* +https://git.musl-libc.org/cgit/musl/tree/src/math +https://gitlab.com/nakst/essence/-/blob/master/shared/math.cpp +*/ + + +fn f64 f64_clamp01(f64 a) { return CLAMP(a, 0, 1); } +fn f64 f64_lerp(f64 a, f64 b, f64 t) { return (1 - t) * a + t * b; } +fn f64 f64_smooth_step(f64 t) { return t*t*(3-2*t); } +fn f64 f64_ease_in_quint(f64 x) { return x * x * x * x * x; } +fn f64 f64_ease_in_cubic(f64 x) { return x * x * x; } +fn f64 f64_ping_pong(f64 x) { return 1.0 - f64_abs(1.0 - f64_mod(x,2)); } + +fn f32 f32_clamp01(f32 a) { return CLAMP(a, 0, 1); } +fn f32 f32_lerp(f32 a, f32 b, f32 t) { return (1 - t) * a + t * b; } +fn f32 f32_smooth_step(f32 t) { return t*t*(3-2*t); } +fn f32 f32_ease_in_quint(f32 x) { return x * x * x * x * x; } +fn f32 f32_ease_in_cubic(f32 x) { return x * x * x; } +fn f32 f32_ping_pong(f32 x) { return 1.0f - f32_abs(1.0f - f32_mod(x,2)); } + +fn v4f32_t v4f32_lerp(v4f32_t a, v4f32_t b, f32 t) { + return (v4f32_t){f32_lerp(a.x, b.x, t), f32_lerp(a.y, b.y, t), f32_lerp(a.z, b.z, t), f32_lerp(a.w, b.w, t)}; +} + +fn v4f32_t v4f32_lerp_noa(v4f32_t a, v4f32_t b, f32 t) { + return (v4f32_t){f32_lerp(a.x, b.x, t), f32_lerp(a.y, b.y, t), f32_lerp(a.z, b.z, t), a.w}; +} + +fn f64 _Sine(f64 x) { + // Calculates sin(x) for x in [0, pi/4]. + + f64 x2 = x * x; + + return x * (U64_TO_F64(0x3FF0000000000000) + x2 * (U64_TO_F64(0xBFC5555555555540) + x2 * (U64_TO_F64(0x3F8111111110ED80) + x2 * (U64_TO_F64(0xBF2A01A019AE6000) + + x2 * (U64_TO_F64(0x3EC71DE349280000) + x2 * (U64_TO_F64(0xBE5AE5DC48000000) + x2 * U64_TO_F64(0x3DE5D68200000000))))))); +} + +fn f32 _SineFloat(f32 x) { + // Calculates sin(x) for x in [0, pi/4]. + + f32 x2 = x * x; + + return x * (U32_TO_F32(0x3F800000) + x2 * (U32_TO_F32(0xBE2AAAA0) + x2 * (U32_TO_F32(0x3C0882C0) + x2 * U32_TO_F32(0xB94C6000)))); +} + +fn f64 _ArcSine(f64 x) { + // Calculates arcsin(x) for x in [0, 0.5]. + + f64 x2 = x * x; + + return x * (U64_TO_F64(0x3FEFFFFFFFFFFFE6) + x2 * (U64_TO_F64(0x3FC555555555FE00) + x2 * (U64_TO_F64(0x3FB333333292DF90) + x2 * (U64_TO_F64(0x3FA6DB6DFD3693A0) + + x2 * (U64_TO_F64(0x3F9F1C608DE51900) + x2 * (U64_TO_F64(0x3F96EA0659B9A080) + x2 * (U64_TO_F64(0x3F91B4ABF1029100) + + x2 * (U64_TO_F64(0x3F8DA8DAF31ECD00) + x2 * (U64_TO_F64(0x3F81C01FD5000C00) + x2 * (U64_TO_F64(0x3F94BDA038CF6B00) + + x2 * (U64_TO_F64(0xBF8E849CA75B1E00) + x2 * U64_TO_F64(0x3FA146C2D37F2C60)))))))))))); +} + +fn f32 _ArcSineFloat(f32 x) { + // Calculates arcsin(x) for x in [0, 0.5]. + + f32 x2 = x * x; + + return x * (U32_TO_F32(0x3F800004) + x2 * (U32_TO_F32(0x3E2AA130) + x2 * (U32_TO_F32(0x3D9B2C28) + x2 * (U32_TO_F32(0x3D1C1800) + x2 * U32_TO_F32(0x3D5A97C0))))); +} + +fn f64 _ArcTangent(f64 x) { + // Calculates arctan(x) for x in [0, 0.5]. + + f64 x2 = x * x; + + return x * (U64_TO_F64(0x3FEFFFFFFFFFFFF8) + x2 * (U64_TO_F64(0xBFD5555555553B44) + x2 * (U64_TO_F64(0x3FC9999999803988) + x2 * (U64_TO_F64(0xBFC249248C882E80) + + x2 * (U64_TO_F64(0x3FBC71C5A4E4C220) + x2 * (U64_TO_F64(0xBFB745B3B75243F0) + x2 * (U64_TO_F64(0x3FB3AFAE9A2939E0) + + x2 * (U64_TO_F64(0xBFB1030C4A4A1B90) + x2 * (U64_TO_F64(0x3FAD6F65C35579A0) + x2 * (U64_TO_F64(0xBFA805BCFDAFEDC0) + + x2 * (U64_TO_F64(0x3F9FC6B5E115F2C0) + x2 * U64_TO_F64(0xBF87DCA5AB25BF80)))))))))))); +} + +fn f32 _ArcTangentFloat(f32 x) { + // Calculates arctan(x) for x in [0, 0.5]. + + f32 x2 = x * x; + + return x * (U32_TO_F32(0x3F7FFFF8) + x2 * (U32_TO_F32(0xBEAAA53C) + x2 * (U32_TO_F32(0x3E4BC990) + x2 * (U32_TO_F32(0xBE084A60) + x2 * U32_TO_F32(0x3D8864B0))))); +} + +fn f64 _Cosine(f64 x) { + // Calculates cos(x) for x in [0, pi/4]. + + f64 x2 = x * x; + + return U64_TO_F64(0x3FF0000000000000) + x2 * (U64_TO_F64(0xBFDFFFFFFFFFFFA0) + x2 * (U64_TO_F64(0x3FA555555554F7C0) + x2 * (U64_TO_F64(0xBF56C16C16475C00) + + x2 * (U64_TO_F64(0x3EFA019F87490000) + x2 * (U64_TO_F64(0xBE927DF66B000000) + x2 * U64_TO_F64(0x3E21B949E0000000)))))); +} + +fn f32 _CosineFloat(f32 x) { + // Calculates cos(x) for x in [0, pi/4]. + + f32 x2 = x * x; + + return U32_TO_F32(0x3F800000) + x2 * (U32_TO_F32(0xBEFFFFDA) + x2 * (U32_TO_F32(0x3D2A9F60) + x2 * U32_TO_F32(0xBAB22C00))); +} + +fn f64 _Tangent(f64 x) { + // Calculates tan(x) for x in [0, pi/4]. + + f64 x2 = x * x; + + return x * (U64_TO_F64(0x3FEFFFFFFFFFFFE8) + x2 * (U64_TO_F64(0x3FD5555555558000) + x2 * (U64_TO_F64(0x3FC1111110FACF90) + x2 * (U64_TO_F64(0x3FABA1BA266BFD20) + + x2 * (U64_TO_F64(0x3F9664F30E56E580) + x2 * (U64_TO_F64(0x3F822703B08BDC00) + x2 * (U64_TO_F64(0x3F6D698D2E4A4C00) + + x2 * (U64_TO_F64(0x3F57FF4F23EA4400) + x2 * (U64_TO_F64(0x3F424F3BEC845800) + x2 * (U64_TO_F64(0x3F34C78CA9F61000) + + x2 * (U64_TO_F64(0xBF042089F8510000) + x2 * (U64_TO_F64(0x3F29D7372D3A8000) + x2 * (U64_TO_F64(0xBF19D1C5EF6F0000) + + x2 * (U64_TO_F64(0x3F0980BDF11E8000))))))))))))))); +} + +fn f32 _TangentFloat(f32 x) { + // Calculates tan(x) for x in [0, pi/4]. + + f32 x2 = x * x; + + return x * (U32_TO_F32(0x3F800001) + x2 * (U32_TO_F32(0x3EAAA9AA) + x2 * (U32_TO_F32(0x3E08ABA8) + x2 * (U32_TO_F32(0x3D58EC90) + + x2 * (U32_TO_F32(0x3CD24840) + x2 * (U32_TO_F32(0x3AC3CA00) + x2 * U32_TO_F32(0x3C272F00))))))); +} + +fn f64 f64_sin(f64 x) { + b32 negate = false; + + // x in -infty, infty + + if (x < 0) { + x = -x; + negate = true; + } + + // x in 0, infty + + x -= 2 * F64_PI * f64_floor(x / (2 * F64_PI)); + + // x in 0, 2*pi + + if (x < F64_PI / 2) { + } else if (x < F64_PI) { + x = F64_PI - x; + } else if (x < 3 * F64_PI / 2) { + x = x - F64_PI; + negate = !negate; + } else { + x = F64_PI * 2 - x; + negate = !negate; + } + + // x in 0, pi/2 + + f64 y = x < F64_PI / 4 ? _Sine(x) : _Cosine(F64_PI / 2 - x); + return negate ? -y : y; +} + + +fn f32 f32_sin(f32 x) { + b32 negate = false; + + // x in -infty, infty + + if (x < 0) { + x = -x; + negate = true; + } + + // x in 0, infty + + x -= 2 * F32_PI * f32_floor(x / (2 * F32_PI)); + + // x in 0, 2*pi + + if (x < F32_PI / 2) { + } else if (x < F32_PI) { + x = F32_PI - x; + } else if (x < 3 * F32_PI / 2) { + x = x - F32_PI; + negate = !negate; + } else { + x = F32_PI * 2 - x; + negate = !negate; + } + + // x in 0, pi/2 + + f32 y = x < F32_PI / 4 ? _SineFloat(x) : _CosineFloat(F32_PI / 2 - x); + return negate ? -y : y; +} + +fn f64 f64_cos(f64 x) { + b32 negate = false; + + // x in -infty, infty + + if (x < 0) { + x = -x; + } + + // x in 0, infty + + x -= 2 * F64_PI * f64_floor(x / (2 * F64_PI)); + + // x in 0, 2*pi + + if (x < F64_PI / 2) { + } else if (x < F64_PI) { + x = F64_PI - x; + negate = !negate; + } else if (x < 3 * F64_PI / 2) { + x = x - F64_PI; + negate = !negate; + } else { + x = F64_PI * 2 - x; + } + + // x in 0, pi/2 + + f64 y = x < F64_PI / 4 ? _Cosine(x) : _Sine(F64_PI / 2 - x); + return negate ? -y : y; +} + +fn f32 f32_cos(f32 x) { + b32 negate = false; + + // x in -infty, infty + + if (x < 0) { + x = -x; + } + + // x in 0, infty + + x -= 2 * F32_PI * f32_floor(x / (2 * F32_PI)); + + // x in 0, 2*pi + + if (x < F32_PI / 2) { + } else if (x < F32_PI) { + x = F32_PI - x; + negate = !negate; + } else if (x < 3 * F32_PI / 2) { + x = x - F32_PI; + negate = !negate; + } else { + x = F32_PI * 2 - x; + } + + // x in 0, pi/2 + + f32 y = x < F32_PI / 4 ? _CosineFloat(x) : _SineFloat(F32_PI / 2 - x); + return negate ? -y : y; +} + +fn f64 f64_tan(f64 x) { + b32 negate = false; + + // x in -infty, infty + + if (x < 0) { + x = -x; + negate = !negate; + } + + // x in 0, infty + + x -= F64_PI * f64_floor(x / F64_PI); + + // x in 0, pi + + if (x > F64_PI / 2) { + x = F64_PI - x; + negate = !negate; + } + + // x in 0, pi/2 + + f64 y = x < F64_PI / 4 ? _Tangent(x) : (1.0 / _Tangent(F64_PI / 2 - x)); + return negate ? -y : y; +} + +fn f32 f32_tan(f32 x) { + b32 negate = false; + + // x in -infty, infty + + if (x < 0) { + x = -x; + negate = !negate; + } + + // x in 0, infty + + x -= F32_PI * f32_floor(x / F32_PI); + + // x in 0, pi + + if (x > F32_PI / 2) { + x = F32_PI - x; + negate = !negate; + } + + // x in 0, pi/2 + + f32 y = x < F32_PI / 4 ? _TangentFloat(x) : (1.0f / _TangentFloat(F32_PI / 2 - x)); + return negate ? -y : y; +} + +fn f64 f64_asin(f64 x) { + b32 negate = false; + + if (x < 0) { + x = -x; + negate = true; + } + + f64 y; + + if (x < 0.5) { + y = _ArcSine(x); + } else { + y = F64_PI / 2 - 2 * _ArcSine(f64_sqrt(0.5 - 0.5 * x)); + } + + return negate ? -y : y; +} + +fn f32 f32_asin(f32 x) { + b32 negate = false; + + if (x < 0) { + x = -x; + negate = true; + } + + f32 y; + + if (x < 0.5) { + y = _ArcSineFloat(x); + } else { + y = F32_PI / 2 - 2 * _ArcSineFloat(f32_sqrt(0.5f - 0.5f * x)); + } + + return negate ? -y : y; +} + +fn f64 f64_acos(f64 x) { + return f64_asin(-x) + F64_PI / 2; +} + +fn f32 f32_acos(f32 x) { + return f32_asin(-x) + F32_PI / 2; +} + +fn f64 f64_atan(f64 x) { + b32 negate = false; + + if (x < 0) { + x = -x; + negate = true; + } + + b32 reciprocalTaken = false; + + if (x > 1) { + x = 1 / x; + reciprocalTaken = true; + } + + f64 y; + + if (x < 0.5) { + y = _ArcTangent(x); + } else { + y = 0.463647609000806116 + _ArcTangent((2 * x - 1) / (2 + x)); + } + + if (reciprocalTaken) { + y = F64_PI / 2 - y; + } + + return negate ? -y : y; +} + +fn f32 f32_atan(f32 x) { + b32 negate = false; + + if (x < 0) { + x = -x; + negate = true; + } + + b32 reciprocalTaken = false; + + if (x > 1) { + x = 1 / x; + reciprocalTaken = true; + } + + f32 y; + + if (x < 0.5f) { + y = _ArcTangentFloat(x); + } else { + y = 0.463647609000806116f + _ArcTangentFloat((2 * x - 1) / (2 + x)); + } + + if (reciprocalTaken) { + y = F32_PI / 2 - y; + } + + return negate ? -y : y; +} + +fn f64 f64_atan2(f64 y, f64 x) { + if (x == 0) return y > 0 ? F64_PI / 2 : -F64_PI / 2; + else if (x > 0) return f64_atan(y / x); + else if (y >= 0) return F64_PI + f64_atan(y / x); + else return -F64_PI + f64_atan(y / x); +} + +fn f32 f32_atan2(f32 y, f32 x) { + if (x == 0) return y > 0 ? F32_PI / 2 : -F32_PI / 2; + else if (x > 0) return f32_atan(y / x); + else if (y >= 0) return F32_PI + f32_atan(y / x); + else return -F32_PI + f32_atan(y / x); +} + +fn b32 f32_are_equal(f32 a, f32 b) { + f32 diff = f32_abs(a - b); + b32 result = diff <= 0.00001f; + return result; +} + +fn b32 f64_are_equal(f64 a, f64 b) { + f64 diff = f64_abs(a - b); + b32 result = diff <= 0.00001; + return result; +} + +fn f32 f32_ease_out_bounce(f32 x) { + f32 n1 = 7.5625f; + f32 d1 = 2.75f; + + if (x < 1.f / d1) { + return n1 * x * x; + } else if (x < 2.f / d1) { + return n1 * (x -= 1.5f / d1) * x + 0.75f; + } else if (x < 2.5f / d1) { + return n1 * (x -= 2.25f / d1) * x + 0.9375f; + } else { + return n1 * (x -= 2.625f / d1) * x + 0.984375f; + } +} + +fn f32 f32_ease_out_elastic(f32 x) { + f32 c4 = (2 * F32_PI) / 3; + + return x == 0.f + ? 0 + : x == 1.f + ? 1 + : f32_pow(2.f, -10.f * x) * f32_sin((x * 10.f - 0.75f) * c4) + 1.f; +} + +fn f32 f32_ease_out_cubic(f32 x) { + return 1.f - f32_pow(1.f - x, 3.f); +} + +fn f32 f32_ease_out_n(f32 x, f32 n) { + return 1.f - f32_pow(1.f - x, n); +} + +fn r2f32_t r2f32_lerp(r2f32_t a, r2f32_t b, f32 t) { + r2f32_t result = { .min = {f32_lerp(a.min.x, b.min.x, t), f32_lerp(a.min.y, b.min.y, t)}, .max = {f32_lerp(a.max.x, b.max.x, t), f32_lerp(a.max.y, b.max.y, t)} }; + return result; +} diff --git a/src/core/core_math.gen.c b/src/core/core_math.gen.c new file mode 100644 index 0000000..2d9acdb --- /dev/null +++ b/src/core/core_math.gen.c @@ -0,0 +1,959 @@ +#include "core_math.h" +#include "core_intrin.h" + +fn_inline v2f32_t v2f32(f32 x, f32 y) { return (v2f32_t){ x, y }; } +gb_read_only v2f32_t v2f32_null = {0}; +fn_inline b32 v2f32_is_null(v2f32_t a) { return memory_equal(&a, &v2f32_null, sizeof(a)); } +fn_inline b32 v2f32_are_equal(v2f32_t a, v2f32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v2f32_t v2f32_add(v2f32_t a, v2f32_t b) { return (v2f32_t){ a.x + b.x, a.y + b.y }; } +fn_inline v2f32_t v2f32_adds(v2f32_t a, f32 b) { return (v2f32_t){ a.x + b, a.y + b }; } +fn_inline v2f32_t v2f32_sub(v2f32_t a, v2f32_t b) { return (v2f32_t){ a.x - b.x, a.y - b.y }; } +fn_inline v2f32_t v2f32_subs(v2f32_t a, f32 b) { return (v2f32_t){ a.x - b, a.y - b }; } +fn_inline v2f32_t v2f32_mul(v2f32_t a, v2f32_t b) { return (v2f32_t){ a.x * b.x, a.y * b.y }; } +fn_inline v2f32_t v2f32_muls(v2f32_t a, f32 b) { return (v2f32_t){ a.x * b, a.y * b }; } +fn_inline v2f32_t v2f32_div(v2f32_t a, v2f32_t b) { return (v2f32_t){ a.x / b.x, a.y / b.y }; } +fn_inline v2f32_t v2f32_divs(v2f32_t a, f32 b) { return (v2f32_t){ a.x / b, a.y / b }; } +fn_inline v3f32_t v3f32(f32 x, f32 y, f32 z) { return (v3f32_t){ x, y, z }; } +gb_read_only v3f32_t v3f32_null = {0}; +fn_inline b32 v3f32_is_null(v3f32_t a) { return memory_equal(&a, &v3f32_null, sizeof(a)); } +fn_inline b32 v3f32_are_equal(v3f32_t a, v3f32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v3f32_t v3f32_add(v3f32_t a, v3f32_t b) { return (v3f32_t){ a.x + b.x, a.y + b.y, a.z + b.z }; } +fn_inline v3f32_t v3f32_adds(v3f32_t a, f32 b) { return (v3f32_t){ a.x + b, a.y + b, a.z + b }; } +fn_inline v3f32_t v3f32_sub(v3f32_t a, v3f32_t b) { return (v3f32_t){ a.x - b.x, a.y - b.y, a.z - b.z }; } +fn_inline v3f32_t v3f32_subs(v3f32_t a, f32 b) { return (v3f32_t){ a.x - b, a.y - b, a.z - b }; } +fn_inline v3f32_t v3f32_mul(v3f32_t a, v3f32_t b) { return (v3f32_t){ a.x * b.x, a.y * b.y, a.z * b.z }; } +fn_inline v3f32_t v3f32_muls(v3f32_t a, f32 b) { return (v3f32_t){ a.x * b, a.y * b, a.z * b }; } +fn_inline v3f32_t v3f32_div(v3f32_t a, v3f32_t b) { return (v3f32_t){ a.x / b.x, a.y / b.y, a.z / b.z }; } +fn_inline v3f32_t v3f32_divs(v3f32_t a, f32 b) { return (v3f32_t){ a.x / b, a.y / b, a.z / b }; } +fn_inline v4f32_t v4f32(f32 x, f32 y, f32 z, f32 w) { return (v4f32_t){ x, y, z, w }; } +gb_read_only v4f32_t v4f32_null = {0}; +fn_inline b32 v4f32_is_null(v4f32_t a) { return memory_equal(&a, &v4f32_null, sizeof(a)); } +fn_inline b32 v4f32_are_equal(v4f32_t a, v4f32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v4f32_t v4f32_add(v4f32_t a, v4f32_t b) { return (v4f32_t){ a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w }; } +fn_inline v4f32_t v4f32_adds(v4f32_t a, f32 b) { return (v4f32_t){ a.x + b, a.y + b, a.z + b, a.w + b }; } +fn_inline v4f32_t v4f32_sub(v4f32_t a, v4f32_t b) { return (v4f32_t){ a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w }; } +fn_inline v4f32_t v4f32_subs(v4f32_t a, f32 b) { return (v4f32_t){ a.x - b, a.y - b, a.z - b, a.w - b }; } +fn_inline v4f32_t v4f32_mul(v4f32_t a, v4f32_t b) { return (v4f32_t){ a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w }; } +fn_inline v4f32_t v4f32_muls(v4f32_t a, f32 b) { return (v4f32_t){ a.x * b, a.y * b, a.z * b, a.w * b }; } +fn_inline v4f32_t v4f32_div(v4f32_t a, v4f32_t b) { return (v4f32_t){ a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w }; } +fn_inline v4f32_t v4f32_divs(v4f32_t a, f32 b) { return (v4f32_t){ a.x / b, a.y / b, a.z / b, a.w / b }; } +fn_inline r2f32_t r2f32(f32 x0, f32 y0, f32 x1, f32 y1) { return (r2f32_t){ x0, y0, x1, y1 }; } +gb_read_only r2f32_t r2f32_null = {0}; +fn_inline b32 r2f32_is_null(r2f32_t a) { return memory_equal(&a, &r2f32_null, sizeof(a)); } +fn_inline b32 r2f32_are_equal(r2f32_t a, r2f32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r2f32_t r2f32_add(r2f32_t a, r2f32_t b) { return (r2f32_t){ a.x0 + b.x0, a.y0 + b.y0, a.x1 + b.x1, a.y1 + b.y1 }; } +fn_inline r2f32_t r2f32_adds(r2f32_t a, f32 b) { return (r2f32_t){ a.x0 + b, a.y0 + b, a.x1 + b, a.y1 + b }; } +fn_inline r2f32_t r2f32_sub(r2f32_t a, r2f32_t b) { return (r2f32_t){ a.x0 - b.x0, a.y0 - b.y0, a.x1 - b.x1, a.y1 - b.y1 }; } +fn_inline r2f32_t r2f32_subs(r2f32_t a, f32 b) { return (r2f32_t){ a.x0 - b, a.y0 - b, a.x1 - b, a.y1 - b }; } +fn_inline r2f32_t r2f32_mul(r2f32_t a, r2f32_t b) { return (r2f32_t){ a.x0 * b.x0, a.y0 * b.y0, a.x1 * b.x1, a.y1 * b.y1 }; } +fn_inline r2f32_t r2f32_muls(r2f32_t a, f32 b) { return (r2f32_t){ a.x0 * b, a.y0 * b, a.x1 * b, a.y1 * b }; } +fn_inline r2f32_t r2f32_div(r2f32_t a, r2f32_t b) { return (r2f32_t){ a.x0 / b.x0, a.y0 / b.y0, a.x1 / b.x1, a.y1 / b.y1 }; } +fn_inline r2f32_t r2f32_divs(r2f32_t a, f32 b) { return (r2f32_t){ a.x0 / b, a.y0 / b, a.x1 / b, a.y1 / b }; } +fn_inline r3f32_t r3f32(f32 x0, f32 y0, f32 z0, f32 x1, f32 y1, f32 z1) { return (r3f32_t){ x0, y0, z0, x1, y1, z1 }; } +gb_read_only r3f32_t r3f32_null = {0}; +fn_inline b32 r3f32_is_null(r3f32_t a) { return memory_equal(&a, &r3f32_null, sizeof(a)); } +fn_inline b32 r3f32_are_equal(r3f32_t a, r3f32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r3f32_t r3f32_add(r3f32_t a, r3f32_t b) { return (r3f32_t){ a.x0 + b.x0, a.y0 + b.y0, a.z0 + b.z0, a.x1 + b.x1, a.y1 + b.y1, a.z1 + b.z1 }; } +fn_inline r3f32_t r3f32_adds(r3f32_t a, f32 b) { return (r3f32_t){ a.x0 + b, a.y0 + b, a.z0 + b, a.x1 + b, a.y1 + b, a.z1 + b }; } +fn_inline r3f32_t r3f32_sub(r3f32_t a, r3f32_t b) { return (r3f32_t){ a.x0 - b.x0, a.y0 - b.y0, a.z0 - b.z0, a.x1 - b.x1, a.y1 - b.y1, a.z1 - b.z1 }; } +fn_inline r3f32_t r3f32_subs(r3f32_t a, f32 b) { return (r3f32_t){ a.x0 - b, a.y0 - b, a.z0 - b, a.x1 - b, a.y1 - b, a.z1 - b }; } +fn_inline r3f32_t r3f32_mul(r3f32_t a, r3f32_t b) { return (r3f32_t){ a.x0 * b.x0, a.y0 * b.y0, a.z0 * b.z0, a.x1 * b.x1, a.y1 * b.y1, a.z1 * b.z1 }; } +fn_inline r3f32_t r3f32_muls(r3f32_t a, f32 b) { return (r3f32_t){ a.x0 * b, a.y0 * b, a.z0 * b, a.x1 * b, a.y1 * b, a.z1 * b }; } +fn_inline r3f32_t r3f32_div(r3f32_t a, r3f32_t b) { return (r3f32_t){ a.x0 / b.x0, a.y0 / b.y0, a.z0 / b.z0, a.x1 / b.x1, a.y1 / b.y1, a.z1 / b.z1 }; } +fn_inline r3f32_t r3f32_divs(r3f32_t a, f32 b) { return (r3f32_t){ a.x0 / b, a.y0 / b, a.z0 / b, a.x1 / b, a.y1 / b, a.z1 / b }; } +fn_inline v2f64_t v2f64(f64 x, f64 y) { return (v2f64_t){ x, y }; } +gb_read_only v2f64_t v2f64_null = {0}; +fn_inline b32 v2f64_is_null(v2f64_t a) { return memory_equal(&a, &v2f64_null, sizeof(a)); } +fn_inline b32 v2f64_are_equal(v2f64_t a, v2f64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v2f64_t v2f64_add(v2f64_t a, v2f64_t b) { return (v2f64_t){ a.x + b.x, a.y + b.y }; } +fn_inline v2f64_t v2f64_adds(v2f64_t a, f64 b) { return (v2f64_t){ a.x + b, a.y + b }; } +fn_inline v2f64_t v2f64_sub(v2f64_t a, v2f64_t b) { return (v2f64_t){ a.x - b.x, a.y - b.y }; } +fn_inline v2f64_t v2f64_subs(v2f64_t a, f64 b) { return (v2f64_t){ a.x - b, a.y - b }; } +fn_inline v2f64_t v2f64_mul(v2f64_t a, v2f64_t b) { return (v2f64_t){ a.x * b.x, a.y * b.y }; } +fn_inline v2f64_t v2f64_muls(v2f64_t a, f64 b) { return (v2f64_t){ a.x * b, a.y * b }; } +fn_inline v2f64_t v2f64_div(v2f64_t a, v2f64_t b) { return (v2f64_t){ a.x / b.x, a.y / b.y }; } +fn_inline v2f64_t v2f64_divs(v2f64_t a, f64 b) { return (v2f64_t){ a.x / b, a.y / b }; } +fn_inline v3f64_t v3f64(f64 x, f64 y, f64 z) { return (v3f64_t){ x, y, z }; } +gb_read_only v3f64_t v3f64_null = {0}; +fn_inline b32 v3f64_is_null(v3f64_t a) { return memory_equal(&a, &v3f64_null, sizeof(a)); } +fn_inline b32 v3f64_are_equal(v3f64_t a, v3f64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v3f64_t v3f64_add(v3f64_t a, v3f64_t b) { return (v3f64_t){ a.x + b.x, a.y + b.y, a.z + b.z }; } +fn_inline v3f64_t v3f64_adds(v3f64_t a, f64 b) { return (v3f64_t){ a.x + b, a.y + b, a.z + b }; } +fn_inline v3f64_t v3f64_sub(v3f64_t a, v3f64_t b) { return (v3f64_t){ a.x - b.x, a.y - b.y, a.z - b.z }; } +fn_inline v3f64_t v3f64_subs(v3f64_t a, f64 b) { return (v3f64_t){ a.x - b, a.y - b, a.z - b }; } +fn_inline v3f64_t v3f64_mul(v3f64_t a, v3f64_t b) { return (v3f64_t){ a.x * b.x, a.y * b.y, a.z * b.z }; } +fn_inline v3f64_t v3f64_muls(v3f64_t a, f64 b) { return (v3f64_t){ a.x * b, a.y * b, a.z * b }; } +fn_inline v3f64_t v3f64_div(v3f64_t a, v3f64_t b) { return (v3f64_t){ a.x / b.x, a.y / b.y, a.z / b.z }; } +fn_inline v3f64_t v3f64_divs(v3f64_t a, f64 b) { return (v3f64_t){ a.x / b, a.y / b, a.z / b }; } +fn_inline v4f64_t v4f64(f64 x, f64 y, f64 z, f64 w) { return (v4f64_t){ x, y, z, w }; } +gb_read_only v4f64_t v4f64_null = {0}; +fn_inline b32 v4f64_is_null(v4f64_t a) { return memory_equal(&a, &v4f64_null, sizeof(a)); } +fn_inline b32 v4f64_are_equal(v4f64_t a, v4f64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v4f64_t v4f64_add(v4f64_t a, v4f64_t b) { return (v4f64_t){ a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w }; } +fn_inline v4f64_t v4f64_adds(v4f64_t a, f64 b) { return (v4f64_t){ a.x + b, a.y + b, a.z + b, a.w + b }; } +fn_inline v4f64_t v4f64_sub(v4f64_t a, v4f64_t b) { return (v4f64_t){ a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w }; } +fn_inline v4f64_t v4f64_subs(v4f64_t a, f64 b) { return (v4f64_t){ a.x - b, a.y - b, a.z - b, a.w - b }; } +fn_inline v4f64_t v4f64_mul(v4f64_t a, v4f64_t b) { return (v4f64_t){ a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w }; } +fn_inline v4f64_t v4f64_muls(v4f64_t a, f64 b) { return (v4f64_t){ a.x * b, a.y * b, a.z * b, a.w * b }; } +fn_inline v4f64_t v4f64_div(v4f64_t a, v4f64_t b) { return (v4f64_t){ a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w }; } +fn_inline v4f64_t v4f64_divs(v4f64_t a, f64 b) { return (v4f64_t){ a.x / b, a.y / b, a.z / b, a.w / b }; } +fn_inline r2f64_t r2f64(f64 x0, f64 y0, f64 x1, f64 y1) { return (r2f64_t){ x0, y0, x1, y1 }; } +gb_read_only r2f64_t r2f64_null = {0}; +fn_inline b32 r2f64_is_null(r2f64_t a) { return memory_equal(&a, &r2f64_null, sizeof(a)); } +fn_inline b32 r2f64_are_equal(r2f64_t a, r2f64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r2f64_t r2f64_add(r2f64_t a, r2f64_t b) { return (r2f64_t){ a.x0 + b.x0, a.y0 + b.y0, a.x1 + b.x1, a.y1 + b.y1 }; } +fn_inline r2f64_t r2f64_adds(r2f64_t a, f64 b) { return (r2f64_t){ a.x0 + b, a.y0 + b, a.x1 + b, a.y1 + b }; } +fn_inline r2f64_t r2f64_sub(r2f64_t a, r2f64_t b) { return (r2f64_t){ a.x0 - b.x0, a.y0 - b.y0, a.x1 - b.x1, a.y1 - b.y1 }; } +fn_inline r2f64_t r2f64_subs(r2f64_t a, f64 b) { return (r2f64_t){ a.x0 - b, a.y0 - b, a.x1 - b, a.y1 - b }; } +fn_inline r2f64_t r2f64_mul(r2f64_t a, r2f64_t b) { return (r2f64_t){ a.x0 * b.x0, a.y0 * b.y0, a.x1 * b.x1, a.y1 * b.y1 }; } +fn_inline r2f64_t r2f64_muls(r2f64_t a, f64 b) { return (r2f64_t){ a.x0 * b, a.y0 * b, a.x1 * b, a.y1 * b }; } +fn_inline r2f64_t r2f64_div(r2f64_t a, r2f64_t b) { return (r2f64_t){ a.x0 / b.x0, a.y0 / b.y0, a.x1 / b.x1, a.y1 / b.y1 }; } +fn_inline r2f64_t r2f64_divs(r2f64_t a, f64 b) { return (r2f64_t){ a.x0 / b, a.y0 / b, a.x1 / b, a.y1 / b }; } +fn_inline r3f64_t r3f64(f64 x0, f64 y0, f64 z0, f64 x1, f64 y1, f64 z1) { return (r3f64_t){ x0, y0, z0, x1, y1, z1 }; } +gb_read_only r3f64_t r3f64_null = {0}; +fn_inline b32 r3f64_is_null(r3f64_t a) { return memory_equal(&a, &r3f64_null, sizeof(a)); } +fn_inline b32 r3f64_are_equal(r3f64_t a, r3f64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r3f64_t r3f64_add(r3f64_t a, r3f64_t b) { return (r3f64_t){ a.x0 + b.x0, a.y0 + b.y0, a.z0 + b.z0, a.x1 + b.x1, a.y1 + b.y1, a.z1 + b.z1 }; } +fn_inline r3f64_t r3f64_adds(r3f64_t a, f64 b) { return (r3f64_t){ a.x0 + b, a.y0 + b, a.z0 + b, a.x1 + b, a.y1 + b, a.z1 + b }; } +fn_inline r3f64_t r3f64_sub(r3f64_t a, r3f64_t b) { return (r3f64_t){ a.x0 - b.x0, a.y0 - b.y0, a.z0 - b.z0, a.x1 - b.x1, a.y1 - b.y1, a.z1 - b.z1 }; } +fn_inline r3f64_t r3f64_subs(r3f64_t a, f64 b) { return (r3f64_t){ a.x0 - b, a.y0 - b, a.z0 - b, a.x1 - b, a.y1 - b, a.z1 - b }; } +fn_inline r3f64_t r3f64_mul(r3f64_t a, r3f64_t b) { return (r3f64_t){ a.x0 * b.x0, a.y0 * b.y0, a.z0 * b.z0, a.x1 * b.x1, a.y1 * b.y1, a.z1 * b.z1 }; } +fn_inline r3f64_t r3f64_muls(r3f64_t a, f64 b) { return (r3f64_t){ a.x0 * b, a.y0 * b, a.z0 * b, a.x1 * b, a.y1 * b, a.z1 * b }; } +fn_inline r3f64_t r3f64_div(r3f64_t a, r3f64_t b) { return (r3f64_t){ a.x0 / b.x0, a.y0 / b.y0, a.z0 / b.z0, a.x1 / b.x1, a.y1 / b.y1, a.z1 / b.z1 }; } +fn_inline r3f64_t r3f64_divs(r3f64_t a, f64 b) { return (r3f64_t){ a.x0 / b, a.y0 / b, a.z0 / b, a.x1 / b, a.y1 / b, a.z1 / b }; } +fn_inline v2i32_t v2i32(i32 x, i32 y) { return (v2i32_t){ x, y }; } +gb_read_only v2i32_t v2i32_null = {0}; +fn_inline b32 v2i32_is_null(v2i32_t a) { return memory_equal(&a, &v2i32_null, sizeof(a)); } +fn_inline b32 v2i32_are_equal(v2i32_t a, v2i32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v2i32_t v2i32_add(v2i32_t a, v2i32_t b) { return (v2i32_t){ a.x + b.x, a.y + b.y }; } +fn_inline v2i32_t v2i32_adds(v2i32_t a, i32 b) { return (v2i32_t){ a.x + b, a.y + b }; } +fn_inline v2i32_t v2i32_sub(v2i32_t a, v2i32_t b) { return (v2i32_t){ a.x - b.x, a.y - b.y }; } +fn_inline v2i32_t v2i32_subs(v2i32_t a, i32 b) { return (v2i32_t){ a.x - b, a.y - b }; } +fn_inline v2i32_t v2i32_mul(v2i32_t a, v2i32_t b) { return (v2i32_t){ a.x * b.x, a.y * b.y }; } +fn_inline v2i32_t v2i32_muls(v2i32_t a, i32 b) { return (v2i32_t){ a.x * b, a.y * b }; } +fn_inline v2i32_t v2i32_div(v2i32_t a, v2i32_t b) { return (v2i32_t){ a.x / b.x, a.y / b.y }; } +fn_inline v2i32_t v2i32_divs(v2i32_t a, i32 b) { return (v2i32_t){ a.x / b, a.y / b }; } +fn_inline v3i32_t v3i32(i32 x, i32 y, i32 z) { return (v3i32_t){ x, y, z }; } +gb_read_only v3i32_t v3i32_null = {0}; +fn_inline b32 v3i32_is_null(v3i32_t a) { return memory_equal(&a, &v3i32_null, sizeof(a)); } +fn_inline b32 v3i32_are_equal(v3i32_t a, v3i32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v3i32_t v3i32_add(v3i32_t a, v3i32_t b) { return (v3i32_t){ a.x + b.x, a.y + b.y, a.z + b.z }; } +fn_inline v3i32_t v3i32_adds(v3i32_t a, i32 b) { return (v3i32_t){ a.x + b, a.y + b, a.z + b }; } +fn_inline v3i32_t v3i32_sub(v3i32_t a, v3i32_t b) { return (v3i32_t){ a.x - b.x, a.y - b.y, a.z - b.z }; } +fn_inline v3i32_t v3i32_subs(v3i32_t a, i32 b) { return (v3i32_t){ a.x - b, a.y - b, a.z - b }; } +fn_inline v3i32_t v3i32_mul(v3i32_t a, v3i32_t b) { return (v3i32_t){ a.x * b.x, a.y * b.y, a.z * b.z }; } +fn_inline v3i32_t v3i32_muls(v3i32_t a, i32 b) { return (v3i32_t){ a.x * b, a.y * b, a.z * b }; } +fn_inline v3i32_t v3i32_div(v3i32_t a, v3i32_t b) { return (v3i32_t){ a.x / b.x, a.y / b.y, a.z / b.z }; } +fn_inline v3i32_t v3i32_divs(v3i32_t a, i32 b) { return (v3i32_t){ a.x / b, a.y / b, a.z / b }; } +fn_inline v4i32_t v4i32(i32 x, i32 y, i32 z, i32 w) { return (v4i32_t){ x, y, z, w }; } +gb_read_only v4i32_t v4i32_null = {0}; +fn_inline b32 v4i32_is_null(v4i32_t a) { return memory_equal(&a, &v4i32_null, sizeof(a)); } +fn_inline b32 v4i32_are_equal(v4i32_t a, v4i32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v4i32_t v4i32_add(v4i32_t a, v4i32_t b) { return (v4i32_t){ a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w }; } +fn_inline v4i32_t v4i32_adds(v4i32_t a, i32 b) { return (v4i32_t){ a.x + b, a.y + b, a.z + b, a.w + b }; } +fn_inline v4i32_t v4i32_sub(v4i32_t a, v4i32_t b) { return (v4i32_t){ a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w }; } +fn_inline v4i32_t v4i32_subs(v4i32_t a, i32 b) { return (v4i32_t){ a.x - b, a.y - b, a.z - b, a.w - b }; } +fn_inline v4i32_t v4i32_mul(v4i32_t a, v4i32_t b) { return (v4i32_t){ a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w }; } +fn_inline v4i32_t v4i32_muls(v4i32_t a, i32 b) { return (v4i32_t){ a.x * b, a.y * b, a.z * b, a.w * b }; } +fn_inline v4i32_t v4i32_div(v4i32_t a, v4i32_t b) { return (v4i32_t){ a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w }; } +fn_inline v4i32_t v4i32_divs(v4i32_t a, i32 b) { return (v4i32_t){ a.x / b, a.y / b, a.z / b, a.w / b }; } +fn_inline r2i32_t r2i32(i32 x0, i32 y0, i32 x1, i32 y1) { return (r2i32_t){ x0, y0, x1, y1 }; } +gb_read_only r2i32_t r2i32_null = {0}; +fn_inline b32 r2i32_is_null(r2i32_t a) { return memory_equal(&a, &r2i32_null, sizeof(a)); } +fn_inline b32 r2i32_are_equal(r2i32_t a, r2i32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r2i32_t r2i32_add(r2i32_t a, r2i32_t b) { return (r2i32_t){ a.x0 + b.x0, a.y0 + b.y0, a.x1 + b.x1, a.y1 + b.y1 }; } +fn_inline r2i32_t r2i32_adds(r2i32_t a, i32 b) { return (r2i32_t){ a.x0 + b, a.y0 + b, a.x1 + b, a.y1 + b }; } +fn_inline r2i32_t r2i32_sub(r2i32_t a, r2i32_t b) { return (r2i32_t){ a.x0 - b.x0, a.y0 - b.y0, a.x1 - b.x1, a.y1 - b.y1 }; } +fn_inline r2i32_t r2i32_subs(r2i32_t a, i32 b) { return (r2i32_t){ a.x0 - b, a.y0 - b, a.x1 - b, a.y1 - b }; } +fn_inline r2i32_t r2i32_mul(r2i32_t a, r2i32_t b) { return (r2i32_t){ a.x0 * b.x0, a.y0 * b.y0, a.x1 * b.x1, a.y1 * b.y1 }; } +fn_inline r2i32_t r2i32_muls(r2i32_t a, i32 b) { return (r2i32_t){ a.x0 * b, a.y0 * b, a.x1 * b, a.y1 * b }; } +fn_inline r2i32_t r2i32_div(r2i32_t a, r2i32_t b) { return (r2i32_t){ a.x0 / b.x0, a.y0 / b.y0, a.x1 / b.x1, a.y1 / b.y1 }; } +fn_inline r2i32_t r2i32_divs(r2i32_t a, i32 b) { return (r2i32_t){ a.x0 / b, a.y0 / b, a.x1 / b, a.y1 / b }; } +fn_inline r3i32_t r3i32(i32 x0, i32 y0, i32 z0, i32 x1, i32 y1, i32 z1) { return (r3i32_t){ x0, y0, z0, x1, y1, z1 }; } +gb_read_only r3i32_t r3i32_null = {0}; +fn_inline b32 r3i32_is_null(r3i32_t a) { return memory_equal(&a, &r3i32_null, sizeof(a)); } +fn_inline b32 r3i32_are_equal(r3i32_t a, r3i32_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r3i32_t r3i32_add(r3i32_t a, r3i32_t b) { return (r3i32_t){ a.x0 + b.x0, a.y0 + b.y0, a.z0 + b.z0, a.x1 + b.x1, a.y1 + b.y1, a.z1 + b.z1 }; } +fn_inline r3i32_t r3i32_adds(r3i32_t a, i32 b) { return (r3i32_t){ a.x0 + b, a.y0 + b, a.z0 + b, a.x1 + b, a.y1 + b, a.z1 + b }; } +fn_inline r3i32_t r3i32_sub(r3i32_t a, r3i32_t b) { return (r3i32_t){ a.x0 - b.x0, a.y0 - b.y0, a.z0 - b.z0, a.x1 - b.x1, a.y1 - b.y1, a.z1 - b.z1 }; } +fn_inline r3i32_t r3i32_subs(r3i32_t a, i32 b) { return (r3i32_t){ a.x0 - b, a.y0 - b, a.z0 - b, a.x1 - b, a.y1 - b, a.z1 - b }; } +fn_inline r3i32_t r3i32_mul(r3i32_t a, r3i32_t b) { return (r3i32_t){ a.x0 * b.x0, a.y0 * b.y0, a.z0 * b.z0, a.x1 * b.x1, a.y1 * b.y1, a.z1 * b.z1 }; } +fn_inline r3i32_t r3i32_muls(r3i32_t a, i32 b) { return (r3i32_t){ a.x0 * b, a.y0 * b, a.z0 * b, a.x1 * b, a.y1 * b, a.z1 * b }; } +fn_inline r3i32_t r3i32_div(r3i32_t a, r3i32_t b) { return (r3i32_t){ a.x0 / b.x0, a.y0 / b.y0, a.z0 / b.z0, a.x1 / b.x1, a.y1 / b.y1, a.z1 / b.z1 }; } +fn_inline r3i32_t r3i32_divs(r3i32_t a, i32 b) { return (r3i32_t){ a.x0 / b, a.y0 / b, a.z0 / b, a.x1 / b, a.y1 / b, a.z1 / b }; } +fn_inline v2i64_t v2i64(i64 x, i64 y) { return (v2i64_t){ x, y }; } +gb_read_only v2i64_t v2i64_null = {0}; +fn_inline b32 v2i64_is_null(v2i64_t a) { return memory_equal(&a, &v2i64_null, sizeof(a)); } +fn_inline b32 v2i64_are_equal(v2i64_t a, v2i64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v2i64_t v2i64_add(v2i64_t a, v2i64_t b) { return (v2i64_t){ a.x + b.x, a.y + b.y }; } +fn_inline v2i64_t v2i64_adds(v2i64_t a, i64 b) { return (v2i64_t){ a.x + b, a.y + b }; } +fn_inline v2i64_t v2i64_sub(v2i64_t a, v2i64_t b) { return (v2i64_t){ a.x - b.x, a.y - b.y }; } +fn_inline v2i64_t v2i64_subs(v2i64_t a, i64 b) { return (v2i64_t){ a.x - b, a.y - b }; } +fn_inline v2i64_t v2i64_mul(v2i64_t a, v2i64_t b) { return (v2i64_t){ a.x * b.x, a.y * b.y }; } +fn_inline v2i64_t v2i64_muls(v2i64_t a, i64 b) { return (v2i64_t){ a.x * b, a.y * b }; } +fn_inline v2i64_t v2i64_div(v2i64_t a, v2i64_t b) { return (v2i64_t){ a.x / b.x, a.y / b.y }; } +fn_inline v2i64_t v2i64_divs(v2i64_t a, i64 b) { return (v2i64_t){ a.x / b, a.y / b }; } +fn_inline v3i64_t v3i64(i64 x, i64 y, i64 z) { return (v3i64_t){ x, y, z }; } +gb_read_only v3i64_t v3i64_null = {0}; +fn_inline b32 v3i64_is_null(v3i64_t a) { return memory_equal(&a, &v3i64_null, sizeof(a)); } +fn_inline b32 v3i64_are_equal(v3i64_t a, v3i64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v3i64_t v3i64_add(v3i64_t a, v3i64_t b) { return (v3i64_t){ a.x + b.x, a.y + b.y, a.z + b.z }; } +fn_inline v3i64_t v3i64_adds(v3i64_t a, i64 b) { return (v3i64_t){ a.x + b, a.y + b, a.z + b }; } +fn_inline v3i64_t v3i64_sub(v3i64_t a, v3i64_t b) { return (v3i64_t){ a.x - b.x, a.y - b.y, a.z - b.z }; } +fn_inline v3i64_t v3i64_subs(v3i64_t a, i64 b) { return (v3i64_t){ a.x - b, a.y - b, a.z - b }; } +fn_inline v3i64_t v3i64_mul(v3i64_t a, v3i64_t b) { return (v3i64_t){ a.x * b.x, a.y * b.y, a.z * b.z }; } +fn_inline v3i64_t v3i64_muls(v3i64_t a, i64 b) { return (v3i64_t){ a.x * b, a.y * b, a.z * b }; } +fn_inline v3i64_t v3i64_div(v3i64_t a, v3i64_t b) { return (v3i64_t){ a.x / b.x, a.y / b.y, a.z / b.z }; } +fn_inline v3i64_t v3i64_divs(v3i64_t a, i64 b) { return (v3i64_t){ a.x / b, a.y / b, a.z / b }; } +fn_inline v4i64_t v4i64(i64 x, i64 y, i64 z, i64 w) { return (v4i64_t){ x, y, z, w }; } +gb_read_only v4i64_t v4i64_null = {0}; +fn_inline b32 v4i64_is_null(v4i64_t a) { return memory_equal(&a, &v4i64_null, sizeof(a)); } +fn_inline b32 v4i64_are_equal(v4i64_t a, v4i64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline v4i64_t v4i64_add(v4i64_t a, v4i64_t b) { return (v4i64_t){ a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w }; } +fn_inline v4i64_t v4i64_adds(v4i64_t a, i64 b) { return (v4i64_t){ a.x + b, a.y + b, a.z + b, a.w + b }; } +fn_inline v4i64_t v4i64_sub(v4i64_t a, v4i64_t b) { return (v4i64_t){ a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w }; } +fn_inline v4i64_t v4i64_subs(v4i64_t a, i64 b) { return (v4i64_t){ a.x - b, a.y - b, a.z - b, a.w - b }; } +fn_inline v4i64_t v4i64_mul(v4i64_t a, v4i64_t b) { return (v4i64_t){ a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w }; } +fn_inline v4i64_t v4i64_muls(v4i64_t a, i64 b) { return (v4i64_t){ a.x * b, a.y * b, a.z * b, a.w * b }; } +fn_inline v4i64_t v4i64_div(v4i64_t a, v4i64_t b) { return (v4i64_t){ a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w }; } +fn_inline v4i64_t v4i64_divs(v4i64_t a, i64 b) { return (v4i64_t){ a.x / b, a.y / b, a.z / b, a.w / b }; } +fn_inline r2i64_t r2i64(i64 x0, i64 y0, i64 x1, i64 y1) { return (r2i64_t){ x0, y0, x1, y1 }; } +gb_read_only r2i64_t r2i64_null = {0}; +fn_inline b32 r2i64_is_null(r2i64_t a) { return memory_equal(&a, &r2i64_null, sizeof(a)); } +fn_inline b32 r2i64_are_equal(r2i64_t a, r2i64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r2i64_t r2i64_add(r2i64_t a, r2i64_t b) { return (r2i64_t){ a.x0 + b.x0, a.y0 + b.y0, a.x1 + b.x1, a.y1 + b.y1 }; } +fn_inline r2i64_t r2i64_adds(r2i64_t a, i64 b) { return (r2i64_t){ a.x0 + b, a.y0 + b, a.x1 + b, a.y1 + b }; } +fn_inline r2i64_t r2i64_sub(r2i64_t a, r2i64_t b) { return (r2i64_t){ a.x0 - b.x0, a.y0 - b.y0, a.x1 - b.x1, a.y1 - b.y1 }; } +fn_inline r2i64_t r2i64_subs(r2i64_t a, i64 b) { return (r2i64_t){ a.x0 - b, a.y0 - b, a.x1 - b, a.y1 - b }; } +fn_inline r2i64_t r2i64_mul(r2i64_t a, r2i64_t b) { return (r2i64_t){ a.x0 * b.x0, a.y0 * b.y0, a.x1 * b.x1, a.y1 * b.y1 }; } +fn_inline r2i64_t r2i64_muls(r2i64_t a, i64 b) { return (r2i64_t){ a.x0 * b, a.y0 * b, a.x1 * b, a.y1 * b }; } +fn_inline r2i64_t r2i64_div(r2i64_t a, r2i64_t b) { return (r2i64_t){ a.x0 / b.x0, a.y0 / b.y0, a.x1 / b.x1, a.y1 / b.y1 }; } +fn_inline r2i64_t r2i64_divs(r2i64_t a, i64 b) { return (r2i64_t){ a.x0 / b, a.y0 / b, a.x1 / b, a.y1 / b }; } +fn_inline r3i64_t r3i64(i64 x0, i64 y0, i64 z0, i64 x1, i64 y1, i64 z1) { return (r3i64_t){ x0, y0, z0, x1, y1, z1 }; } +gb_read_only r3i64_t r3i64_null = {0}; +fn_inline b32 r3i64_is_null(r3i64_t a) { return memory_equal(&a, &r3i64_null, sizeof(a)); } +fn_inline b32 r3i64_are_equal(r3i64_t a, r3i64_t b) { return memory_equal(&a, &b, sizeof(a)); } +fn_inline r3i64_t r3i64_add(r3i64_t a, r3i64_t b) { return (r3i64_t){ a.x0 + b.x0, a.y0 + b.y0, a.z0 + b.z0, a.x1 + b.x1, a.y1 + b.y1, a.z1 + b.z1 }; } +fn_inline r3i64_t r3i64_adds(r3i64_t a, i64 b) { return (r3i64_t){ a.x0 + b, a.y0 + b, a.z0 + b, a.x1 + b, a.y1 + b, a.z1 + b }; } +fn_inline r3i64_t r3i64_sub(r3i64_t a, r3i64_t b) { return (r3i64_t){ a.x0 - b.x0, a.y0 - b.y0, a.z0 - b.z0, a.x1 - b.x1, a.y1 - b.y1, a.z1 - b.z1 }; } +fn_inline r3i64_t r3i64_subs(r3i64_t a, i64 b) { return (r3i64_t){ a.x0 - b, a.y0 - b, a.z0 - b, a.x1 - b, a.y1 - b, a.z1 - b }; } +fn_inline r3i64_t r3i64_mul(r3i64_t a, r3i64_t b) { return (r3i64_t){ a.x0 * b.x0, a.y0 * b.y0, a.z0 * b.z0, a.x1 * b.x1, a.y1 * b.y1, a.z1 * b.z1 }; } +fn_inline r3i64_t r3i64_muls(r3i64_t a, i64 b) { return (r3i64_t){ a.x0 * b, a.y0 * b, a.z0 * b, a.x1 * b, a.y1 * b, a.z1 * b }; } +fn_inline r3i64_t r3i64_div(r3i64_t a, r3i64_t b) { return (r3i64_t){ a.x0 / b.x0, a.y0 / b.y0, a.z0 / b.z0, a.x1 / b.x1, a.y1 / b.y1, a.z1 / b.z1 }; } +fn_inline r3i64_t r3i64_divs(r3i64_t a, i64 b) { return (r3i64_t){ a.x0 / b, a.y0 / b, a.z0 / b, a.x1 / b, a.y1 / b, a.z1 / b }; } +fn_inline r2f32_t r2f32_min_dim(v2f32_t pos, v2f32_t size) { return (r2f32_t){ pos, v2f32_add(pos, size) }; } +fn_inline r2f32_t r2f32_center_half_dim(v2f32_t center, v2f32_t halfdim) { return (r2f32_t){ v2f32_sub(center, halfdim), v2f32_add(center, halfdim) }; } +fn_inline r3f32_t r3f32_min_dim(v3f32_t pos, v3f32_t size) { return (r3f32_t){ pos, v3f32_add(pos, size) }; } +fn_inline r3f32_t r3f32_center_half_dim(v3f32_t center, v3f32_t halfdim) { return (r3f32_t){ v3f32_sub(center, halfdim), v3f32_add(center, halfdim) }; } +fn_inline r2f64_t r2f64_min_dim(v2f64_t pos, v2f64_t size) { return (r2f64_t){ pos, v2f64_add(pos, size) }; } +fn_inline r2f64_t r2f64_center_half_dim(v2f64_t center, v2f64_t halfdim) { return (r2f64_t){ v2f64_sub(center, halfdim), v2f64_add(center, halfdim) }; } +fn_inline r3f64_t r3f64_min_dim(v3f64_t pos, v3f64_t size) { return (r3f64_t){ pos, v3f64_add(pos, size) }; } +fn_inline r3f64_t r3f64_center_half_dim(v3f64_t center, v3f64_t halfdim) { return (r3f64_t){ v3f64_sub(center, halfdim), v3f64_add(center, halfdim) }; } +fn_inline r2i32_t r2i32_min_dim(v2i32_t pos, v2i32_t size) { return (r2i32_t){ pos, v2i32_add(pos, size) }; } +fn_inline r2i32_t r2i32_center_half_dim(v2i32_t center, v2i32_t halfdim) { return (r2i32_t){ v2i32_sub(center, halfdim), v2i32_add(center, halfdim) }; } +fn_inline r3i32_t r3i32_min_dim(v3i32_t pos, v3i32_t size) { return (r3i32_t){ pos, v3i32_add(pos, size) }; } +fn_inline r3i32_t r3i32_center_half_dim(v3i32_t center, v3i32_t halfdim) { return (r3i32_t){ v3i32_sub(center, halfdim), v3i32_add(center, halfdim) }; } +fn_inline r2i64_t r2i64_min_dim(v2i64_t pos, v2i64_t size) { return (r2i64_t){ pos, v2i64_add(pos, size) }; } +fn_inline r2i64_t r2i64_center_half_dim(v2i64_t center, v2i64_t halfdim) { return (r2i64_t){ v2i64_sub(center, halfdim), v2i64_add(center, halfdim) }; } +fn_inline r3i64_t r3i64_min_dim(v3i64_t pos, v3i64_t size) { return (r3i64_t){ pos, v3i64_add(pos, size) }; } +fn_inline r3i64_t r3i64_center_half_dim(v3i64_t center, v3i64_t halfdim) { return (r3i64_t){ v3i64_sub(center, halfdim), v3i64_add(center, halfdim) }; } +fn r2f32_t r2f32_cut_left(r2f32_t *r, f32 value) { + f32 minx = r->min.x; + r->min.x = MIN(r->min.x + value, r->max.x); + r2f32_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2f32_t r2f32_cut_right(r2f32_t *r, f32 value) { + f32 maxx = r->max.x; + r->max.x = MAX(r->min.x, r->max.x - value); + r2f32_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f32_t r2f32_cut_top(r2f32_t *r, f32 value) { /* Y is down */ + f32 miny = r->min.y; + r->min.y = MIN(r->max.y, r->min.y + value); + r2f32_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2f32_t r2f32_cut_bottom(r2f32_t *r, f32 value) { /* Y is down */ + f32 maxy = r->max.y; + r->max.y = MAX(r->min.y, r->max.y - value); + r2f32_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2f32_t r2f32_cut_left_no_squash(r2f32_t *r, f32 value) { + f32 minx = r->min.x; + r->min.x = r->min.x + value; + r2f32_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2f32_t r2f32_cut_right_no_squash(r2f32_t *r, f32 value) { + f32 maxx = r->max.x; + r->max.x = r->max.x - value; + r2f32_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f32_t r2f32_cut_top_no_squash(r2f32_t *r, f32 value) { /* Y is down */ + f32 miny = r->min.y; + r->min.y = r->min.y + value; + r2f32_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2f32_t r2f32_cut_bottom_no_squash(r2f32_t *r, f32 value) { /* Y is down */ + f32 maxy = r->max.y; + r->max.y = r->max.y - value; + r2f32_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2f32_t r2f32_add_left(r2f32_t *r, f32 value) { + r2f32_t result = { .min = {r->min.x - value, r->min.y}, .max = {r->min.x, r->max.y} }; + r->min.x -= value; + return result; +} +fn r2f32_t r2f32_add_right(r2f32_t *r, f32 value) { + r2f32_t result = { .min = {r->max.x, r->min.y}, .max = {r->max.x + value, r->max.y} }; + r->max.x += value; + return result; +} +fn r2f32_t r2f32_add_top(r2f32_t *r, f32 value) { + r2f32_t result = { .min = {r->min.x, r->min.y - value}, .max = {r->max.x, r->min.y} }; + r->min.y -= value; + return result; +} +fn r2f32_t r2f32_add_bottom(r2f32_t *r, f32 value) { + r2f32_t result = { .min = {r->min.x, r->max.y}, .max = {r->max.x, r->max.y + value} }; + r->max.y += value; + return result; +} + +// get past left +fn r2f32_t r2f32_getp_left(const r2f32_t *rect, f32 value) { + r2f32_t result = r2f32(rect->min.x - value, rect->min.y, rect->min.x, rect->max.y); + return result; +} +fn r2f32_t r2f32_getp_right(const r2f32_t *rect, f32 value) { + r2f32_t result = r2f32(rect->max.x, rect->min.y, rect->max.x + value, rect->max.y); + return result; +} +fn r2f32_t r2f32_getp_bottom(const r2f32_t *rect, f32 value) { + r2f32_t result = r2f32(rect->min.x, rect->max.y, rect->max.x, rect->max.y + value); + return result; +} +fn r2f32_t r2f32_getp_top(const r2f32_t *rect, f32 value) { + r2f32_t result = r2f32(rect->min.x, rect->min.y - value, rect->max.x, rect->min.y); + return result; +} + +fn r2f32_t r2f32_get_left(const r2f32_t *r, f32 value) { + f32 minx = r->min.x; + r2f32_t result = (r2f32_t){ .min = {.x = minx, .y = r->min.y}, .max = {.x = MIN(r->min.x + value, r->max.x), .y =r->max.y} }; + return result; +} +fn r2f32_t r2f32_get_right(const r2f32_t *r, f32 value) { + f32 maxx = r->max.x; + r2f32_t result = (r2f32_t){ .min = {.x = MAX(r->min.x, r->max.x - value), .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f32_t r2f32_get_top(const r2f32_t *r, f32 value) { /* Y is down */ + f32 miny = r->min.y; + r2f32_t result = (r2f32_t){ .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = MIN(r->max.y, r->min.y + value)} }; + return result; +} +fn r2f32_t r2f32_get_bottom(const r2f32_t *r, f32 value) { /* Y is down */ + f32 maxy = r->max.y; + r2f32_t result = (r2f32_t){ .min = {.x = r->min.x, .y = MAX(r->min.y, r->max.y - value)}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + + +fn_inline r2f32_t r2f32_expand(r2f32_t rect, v2f32_t value) { return (r2f32_t){ v2f32_sub(rect.min, value), v2f32_add(rect.max, value) }; } +fn_inline r2f32_t r2f32_shrink(r2f32_t rect, v2f32_t value) { return (r2f32_t){ v2f32_add(rect.min, value), v2f32_sub(rect.max, value) }; } +fn_inline r2f32_t r2f32_shrinks(r2f32_t rect, f32 value) { return (r2f32_t){ v2f32_adds(rect.min, value), v2f32_subs(rect.max, value) }; } +fn_inline v2f32_t r2f32_size(r2f32_t r) { return (v2f32_t){r.max.x - r.min.x, r.max.y - r.min.y}; } +fn_inline v2f32_t r2f32_get_mid(r2f32_t r) { return v2f32_add(r.min, v2f32_divs(r2f32_size(r), 2)); } +fn_inline b32 r2f32_contains(r2f32_t rec, v2f32_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +fn_inline r2f32_t r2f32_intersect(r2f32_t a, r2f32_t b) { return (r2f32_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +fn_inline r2f32_t r2f32_union(r2f32_t a, r2f32_t b) { return (r2f32_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline f32 r1f32_size(r1f32_t a) { return a.max - a.min; } +fn_inline r1f32_t r1f32(f32 min, f32 max) { return (r1f32_t){min,max}; } +fn_inline r1f32_t r1f32_auto(f32 a, f32 b) { return (r1f32_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1f32_t r1f32s(f32 a) { return (r1f32_t){a,a}; } +fn_inline r1f32_t r1f32_clamp(r1f32_t a, f32 min, f32 max) { return (r1f32_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +fn_inline b32 r1f32_contains(r1f32_t rec, f32 point) { return (point >= rec.min) && (point < rec.max) && (point >= rec.min) && (point < rec.max); } +fn_inline b32 r1f32_are_equal(r1f32_t a, r1f32_t b) { return a.min == b.min && a.max == b.max; } +gb_read_only r1f32_t r1f32_null; + +fn b32 r1f32_overlap(r1f32_t a, r1f32_t b) { + b32 r1 = (a.max >= b.min && a.max <= b.max) || (a.min >= b.min && a.min <= b.max); + b32 r2 = (b.max >= a.min && b.max <= a.max) || (b.min >= a.min && b.min <= a.max); + return r1 || r2; +} + +fn v2f32_t v2f32_clamps(v2f32_t v, f32 min, f32 max) { + v2f32_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2f32_t v2f32_clamp(v2f32_t v, v2f32_t min, v2f32_t max) { + v2f32_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} + +fn r2f32_t r2f32_fix(r2f32_t n) { + r2f32_t result = { + .min = {MIN(n.min.x, n.max.x), MIN(n.min.y, n.max.y)}, + .max = {MAX(n.min.x, n.max.x), MAX(n.min.y, n.max.y)}, + }; + return result; +} +fn r2f64_t r2f64_cut_left(r2f64_t *r, f64 value) { + f64 minx = r->min.x; + r->min.x = MIN(r->min.x + value, r->max.x); + r2f64_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_right(r2f64_t *r, f64 value) { + f64 maxx = r->max.x; + r->max.x = MAX(r->min.x, r->max.x - value); + r2f64_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_top(r2f64_t *r, f64 value) { /* Y is down */ + f64 miny = r->min.y; + r->min.y = MIN(r->max.y, r->min.y + value); + r2f64_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2f64_t r2f64_cut_bottom(r2f64_t *r, f64 value) { /* Y is down */ + f64 maxy = r->max.y; + r->max.y = MAX(r->min.y, r->max.y - value); + r2f64_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2f64_t r2f64_cut_left_no_squash(r2f64_t *r, f64 value) { + f64 minx = r->min.x; + r->min.x = r->min.x + value; + r2f64_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_right_no_squash(r2f64_t *r, f64 value) { + f64 maxx = r->max.x; + r->max.x = r->max.x - value; + r2f64_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_top_no_squash(r2f64_t *r, f64 value) { /* Y is down */ + f64 miny = r->min.y; + r->min.y = r->min.y + value; + r2f64_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2f64_t r2f64_cut_bottom_no_squash(r2f64_t *r, f64 value) { /* Y is down */ + f64 maxy = r->max.y; + r->max.y = r->max.y - value; + r2f64_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2f64_t r2f64_add_left(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->min.x - value, r->min.y}, .max = {r->min.x, r->max.y} }; + r->min.x -= value; + return result; +} +fn r2f64_t r2f64_add_right(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->max.x, r->min.y}, .max = {r->max.x + value, r->max.y} }; + r->max.x += value; + return result; +} +fn r2f64_t r2f64_add_top(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->min.x, r->min.y - value}, .max = {r->max.x, r->min.y} }; + r->min.y -= value; + return result; +} +fn r2f64_t r2f64_add_bottom(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->min.x, r->max.y}, .max = {r->max.x, r->max.y + value} }; + r->max.y += value; + return result; +} + +// get past left +fn r2f64_t r2f64_getp_left(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->min.x - value, rect->min.y, rect->min.x, rect->max.y); + return result; +} +fn r2f64_t r2f64_getp_right(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->max.x, rect->min.y, rect->max.x + value, rect->max.y); + return result; +} +fn r2f64_t r2f64_getp_bottom(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->min.x, rect->max.y, rect->max.x, rect->max.y + value); + return result; +} +fn r2f64_t r2f64_getp_top(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->min.x, rect->min.y - value, rect->max.x, rect->min.y); + return result; +} + +fn r2f64_t r2f64_get_left(const r2f64_t *r, f64 value) { + f64 minx = r->min.x; + r2f64_t result = (r2f64_t){ .min = {.x = minx, .y = r->min.y}, .max = {.x = MIN(r->min.x + value, r->max.x), .y =r->max.y} }; + return result; +} +fn r2f64_t r2f64_get_right(const r2f64_t *r, f64 value) { + f64 maxx = r->max.x; + r2f64_t result = (r2f64_t){ .min = {.x = MAX(r->min.x, r->max.x - value), .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f64_t r2f64_get_top(const r2f64_t *r, f64 value) { /* Y is down */ + f64 miny = r->min.y; + r2f64_t result = (r2f64_t){ .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = MIN(r->max.y, r->min.y + value)} }; + return result; +} +fn r2f64_t r2f64_get_bottom(const r2f64_t *r, f64 value) { /* Y is down */ + f64 maxy = r->max.y; + r2f64_t result = (r2f64_t){ .min = {.x = r->min.x, .y = MAX(r->min.y, r->max.y - value)}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + + +fn_inline r2f64_t r2f64_expand(r2f64_t rect, v2f64_t value) { return (r2f64_t){ v2f64_sub(rect.min, value), v2f64_add(rect.max, value) }; } +fn_inline r2f64_t r2f64_shrink(r2f64_t rect, v2f64_t value) { return (r2f64_t){ v2f64_add(rect.min, value), v2f64_sub(rect.max, value) }; } +fn_inline r2f64_t r2f64_shrinks(r2f64_t rect, f64 value) { return (r2f64_t){ v2f64_adds(rect.min, value), v2f64_subs(rect.max, value) }; } +fn_inline v2f64_t r2f64_size(r2f64_t r) { return (v2f64_t){r.max.x - r.min.x, r.max.y - r.min.y}; } +fn_inline v2f64_t r2f64_get_mid(r2f64_t r) { return v2f64_add(r.min, v2f64_divs(r2f64_size(r), 2)); } +fn_inline b32 r2f64_contains(r2f64_t rec, v2f64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +fn_inline r2f64_t r2f64_intersect(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +fn_inline r2f64_t r2f64_union(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline f64 r1f64_size(r1f64_t a) { return a.max - a.min; } +fn_inline r1f64_t r1f64(f64 min, f64 max) { return (r1f64_t){min,max}; } +fn_inline r1f64_t r1f64_auto(f64 a, f64 b) { return (r1f64_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1f64_t r1f64s(f64 a) { return (r1f64_t){a,a}; } +fn_inline r1f64_t r1f64_clamp(r1f64_t a, f64 min, f64 max) { return (r1f64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +fn_inline b32 r1f64_contains(r1f64_t rec, f64 point) { return (point >= rec.min) && (point < rec.max) && (point >= rec.min) && (point < rec.max); } +fn_inline b32 r1f64_are_equal(r1f64_t a, r1f64_t b) { return a.min == b.min && a.max == b.max; } +gb_read_only r1f64_t r1f64_null; + +fn b32 r1f64_overlap(r1f64_t a, r1f64_t b) { + b32 r1 = (a.max >= b.min && a.max <= b.max) || (a.min >= b.min && a.min <= b.max); + b32 r2 = (b.max >= a.min && b.max <= a.max) || (b.min >= a.min && b.min <= a.max); + return r1 || r2; +} + +fn v2f64_t v2f64_clamps(v2f64_t v, f64 min, f64 max) { + v2f64_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2f64_t v2f64_clamp(v2f64_t v, v2f64_t min, v2f64_t max) { + v2f64_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} + +fn r2f64_t r2f64_fix(r2f64_t n) { + r2f64_t result = { + .min = {MIN(n.min.x, n.max.x), MIN(n.min.y, n.max.y)}, + .max = {MAX(n.min.x, n.max.x), MAX(n.min.y, n.max.y)}, + }; + return result; +} +fn r2i32_t r2i32_cut_left(r2i32_t *r, i32 value) { + i32 minx = r->min.x; + r->min.x = MIN(r->min.x + value, r->max.x); + r2i32_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2i32_t r2i32_cut_right(r2i32_t *r, i32 value) { + i32 maxx = r->max.x; + r->max.x = MAX(r->min.x, r->max.x - value); + r2i32_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2i32_t r2i32_cut_top(r2i32_t *r, i32 value) { /* Y is down */ + i32 miny = r->min.y; + r->min.y = MIN(r->max.y, r->min.y + value); + r2i32_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2i32_t r2i32_cut_bottom(r2i32_t *r, i32 value) { /* Y is down */ + i32 maxy = r->max.y; + r->max.y = MAX(r->min.y, r->max.y - value); + r2i32_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2i32_t r2i32_cut_left_no_squash(r2i32_t *r, i32 value) { + i32 minx = r->min.x; + r->min.x = r->min.x + value; + r2i32_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2i32_t r2i32_cut_right_no_squash(r2i32_t *r, i32 value) { + i32 maxx = r->max.x; + r->max.x = r->max.x - value; + r2i32_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2i32_t r2i32_cut_top_no_squash(r2i32_t *r, i32 value) { /* Y is down */ + i32 miny = r->min.y; + r->min.y = r->min.y + value; + r2i32_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2i32_t r2i32_cut_bottom_no_squash(r2i32_t *r, i32 value) { /* Y is down */ + i32 maxy = r->max.y; + r->max.y = r->max.y - value; + r2i32_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2i32_t r2i32_add_left(r2i32_t *r, i32 value) { + r2i32_t result = { .min = {r->min.x - value, r->min.y}, .max = {r->min.x, r->max.y} }; + r->min.x -= value; + return result; +} +fn r2i32_t r2i32_add_right(r2i32_t *r, i32 value) { + r2i32_t result = { .min = {r->max.x, r->min.y}, .max = {r->max.x + value, r->max.y} }; + r->max.x += value; + return result; +} +fn r2i32_t r2i32_add_top(r2i32_t *r, i32 value) { + r2i32_t result = { .min = {r->min.x, r->min.y - value}, .max = {r->max.x, r->min.y} }; + r->min.y -= value; + return result; +} +fn r2i32_t r2i32_add_bottom(r2i32_t *r, i32 value) { + r2i32_t result = { .min = {r->min.x, r->max.y}, .max = {r->max.x, r->max.y + value} }; + r->max.y += value; + return result; +} + +// get past left +fn r2i32_t r2i32_getp_left(const r2i32_t *rect, i32 value) { + r2i32_t result = r2i32(rect->min.x - value, rect->min.y, rect->min.x, rect->max.y); + return result; +} +fn r2i32_t r2i32_getp_right(const r2i32_t *rect, i32 value) { + r2i32_t result = r2i32(rect->max.x, rect->min.y, rect->max.x + value, rect->max.y); + return result; +} +fn r2i32_t r2i32_getp_bottom(const r2i32_t *rect, i32 value) { + r2i32_t result = r2i32(rect->min.x, rect->max.y, rect->max.x, rect->max.y + value); + return result; +} +fn r2i32_t r2i32_getp_top(const r2i32_t *rect, i32 value) { + r2i32_t result = r2i32(rect->min.x, rect->min.y - value, rect->max.x, rect->min.y); + return result; +} + +fn r2i32_t r2i32_get_left(const r2i32_t *r, i32 value) { + i32 minx = r->min.x; + r2i32_t result = (r2i32_t){ .min = {.x = minx, .y = r->min.y}, .max = {.x = MIN(r->min.x + value, r->max.x), .y =r->max.y} }; + return result; +} +fn r2i32_t r2i32_get_right(const r2i32_t *r, i32 value) { + i32 maxx = r->max.x; + r2i32_t result = (r2i32_t){ .min = {.x = MAX(r->min.x, r->max.x - value), .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2i32_t r2i32_get_top(const r2i32_t *r, i32 value) { /* Y is down */ + i32 miny = r->min.y; + r2i32_t result = (r2i32_t){ .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = MIN(r->max.y, r->min.y + value)} }; + return result; +} +fn r2i32_t r2i32_get_bottom(const r2i32_t *r, i32 value) { /* Y is down */ + i32 maxy = r->max.y; + r2i32_t result = (r2i32_t){ .min = {.x = r->min.x, .y = MAX(r->min.y, r->max.y - value)}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + + +fn_inline r2i32_t r2i32_expand(r2i32_t rect, v2i32_t value) { return (r2i32_t){ v2i32_sub(rect.min, value), v2i32_add(rect.max, value) }; } +fn_inline r2i32_t r2i32_shrink(r2i32_t rect, v2i32_t value) { return (r2i32_t){ v2i32_add(rect.min, value), v2i32_sub(rect.max, value) }; } +fn_inline r2i32_t r2i32_shrinks(r2i32_t rect, i32 value) { return (r2i32_t){ v2i32_adds(rect.min, value), v2i32_subs(rect.max, value) }; } +fn_inline v2i32_t r2i32_size(r2i32_t r) { return (v2i32_t){r.max.x - r.min.x, r.max.y - r.min.y}; } +fn_inline v2i32_t r2i32_get_mid(r2i32_t r) { return v2i32_add(r.min, v2i32_divs(r2i32_size(r), 2)); } +fn_inline b32 r2i32_contains(r2i32_t rec, v2i32_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +fn_inline r2i32_t r2i32_intersect(r2i32_t a, r2i32_t b) { return (r2i32_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +fn_inline r2i32_t r2i32_union(r2i32_t a, r2i32_t b) { return (r2i32_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline i32 r1i32_size(r1i32_t a) { return a.max - a.min; } +fn_inline r1i32_t r1i32(i32 min, i32 max) { return (r1i32_t){min,max}; } +fn_inline r1i32_t r1i32_auto(i32 a, i32 b) { return (r1i32_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1i32_t r1i32s(i32 a) { return (r1i32_t){a,a}; } +fn_inline r1i32_t r1i32_clamp(r1i32_t a, i32 min, i32 max) { return (r1i32_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +fn_inline b32 r1i32_contains(r1i32_t rec, i32 point) { return (point >= rec.min) && (point < rec.max) && (point >= rec.min) && (point < rec.max); } +fn_inline b32 r1i32_are_equal(r1i32_t a, r1i32_t b) { return a.min == b.min && a.max == b.max; } +gb_read_only r1i32_t r1i32_null; + +fn b32 r1i32_overlap(r1i32_t a, r1i32_t b) { + b32 r1 = (a.max >= b.min && a.max <= b.max) || (a.min >= b.min && a.min <= b.max); + b32 r2 = (b.max >= a.min && b.max <= a.max) || (b.min >= a.min && b.min <= a.max); + return r1 || r2; +} + +fn v2i32_t v2i32_clamps(v2i32_t v, i32 min, i32 max) { + v2i32_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2i32_t v2i32_clamp(v2i32_t v, v2i32_t min, v2i32_t max) { + v2i32_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} + +fn r2i32_t r2i32_fix(r2i32_t n) { + r2i32_t result = { + .min = {MIN(n.min.x, n.max.x), MIN(n.min.y, n.max.y)}, + .max = {MAX(n.min.x, n.max.x), MAX(n.min.y, n.max.y)}, + }; + return result; +} +fn r2i64_t r2i64_cut_left(r2i64_t *r, i64 value) { + i64 minx = r->min.x; + r->min.x = MIN(r->min.x + value, r->max.x); + r2i64_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2i64_t r2i64_cut_right(r2i64_t *r, i64 value) { + i64 maxx = r->max.x; + r->max.x = MAX(r->min.x, r->max.x - value); + r2i64_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2i64_t r2i64_cut_top(r2i64_t *r, i64 value) { /* Y is down */ + i64 miny = r->min.y; + r->min.y = MIN(r->max.y, r->min.y + value); + r2i64_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2i64_t r2i64_cut_bottom(r2i64_t *r, i64 value) { /* Y is down */ + i64 maxy = r->max.y; + r->max.y = MAX(r->min.y, r->max.y - value); + r2i64_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2i64_t r2i64_cut_left_no_squash(r2i64_t *r, i64 value) { + i64 minx = r->min.x; + r->min.x = r->min.x + value; + r2i64_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2i64_t r2i64_cut_right_no_squash(r2i64_t *r, i64 value) { + i64 maxx = r->max.x; + r->max.x = r->max.x - value; + r2i64_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2i64_t r2i64_cut_top_no_squash(r2i64_t *r, i64 value) { /* Y is down */ + i64 miny = r->min.y; + r->min.y = r->min.y + value; + r2i64_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2i64_t r2i64_cut_bottom_no_squash(r2i64_t *r, i64 value) { /* Y is down */ + i64 maxy = r->max.y; + r->max.y = r->max.y - value; + r2i64_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2i64_t r2i64_add_left(r2i64_t *r, i64 value) { + r2i64_t result = { .min = {r->min.x - value, r->min.y}, .max = {r->min.x, r->max.y} }; + r->min.x -= value; + return result; +} +fn r2i64_t r2i64_add_right(r2i64_t *r, i64 value) { + r2i64_t result = { .min = {r->max.x, r->min.y}, .max = {r->max.x + value, r->max.y} }; + r->max.x += value; + return result; +} +fn r2i64_t r2i64_add_top(r2i64_t *r, i64 value) { + r2i64_t result = { .min = {r->min.x, r->min.y - value}, .max = {r->max.x, r->min.y} }; + r->min.y -= value; + return result; +} +fn r2i64_t r2i64_add_bottom(r2i64_t *r, i64 value) { + r2i64_t result = { .min = {r->min.x, r->max.y}, .max = {r->max.x, r->max.y + value} }; + r->max.y += value; + return result; +} + +// get past left +fn r2i64_t r2i64_getp_left(const r2i64_t *rect, i64 value) { + r2i64_t result = r2i64(rect->min.x - value, rect->min.y, rect->min.x, rect->max.y); + return result; +} +fn r2i64_t r2i64_getp_right(const r2i64_t *rect, i64 value) { + r2i64_t result = r2i64(rect->max.x, rect->min.y, rect->max.x + value, rect->max.y); + return result; +} +fn r2i64_t r2i64_getp_bottom(const r2i64_t *rect, i64 value) { + r2i64_t result = r2i64(rect->min.x, rect->max.y, rect->max.x, rect->max.y + value); + return result; +} +fn r2i64_t r2i64_getp_top(const r2i64_t *rect, i64 value) { + r2i64_t result = r2i64(rect->min.x, rect->min.y - value, rect->max.x, rect->min.y); + return result; +} + +fn r2i64_t r2i64_get_left(const r2i64_t *r, i64 value) { + i64 minx = r->min.x; + r2i64_t result = (r2i64_t){ .min = {.x = minx, .y = r->min.y}, .max = {.x = MIN(r->min.x + value, r->max.x), .y =r->max.y} }; + return result; +} +fn r2i64_t r2i64_get_right(const r2i64_t *r, i64 value) { + i64 maxx = r->max.x; + r2i64_t result = (r2i64_t){ .min = {.x = MAX(r->min.x, r->max.x - value), .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2i64_t r2i64_get_top(const r2i64_t *r, i64 value) { /* Y is down */ + i64 miny = r->min.y; + r2i64_t result = (r2i64_t){ .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = MIN(r->max.y, r->min.y + value)} }; + return result; +} +fn r2i64_t r2i64_get_bottom(const r2i64_t *r, i64 value) { /* Y is down */ + i64 maxy = r->max.y; + r2i64_t result = (r2i64_t){ .min = {.x = r->min.x, .y = MAX(r->min.y, r->max.y - value)}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + + +fn_inline r2i64_t r2i64_expand(r2i64_t rect, v2i64_t value) { return (r2i64_t){ v2i64_sub(rect.min, value), v2i64_add(rect.max, value) }; } +fn_inline r2i64_t r2i64_shrink(r2i64_t rect, v2i64_t value) { return (r2i64_t){ v2i64_add(rect.min, value), v2i64_sub(rect.max, value) }; } +fn_inline r2i64_t r2i64_shrinks(r2i64_t rect, i64 value) { return (r2i64_t){ v2i64_adds(rect.min, value), v2i64_subs(rect.max, value) }; } +fn_inline v2i64_t r2i64_size(r2i64_t r) { return (v2i64_t){r.max.x - r.min.x, r.max.y - r.min.y}; } +fn_inline v2i64_t r2i64_get_mid(r2i64_t r) { return v2i64_add(r.min, v2i64_divs(r2i64_size(r), 2)); } +fn_inline b32 r2i64_contains(r2i64_t rec, v2i64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +fn_inline r2i64_t r2i64_intersect(r2i64_t a, r2i64_t b) { return (r2i64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +fn_inline r2i64_t r2i64_union(r2i64_t a, r2i64_t b) { return (r2i64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline i64 r1i64_size(r1i64_t a) { return a.max - a.min; } +fn_inline r1i64_t r1i64(i64 min, i64 max) { return (r1i64_t){min,max}; } +fn_inline r1i64_t r1i64_auto(i64 a, i64 b) { return (r1i64_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1i64_t r1i64s(i64 a) { return (r1i64_t){a,a}; } +fn_inline r1i64_t r1i64_clamp(r1i64_t a, i64 min, i64 max) { return (r1i64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +fn_inline b32 r1i64_contains(r1i64_t rec, i64 point) { return (point >= rec.min) && (point < rec.max) && (point >= rec.min) && (point < rec.max); } +fn_inline b32 r1i64_are_equal(r1i64_t a, r1i64_t b) { return a.min == b.min && a.max == b.max; } +gb_read_only r1i64_t r1i64_null; + +fn b32 r1i64_overlap(r1i64_t a, r1i64_t b) { + b32 r1 = (a.max >= b.min && a.max <= b.max) || (a.min >= b.min && a.min <= b.max); + b32 r2 = (b.max >= a.min && b.max <= a.max) || (b.min >= a.min && b.min <= a.max); + return r1 || r2; +} + +fn v2i64_t v2i64_clamps(v2i64_t v, i64 min, i64 max) { + v2i64_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2i64_t v2i64_clamp(v2i64_t v, v2i64_t min, v2i64_t max) { + v2i64_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} + +fn r2i64_t r2i64_fix(r2i64_t n) { + r2i64_t result = { + .min = {MIN(n.min.x, n.max.x), MIN(n.min.y, n.max.y)}, + .max = {MAX(n.min.x, n.max.x), MAX(n.min.y, n.max.y)}, + }; + return result; +} +fn_inline v2f64_t v2f32_to_v2f64(v2f32_t v) { return (v2f64_t){ (f64)v.x, (f64)v.y }; } +fn_inline v3f64_t v3f32_to_v3f64(v3f32_t v) { return (v3f64_t){ (f64)v.x, (f64)v.y, (f64)v.z }; } +fn_inline v4f64_t v4f32_to_v4f64(v4f32_t v) { return (v4f64_t){ (f64)v.x, (f64)v.y, (f64)v.z, (f64)v.w }; } +fn_inline r2f64_t r2f32_to_r2f64(r2f32_t v) { return (r2f64_t){ (f64)v.x0, (f64)v.y0, (f64)v.x1, (f64)v.y1 }; } +fn_inline r3f64_t r3f32_to_r3f64(r3f32_t v) { return (r3f64_t){ (f64)v.x0, (f64)v.y0, (f64)v.z0, (f64)v.x1, (f64)v.y1, (f64)v.z1 }; } +fn_inline v2i32_t v2f32_to_v2i32(v2f32_t v) { return (v2i32_t){ (i32)v.x, (i32)v.y }; } +fn_inline v3i32_t v3f32_to_v3i32(v3f32_t v) { return (v3i32_t){ (i32)v.x, (i32)v.y, (i32)v.z }; } +fn_inline v4i32_t v4f32_to_v4i32(v4f32_t v) { return (v4i32_t){ (i32)v.x, (i32)v.y, (i32)v.z, (i32)v.w }; } +fn_inline r2i32_t r2f32_to_r2i32(r2f32_t v) { return (r2i32_t){ (i32)v.x0, (i32)v.y0, (i32)v.x1, (i32)v.y1 }; } +fn_inline r3i32_t r3f32_to_r3i32(r3f32_t v) { return (r3i32_t){ (i32)v.x0, (i32)v.y0, (i32)v.z0, (i32)v.x1, (i32)v.y1, (i32)v.z1 }; } +fn_inline v2i64_t v2f32_to_v2i64(v2f32_t v) { return (v2i64_t){ (i64)v.x, (i64)v.y }; } +fn_inline v3i64_t v3f32_to_v3i64(v3f32_t v) { return (v3i64_t){ (i64)v.x, (i64)v.y, (i64)v.z }; } +fn_inline v4i64_t v4f32_to_v4i64(v4f32_t v) { return (v4i64_t){ (i64)v.x, (i64)v.y, (i64)v.z, (i64)v.w }; } +fn_inline r2i64_t r2f32_to_r2i64(r2f32_t v) { return (r2i64_t){ (i64)v.x0, (i64)v.y0, (i64)v.x1, (i64)v.y1 }; } +fn_inline r3i64_t r3f32_to_r3i64(r3f32_t v) { return (r3i64_t){ (i64)v.x0, (i64)v.y0, (i64)v.z0, (i64)v.x1, (i64)v.y1, (i64)v.z1 }; } +fn_inline v2f32_t v2f64_to_v2f32(v2f64_t v) { return (v2f32_t){ (f32)v.x, (f32)v.y }; } +fn_inline v3f32_t v3f64_to_v3f32(v3f64_t v) { return (v3f32_t){ (f32)v.x, (f32)v.y, (f32)v.z }; } +fn_inline v4f32_t v4f64_to_v4f32(v4f64_t v) { return (v4f32_t){ (f32)v.x, (f32)v.y, (f32)v.z, (f32)v.w }; } +fn_inline r2f32_t r2f64_to_r2f32(r2f64_t v) { return (r2f32_t){ (f32)v.x0, (f32)v.y0, (f32)v.x1, (f32)v.y1 }; } +fn_inline r3f32_t r3f64_to_r3f32(r3f64_t v) { return (r3f32_t){ (f32)v.x0, (f32)v.y0, (f32)v.z0, (f32)v.x1, (f32)v.y1, (f32)v.z1 }; } +fn_inline v2i32_t v2f64_to_v2i32(v2f64_t v) { return (v2i32_t){ (i32)v.x, (i32)v.y }; } +fn_inline v3i32_t v3f64_to_v3i32(v3f64_t v) { return (v3i32_t){ (i32)v.x, (i32)v.y, (i32)v.z }; } +fn_inline v4i32_t v4f64_to_v4i32(v4f64_t v) { return (v4i32_t){ (i32)v.x, (i32)v.y, (i32)v.z, (i32)v.w }; } +fn_inline r2i32_t r2f64_to_r2i32(r2f64_t v) { return (r2i32_t){ (i32)v.x0, (i32)v.y0, (i32)v.x1, (i32)v.y1 }; } +fn_inline r3i32_t r3f64_to_r3i32(r3f64_t v) { return (r3i32_t){ (i32)v.x0, (i32)v.y0, (i32)v.z0, (i32)v.x1, (i32)v.y1, (i32)v.z1 }; } +fn_inline v2i64_t v2f64_to_v2i64(v2f64_t v) { return (v2i64_t){ (i64)v.x, (i64)v.y }; } +fn_inline v3i64_t v3f64_to_v3i64(v3f64_t v) { return (v3i64_t){ (i64)v.x, (i64)v.y, (i64)v.z }; } +fn_inline v4i64_t v4f64_to_v4i64(v4f64_t v) { return (v4i64_t){ (i64)v.x, (i64)v.y, (i64)v.z, (i64)v.w }; } +fn_inline r2i64_t r2f64_to_r2i64(r2f64_t v) { return (r2i64_t){ (i64)v.x0, (i64)v.y0, (i64)v.x1, (i64)v.y1 }; } +fn_inline r3i64_t r3f64_to_r3i64(r3f64_t v) { return (r3i64_t){ (i64)v.x0, (i64)v.y0, (i64)v.z0, (i64)v.x1, (i64)v.y1, (i64)v.z1 }; } +fn_inline v2f32_t v2i32_to_v2f32(v2i32_t v) { return (v2f32_t){ (f32)v.x, (f32)v.y }; } +fn_inline v3f32_t v3i32_to_v3f32(v3i32_t v) { return (v3f32_t){ (f32)v.x, (f32)v.y, (f32)v.z }; } +fn_inline v4f32_t v4i32_to_v4f32(v4i32_t v) { return (v4f32_t){ (f32)v.x, (f32)v.y, (f32)v.z, (f32)v.w }; } +fn_inline r2f32_t r2i32_to_r2f32(r2i32_t v) { return (r2f32_t){ (f32)v.x0, (f32)v.y0, (f32)v.x1, (f32)v.y1 }; } +fn_inline r3f32_t r3i32_to_r3f32(r3i32_t v) { return (r3f32_t){ (f32)v.x0, (f32)v.y0, (f32)v.z0, (f32)v.x1, (f32)v.y1, (f32)v.z1 }; } +fn_inline v2f64_t v2i32_to_v2f64(v2i32_t v) { return (v2f64_t){ (f64)v.x, (f64)v.y }; } +fn_inline v3f64_t v3i32_to_v3f64(v3i32_t v) { return (v3f64_t){ (f64)v.x, (f64)v.y, (f64)v.z }; } +fn_inline v4f64_t v4i32_to_v4f64(v4i32_t v) { return (v4f64_t){ (f64)v.x, (f64)v.y, (f64)v.z, (f64)v.w }; } +fn_inline r2f64_t r2i32_to_r2f64(r2i32_t v) { return (r2f64_t){ (f64)v.x0, (f64)v.y0, (f64)v.x1, (f64)v.y1 }; } +fn_inline r3f64_t r3i32_to_r3f64(r3i32_t v) { return (r3f64_t){ (f64)v.x0, (f64)v.y0, (f64)v.z0, (f64)v.x1, (f64)v.y1, (f64)v.z1 }; } +fn_inline v2i64_t v2i32_to_v2i64(v2i32_t v) { return (v2i64_t){ (i64)v.x, (i64)v.y }; } +fn_inline v3i64_t v3i32_to_v3i64(v3i32_t v) { return (v3i64_t){ (i64)v.x, (i64)v.y, (i64)v.z }; } +fn_inline v4i64_t v4i32_to_v4i64(v4i32_t v) { return (v4i64_t){ (i64)v.x, (i64)v.y, (i64)v.z, (i64)v.w }; } +fn_inline r2i64_t r2i32_to_r2i64(r2i32_t v) { return (r2i64_t){ (i64)v.x0, (i64)v.y0, (i64)v.x1, (i64)v.y1 }; } +fn_inline r3i64_t r3i32_to_r3i64(r3i32_t v) { return (r3i64_t){ (i64)v.x0, (i64)v.y0, (i64)v.z0, (i64)v.x1, (i64)v.y1, (i64)v.z1 }; } +fn_inline v2f32_t v2i64_to_v2f32(v2i64_t v) { return (v2f32_t){ (f32)v.x, (f32)v.y }; } +fn_inline v3f32_t v3i64_to_v3f32(v3i64_t v) { return (v3f32_t){ (f32)v.x, (f32)v.y, (f32)v.z }; } +fn_inline v4f32_t v4i64_to_v4f32(v4i64_t v) { return (v4f32_t){ (f32)v.x, (f32)v.y, (f32)v.z, (f32)v.w }; } +fn_inline r2f32_t r2i64_to_r2f32(r2i64_t v) { return (r2f32_t){ (f32)v.x0, (f32)v.y0, (f32)v.x1, (f32)v.y1 }; } +fn_inline r3f32_t r3i64_to_r3f32(r3i64_t v) { return (r3f32_t){ (f32)v.x0, (f32)v.y0, (f32)v.z0, (f32)v.x1, (f32)v.y1, (f32)v.z1 }; } +fn_inline v2f64_t v2i64_to_v2f64(v2i64_t v) { return (v2f64_t){ (f64)v.x, (f64)v.y }; } +fn_inline v3f64_t v3i64_to_v3f64(v3i64_t v) { return (v3f64_t){ (f64)v.x, (f64)v.y, (f64)v.z }; } +fn_inline v4f64_t v4i64_to_v4f64(v4i64_t v) { return (v4f64_t){ (f64)v.x, (f64)v.y, (f64)v.z, (f64)v.w }; } +fn_inline r2f64_t r2i64_to_r2f64(r2i64_t v) { return (r2f64_t){ (f64)v.x0, (f64)v.y0, (f64)v.x1, (f64)v.y1 }; } +fn_inline r3f64_t r3i64_to_r3f64(r3i64_t v) { return (r3f64_t){ (f64)v.x0, (f64)v.y0, (f64)v.z0, (f64)v.x1, (f64)v.y1, (f64)v.z1 }; } +fn_inline v2i32_t v2i64_to_v2i32(v2i64_t v) { return (v2i32_t){ (i32)v.x, (i32)v.y }; } +fn_inline v3i32_t v3i64_to_v3i32(v3i64_t v) { return (v3i32_t){ (i32)v.x, (i32)v.y, (i32)v.z }; } +fn_inline v4i32_t v4i64_to_v4i32(v4i64_t v) { return (v4i32_t){ (i32)v.x, (i32)v.y, (i32)v.z, (i32)v.w }; } +fn_inline r2i32_t r2i64_to_r2i32(r2i64_t v) { return (r2i32_t){ (i32)v.x0, (i32)v.y0, (i32)v.x1, (i32)v.y1 }; } +fn_inline r3i32_t r3i64_to_r3i32(r3i64_t v) { return (r3i32_t){ (i32)v.x0, (i32)v.y0, (i32)v.z0, (i32)v.x1, (i32)v.y1, (i32)v.z1 }; } +fn_inline r2f32_t r2f32_add_v2f32(r2f32_t a, v2f32_t b) { return (r2f32_t){ v2f32_add(a.min, b), v2f32_add(a.max, b) }; } +fn_inline r2f32_t r2f32_sub_v2f32(r2f32_t a, v2f32_t b) { return (r2f32_t){ v2f32_sub(a.min, b), v2f32_sub(a.max, b) }; } +fn_inline r2f32_t r2f32_mul_v2f32(r2f32_t a, v2f32_t b) { return (r2f32_t){ v2f32_mul(a.min, b), v2f32_mul(a.max, b) }; } +fn_inline r2f32_t r2f32_div_v2f32(r2f32_t a, v2f32_t b) { return (r2f32_t){ v2f32_div(a.min, b), v2f32_div(a.max, b) }; } +fn_inline r2f64_t r2f64_add_v2f64(r2f64_t a, v2f64_t b) { return (r2f64_t){ v2f64_add(a.min, b), v2f64_add(a.max, b) }; } +fn_inline r2f64_t r2f64_sub_v2f64(r2f64_t a, v2f64_t b) { return (r2f64_t){ v2f64_sub(a.min, b), v2f64_sub(a.max, b) }; } +fn_inline r2f64_t r2f64_mul_v2f64(r2f64_t a, v2f64_t b) { return (r2f64_t){ v2f64_mul(a.min, b), v2f64_mul(a.max, b) }; } +fn_inline r2f64_t r2f64_div_v2f64(r2f64_t a, v2f64_t b) { return (r2f64_t){ v2f64_div(a.min, b), v2f64_div(a.max, b) }; } +fn_inline r2i32_t r2i32_add_v2i32(r2i32_t a, v2i32_t b) { return (r2i32_t){ v2i32_add(a.min, b), v2i32_add(a.max, b) }; } +fn_inline r2i32_t r2i32_sub_v2i32(r2i32_t a, v2i32_t b) { return (r2i32_t){ v2i32_sub(a.min, b), v2i32_sub(a.max, b) }; } +fn_inline r2i32_t r2i32_mul_v2i32(r2i32_t a, v2i32_t b) { return (r2i32_t){ v2i32_mul(a.min, b), v2i32_mul(a.max, b) }; } +fn_inline r2i32_t r2i32_div_v2i32(r2i32_t a, v2i32_t b) { return (r2i32_t){ v2i32_div(a.min, b), v2i32_div(a.max, b) }; } +fn_inline r2i64_t r2i64_add_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_add(a.min, b), v2i64_add(a.max, b) }; } +fn_inline r2i64_t r2i64_sub_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_sub(a.min, b), v2i64_sub(a.max, b) }; } +fn_inline r2i64_t r2i64_mul_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_mul(a.min, b), v2i64_mul(a.max, b) }; } +fn_inline r2i64_t r2i64_div_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_div(a.min, b), v2i64_div(a.max, b) }; } +fn f32 f32_safe_ratio(f32 a, f32 b, f32 if0) { + f32 result = if0; + if (b != 0.0) { + result = a / b; + } + return result; +} + +fn_inline f32 f32_safe_ratio0(f32 a, f32 b) { return f32_safe_ratio(a, b, 0); } +fn_inline f32 f32_safe_ratio1(f32 a, f32 b) { return f32_safe_ratio(a, b, 0); } +fn f64 f64_safe_ratio(f64 a, f64 b, f64 if0) { + f64 result = if0; + if (b != 0.0) { + result = a / b; + } + return result; +} + +fn_inline f64 f64_safe_ratio0(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); } +fn_inline f64 f64_safe_ratio1(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); } diff --git a/src/core/core_math.h b/src/core/core_math.h new file mode 100644 index 0000000..93ad207 --- /dev/null +++ b/src/core/core_math.h @@ -0,0 +1,215 @@ +#pragma once +#include "core_basic.h" + +typedef union v2f32_t v2f32_t; +union v2f32_t { + struct { f32 x, y; }; + f32 e[2]; +}; + +typedef union v3f32_t v3f32_t; +union v3f32_t { + struct { f32 x, y, z; }; + struct { v2f32_t xy; }; + struct { f32 _x0; v2f32_t zw; }; + struct { f32 r, g, b; }; + struct { f32 h, s, l; }; + f32 e[3]; +}; + +typedef union v4f32_t v4f32_t; +union v4f32_t { + struct { f32 x, y, z, w; }; + struct { v2f32_t xy; v2f32_t zw; }; + struct { v3f32_t xyz; }; + struct { f32 _x0; f32 yzw; }; + struct { f32 r, g, b, a; }; + struct { f32 h, s, l, _a; }; + f32 e[4]; +}; + +typedef union r1f32_t r1f32_t; +union r1f32_t { + struct { f32 min, max; }; + struct { f32 x0, x1; }; + f32 e[2]; +}; + +typedef union r2f32_t r2f32_t; +union r2f32_t { + struct { v2f32_t min, max; }; + struct { f32 x0, y0, x1, y1; }; + v4f32_t e4; + f32 e[4]; +}; + +typedef union r3f32_t r3f32_t; +union r3f32_t { + struct { v3f32_t min, max; }; + struct { f32 x0, y0, z0, x1, y1, z1; }; + f32 e[6]; +}; + + +typedef union v2f64_t v2f64_t; +union v2f64_t { + struct { f64 x, y; }; + f64 e[2]; +}; + +typedef union v3f64_t v3f64_t; +union v3f64_t { + struct { f64 x, y, z; }; + struct { v2f64_t xy; }; + struct { f64 _x0; v2f64_t zw; }; + struct { f64 r, g, b; }; + struct { f64 h, s, l; }; + f64 e[3]; +}; + +typedef union v4f64_t v4f64_t; +union v4f64_t { + struct { f64 x, y, z, w; }; + struct { v2f64_t xy; v2f64_t zw; }; + struct { v3f64_t xyz; }; + struct { f64 _x0; f64 yzw; }; + struct { f64 r, g, b, a; }; + struct { f64 h, s, l, _a; }; + f64 e[4]; +}; + +typedef union r1f64_t r1f64_t; +union r1f64_t { + struct { f64 min, max; }; + struct { f64 x0, x1; }; + f64 e[2]; +}; + +typedef union r2f64_t r2f64_t; +union r2f64_t { + struct { v2f64_t min, max; }; + struct { f64 x0, y0, x1, y1; }; + v4f64_t e4; + f64 e[4]; +}; + +typedef union r3f64_t r3f64_t; +union r3f64_t { + struct { v3f64_t min, max; }; + struct { f64 x0, y0, z0, x1, y1, z1; }; + f64 e[6]; +}; + + +typedef union v2i32_t v2i32_t; +union v2i32_t { + struct { i32 x, y; }; + i32 e[2]; +}; + +typedef union v3i32_t v3i32_t; +union v3i32_t { + struct { i32 x, y, z; }; + struct { v2i32_t xy; }; + struct { i32 _x0; v2i32_t zw; }; + struct { i32 r, g, b; }; + struct { i32 h, s, l; }; + i32 e[3]; +}; + +typedef union v4i32_t v4i32_t; +union v4i32_t { + struct { i32 x, y, z, w; }; + struct { v2i32_t xy; v2i32_t zw; }; + struct { v3i32_t xyz; }; + struct { i32 _x0; i32 yzw; }; + struct { i32 r, g, b, a; }; + struct { i32 h, s, l, _a; }; + i32 e[4]; +}; + +typedef union r1i32_t r1i32_t; +union r1i32_t { + struct { i32 min, max; }; + struct { i32 x0, x1; }; + i32 e[2]; +}; + +typedef union r2i32_t r2i32_t; +union r2i32_t { + struct { v2i32_t min, max; }; + struct { i32 x0, y0, x1, y1; }; + v4i32_t e4; + i32 e[4]; +}; + +typedef union r3i32_t r3i32_t; +union r3i32_t { + struct { v3i32_t min, max; }; + struct { i32 x0, y0, z0, x1, y1, z1; }; + i32 e[6]; +}; + + +typedef union v2i64_t v2i64_t; +union v2i64_t { + struct { i64 x, y; }; + i64 e[2]; +}; + +typedef union v3i64_t v3i64_t; +union v3i64_t { + struct { i64 x, y, z; }; + struct { v2i64_t xy; }; + struct { i64 _x0; v2i64_t zw; }; + struct { i64 r, g, b; }; + struct { i64 h, s, l; }; + i64 e[3]; +}; + +typedef union v4i64_t v4i64_t; +union v4i64_t { + struct { i64 x, y, z, w; }; + struct { v2i64_t xy; v2i64_t zw; }; + struct { v3i64_t xyz; }; + struct { i64 _x0; i64 yzw; }; + struct { i64 r, g, b, a; }; + struct { i64 h, s, l, _a; }; + i64 e[4]; +}; + +typedef union r1i64_t r1i64_t; +union r1i64_t { + struct { i64 min, max; }; + struct { i64 x0, x1; }; + i64 e[2]; +}; + +typedef union r2i64_t r2i64_t; +union r2i64_t { + struct { v2i64_t min, max; }; + struct { i64 x0, y0, x1, y1; }; + v4i64_t e4; + i64 e[4]; +}; + +typedef union r3i64_t r3i64_t; +union r3i64_t { + struct { v3i64_t min, max; }; + struct { i64 x0, y0, z0, x1, y1, z1; }; + i64 e[6]; +}; + +#define F64_PI (3.1415926535897932384626433832795028841971693994) +#define F64_DEG2RAD (F64_PI / 180.0); // @Usage: degree * DEG2RAD = radians; +#define F64_RAD2DEG (180.0 / F64_PI); +#define F32_PI ((f32)F64_PI) + +#define v4f32_const_rgba255(r, g, b, a) { (f32)(r) / 255.0f, (f32)(g) / 255.0f, (f32)(b) / 255.0f, (f32)(a) / 255.0f } +#define v4f32_rgba255(r, g, b, a) (v4f32_t){ (f32)(r) / 255.0f, (f32)(g) / 255.0f, (f32)(b) / 255.0f, (f32)(a) / 255.0f } + +static gb_read_only v4f32_t white_color = v4f32_const_rgba255(255, 255, 255, 255); +static gb_read_only v4f32_t black_color = v4f32_const_rgba255(0, 0, 0, 255); +static gb_read_only v4f32_t magenta_color = v4f32_const_rgba255(255, 0, 255, 255); +static gb_read_only v4f32_t red_color = v4f32_const_rgba255(255, 0, 0, 255); +static gb_read_only v4f32_t blue_color = v4f32_const_rgba255(0, 0, 255, 255); diff --git a/src/core/core_math_gen.py b/src/core/core_math_gen.py new file mode 100644 index 0000000..c06a6cb --- /dev/null +++ b/src/core/core_math_gen.py @@ -0,0 +1,406 @@ +import sys + +op_idx = 0 +opname_idx = 1 +symbols = [ + ["+", "add"], + ["-", "sub"], + ["*", "mul"], + ["/", "div"], +] + +basic_types = [ + "f32", + "f64", + "i32", + "i64", +] + +name_idx = 0 +member_idx = 1 + +vec_types = [ + ["v2", ["x", "y"]], + ["v3", ["x", "y", "z"]], + ["v4", ["x", "y", "z", "w"]], +] + +rect_types = [ + ["r2", ["x0", "y0", "x1", "y1"]], + ["r3", ["x0", "y0", "z0", "x1", "y1", "z1"]], +] + +struct_types = vec_types + rect_types + + +# fd = open("core_math.gen.h", "w") +# sys.stdout = fd + +# print("// auto generated using:", __file__) + +# for bt in basic_types: +# s = """ +# typedef union v2f64_t v2f64_t; +# union v2f64_t { +# struct { f64 x, y; }; +# f64 e[2]; +# }; + +# typedef union v3f64_t v3f64_t; +# union v3f64_t { +# struct { f64 x, y, z; }; +# struct { v2f64_t xy; }; +# struct { f64 _x0; v2f64_t zw; }; +# struct { f64 r, g, b; }; +# struct { f64 h, s, l; }; +# f64 e[3]; +# }; + +# typedef union v4f64_t v4f64_t; +# union v4f64_t { +# struct { f64 x, y, z, w; }; +# struct { v2f64_t xy; v2f64_t zw; }; +# struct { v3f64_t xyz; }; +# struct { f64 _x0; f64 yzw; }; +# struct { f64 r, g, b, a; }; +# struct { f64 h, s, l, _a; }; +# f64 e[4]; +# }; + +# typedef union r1f64_t r1f64_t; +# union r1f64_t { +# struct { f64 min, max; }; +# struct { f64 x0, x1; }; +# f64 e[2]; +# }; + +# typedef union r2f64_t r2f64_t; +# union r2f64_t { +# struct { v2f64_t min, max; }; +# struct { f64 x0, y0, x1, y1; }; +# v4f64_t e4; +# f64 e[4]; +# }; + +# typedef union r3f64_t r3f64_t; +# union r3f64_t { +# struct { v3f64_t min, max; }; +# struct { f64 x0, y0, z0, x1, y1, z1; }; +# f64 e[6]; +# }; +# +# +# type_t type__v2f64_t = { type_kind_struct, s8_const("v2f64_t"), sizeof(v2f64_t), .count = 2, +# .members = (type_member_t[]){ +# {s8_const("x"), &type__f64, .offset = offsetof(v2f64_t, x)}, +# {s8_const("y"), &type__f64, .offset = offsetof(v2f64_t, y)}, +# } +# }; + +# type_t type__v3f64_t = { type_kind_struct, s8_const("v3f64_t"), sizeof(v3f64_t), .count = 3, +# .members = (type_member_t[]){ +# {s8_const("x"), &type__f64, .offset = offsetof(v3f64_t, x)}, +# {s8_const("y"), &type__f64, .offset = offsetof(v3f64_t, y)}, +# {s8_const("z"), &type__f64, .offset = offsetof(v3f64_t, z)}, +# } +# }; + +# type_t type__v4f64_t = { type_kind_struct, s8_const("v4f64_t"), sizeof(v4f64_t), .count = 4, +# .members = (type_member_t[]){ +# {s8_const("x"), &type__f64, .offset = offsetof(v4f64_t, x)}, +# {s8_const("y"), &type__f64, .offset = offsetof(v4f64_t, y)}, +# {s8_const("z"), &type__f64, .offset = offsetof(v4f64_t, z)}, +# {s8_const("w"), &type__f64, .offset = offsetof(v4f64_t, w)}, +# } +# }; + +# type_t type__r3f64_t = { type_kind_struct, s8_const("r3f64_t"), sizeof(r3f64_t), .count = 6, +# .members = (type_member_t[]){ +# {s8_const("x0"), &type__f64, .offset = offsetof(r3f64_t, x0)}, +# {s8_const("y0"), &type__f64, .offset = offsetof(r3f64_t, y0)}, +# {s8_const("x0"), &type__f64, .offset = offsetof(r3f64_t, z0)}, +# {s8_const("x1"), &type__f64, .offset = offsetof(r3f64_t, x1)}, +# {s8_const("y1"), &type__f64, .offset = offsetof(r3f64_t, y1)}, +# {s8_const("x1"), &type__f64, .offset = offsetof(r3f64_t, z1)}, +# } +# }; + +# type_member_t members__r2f64_t[] = { +# {s8_const("x0"), &type__f64, .offset = offsetof(r2f64_t, x0)}, +# {s8_const("y0"), &type__f64, .offset = offsetof(r2f64_t, y0)}, +# {s8_const("x1"), &type__f64, .offset = offsetof(r2f64_t, x1)}, +# {s8_const("y1"), &type__f64, .offset = offsetof(r2f64_t, y1)}, +# }; +# DEFINE_STRUCT(r2f64_t); + +# type_member_t members__r1f64_t[] = { +# {s8_const("x0"), &type__f64, .offset = offsetof(r1f64_t, x0)}, +# {s8_const("x1"), &type__f64, .offset = offsetof(r1f64_t, x1)}, +# }; +# DEFINE_STRUCT(r1f64_t); +# """ +# s = s.replace("f64", bt) +# print(s) + + +fd = open("core_math.gen.c", "w", newline = "\n", encoding = "utf-8") +sys.stdout = fd + +for basic_type in basic_types: + for st in struct_types: + type = f"{st[name_idx]}{basic_type}" + typedef = f"{type}_t" + members = st[member_idx] + + def members_as_func_params(members, basic_type): + result = "" + for i, m in enumerate(members): + result += f"{basic_type} {m}" + if i != len(members) - 1: + result += ", " + return result + + print(f"""fn_inline {type}_t {type}({members_as_func_params(members, basic_type)}) {{ return ({type}_t){{ {members_as_func_params(members, "")} }}; }}""") + print(f"""gb_read_only {type}_t {type}_null = {{0}};""") + print(f"""fn_inline b32 {type}_is_null({type}_t a) {{ return memory_equal(&a, &{type}_null, sizeof(a)); }}""") + print(f"""fn_inline b32 {type}_are_equal({type}_t a, {type}_t b) {{ return memory_equal(&a, &b, sizeof(a)); }}""") + + for sym in symbols: + op = sym[op_idx] + opname = sym[opname_idx] + + + def op_str(members, op, skip_right = False): + result = "" + for i in range(len(members)): + mem = members[i] + if skip_right: + result += f"a.{mem} {op} b" + else: + result += f"a.{mem} {op} b.{mem}" + + if i != len(members) - 1: + result += ", " + return result + + + print(f"fn_inline {type}_t {type}_{opname}({type}_t a, {type}_t b) {{ return ({type}_t){{ {op_str(members, op)} }}; }}") + print(f"fn_inline {type}_t {type}_{opname}s({type}_t a, {basic_type} b) {{ return ({type}_t){{ {op_str(members, op, skip_right = True)} }}; }}") + +for basic_type in basic_types: + for i in range(len(rect_types)): + vec_type = vec_types[i] + rect_type = rect_types[i] + + vec_name = vec_type[name_idx] + basic_type + vec_members = vec_type[member_idx] + rect_name = rect_type[name_idx] + basic_type + rect_members = rect_type[member_idx] + + print(f"fn_inline {rect_name}_t {rect_name}_min_dim({vec_name}_t pos, {vec_name}_t size) {{ return ({rect_name}_t){{ pos, {vec_name}_add(pos, size) }}; }}") + print(f"fn_inline {rect_name}_t {rect_name}_center_half_dim({vec_name}_t center, {vec_name}_t halfdim) {{ return ({rect_name}_t){{ {vec_name}_sub(center, halfdim), {vec_name}_add(center, halfdim) }}; }}") + +for basic_type in basic_types: + s = """ +fn r2f64_t r2f64_cut_left(r2f64_t *r, f64 value) { + f64 minx = r->min.x; + r->min.x = MIN(r->min.x + value, r->max.x); + r2f64_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_right(r2f64_t *r, f64 value) { + f64 maxx = r->max.x; + r->max.x = MAX(r->min.x, r->max.x - value); + r2f64_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_top(r2f64_t *r, f64 value) { /* Y is down */ + f64 miny = r->min.y; + r->min.y = MIN(r->max.y, r->min.y + value); + r2f64_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2f64_t r2f64_cut_bottom(r2f64_t *r, f64 value) { /* Y is down */ + f64 maxy = r->max.y; + r->max.y = MAX(r->min.y, r->max.y - value); + r2f64_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2f64_t r2f64_cut_left_no_squash(r2f64_t *r, f64 value) { + f64 minx = r->min.x; + r->min.x = r->min.x + value; + r2f64_t result = { .min = {.x = minx, .y = r->min.y}, .max = {.x = r->min.x, .y =r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_right_no_squash(r2f64_t *r, f64 value) { + f64 maxx = r->max.x; + r->max.x = r->max.x - value; + r2f64_t result = { .min = {.x = r->max.x, .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f64_t r2f64_cut_top_no_squash(r2f64_t *r, f64 value) { /* Y is down */ + f64 miny = r->min.y; + r->min.y = r->min.y + value; + r2f64_t result = { .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = r->min.y} }; + return result; +} +fn r2f64_t r2f64_cut_bottom_no_squash(r2f64_t *r, f64 value) { /* Y is down */ + f64 maxy = r->max.y; + r->max.y = r->max.y - value; + r2f64_t result = { .min = {.x = r->min.x, .y = r->max.y}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + +fn r2f64_t r2f64_add_left(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->min.x - value, r->min.y}, .max = {r->min.x, r->max.y} }; + r->min.x -= value; + return result; +} +fn r2f64_t r2f64_add_right(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->max.x, r->min.y}, .max = {r->max.x + value, r->max.y} }; + r->max.x += value; + return result; +} +fn r2f64_t r2f64_add_top(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->min.x, r->min.y - value}, .max = {r->max.x, r->min.y} }; + r->min.y -= value; + return result; +} +fn r2f64_t r2f64_add_bottom(r2f64_t *r, f64 value) { + r2f64_t result = { .min = {r->min.x, r->max.y}, .max = {r->max.x, r->max.y + value} }; + r->max.y += value; + return result; +} + +// get past left +fn r2f64_t r2f64_getp_left(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->min.x - value, rect->min.y, rect->min.x, rect->max.y); + return result; +} +fn r2f64_t r2f64_getp_right(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->max.x, rect->min.y, rect->max.x + value, rect->max.y); + return result; +} +fn r2f64_t r2f64_getp_bottom(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->min.x, rect->max.y, rect->max.x, rect->max.y + value); + return result; +} +fn r2f64_t r2f64_getp_top(const r2f64_t *rect, f64 value) { + r2f64_t result = r2f64(rect->min.x, rect->min.y - value, rect->max.x, rect->min.y); + return result; +} + +fn r2f64_t r2f64_get_left(const r2f64_t *r, f64 value) { + f64 minx = r->min.x; + r2f64_t result = (r2f64_t){ .min = {.x = minx, .y = r->min.y}, .max = {.x = MIN(r->min.x + value, r->max.x), .y =r->max.y} }; + return result; +} +fn r2f64_t r2f64_get_right(const r2f64_t *r, f64 value) { + f64 maxx = r->max.x; + r2f64_t result = (r2f64_t){ .min = {.x = MAX(r->min.x, r->max.x - value), .y = r->min.y}, .max = {.x = maxx, .y = r->max.y} }; + return result; +} +fn r2f64_t r2f64_get_top(const r2f64_t *r, f64 value) { /* Y is down */ + f64 miny = r->min.y; + r2f64_t result = (r2f64_t){ .min = {.x = r->min.x, .y = miny}, .max = {.x = r->max.x, .y = MIN(r->max.y, r->min.y + value)} }; + return result; +} +fn r2f64_t r2f64_get_bottom(const r2f64_t *r, f64 value) { /* Y is down */ + f64 maxy = r->max.y; + r2f64_t result = (r2f64_t){ .min = {.x = r->min.x, .y = MAX(r->min.y, r->max.y - value)}, .max = {.x = r->max.x, .y = maxy} }; + return result; +} + + +fn_inline r2f64_t r2f64_expand(r2f64_t rect, v2f64_t value) { return (r2f64_t){ v2f64_sub(rect.min, value), v2f64_add(rect.max, value) }; } +fn_inline r2f64_t r2f64_shrink(r2f64_t rect, v2f64_t value) { return (r2f64_t){ v2f64_add(rect.min, value), v2f64_sub(rect.max, value) }; } +fn_inline r2f64_t r2f64_shrinks(r2f64_t rect, f64 value) { return (r2f64_t){ v2f64_adds(rect.min, value), v2f64_subs(rect.max, value) }; } +fn_inline v2f64_t r2f64_size(r2f64_t r) { return (v2f64_t){r.max.x - r.min.x, r.max.y - r.min.y}; } +fn_inline v2f64_t r2f64_get_mid(r2f64_t r) { return v2f64_add(r.min, v2f64_divs(r2f64_size(r), 2)); } +fn_inline b32 r2f64_contains(r2f64_t rec, v2f64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +fn_inline r2f64_t r2f64_intersect(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +fn_inline r2f64_t r2f64_union(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline f64 r1f64_size(r1f64_t a) { return a.max - a.min; } +fn_inline r1f64_t r1f64(f64 min, f64 max) { return (r1f64_t){min,max}; } +fn_inline r1f64_t r1f64_auto(f64 a, f64 b) { return (r1f64_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1f64_t r1f64s(f64 a) { return (r1f64_t){a,a}; } +fn_inline r1f64_t r1f64_clamp(r1f64_t a, f64 min, f64 max) { return (r1f64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +fn_inline b32 r1f64_contains(r1f64_t rec, f64 point) { return (point >= rec.min) && (point < rec.max) && (point >= rec.min) && (point < rec.max); } +fn_inline b32 r1f64_are_equal(r1f64_t a, r1f64_t b) { return a.min == b.min && a.max == b.max; } +gb_read_only r1f64_t r1f64_null; + +fn b32 r1f64_overlap(r1f64_t a, r1f64_t b) { + b32 r1 = (a.max >= b.min && a.max <= b.max) || (a.min >= b.min && a.min <= b.max); + b32 r2 = (b.max >= a.min && b.max <= a.max) || (b.min >= a.min && b.min <= a.max); + return r1 || r2; +} + +fn v2f64_t v2f64_clamps(v2f64_t v, f64 min, f64 max) { + v2f64_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2f64_t v2f64_clamp(v2f64_t v, v2f64_t min, v2f64_t max) { + v2f64_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} + +fn r2f64_t r2f64_fix(r2f64_t n) { + r2f64_t result = { + .min = {MIN(n.min.x, n.max.x), MIN(n.min.y, n.max.y)}, + .max = {MAX(n.min.x, n.max.x), MAX(n.min.y, n.max.y)}, + }; + return result; +} + """.strip() + s = s.replace("f64", basic_type) + print(s) + +for at in basic_types: + for bt in basic_types: + if at == bt: continue + for st in struct_types: + atype = f"{st[name_idx]}{at}" + btype = f"{st[name_idx]}{bt}" + members = st[member_idx] + + def cast_members(members, type): + result = "" + for i in range(len(members)): + result += f"({type})v.{members[i]}" + if i != len(members) - 1: + result += ", " + return result + + print(f"fn_inline {btype}_t {atype}_to_{btype}({atype}_t v) {{ return ({btype}_t){{ {cast_members(members, bt)} }}; }}") + + +####### +# generate r2f64_sub_v2f64 for +-*/ and types +for bt in basic_types: + for sym in symbols: + word_op = sym[1] + s = """ +fn_inline r2f64_t r2f64_sub_v2f64(r2f64_t a, v2f64_t b) { return (r2f64_t){ v2f64_sub(a.min, b), v2f64_sub(a.max, b) }; } +""".strip() + s = s.replace("f64", bt) + s = s.replace("sub", word_op) + print(s) + + +for bt in ["f32", "f64"]: + s = """ +fn f64 f64_safe_ratio(f64 a, f64 b, f64 if0) { + f64 result = if0; + if (b != 0.0) { + result = a / b; + } + return result; +} + +fn_inline f64 f64_safe_ratio0(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); } +fn_inline f64 f64_safe_ratio1(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); } + """.strip() + s = s.replace("f64", bt) + print(s) \ No newline at end of file diff --git a/src/core/core_platform.c b/src/core/core_platform.c new file mode 100644 index 0000000..7f72e3b --- /dev/null +++ b/src/core/core_platform.c @@ -0,0 +1,470 @@ +#include "core_platform.h" +#include "core_ctx.h" + +#if PLATFORM_WASM && PLATFORM_EMSCRIPTEN == 0 +#define gb_wasm_export __attribute__((visibility("default"))) +#define fn_wasm_export __attribute__((visibility("default"))) +#define fn_wasm_import + +fn_wasm_import void wasm_alert(isize ptr, i32 len); +fn_wasm_import f64 wasm_parse_float(isize str, i32 len); +fn_wasm_import void wasm_write_to_console(isize str, i32 len); + +extern char __heap_base; + +fn void *os_vmem_reserve(usize size) { + unused(size); + return NULL; +} + +fn b32 os_vmem_commit(void *p, usize size) { + unused(p); + unused(size); + return false; +} + +fn b32 os_vmem_release(void *p) { + unused(p); + return true; +} + +fn b32 os_vmem_decommit(void *p, usize size) { + unused(p); + unused(size); + return true; +} + +fn void os_error_box(char *str) { + wasm_alert((isize)str, str_len(str)); +} + +fn void os_console_log(char *str) { + s8_t string = s8_from_char(str); + if (s8_ends_with(string, s8("\n"))) { + string = s8_chop(string, 1); + } + wasm_write_to_console((isize)string.str, (i32)string.len); +} + +fn f64 os_parse_float(char *str) { + return wasm_parse_float((isize)str, str_len((char *)str)); +} + +fn void os_core_small_init(ma_arena_t *arena) { + tcx = ma_push_type(arena, thread_ctx_t); + tcx->log.break_on_error = true; + tcx->log.break_on_fatal = true; + tcx->log.break_on_warning = true; + tcx->log.print_file_and_line = true; + tcx->log.log_proc = default_log_proc; +} + +fn void os_core_init(void) { + ma_arena_t perm = {0}; + isize page_size = kib(64); + isize page_count = __builtin_wasm_memory_size(0); + u8 *memory = (u8 *)&__heap_base; + usize memory_size = page_count * (page_size) - (isize)memory; + perm.data = memory; + perm.commit = perm.reserve = memory_size; + os_core_small_init(&perm); + tcx->perm = perm; + ma_push_arena_ex(&tcx->perm, &tcx->temp, mib(16)); + ma_push_arena_ex(&tcx->perm, &tcx->scratch[0], mib(2)); + ma_push_arena_ex(&tcx->perm, &tcx->scratch[1], kib(256)); + ma_push_arena_ex(&tcx->perm, &tcx->scratch[2], kib(64)); + debugf("memory size = %lld", memory_size); +} +#elif PLATFORM_WINDOWS + #pragma comment(lib, "user32.lib") + #pragma comment(lib, "DbgHelp.lib") + #pragma comment(lib, "Shell32.lib") + #pragma comment(lib, "Ole32.lib") + #define NOMINMAX + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include + #include + #include + #include + #include + #include + +typedef struct b_stacktrace_tag* b_stacktrace_handle; + +/* + Returns a stack-trace handle from the point of view of the caller which + can be expanded to a string via b_stacktrace_to_string. + The handle is allocated with `malloc` and needs to be freed with `free` +*/ +fn b_stacktrace_handle b_stacktrace_get(); + +/* + Converts a stack-trace handle to a human-readable string. + The string is allocated with `malloc` and needs to be freed with `free` +*/ +fn char* b_stacktrace_to_string(b_stacktrace_handle stacktrace); + +/* + Returns a human-readable stack-trace string from the point of view of the + caller. + The string is allocated with `malloc` and needs to be freed with `free` +*/ +fn char* b_stacktrace_get_string(void); + +/* version */ + +typedef struct print_buf { + char* buf; + int pos; + int size; +} print_buf; + +static print_buf buf_init(void) { + print_buf ret = { + (char*) malloc(1024), + 0, + 1024 + }; + return ret; +} + +static void buf_printf(print_buf* b, const char* fmt, ...) { + va_list args; + va_start(args, fmt); + const int len = vsnprintf(NULL, 0, fmt, args) + 1; + va_end(args); + + const int new_end = b->pos + len; + + if (new_end > b->size) { + while (new_end > b->size) b->size *= 2; + b->buf = (char*)realloc(b->buf, b->size); + } + + va_start(args, fmt); + b->pos += vsnprintf(b->buf + b->pos, len, fmt, args); + va_end(args); +} + +char* b_stacktrace_get_string(void) { + b_stacktrace_handle h = b_stacktrace_get(); + char* ret = b_stacktrace_to_string(h); + free(h); + return ret; +} + +#define B_STACKTRACE_MAX_DEPTH 1024 + +#define B_STACKTRACE_ERROR_FLAG ((DWORD64)1 << 63) + +typedef struct b_stacktrace_entry { + DWORD64 AddrPC_Offset; + DWORD64 AddrReturn_Offset; +} b_stacktrace_entry; + +static int SymInitialize_called = 0; + +b_stacktrace_handle b_stacktrace_get(void) { + HANDLE process = GetCurrentProcess(); + HANDLE thread = GetCurrentThread(); + CONTEXT context; + STACKFRAME64 frame; /* in/out stackframe */ + DWORD imageType; + b_stacktrace_entry* ret = (b_stacktrace_entry*)malloc(B_STACKTRACE_MAX_DEPTH * sizeof(b_stacktrace_entry)); + int i = 0; + + if (!SymInitialize_called) { + SymInitialize(process, NULL, TRUE); + SymInitialize_called = 1; + } + + RtlCaptureContext(&context); + + memset(&frame, 0, sizeof(frame)); +#ifdef _M_IX86 + imageType = IMAGE_FILE_MACHINE_I386; + frame.AddrPC.Offset = context.Eip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context.Ebp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context.Esp; + frame.AddrStack.Mode = AddrModeFlat; +#elif _M_X64 + imageType = IMAGE_FILE_MACHINE_AMD64; + frame.AddrPC.Offset = context.Rip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context.Rsp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context.Rsp; + frame.AddrStack.Mode = AddrModeFlat; +#elif _M_IA64 + imageType = IMAGE_FILE_MACHINE_IA64; + frame.AddrPC.Offset = context.StIIP; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context.IntSp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrBStore.Offset = context.RsBSP; + frame.AddrBStore.Mode = AddrModeFlat; + frame.AddrStack.Offset = context.IntSp; + frame.AddrStack.Mode = AddrModeFlat; +#else + #error "Platform not supported!" +#endif + + while (1) { + b_stacktrace_entry* cur = ret + i++; + if (i == B_STACKTRACE_MAX_DEPTH) { + cur->AddrPC_Offset = 0; + cur->AddrReturn_Offset = 0; + break; + } + + if (!StackWalk64(imageType, process, thread, &frame, &context, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL)) { + cur->AddrPC_Offset = frame.AddrPC.Offset; + cur->AddrReturn_Offset = B_STACKTRACE_ERROR_FLAG; /* mark error */ + cur->AddrReturn_Offset |= GetLastError(); + break; + } + + cur->AddrPC_Offset = frame.AddrPC.Offset; + cur->AddrReturn_Offset = frame.AddrReturn.Offset; + + if (frame.AddrReturn.Offset == 0) { + break; + } + } + + return (b_stacktrace_handle)(ret); +} + +char* b_stacktrace_to_string(b_stacktrace_handle h) { + const b_stacktrace_entry* entries = (b_stacktrace_entry*)h; + int i = 0; + HANDLE process = GetCurrentProcess(); + print_buf out = buf_init(); + IMAGEHLP_SYMBOL64* symbol = (IMAGEHLP_SYMBOL64*)malloc(sizeof(IMAGEHLP_SYMBOL64) + 1024); + symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); + symbol->MaxNameLength = 1024; + + while (1) { + IMAGEHLP_LINE64 lineData; + DWORD lineOffset = 0; + DWORD64 symOffset = 0; + const b_stacktrace_entry* cur = entries + i++; + + if (cur->AddrReturn_Offset & B_STACKTRACE_ERROR_FLAG) { + DWORD error = cur->AddrReturn_Offset & 0xFFFFFFFF; + buf_printf(&out, "StackWalk64 error: %d @ %p\n", error, cur->AddrPC_Offset); + break; + } + + if (cur->AddrPC_Offset == cur->AddrReturn_Offset) { + buf_printf(&out, "Stack overflow @ %p\n", cur->AddrPC_Offset); + break; + } + + SymGetLineFromAddr64(process, cur->AddrPC_Offset, &lineOffset, &lineData); + buf_printf(&out, "%s(%d): ", lineData.FileName, lineData.LineNumber); + + if (SymGetSymFromAddr64(process, cur->AddrPC_Offset, &symOffset, symbol)) { + buf_printf(&out, "%s\n", symbol->Name); + } + else { + buf_printf(&out, " Unkown symbol @ %p\n", cur->AddrPC_Offset); + } + + if (cur->AddrReturn_Offset == 0) { + break; + } + } + + free(symbol); + return out.buf; +} + +fn void *os_vmem_reserve(usize size) { + void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); + return result; +} + +fn b32 os_vmem_commit(void *p, usize size) { + void *result = VirtualAlloc(p, size, MEM_COMMIT, PAGE_READWRITE); + return result ? true : false; +} +fn b32 os_vmem_release(void *p) { + BOOL result = VirtualFree(p, 0, MEM_RELEASE); + return result ? true : false; +} + +fn b32 os_vmem_decommit(void *p, usize size) { + BOOL result = VirtualFree(p, size, MEM_DECOMMIT); + return result ? true : false; +} + +fn void os_error_box(char *str) { + OutputDebugStringA(str); + fprintf(stderr, "%s", str); + fflush(stderr); + MessageBoxA(NULL, str, "fatal error", MB_OK); +} + +fn void os_console_log(char *str) { + OutputDebugStringA(str); + fputs(str, stdout); + fflush(stdout); +} + +fn f64 os_parse_float(char *str) { + return strtod(str, NULL); +} + +fn void os_win32_crash_handler(int signal) { + printf("signal: %d\n", signal); + puts(b_stacktrace_get_string()); + exit(1); +} + +fn void os_win32_register_crash_handler() { + signal(SIGSEGV, os_win32_crash_handler); + signal(SIGABRT, os_win32_crash_handler); +} + +fn void os_core_small_init(ma_arena_t *arena) { + tcx = ma_push_type(arena, thread_ctx_t); + tcx->log.break_on_error = true; + tcx->log.break_on_fatal = true; + tcx->log.break_on_warning = true; + tcx->log.print_file_and_line = true; + tcx->log.log_proc = default_log_proc; + os_win32_register_crash_handler(); +} + +fn void os_core_init(void) { + ma_arena_t perm = {0}; + os_core_small_init(&perm); + tcx->perm = perm; +} +#elif PLATFORM_POSIX + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + +#if !PLATFORM_EMSCRIPTEN + #include + #include +#endif +fn void *os_vmem_reserve(usize size) { + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + return result == MAP_FAILED ? NULL : result; +} + +fn b32 os_vmem_commit(void *ptr, usize size) { + mprotect(ptr, size, PROT_READ|PROT_WRITE); + return true; +} + +fn b32 os_vmem_release(void *ptr) { + int result = munmap(ptr, 0); + return result == 0 ? true : false; +} + +fn b32 os_vmem_decommit(void *ptr, usize size) { + madvise(ptr, size, MADV_DONTNEED); + mprotect(ptr, size, PROT_NONE); + return true; +} + +fn void os_error_box(char *str) { + fprintf(stderr, "%s", str); + fflush(stderr); +} + +fn void os_console_log(char *str) { + fputs(str, stdout); + fflush(stdout); +} + +fn f64 os_parse_float(char *str) { + return strtod(str, NULL); +} + +gb struct backtrace_state *backtrace_state = NULL; + +fn void os_core_backtrace_error_callback(void *data, const char *msg, int errnum) { + unused(data); + errorf("libbacktrace error: %s (errnum: %d)\n", msg, errnum); +} + +fn int os_core_backtrace_print_callback(void *data, uintptr_t pc, const char *filename, int lineno, const char *function) { + unused(data); + unused(pc); + b32 printed = false; + if (filename != NULL) { + char buffer[512]; + char *f = realpath(filename, buffer); + printf("%s:%d:1: ", f, lineno); + printed = true; + } + if (function != NULL) { + printf("%s", function); + printed = true; + } + if (printed) { + printf("\n"); + } + return 0; +} + +#if !PLATFORM_EMSCRIPTEN +fn void os_unix_crash_handler(int signal, siginfo_t* info, void* context) { + unused(context); + unused(signal); + unused(info); + backtrace_full(backtrace_state, 2, os_core_backtrace_print_callback, os_core_backtrace_error_callback, NULL); + exit(1); +} + +fn void os_unix_register_crash_handler() { + backtrace_state = backtrace_create_state(NULL, 1, os_core_backtrace_error_callback, NULL); + + struct sigaction sa; + sa.sa_sigaction = os_unix_crash_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART | SA_SIGINFO; + + sigaction(SIGSEGV, &sa, NULL); + sigaction(SIGABRT, &sa, NULL); + sigaction(SIGBUS, &sa, NULL); + sigaction(SIGILL, &sa, NULL); + sigaction(SIGFPE, &sa, NULL); +} +#endif + +fn void os_core_small_init(ma_arena_t *arena) { + tcx = ma_push_type(arena, thread_ctx_t); + tcx->log.break_on_error = true; + tcx->log.break_on_fatal = true; + tcx->log.break_on_warning = true; + tcx->log.print_file_and_line = true; + tcx->log.log_proc = default_log_proc; +#if !PLATFORM_EMSCRIPTEN + os_unix_register_crash_handler(); +#endif +} + +fn void os_core_init(void) { + ma_arena_t perm = {0}; + os_core_small_init(&perm); + tcx->perm = perm; +} +#endif diff --git a/src/core/core_platform.h b/src/core/core_platform.h new file mode 100644 index 0000000..e58a022 --- /dev/null +++ b/src/core/core_platform.h @@ -0,0 +1,30 @@ +#pragma once +#include "core_basic.h" +#include "core_arena.h" + +fn void os_error_box(char *str); +fn void os_console_log(char *str); + +fn void *os_vmem_reserve(usize size); +fn b32 os_vmem_commit(void *p, usize size); +fn b32 os_vmem_release(void *p); +fn b32 os_vmem_decommit(void *p, usize size); + +fn void os_core_init(void); +fn void os_core_small_init(ma_arena_t *arena); +fn f64 os_parse_float(char *str); + + +#if PLATFORM_DEBUG_ASSERT +#define assert_expr(x) (!(x) && (os_error_box(FILE_AND_LINE ": assertion failed: " #x "\n"), debug_break())) +#define assert(x) do { assert_expr(x); } while(0) +#define assert_ex(x, msg) (!(x) && (os_error_box(FILE_AND_LINE ": assertion failed: " #x " :: " #msg "\n"), debug_break())) +#else +#define assert_expr(x) (void)(x) +#define assert(x) do { (void)(x); } while(0) +#define assert_ex(x, msg) do { (void)(x); } while(0) +#endif +#define not_implemented assert(!"not implemented!") +#define invalid_codepath assert(!"invalid code path!") +#define default_is_invalid default: assert(!"invalid default case") +#define else_is_invalid else { assert(!"else was not expected to be executed!"); } diff --git a/src/core/core_string.c b/src/core/core_string.c new file mode 100644 index 0000000..584796b --- /dev/null +++ b/src/core/core_string.c @@ -0,0 +1,559 @@ +#include "core_string.h" +#include "core_intrin.h" +#include "core_platform.h" +#include "stb_sprintf.h" + +#define s8_vsnprintf stbsp_vsnprintf + +fn i32 str_len(char *str) { + i32 i = 0; + while (str[i]) i += 1; + return i; +} + +fn b32 str_eq(char *a, char *b) { + return s8_are_equal(s8_from_char(a), s8_from_char(b)); +} + +fn char char_to_lower_case(char a) { + if (a >= 'A' && a <= 'Z') a += 32; + return a; +} + +fn char char_to_upper_case(char a) { + if (a >= 'a' && a <= 'z') a -= 32; + return a; +} + +fn b32 char_is_whitespace(char w) { + b32 result = w == '\n' || w == ' ' || w == '\t' || w == '\v' || w == '\r'; + return result; +} + +fn b32 char_is_alphabetic(char a) { + b32 result = (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'); + return result; +} + +fn b32 char_is_ident(char a) { + b32 result = (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') || a == '_'; + return result; +} + +fn b32 char_is_digit(char a) { + b32 result = a >= '0' && a <= '9'; + return result; +} + +fn b32 char_is_alphanumeric(char a) { + b32 result = char_is_digit(a) || char_is_alphabetic(a); + return result; +} + +fn b32 char_is_symbol(char w) { + b32 result = (w >= '!' && w <= '/') || (w >= ':' && w <= '@') || (w >= '[' && w <= '`') || (w >= '{' && w <= '~'); + return result; +} + +fn b32 char_is_non_word(char w) { + b32 result = w != '_' && (char_is_symbol(w) || char_is_whitespace(w)); + return result; +} + +fn b32 char_is_word(char w) { + b32 result = !char_is_non_word(w); + return result; +} + +fn s8_t s8_from_range(char *begin, char *end) { + assert(end >= begin); + intptr_t size = (intptr_t)end - (intptr_t)begin; + s8_t result = {begin, size}; + return result; +} + +fn s8_t s8_from_char(char *string) { + s8_t result; + result.str = (char *)string; + result.len = str_len(string); + return result; +} + +fn s8_t s8_copy(ma_arena_t *ma, s8_t string) { + char *copy = (char *)ma_push_size(ma, sizeof(char) * (string.len + 1)); + memory_copy(copy, string.str, string.len); + copy[string.len] = 0; + s8_t result = s8_make(copy, string.len); + return result; +} + +fn s8_t s8_copy_char(ma_arena_t *ma, char *s) { + int64_t len = str_len(s); + char *copy = (char *)ma_push_size(ma, sizeof(char) * (len + 1)); + memory_copy(copy, s, len); + copy[len] = 0; + s8_t result = s8_make(copy, len); + return result; +} + +fn b32 s8_are_equal_ex(s8_t a, s8_t b, b32 ignore_case) { + if (a.len != b.len) return false; + for (int64_t i = 0; i < a.len; i++) { + char A = a.str[i]; + char B = b.str[i]; + if (ignore_case) { + A = char_to_lower_case(A); + B = char_to_lower_case(B); + } + if (A != B) + return false; + } + return true; +} + +fn b32 s8_are_equal(s8_t a, s8_t b) { + return s8_are_equal_ex(a, b, false); +} + +fn s8_t s8_get_postfix(s8_t string, int64_t len) { + len = CLAMP_TOP(len, string.len); + int64_t remain_len = string.len - len; + s8_t result = s8_make(string.str + remain_len, len); + return result; +} + +fn s8_t s8_get_prefix(s8_t string, int64_t len) { + len = CLAMP_TOP(len, string.len); + s8_t result = s8_make(string.str, len); + return result; +} + +fn s8_t s8_chop(s8_t string, int64_t len) { + len = CLAMP_TOP(len, string.len); + s8_t result = s8_make(string.str, string.len - len); + return result; +} + +fn s8_t s8_skip(s8_t string, int64_t len) { + len = CLAMP_TOP(len, string.len); + int64_t remain = string.len - len; + s8_t result = s8_make(string.str + len, remain); + return result; +} + +fn b32 s8_ends_with_ex(s8_t a, s8_t end, b32 ignore_case) { + s8_t a_end = s8_get_postfix(a, end.len); + b32 result = s8_are_equal_ex(end, a_end, ignore_case); + return result; +} + +fn b32 s8_starts_with_ex(s8_t a, s8_t start, b32 ignore_case) { + s8_t a_start = s8_get_prefix(a, start.len); + b32 result = s8_are_equal_ex(start, a_start, ignore_case); + return result; +} + +fn b32 s8_ends_with(s8_t a, s8_t end) { + return s8_ends_with_ex(a, end, false); +} + +fn b32 s8_starts_with(s8_t a, s8_t start) { + return s8_starts_with_ex(a, start, false); +} + +fn void s8_normalize_path_unsafe(s8_t s) { + for (int64_t i = 0; i < s.len; i++) { + if (s.str[i] == '\\') + s.str[i] = '/'; + } +} + +fn b32 s8_is_pointer_inside(s8_t string, char *p) { + uintptr_t pointer = (uintptr_t)p; + uintptr_t start = (uintptr_t)string.str; + uintptr_t stop = start + (uintptr_t)string.len; + b32 result = pointer >= start && pointer < stop; + return result; +} + +fn s8_t s8_cut_start(s8_t *in, i64 size) { + s8_t result = s8_get_prefix(*in, size); + *in = s8_skip(*in, result.len); + return result; +} + +fn s8_t s8_cut_end(s8_t *in, i64 size) { + s8_t result = s8_get_postfix(*in, size); + *in = s8_chop(*in, result.len); + return result; +} + +#if 0 +s8_t s8_skip_to_p(s8_t string, char *p) { + if (s8_is_pointer_inside(string, p)) { + s8_t result = s8_make(p, p - string.str); + return result; + } + return string; +} + +s8_t s8_skip_past(s8_t string, s8_t a) { + if (s8_is_pointer_inside(string, a.str)) { + s8_t on_p = s8_make(a.str, a.str - string.str); + s8_t result = s8_skip(on_p, a.len); + return result; + } + return string; +} +#endif + +fn s8_t s8_slice(s8_t string, int64_t first_index, int64_t one_past_last_index) { + if (one_past_last_index < 0) one_past_last_index = string.len + one_past_last_index + 1; + if (first_index < 0) first_index = string.len + first_index; + assert(first_index < one_past_last_index); + assert(string.len > 0); + s8_t result = string; + if (string.len > 0) { + if (one_past_last_index > first_index) { + first_index = CLAMP_TOP(first_index, string.len - 1); + one_past_last_index = CLAMP_TOP(one_past_last_index, string.len); + result.str += first_index; + result.len = one_past_last_index - first_index; + } + else { + result.len = 0; + } + } + return result; +} + +fn s8_t s8_trim(s8_t string) { + if (string.len == 0) + return string; + + int64_t whitespace_begin = 0; + for (; whitespace_begin < string.len; whitespace_begin++) { + if (!char_is_whitespace(string.str[whitespace_begin])) { + break; + } + } + + int64_t whitespace_end = string.len; + for (; whitespace_end != whitespace_begin; whitespace_end--) { + if (!char_is_whitespace(string.str[whitespace_end - 1])) { + break; + } + } + + if (whitespace_begin == whitespace_end) { + string.len = 0; + } + else { + string = s8_slice(string, whitespace_begin, whitespace_end); + } + + return string; +} + +fn s8_t s8_trim_end(s8_t string) { + int64_t whitespace_end = string.len; + for (; whitespace_end != 0; whitespace_end--) { + if (!char_is_whitespace(string.str[whitespace_end - 1])) { + break; + } + } + + s8_t result = s8_get_prefix(string, whitespace_end); + return result; +} + +fn b32 s8_seek(s8_t string, s8_t find, s8_seek_t flags, int64_t *index_out) { + b32 ignore_case = flags & s8_seek_ignore_case ? true : false; + b32 result = false; + if (flags & s8_seek_match_find_last) { + for (int64_t i = string.len; i != 0; i--) { + int64_t index = i - 1; + s8_t substring = s8_slice(string, index, index + find.len); + if (s8_are_equal_ex(substring, find, ignore_case)) { + if (index_out) + *index_out = index; + result = true; + break; + } + } + } + else { + for (int64_t i = 0; i < string.len; i++) { + s8_t substring = s8_slice(string, i, i + find.len); + if (s8_are_equal_ex(substring, find, ignore_case)) { + if (index_out) + *index_out = i; + result = true; + break; + } + } + } + + return result; +} + +fn int64_t s8_find(s8_t string, s8_t find, s8_seek_t flag) { + int64_t result = -1; + s8_seek(string, find, flag, &result); + return result; +} + +fn s8_t s8_chop_last_char(s8_t s, s8_t ch) { + s8_t result = s; + s8_seek(s, ch, s8_seek_match_find_last, &result.len); + return result; +} + +fn s8_t s8_chop_last_slash(s8_t s) { + return s8_chop_last_char(s, s8("/")); +} + +fn s8_t s8_chop_last_period(s8_t s) { + return s8_chop_last_char(s, s8(".")); +} + +fn s8_t s8_skip_to_last_char(s8_t s, s8_t ch) { + int64_t pos; + s8_t result = s; + if (s8_seek(s, ch, s8_seek_match_find_last, &pos)) { + result = s8_skip(result, pos + 1); + } + return result; +} + +fn s8_t s8_skip_to_last_slash(s8_t s) { + return s8_skip_to_last_char(s, s8("/")); +} + +fn s8_t s8_skip_to_last_period(s8_t s) { + return s8_skip_to_last_char(s, s8(".")); +} + +fn s8_t s8_get_name_no_ext(s8_t s) { + return s8_skip_to_last_slash(s8_chop_last_period(s)); +} + +fn s8_t s8_normalize_path(ma_arena_t *ma, s8_t s) { + s8_t copy = s8_copy(ma, s); + s8_normalize_path_unsafe(copy); + return copy; +} + +fn s8_t s8_to_lower_case(ma_arena_t *ma, s8_t s) { + s8_t copy = s8_copy(ma, s); + for (int64_t i = 0; i < copy.len; i++) { + copy.str[i] = char_to_lower_case(copy.str[i]); + } + return copy; +} + +fn s8_t s8_to_upper_case(ma_arena_t *ma, s8_t s) { + s8_t copy = s8_copy(ma, s); + for (int64_t i = 0; i < copy.len; i++) { + copy.str[i] = char_to_upper_case(copy.str[i]); + } + return copy; +} + +fn s8_t s8_vfmt(ma_arena_t *ma, const char *str, va_list args1) { + va_list args2; + va_copy(args2, args1); + int64_t len = s8_vsnprintf(0, 0, str, args2); + va_end(args2); + + char *result = (char *)ma_push_size(ma, sizeof(char) * (len + 1)); + s8_vsnprintf(result, (i32)(len + 1), str, args1); + s8_t res = s8_make(result, len); + return res; +} + +fn s8_t s8_printf(ma_arena_t *ma, const char *str, ...) { + S8_FMT(ma, str, result); + return result; +} + +fn sb8_node_t *sb8_create_node(ma_arena_t *ma, s8_t str) { + sb8_node_t *node = ma_push_type(ma, sb8_node_t); + node->string = str; + return node; +} + +fn sb8_node_t *sb8_append(sb8_t *list, s8_t string) { + assert(list->arena != NULL); + sb8_node_t *node = sb8_create_node(list->arena, string); + SLLQ_APPEND(list->first, list->last, node); + return node; +} + +fn s8_t sb8_printf(sb8_t *sb, const char *str, ...) { + S8_FMT(sb->arena, str, result); + sb8_append(sb, result); + return result; +} + +fn void sb8_indent(sb8_t *sb) { + sb8_printf(sb, "\n%.*s", sb->indent*4, " "); +} + +fn s8_t sb8_stmtf(sb8_t *sb, const char *str, ...) { + S8_FMT(sb->arena, str, result); + sb8_indent(sb); + sb8_append(sb, result); + return result; +} + +fn int64_t sb8_char_size(sb8_t *sb) { + int64_t result = 0; + for (sb8_node_t *it = sb->first; it; it = it->next) { + result += it->len; + } + return result; +} + +fn s8_t sb8_merge(ma_arena_t *arena, sb8_t *sb) { + int64_t size = sb8_char_size(sb) + 1; + char *str = ma_push_size(arena, size); + s8_t result = {str, 0}; + for (sb8_node_t *it = sb->first; it; it = it->next) { + memory_copy(result.str + result.len, it->str, it->len); + result.len += it->len; + } + result.str[result.len] = 0; + return result; +} + +fn sb8_t s8_split(ma_arena_t *ma, s8_t string, s8_t find, s8_split_t flags) { + sb8_t result = (sb8_t){ma}; + int64_t index = 0; + + s8_seek_t find_flag = flags & s8_split_ignore_case ? s8_seek_ignore_case : s8_seek_none; + while (s8_seek(string, find, find_flag, &index)) { + s8_t before_match = s8_make(string.str, index); + if (flags & s8_split_cleanup) { + before_match = s8_trim(before_match); + if (before_match.len) { + sb8_append(&result, before_match); + } + } else { + sb8_append(&result, before_match); + } + if (flags & s8_split_inclusive) { + s8_t match = s8_make(string.str + index, find.len); + sb8_append(&result, match); + } + string = s8_skip(string, index + find.len); + } + if (string.len) sb8_append(&result, string); + return result; +} + +fn u64 u64_from_hexchar(char c) { + switch (c) { + case '0': return 0; break; + case '1': return 1; break; + case '2': return 2; break; + case '3': return 3; break; + case '4': return 4; break; + case '5': return 5; break; + case '6': return 6; break; + case '7': return 7; break; + case '8': return 8; break; + case '9': return 9; break; + case 'a': + case 'A': return 10; break; + case 'b': + case 'B': return 11; break; + case 'c': + case 'C': return 12; break; + case 'd': + case 'D': return 13; break; + case 'e': + case 'E': return 14; break; + case 'f': + case 'F': return 15; break; + default: return 255; + } +} + +fn u64 u64_from_s8(s8_t s, u64 base) { + assert(base >= 2 && base <= 16); + u64 acc = 0; + for (i64 i = 0; i < s.len; i++) { + u64 num = u64_from_hexchar(s.str[i]); + assert(num < base); + acc *= base; + acc += num; + } + return acc; +} + +fn u64 u64_from_s8_loose(s8_t s, u64 base) { + assert(base >= 2 && base <= 16); + u64 acc = 0; + for (i64 i = 0; i < s.len; i++) { + u64 num = u64_from_hexchar(s.str[i]); + if (num >= base) { + break; + } + acc *= base; + acc += num; + } + return acc; +} + +fn f64 f64_from_s8(s8_t string) { + ma_temp_t scratch = ma_begin_scratch(); + s8_t num_string = s8_copy(scratch.arena, string); + f64 result = os_parse_float(num_string.str); + ma_end_scratch(scratch); + return result; +} + +gb_read_only i64 s8_fuzzy_closer_word_begin = 5; +gb_read_only i64 s8_fuzzy_consecutive_multiplier = 3; +fn i64 s8_fuzzy_rate_string(s8_t string, s8_t with) { + if (with.len == 0) return 0; + + i64 points = 0; + i64 consecutive = 0; + i64 with_i = 0; + for (i64 i = 0; i < string.len; i++) { + if (string.str[i] == with.str[with_i]) { + i64 closer_begin = CLAMP_BOT((i64)0, s8_fuzzy_closer_word_begin - i); + points += closer_begin; + consecutive++; + with_i += 1; + } else { + points += consecutive * s8_fuzzy_consecutive_multiplier; + consecutive = 0; + with_i = 0; + } + + if (with_i >= with.len) with_i = 0; + } + points += consecutive * s8_fuzzy_consecutive_multiplier; + return points; +} + +fn fuzzy_pair_t *s8_fuzzy_rate_array(ma_arena_t *arena, s8_t needle, s8_t *array, i32 len) { + fuzzy_pair_t *pairs = ma_push_array(arena, fuzzy_pair_t, len); + for (i32 i = 0; i < len; i += 1) { + pairs[i].rating = s8_fuzzy_rate_string(array[i], needle); + pairs[i].index = i; + } + + for (i32 i = 0; i < len - 1; i++) { + for (i32 j = 0; j < len - 1; j++) { + if (pairs[j].rating < pairs[j + 1].rating) { + SWAP(fuzzy_pair_t, pairs[j], pairs[j + 1]); + } + } + } + + return pairs; +} diff --git a/src/core/core_string.h b/src/core/core_string.h new file mode 100644 index 0000000..2ab94f7 --- /dev/null +++ b/src/core/core_string.h @@ -0,0 +1,174 @@ +#pragma once +#include "core_basic.h" +#include "core_arena.h" + +typedef struct s8_t s8_t; +struct s8_t { + char *str; + int64_t len; +}; + +typedef struct sb8_node_t sb8_node_t; +struct sb8_node_t { + sb8_node_t *next; + union { + struct { char *str; int64_t len; }; + s8_t string; + }; +}; + +typedef struct sb8_t sb8_t; +struct sb8_t { + ma_arena_t *arena; + sb8_node_t *first; + sb8_node_t *last; + + // WARNING: remember to update typeinfo after editing this + i32 indent; +}; + +typedef i32 s8_seek_t; +enum { + s8_seek_none = 0, + s8_seek_ignore_case = 1, + s8_seek_match_find_last = 2, +}; + +typedef i32 s8_split_t; +enum { + s8_split_none = 0, + s8_split_ignore_case = 1, + s8_split_inclusive = 2, + s8_split_cleanup = 4, +}; + +enum { s8_ignore_case = 1 }; + +// +// char and char string operations +fn i32 str_len(char *str); +fn b32 str_eq(char *a, char *b); +fn char char_to_lower_case(char a); +fn char char_to_upper_case(char a); +fn b32 char_is_whitespace(char w); +fn b32 char_is_alphabetic(char a); +fn b32 char_is_ident(char a); +fn b32 char_is_digit(char a); +fn b32 char_is_alphanumeric(char a); + +fn u64 u64_from_hexchar(char c); +fn u64 u64_from_s8(s8_t s, u64 base); +fn f64 f64_from_s8(s8_t string); + +// +// string8 constructors +#define s8_make(str,len) (s8_t){str, len} +#define s8_null (s8_t){0} +#define s8_invalid s8("") +#define s8(string) (s8_t){(char *)string, sizeof(string) - 1} +#define s8_const(string) { string, sizeof(string) - 1 } +#define s8_struct(DATA) (s8_t){.str = (char *)&(DATA), .len = sizeof(DATA)} +#define s8_array(DATA) (s8_t){.str = (char *)(DATA), .len = lengthof(DATA)} +#define s8_array_lit(DATA) {.str = (char *)(DATA), .len = lengthof(DATA)} +fn s8_t s8_from_range(char *begin, char *end); +fn s8_t s8_from_char(char *string); +fn s8_t s8_copy(ma_arena_t *ma, s8_t string); + +// +// conditional +fn b32 s8_are_equal_ex(s8_t a, s8_t b, b32 ignore_case); +fn b32 s8_are_equal(s8_t a, s8_t b); +fn b32 s8_ends_with_ex(s8_t a, s8_t end, b32 ignore_case); +fn b32 s8_starts_with_ex(s8_t a, s8_t start, b32 ignore_case); +fn b32 s8_ends_with(s8_t a, s8_t end); +fn b32 s8_starts_with(s8_t a, s8_t start); +fn b32 s8_is_pointer_inside(s8_t string, char *p);// @todo: maybe more general? + +// +// search +fn b32 s8_seek(s8_t string, s8_t find, s8_seek_t flags, int64_t *index_out); +fn int64_t s8_find(s8_t string, s8_t find, s8_seek_t flag); +fn sb8_t s8_split(ma_arena_t *ma, s8_t string, s8_t find, s8_split_t flags); + +// +// string view transforms +fn s8_t s8_slice(s8_t string, int64_t first_index, int64_t one_past_last_index); +fn s8_t s8_get_postfix(s8_t string, int64_t len); +fn s8_t s8_get_prefix(s8_t string, int64_t len); +fn s8_t s8_chop(s8_t string, int64_t len); +fn s8_t s8_skip(s8_t string, int64_t len); +fn s8_t s8_chop_last_slash(s8_t s); +fn s8_t s8_chop_last_period(s8_t s); +fn s8_t s8_skip_to_last_slash(s8_t s); +fn s8_t s8_skip_to_last_period(s8_t s); +fn s8_t s8_get_name_no_ext(s8_t s); +fn s8_t s8_trim(s8_t string); +fn s8_t s8_trim_end(s8_t string); +fn s8_t s8_cut_start(s8_t *in, i64 size); +fn s8_t s8_cut_end(s8_t *in, i64 size); +// +// formatting +fn void s8_normalize_path_unsafe(s8_t s); +fn s8_t s8_normalize_path(ma_arena_t *ma, s8_t s); +fn s8_t s8_to_lower_case(ma_arena_t *ma, s8_t s); +fn s8_t s8_to_upper_case(ma_arena_t *ma, s8_t s); +fn s8_t s8_vfmt(ma_arena_t *ma, const char *str, va_list args1); +fn s8_t s8_printf(ma_arena_t *ma, const char *str, ...); + +// +// string builder +#define sb8(ARENA) &(sb8_t){.arena = arena} +#define sb8_serial_begin(ARENA) &(sb8_t){.arena = ARENA} +#define sb8_serial_end(ARENA, SB) sb8_merge(ARENA, SB) + +fn s8_t sb8_printf(sb8_t *sb, const char *str, ...); +fn sb8_node_t *sb8_append(sb8_t *list, s8_t string); +fn sb8_node_t *sb8_create_node(ma_arena_t *ma, s8_t str); + +fn s8_t sb8_merge(ma_arena_t *arena, sb8_t *sb); +fn void sb8_indent(sb8_t *sb); +fn s8_t sb8_stmtf(sb8_t *sb, const char *str, ...); +fn int64_t sb8_char_size(sb8_t *sb); + +#if 0 +sb8_t *sbin_write_begin(ma_arena_t *arena); +s8_t sbin_write_end(sb8_t *sb); + +void *sbin_write_data(sb8_t *sb, void *p, i64 size); +void *sbin_write_size(sb8_t *sb, i64 size); +void *sbin_write_u64(sb8_t *sb, u64 value); +void *sbin_write_u32(sb8_t *sb, u32 value); +void *sbin_write_u16(sb8_t *sb, u16 value); +void *sbin_write_u8(sb8_t *sb, u8 value); +s8_t *sbin_write_s8(sb8_t *sb, s8_t string); +char *sbin_write_str(sb8_t *sb, char *string); + +stream_t sbin_read_begin(void *p, i64 size); +void sbin_read_end(stream_t *stream); +void *sbin_read_data(stream_t *stream, i64 size); +#endif + +// +// other +#define s8_fmtspec(string) (int)(string).len, (string).str +#define S8_CODE(...) s8(#__VA_ARGS__) +#define S8_FILE s8(__FILE__) +#define S8_FILE_AND_LINE s8(FILE_AND_LINE) + +#define S8_FMT(ma, str, result) \ + va_list args1; \ + va_start(args1, str); \ + s8_t result = s8_vfmt(ma, str, args1); \ + va_end(args1) + +#define STR_FMT(buff, str) \ + va_list args1; \ + va_start(args1, str); \ + i32 len = stbsp_vsnprintf(buff, sizeof(buff), str, args1); \ + va_end(args1) + +typedef struct fuzzy_pair_t fuzzy_pair_t; +struct fuzzy_pair_t { + i64 index; + i64 rating; +}; diff --git a/src/core/core_string16.c b/src/core/core_string16.c new file mode 100644 index 0000000..ad652f6 --- /dev/null +++ b/src/core/core_string16.c @@ -0,0 +1,619 @@ +#include "core_string16.h" +#include "core_platform.h" +#include "core_intrin.h" +#include "core_unicode.h" +#include "core_ctx.h" + +fn i64 str16_len(u16 *string) { + i64 len = 0; + while (*string++ != 0) + len++; + return len; +} + +fn u16 char16_to_lower_case(u16 a) { + if (a >= 'A' && a <= 'Z') a += 32; + return a; +} + +fn u16 char16_to_upper_case(u16 a) { + if (a >= 'a' && a <= 'z') a -= 32; + return a; +} + +fn b32 char16_is_whitespace(u16 w) { + b32 result = w == '\n' || w == ' ' || w == '\t' || w == '\v' || w == '\r'; + return result; +} + +fn b32 char16_is_alphabetic(u16 a) { + b32 result = (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'); + return result; +} + +fn b32 char16_is_ident(u16 a) { + b32 result = (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') || a == '_'; + return result; +} + +fn b32 char16_is_digit(u16 a) { + b32 result = a >= '0' && a <= '9'; + return result; +} + +fn b32 char16_is_symbol(u16 w) { + b32 result = (w >= '!' && w <= '/') || (w >= ':' && w <= '@') || (w >= '[' && w <= '`') || (w >= '{' && w <= '~'); + return result; +} + +fn b32 char16_is_non_word(u16 w) { + b32 result = w != '_' && (char16_is_symbol(w) || char16_is_whitespace(w)); + return result; +} + +fn b32 char16_is_word(u16 w) { + b32 result = !char16_is_non_word(w); + return result; +} + +fn b32 char16_is_alphanumeric(u16 a) { + b32 result = char16_is_digit(a) || char16_is_alphabetic(a); + return result; +} + +fn s16_t s16_from_range(u16 *begin, u16 *end) { + assert_expr(end >= begin); + intptr_t size = (intptr_t)end - (intptr_t)begin; + s16_t result = {begin, size / 2}; + return result; +} + +fn s16_t s16_from_str16(u16 *string) { + s16_t result; + result.str = string; + result.len = str16_len(string); + return result; +} + +fn s16_t s16_copy(ma_arena_t *ma, s16_t string) { + i64 byte_size = sizeof(u16) * string.len; + u16 *copy = (u16 *)ma_push_size(ma, byte_size + sizeof(u16)); + memory_copy(copy, string.str, byte_size); + copy[string.len] = 0; + s16_t result = s16_make(copy, string.len); + return result; +} + +fn s16_t s16_copy_str16(ma_arena_t *ma, u16 *s) { + return s16_copy(ma, s16_make(s, str16_len(s))); +} + +fn b32 s16_are_equal_ex(s16_t a, s16_t b, b32 ignore_case) { + if (a.len != b.len) return false; + for (i64 i = 0; i < a.len; i++) { + u16 A = a.str[i]; + u16 B = b.str[i]; + if (ignore_case) { + A = char16_to_lower_case(A); + B = char16_to_lower_case(B); + } + if (A != B) + return false; + } + return true; +} + +fn b32 s16_are_equal(s16_t a, s16_t b) { + return s16_are_equal_ex(a, b, false); +} + +fn s16_t s16_from_s8(ma_arena_t *ma, s8_t string) { + u16 *buffer = ma_push_array(ma, u16, string.len + 1); + i64 len = wstr_from_str(buffer, string.len + 1, string.str, string.len); + assert(len <= string.len); // @todo: verify + return (s16_t){buffer, len}; +} + +fn s8_t s8_from_s16(ma_arena_t *ma, s16_t string) { + i64 buffer_size = (string.len + 1) * 2; + char *buffer = ma_push_array(ma, char, buffer_size); + i64 len = str_from_wstr(buffer, buffer_size, string.str, string.len); + assert(len < buffer_size); + return (s8_t){buffer, len}; +} + +fn s16_t s16_get_postfix(s16_t string, i64 len) { + len = CLAMP_TOP(len, string.len); + i64 remain_len = string.len - len; + s16_t result = s16_make(string.str + remain_len, len); + return result; +} + +fn s16_t s16_get_prefix(s16_t string, i64 len) { + len = CLAMP_TOP(len, string.len); + s16_t result = s16_make(string.str, len); + return result; +} + +fn s16_t s16_chop(s16_t string, i64 len) { + len = CLAMP_TOP(len, string.len); + s16_t result = s16_make(string.str, string.len - len); + return result; +} + +fn s16_t s16_skip(s16_t string, i64 len) { + len = CLAMP_TOP(len, string.len); + i64 remain = string.len - len; + s16_t result = s16_make(string.str + len, remain); + return result; +} + +fn b32 s16_ends_with_ex(s16_t a, s16_t end, b32 ignore_case) { + s16_t a_end = s16_get_postfix(a, end.len); + b32 result = s16_are_equal_ex(end, a_end, ignore_case); + return result; +} + +fn b32 s16_starts_with_ex(s16_t a, s16_t start, b32 ignore_case) { + s16_t a_start = s16_get_prefix(a, start.len); + b32 result = s16_are_equal_ex(start, a_start, ignore_case); + return result; +} + +fn b32 s16_ends_with(s16_t a, s16_t end) { + return s16_ends_with_ex(a, end, false); +} + +fn b32 s16_starts_with(s16_t a, s16_t start) { + return s16_ends_with_ex(a, start, false); +} + +fn void s16_normalize_path_unsafe(s16_t s) { + for (i64 i = 0; i < s.len; i++) { + if (s.str[i] == '\\') + s.str[i] = '/'; + } +} + +fn s16_t s16_normalize_path(ma_arena_t *ma, s16_t s) { + s16_t copy = s16_copy(ma, s); + s16_normalize_path_unsafe(copy); + return copy; +} + +fn b32 s16_is_pointer_inside(s16_t string, u16 *p) { + uintptr_t pointer = (uintptr_t)p; + uintptr_t start = (uintptr_t)string.str; + uintptr_t stop = start + (uintptr_t)string.len * sizeof(u16); + b32 result = pointer >= start && pointer < stop; + return result; +} + +fn s16_t s16_cut_start(s16_t *in, i64 size) { + s16_t result = s16_get_prefix(*in, size); + *in = s16_skip(*in, result.len); + return result; +} + +fn s16_t s16_cut_end(s16_t *in, i64 size) { + s16_t result = s16_get_postfix(*in, size); + *in = s16_chop(*in, result.len); + return result; +} + +fn s16_t s16_slice(s16_t string, i64 first_index, i64 one_past_last_index) { + if (one_past_last_index < 0) one_past_last_index = string.len + one_past_last_index + 1; + if (first_index < 0) first_index = string.len + first_index; + assert(first_index < one_past_last_index); + assert(string.len > 0); + s16_t result = string; + if (string.len > 0) { + if (one_past_last_index > first_index) { + first_index = CLAMP_TOP(first_index, string.len - 1); + one_past_last_index = CLAMP_TOP(one_past_last_index, string.len); + result.str += first_index; + result.len = one_past_last_index - first_index; + } + else { + result.len = 0; + } + } + return result; +} + +fn s16_t s16_trim(s16_t string) { + if (string.len == 0) + return string; + + i64 whitespace_begin = 0; + for (; whitespace_begin < string.len; whitespace_begin++) { + if (!char16_is_whitespace(string.str[whitespace_begin])) { + break; + } + } + + i64 whitespace_end = string.len; + for (; whitespace_end != whitespace_begin; whitespace_end--) { + if (!char16_is_whitespace(string.str[whitespace_end - 1])) { + break; + } + } + + if (whitespace_begin == whitespace_end) { + string.len = 0; + } + else { + string = s16_slice(string, whitespace_begin, whitespace_end); + } + + return string; +} + +fn s16_t s16_trim_end(s16_t string) { + i64 whitespace_end = string.len; + for (; whitespace_end != 0; whitespace_end--) { + if (!char16_is_whitespace(string.str[whitespace_end - 1])) { + break; + } + } + + s16_t result = s16_get_prefix(string, whitespace_end); + return result; +} + +fn b32 s16_seek(s16_t string, s16_t find, s16_seek_t flags, int64_t *index_out) { + b32 ignore_case = flags & s16_seek_ignore_case ? true : false; + b32 result = false; + if (flags & s16_seek_match_find_last) { + for (int64_t i = string.len; i != 0; i--) { + int64_t index = i - 1; + s16_t substring = s16_slice(string, index, index + find.len); + if (s16_are_equal_ex(substring, find, ignore_case)) { + if (index_out) + *index_out = index; + result = true; + break; + } + } + } + else { + for (int64_t i = 0; i < string.len; i++) { + s16_t substring = s16_slice(string, i, i + find.len); + if (s16_are_equal_ex(substring, find, ignore_case)) { + if (index_out) + *index_out = i; + result = true; + break; + } + } + } + + return result; +} + +fn int64_t s16_find(s16_t string, s16_t find, s16_seek_t flag) { + int64_t result = -1; + s16_seek(string, find, flag, &result); + return result; +} + +fn s16_t s16_chop_last_char(s16_t s, s16_t ch) { + s16_t result = s; + s16_seek(s, ch, s16_seek_match_find_last, &result.len); + return result; +} + +fn s16_t s16_chop_last_slash(s16_t s) { + return s16_chop_last_char(s, s16("/")); +} + +fn s16_t s16_chop_last_period(s16_t s) { + return s16_chop_last_char(s, s16(".")); +} + +fn s16_t s16_skip_to_last_char(s16_t s, s16_t ch) { + int64_t pos; + s16_t result = s; + if (s16_seek(s, ch, s16_seek_match_find_last, &pos)) { + result = s16_skip(result, pos + 1); + } + return result; +} + +fn s16_t s16_skip_to_last_slash(s16_t s) { + return s16_skip_to_last_char(s, s16("/")); +} + +fn s16_t s16_skip_to_last_period(s16_t s) { + return s16_skip_to_last_char(s, s16(".")); +} + +fn s16_t s16_get_name_no_ext(s16_t s) { + return s16_skip_to_last_slash(s16_chop_last_period(s)); +} + +fn s16_t s16_to_lower_case(ma_arena_t *ma, s16_t s) { + s16_t copy = s16_copy(ma, s); + for (int64_t i = 0; i < copy.len; i++) { + copy.str[i] = char16_to_lower_case(copy.str[i]); + } + return copy; +} + +fn s16_t s16_to_upper_case(ma_arena_t *ma, s16_t s) { + s16_t copy = s16_copy(ma, s); + for (int64_t i = 0; i < copy.len; i++) { + copy.str[i] = char16_to_upper_case(copy.str[i]); + } + return copy; +} + +fn s16_t s16_printf(ma_arena_t *ma, const char *str, ...) { + ma_temp_t scratch = ma_begin_scratch1(ma); + S8_FMT(scratch.arena, str, result); + s16_t result16 = s16_from_s8(ma, result); + ma_end_scratch(scratch); + return result16; +} + +fn u64 u64_from_s16(s16_t s, u64 base) { + assert(base >= 2 && base <= 16); + u64 acc = 0; + for (i64 i = 0; i < s.len; i++) { + u64 num = u64_from_hexchar((char)s.str[i]); + assert(num < base); + acc *= base; + acc += num; + } + return acc; +} + +fn f64 f64_from_s16(s16_t string) { + ma_temp_t scratch = ma_begin_scratch(); + s8_t num_string = s8_from_s16(scratch.arena, string); + f64 result = os_parse_float(num_string.str); + ma_end_scratch(scratch); + return result; +} + +gb_read_only i64 s16_fuzzy_closer_word_begin = 5; +gb_read_only i64 s16_fuzzy_consecutive_multiplier = 3; +fn i64 s16_fuzzy_rate(s16_t string, s16_t with) { + if (with.len == 0) return 0; + + i64 points = 0; + i64 consecutive = 0; + i64 with_i = 0; + for (i64 i = 0; i < string.len; i++) { + if (string.str[i] == with.str[with_i]) { + i64 closer_begin = CLAMP_BOT((i64)0, s16_fuzzy_closer_word_begin - i); + points += closer_begin; + consecutive++; + with_i += 1; + } else { + points += consecutive * s16_fuzzy_consecutive_multiplier; + consecutive = 0; + with_i = 0; + } + + if (with_i >= with.len) with_i = 0; + } + points += consecutive * s16_fuzzy_consecutive_multiplier; + return points; +} + +fn fuzzy_pair_t *s16_fuzzy_rate_array(ma_arena_t *arena, s16_t needle, s16_t *array, i32 len) { + fuzzy_pair_t *pairs = ma_push_array(arena, fuzzy_pair_t, len); + for (i32 i = 0; i < len; i += 1) { + pairs[i].rating = s16_fuzzy_rate(array[i], needle); + pairs[i].index = i; + } + + for (i32 i = 0; i < len - 1; i++) { + for (i32 j = 0; j < len - 1; j++) { + if (pairs[j].rating < pairs[j + 1].rating) { + SWAP(fuzzy_pair_t, pairs[j], pairs[j + 1]); + } + } + } + + return pairs; +} + +fn sb16_node_t *sb16_create_node(ma_arena_t *ma, s16_t str) { + sb16_node_t *node = ma_push_type(ma, sb16_node_t); + node->string = str; + return node; +} + +fn sb16_node_t *sb16_append(sb16_t *list, s16_t string) { + assert(list->arena != NULL); + sb16_node_t *node = sb16_create_node(list->arena, string); + SLLQ_APPEND(list->first, list->last, node); + return node; +} + +fn s16_t sb16_printf(sb16_t *sb, const char *str, ...) { + ma_temp_t scratch = ma_begin_scratch1(sb->arena); + S8_FMT(scratch.arena, str, result); + s16_t result16 = s16_from_s8(sb->arena, result); + sb16_append(sb, result16); + ma_end_scratch(scratch); + return result16; +} + +fn void sb16_indent(sb16_t *sb) { + sb16_printf(sb, "\n%.*s", sb->indent*4, " "); +} + +fn s16_t sb16_stmtf(sb16_t *sb, const char *str, ...) { + ma_temp_t scratch = ma_begin_scratch1(sb->arena); + S8_FMT(scratch.arena, str, result); + s16_t result16 = s16_from_s8(sb->arena, result); + sb16_indent(sb); + sb16_append(sb, result16); + ma_end_scratch(scratch); + return result16; +} + +fn int64_t sb16_char_size(sb16_t *sb) { + int64_t result = 0; + for (sb16_node_t *it = sb->first; it; it = it->next) { + result += it->len; + } + return result; +} + +fn s16_t sb16_merge(ma_arena_t *arena, sb16_t *sb) { + int64_t size = sb16_char_size(sb) + 1; + i64 byte_size = size * sizeof(u16); + u16 *str = ma_push_size(arena, byte_size); + s16_t result = {str, 0}; + for (sb16_node_t *it = sb->first; it; it = it->next) { + memory_copy(result.str + result.len, it->str, it->len * sizeof(u16)); + result.len += it->len; + } + result.str[result.len] = 0; + return result; +} + +fn sb16_t s16_split(ma_arena_t *ma, s16_t string, s16_t find, s16_split_t flags) { + sb16_t result = (sb16_t){ma}; + int64_t index = 0; + + s16_seek_t find_flag = flags & s16_split_ignore_case ? s16_seek_ignore_case : s16_seek_none; + while (s16_seek(string, find, find_flag, &index)) { + s16_t before_match = s16_make(string.str, index); + sb16_append(&result, before_match); + if (flags & s16_split_inclusive) { + s16_t match = s16_make(string.str + index, find.len); + sb16_append(&result, match); + } + string = s16_skip(string, index + find.len); + } + if (string.len) sb16_append(&result, string); + return result; +} + +fn s16_t s16_copy_ex(alo_t ma, s16_t string) { + i64 byte_size = sizeof(u16) * string.len; + u16 *copy = (u16 *)alloc_size(ma, byte_size + sizeof(u16)); + memory_copy(copy, string.str, byte_size); + copy[string.len] = 0; + s16_t result = s16_make(copy, string.len); + return result; +} + +fn_test void test_string16(void) { + ma_temp_t scratch = ma_begin_scratch(); + + // string16 lit basic tests + { + s16_t a = s16("memes"); + assert(a.len == 5); + assert(a.str[0] == char16('m')); + assert(a.str[4] == char16('s')); + s16_t b = s16("not memes"); + s16_t c = s16("MEMES"); + assert(s16_are_equal(a, b) == false); + assert(s16_are_equal(a, a) == true); + assert(s16_are_equal_ex(a, c, true) == true); + } + + { + assert(char16_to_upper_case('a') == char16('A')); + assert(char16_to_upper_case('a') == 'A'); + assert(char16_to_upper_case(char16('a')) == 'A'); + assert(char16_is_digit('3')); + } + + { + s16_t a = s16_from_str16(str16("memes")); + assert(a.len == 5); + assert(s16_are_equal(a, s16("memes")) == true); + + s16_t b = s16_copy(scratch.arena, a); + assert(a.str != b.str); + assert(b.len == a.len); + assert(s16_are_equal(a, b)); + + s16_t c = s16_from_range(a.str, a.str + a.len); + assert(s16_are_equal(a, c)); + } + + { + s16_t a = s16("thing itself"); + assert(s16_starts_with_ex(a, s16("thing"), false)); + assert(!s16_starts_with_ex(a, s16("thing itself and"), false)); + assert(!s16_starts_with_ex(a, s16("thing itself "), false)); + assert(s16_starts_with_ex(a, s16("THING"), true)); + assert(!s16_starts_with_ex(a, s16("a"), false)); + + assert(s16_ends_with_ex(a, s16("itself"), false)); + assert(s16_ends_with_ex(a, s16("thing itself"), false)); + assert(!s16_ends_with_ex(a, s16("thing itselfa"), false)); + + s16_t b = s16("memes"); + assert(s16_is_pointer_inside(b, b.str)); + assert(s16_is_pointer_inside(b, b.str + 4)); + assert(!s16_is_pointer_inside(b, b.str + 5)); + } + + { + s16_t a = s16("C:\\Program Files\\Memes"); + u16 memes[256] = {0}; + memory_copy(memes, a.str, a.len * 2 + 2); + s16_t b = s16_make(memes, a.len); + + s16_normalize_path_unsafe(b); + assert(b.str[2] == '/'); + } + + { + s16_t a = s16(" thing "); + s16_t b = s16_trim(a); + assert(s16_are_equal(b, s16("thing"))); + } + + { + s16_t a = s16_printf(scratch.arena, "%d", 432); + assert(s16_are_equal(a, s16("432"))); + assert(f64_from_s16(s16("432.0")) == 432.0); + assert(u64_from_s16(s16("432"), 10) == 432); + } + + { + sb16_t *list = sb16_serial_begin(scratch.arena); + sb16_printf(list, "%d ", 987); + sb16_printf(list, "ter "); + sb16_printf(list, "|"); + s16_t string = sb16_serial_end(scratch.arena, list); + assert(s16_are_equal(string, s16("987 ter |"))); + } + + { + s16_t a = s16("A|B|dek|mek|vek|"); + sb16_t b = s16_split(scratch.arena, a, s16("|"), s16_split_none); + assert(s16_are_equal(b.first->string, s16("A"))); + assert(s16_are_equal(b.first->next->string, s16("B"))); + assert(s16_are_equal(b.first->next->next->string, s16("dek"))); + assert(s16_are_equal(b.first->next->next->next->string, s16("mek"))); + assert(s16_are_equal(b.first->next->next->next->next->string, s16("vek"))); + assert(b.first->next->next->next->next->next == NULL); + } + + { + s16_t a = s16_to_upper_case(scratch.arena, s16("thing Meme")); + assert(s16_are_equal(a, s16("THING MEME"))); + + a = s16_to_lower_case(scratch.arena, s16("THING Meme")); + assert(s16_are_equal(a, s16("thing meme"))); + } + + { + s16_t a = s16("C:/thing/itself"); + assert(s16_are_equal(s16_chop_last_slash(a), s16("C:/thing"))); + } + + ma_end_scratch(scratch); +} diff --git a/src/core/core_string16.h b/src/core/core_string16.h new file mode 100644 index 0000000..9ceeaf8 --- /dev/null +++ b/src/core/core_string16.h @@ -0,0 +1,128 @@ +#pragma once +#include "core_basic.h" +#include "core_arena.h" +#include "core_string.h" + +typedef struct s16_t s16_t; +struct s16_t { + u16 *str; + i64 len; +}; + +typedef struct sb16_node_t sb16_node_t; +struct sb16_node_t { + sb16_node_t *next; + union { + struct { u16 *str; int64_t len; }; + s16_t string; + }; +}; + +typedef struct sb16_t sb16_t; +struct sb16_t { + ma_arena_t *arena; + sb16_node_t *first; + sb16_node_t *last; + + // WARNING: remember to update typeinfo after editing this + i32 indent; +}; + +typedef i32 s16_seek_t; +enum { + s16_seek_none = 0, + s16_seek_ignore_case = 1, + s16_seek_match_find_last = 2, +}; + +typedef i32 s16_split_t; +enum { + s16_split_none = 0, + s16_split_ignore_case = 1, + s16_split_inclusive = 2, +}; + +enum { s16_ignore_case = 1 }; + + +typedef struct s32_t s32_t; +struct s32_t { + u32 *str; + i64 len; +}; + +#define s16_make(str,len) (s16_t){str, len} + +#define s16(str) (s16_t){(u16 *)u##str, lengthof(str) - 1} +#define s16_const(string) { (u16 *)u##string, lengthof(string) - 1 } +#define s16_invalid s16_lit("") +#define s16_null (s16_t){0} + +#define str16(str) ((u16 *)u##str) +#define char16(str) ((u16)u##str) + +#define sb16(ARENA) &(sb16_t){.arena = arena} +#define sb16_serial_begin(ARENA) &(sb16_t){.arena = ARENA} +#define sb16_serial_end(ARENA, SB) sb16_merge(ARENA, SB) + +fn i64 str16_len(u16 *string); +fn u16 char16_to_lower_case(u16 a); +fn u16 char16_to_upper_case(u16 a); +fn b32 char16_is_whitespace(u16 w); +fn b32 char16_is_alphabetic(u16 a); +fn b32 char16_is_ident(u16 a); +fn b32 char16_is_digit(u16 a); +fn b32 char16_is_symbol(u16 w); +fn b32 char16_is_non_word(u16 w); +fn b32 char16_is_word(u16 w); +fn b32 char16_is_alphanumeric(u16 a); +fn s16_t s16_from_range(u16 *begin, u16 *end); +fn s16_t s16_from_str16(u16 *string); +fn s16_t s16_copy(ma_arena_t *ma, s16_t string); +fn s16_t s16_copy_str16(ma_arena_t *ma, u16 *s); +fn b32 s16_are_equal_ex(s16_t a, s16_t b, b32 ignore_case); +fn b32 s16_are_equal(s16_t a, s16_t b); +fn s16_t s16_from_s8(ma_arena_t *ma, s8_t string); +fn s8_t s8_from_s16(ma_arena_t *ma, s16_t string); +fn s16_t s16_get_postfix(s16_t string, i64 len); +fn s16_t s16_get_prefix(s16_t string, i64 len); +fn s16_t s16_chop(s16_t string, i64 len); +fn s16_t s16_skip(s16_t string, i64 len); +fn b32 s16_ends_with_ex(s16_t a, s16_t end, b32 ignore_case); +fn b32 s16_starts_with_ex(s16_t a, s16_t start, b32 ignore_case); +fn b32 s16_ends_with(s16_t a, s16_t end); +fn b32 s16_starts_with(s16_t a, s16_t start); +fn void s16_normalize_path_unsafe(s16_t s); +fn s16_t s16_normalize_path(ma_arena_t *ma, s16_t s); +fn b32 s16_is_pointer_inside(s16_t string, u16 *p); +fn s16_t s16_cut_start(s16_t *in, i64 size); +fn s16_t s16_cut_end(s16_t *in, i64 size); +fn s16_t s16_slice(s16_t string, i64 first_index, i64 one_past_last_index); +fn s16_t s16_trim(s16_t string); +fn s16_t s16_trim_end(s16_t string); +fn b32 s16_seek(s16_t string, s16_t find, s16_seek_t flags, int64_t *index_out); +fn int64_t s16_find(s16_t string, s16_t find, s16_seek_t flag); +fn s16_t s16_chop_last_char(s16_t s, s16_t ch); +fn s16_t s16_chop_last_slash(s16_t s); +fn s16_t s16_chop_last_period(s16_t s); +fn s16_t s16_skip_to_last_char(s16_t s, s16_t ch); +fn s16_t s16_skip_to_last_slash(s16_t s); +fn s16_t s16_skip_to_last_period(s16_t s); +fn s16_t s16_get_name_no_ext(s16_t s); +fn s16_t s16_to_lower_case(ma_arena_t *ma, s16_t s); +fn s16_t s16_to_upper_case(ma_arena_t *ma, s16_t s); +fn s16_t s16_printf(ma_arena_t *ma, const char *str, ...); +fn u64 u64_from_s16(s16_t s, u64 base); +fn f64 f64_from_s16(s16_t string); +fn i64 s16_fuzzy_rate(s16_t string, s16_t with); +fn fuzzy_pair_t *s16_fuzzy_rate_array(ma_arena_t *arena, s16_t needle, s16_t *array, i32 len); +fn sb16_node_t *sb16_create_node(ma_arena_t *ma, s16_t str); +fn sb16_node_t *sb16_append(sb16_t *list, s16_t string); +fn s16_t sb16_printf(sb16_t *sb, const char *str, ...); +fn void sb16_indent(sb16_t *sb); +fn s16_t sb16_stmtf(sb16_t *sb, const char *str, ...); +fn int64_t sb16_char_size(sb16_t *sb); +fn s16_t sb16_merge(ma_arena_t *arena, sb16_t *sb); +fn sb16_t s16_split(ma_arena_t *ma, s16_t string, s16_t find, s16_split_t flags); +fn s16_t s16_copy_ex(alo_t ma, s16_t string); +fn_test void test_string16(void); diff --git a/src/core/core_type_info.c b/src/core/core_type_info.c new file mode 100644 index 0000000..1938536 --- /dev/null +++ b/src/core/core_type_info.c @@ -0,0 +1,466 @@ +#include "core_type_info.h" +#include "core_platform.h" +#include "core_log.h" +#include "core_lexer.h" + +fn s8_t ti_enum_value_to_name(i64 value, type_t *type) { + assert(type->kind == type_kind_enum); + for (i32 i = 0; i < type->count; i += 1) { + type_member_t *it = type->members + i; + if (value == it->value) { + return it->name; + } + } + return s8("invalid"); +} + +fn i64 ti_enum_name_to_value(s8_t name, type_t *type) { + assert(type->kind == type_kind_enum); + for (i32 i = 0; i < type->count; i += 1) { + type_member_t *it = type->members + i; + if (s8_are_equal(it->name, name)) { + return it->value; + } + } + return -1; +} + +fn i64 ti_enum_read_value(void *p, type_t *type) { + assert(type->kind == type_kind_enum); + i64 value = 0; + if (type->size == 1) { + value = *(i8 *)p; + } else if (type->size == 2) { + value = *(i16 *)p; + } else if (type->size == 4) { + value = *(i32 *)p; + } else if (type->size == 8) { + value = *(i64 *)p; + } else { + fatalf("invalid size of enum: %d", type->size); + } + return value; +} + +fn void ti_enum_write_value(void *p, i64 value, type_t *type) { + assert(type->kind == type_kind_enum); + if (type->size == 1) { + *(i8 *)p = (i8)value; + } else if (type->size == 2) { + *(i16 *)p = (i16)value; + } else if (type->size == 4) { + *(i32 *)p = (i32)value; + } else if (type->size == 8) { + *(i64 *)p = (i64)value; + } else { + fatalf("invalid size of enum: %d", type->size); + } +} + +fn i64 ti_enum_next_value(i64 value, type_t *type) { + assert(type->kind == type_kind_enum); + i32 next_i = 0; + for (i32 i = 0; i < type->count; i += 1) { + type_member_t *it = type->members + i; + if (value == it->value) { + if (i + 1 < type->count) { + next_i = i + 1; + break; + } + } + } + + type_member_t *tm = type->members + next_i; + return tm->value; +} + +fn type_member_t *ti_get_member(s8_t name, type_t *type) { + for (i32 i = 0; i < type->count; i += 1) { + type_member_t *it = type->members + i; + if (s8_are_equal(it->name, name)) { + return it; + } + } + return NULL; +} + +fn void *ti_extract_member(void *p, type_member_t *tm) { + u8 *p8 = (u8 *)p; + u8 *result = p8 + tm->offset; + return result; +} + +fn void *ti_extract_array_idx(void *p, type_t *type, i32 idx) { + assert(idx < type->count); + + u8 *p8 = (u8 *)p; + u8 *result = p8 + type->base->size * idx; + return result; +} + +fn void ti__serial_data_ex(sb8_t *sb, void *p, type_t *type) { + assert(type->kind != type_kind_invalid); + + switch(type->kind) { + case type_kind_i8: { + i8 n = *(i8 *)p; + sb8_printf(sb, "%d", n); + return; + } break; + case type_kind_i16: { + i16 n = *(i16 *)p; + sb8_printf(sb, "%d", n); + return; + } break; + case type_kind_i32: { + i32 n = *(i32 *)p; + sb8_printf(sb, "%d", n); + return; + } break; + case type_kind_i64: { + i64 n = *(i64 *)p; + sb8_printf(sb, "%lld", (long long)n); + return; + } break; + case type_kind_u8: { + u8 n = *(u8 *)p; + sb8_printf(sb, "%u", n); + return; + } break; + case type_kind_u16: { + u16 n = *(u16 *)p; + sb8_printf(sb, "%u", n); + return; + } break; + case type_kind_u32: { + u32 n = *(u32 *)p; + sb8_printf(sb, "%u", n); + return; + } break; + case type_kind_u64: { + u64 n = *(u64 *)p; + sb8_printf(sb, "%llu", (unsigned long long)n); + return; + } break; + case type_kind_b8: { + b8 n = *(b8 *)p; + sb8_printf(sb, "%d", n); + return; + } break; + case type_kind_b16: { + b16 n = *(b16 *)p; + sb8_printf(sb, "%d", n); + return; + } break; + case type_kind_b32: { + b32 n = *(b32 *)p; + sb8_printf(sb, "%d", n); + return; + } break; + case type_kind_b64: { + b64 n = *(b64 *)p; + sb8_printf(sb, "%lld", (long long)n); + return; + } break; + case type_kind_f32: { + f32 n = *(f32 *)p; + sb8_printf(sb, "%f", n); + return; + } break; + case type_kind_f64: { + f64 n = *(f64 *)p; + sb8_printf(sb, "%f", n); + return; + } break; + case type_kind_isize: { + isize n = *(isize *)p; + sb8_printf(sb, "%lld", (long long)n); + return; + } break; + case type_kind_usize: { + usize n = *(usize *)p; + sb8_printf(sb, "%llu", (unsigned long long)n); + return; + } break; + case type_kind_int: { + int n = *(int *)p; + sb8_printf(sb, "%d", n); + return; + } break; + case type_kind_char: { + char n = *(char *)p; + sb8_printf(sb, "%c", n); + return; + } break; + } + + if (type == &type__s8_t) { + s8_t n = *(s8_t *)p; + sb8_printf(sb, "\"%S\"", n); + return; + } + + + if (type->kind == type_kind_pointer) { + sb8_printf(sb, "0x%x", p); + return; + } + + if (type->kind == type_kind_enum) { + i64 value = ti_enum_read_value(p, type); + s8_t s = ti_enum_value_to_name(value, type); + sb8_append(sb, s); + return; + } + + if (type->kind == type_kind_array) { + sb8_printf(sb, "{"); + sb->indent += 1; + for (i32 i = 0; i < type->count; i += 1) { + void *mem_p = ti_extract_array_idx(p, type, i); + sb8_indent(sb); + ti__serial_data_ex(sb, mem_p, type->base); + sb8_printf(sb, ","); + } + sb->indent -= 1; + sb8_stmtf(sb, "}"); + return; + } + + if (type->kind == type_kind_struct) { + sb8_printf(sb, "{"); + sb->indent += 1; + for (i32 i = 0; i < type->count; i += 1) { + type_member_t *mem = type->members + i; + void *mem_p = ti_extract_member(p, mem); + sb8_indent(sb); + sb8_printf(sb, "%S: ", mem->name); + ti__serial_data_ex(sb, mem_p, mem->type); + sb8_printf(sb, ","); + } + sb->indent -= 1; + sb8_stmtf(sb, "}"); + return; + } + + fatalf("can't serialize: unhandled type"); +} + +fn s8_t ti__serial_data(ma_arena_t *arena, void *p, type_t *type) { + ma_temp_t scratch = ma_begin_scratch1(arena); + sb8_t *sb = sb8_serial_begin(scratch.arena); + ti__serial_data_ex(sb, p, type); + s8_t string = sb8_serial_end(arena, sb); + ma_end_scratch(scratch); + return string; +} + +fn i64 ti__parser_match_i64(parser_t *par) { + i64 minus = 1; + if (parser_match(par, lex_kind_minus)) { + minus = -1; + } + lex_t *token = parser_expect(par, lex_kind_integer); + i64 result = (i64)token->integer * minus; + return result; +} + +fn void ti__deserial_data_ex(ma_arena_t *arena, parser_t *par, void *p, type_t *type) { + switch(type->kind) { + case type_kind_i8: { + i8 *n = (i8 *)p; + n[0] = (i8)ti__parser_match_i64(par); + return; + } break; + case type_kind_i16: { + i16 *n = (i16 *)p; + n[0] = (i16)ti__parser_match_i64(par); + return; + } break; + case type_kind_i32: { + i32 *n = (i32 *)p; + n[0] = (i32)ti__parser_match_i64(par); + return; + } break; + case type_kind_i64: { + i64 *n = (i64 *)p; + n[0] = (i64)ti__parser_match_i64(par); + return; + } break; + case type_kind_b8: { + b8 *n = (b8 *)p; + n[0] = (b8)ti__parser_match_i64(par); + return; + } break; + case type_kind_b16: { + b16 *n = (b16 *)p; + n[0] = (b16)ti__parser_match_i64(par); + return; + } break; + case type_kind_b32: { + b32 *n = (b32 *)p; + n[0] = (b32)ti__parser_match_i64(par); + return; + } break; + case type_kind_b64: { + b64 *n = (b64 *)p; + n[0] = (b64)ti__parser_match_i64(par); + return; + } break; + case type_kind_u8: { + lex_t *token = parser_expect(par, lex_kind_integer); + u8 *n = (u8 *)p; + n[0] = (u8)token->integer; + return; + } break; + case type_kind_u16: { + lex_t *token = parser_expect(par, lex_kind_integer); + u16 *n = (u16 *)p; + n[0] = (u16)token->integer; + return; + } break; + case type_kind_u32: { + lex_t *token = parser_expect(par, lex_kind_integer); + u32 *n = (u32 *)p; + n[0] = (u32)token->integer; + return; + } break; + case type_kind_u64: { + lex_t *token = parser_expect(par, lex_kind_integer); + u64 *n = (u64 *)p; + n[0] = (u64)token->integer; + return; + } break; + case type_kind_f32: { + lex_t *token = parser_expect(par, lex_kind_real); + f32 *n = (f32 *)p; + n[0] = (f32)token->real; + return; + } break; + case type_kind_f64: { + lex_t *token = parser_expect(par, lex_kind_real); + f64 *n = (f64 *)p; + n[0] = token->real; + return; + } break; + case type_kind_isize: { + isize *n = (isize *)p; + n[0] = (isize)ti__parser_match_i64(par); + return; + } break; + case type_kind_usize: { + lex_t *token = parser_expect(par, lex_kind_integer); + usize *n = (usize *)p; + n[0] = (usize)token->integer; + return; + } break; + case type_kind_int: { + int *n = (int *)p; + n[0] = (int)ti__parser_match_i64(par); + return; + } break; + case type_kind_char: { + char *n = (char *)p; + n[0] = (char)ti__parser_match_i64(par); + return; + } break; + } + + if (type == &type__s8_t) { + lex_t *token = parser_expect(par, lex_kind_string); + s8_t *n = (s8_t *)p; + n[0] = s8_copy(arena, token->string); + return; + } + + if (type->kind == type_kind_enum) { + lex_t *token = parser_expect(par, lex_kind_ident); + i64 value = ti_enum_name_to_value(token->string, type); + if (value == -1) { + fatalf("invalid enum value: %S", token->string); + } + + ti_enum_write_value(p, value, type); + return; + } + + if (type->kind == type_kind_struct) { +#if 0 + parser_expect(par, lex_kind_open_brace); + while (!parser_match(par, lex_kind_close_brace)) { + lex_t *ident = parser_expect(par, lex_kind_ident); + parser_expect(par, lex_kind_colon); + + type_member_t *mem = ti_get_member(type, ident->string); + if (mem) { + u8 *mem_p = p8 + mem->offset; + ti__deserial_data_ex(arena, par, mem_p, mem->type); + } else { + debugf("deserial - skipping field: %S", ident->string); + parser_eat_until(par, lex_kind_comma); + } + + parser_expect(par, lex_kind_comma); + } + +#else // strict + parser_expect(par, lex_kind_open_brace); + for (i32 i = 0; i < type->count; i += 1) { + type_member_t *mem = type->members + i; + void *memp = ti_extract_member(p, mem); + + lex_t *ident = parser_expect(par, lex_kind_ident); + parser_expect(par, lex_kind_colon); + + expect (s8_are_equal(ident->string, mem->name)) fatalf("expected identifier: %S, got instead %S", mem->name, ident->string); + + ti__deserial_data_ex(arena, par, memp, mem->type); + parser_expect(par, lex_kind_comma); + } + parser_expect(par, lex_kind_close_brace); +#endif + } + + if (type->kind == type_kind_array) { + parser_expect(par, lex_kind_open_brace); + for (i32 i = 0; i < type->count; i += 1) { + void *memp = ti_extract_array_idx(p, type, i); + ti__deserial_data_ex(arena, par, memp, type->base); + parser_expect(par, lex_kind_comma); + } + parser_expect(par, lex_kind_close_brace); + } +} + +fn void *ti__deserial_data(ma_arena_t *arena, s8_t data, type_t *type) { + void *p = ma_push_size(arena, type->size); + ma_temp_t scratch = ma_begin_scratch(); + lex_array_t tokens = lex_tokens(scratch.arena, "data serializing", data); + parser_t *par = parser_make(scratch.arena, tokens.data); + ti__deserial_data_ex(arena, par, p, type); + ma_end_scratch(scratch); + return p; +} + +fn b32 ti_is_basic(type_t *type) { + b32 result = type->kind >= type_kind_first_basic && type->kind <= type_kind_last_basic; + return result; +} + +fn b32 ti_has_type_name(type_t *type) { + b32 result = ti_is_basic(type) || type->kind == type_kind_struct || type->kind == type_kind_enum || type->kind == type_kind_union; + return result; +} + +fn s8_t ti_serial_type(ma_arena_t *arena, type_t *type) { + if (ti_has_type_name(type)) { + return type->name; + } else if (type->kind == type_kind_pointer) { + s8_t name = ti_serial_type(arena, type->base); + return s8_printf(arena, "%S*", name); + } else if (type->kind == type_kind_array) { + s8_t name = ti_serial_type(arena, type->base); + return s8_printf(arena, "%S[%d]", name, type->count); + } else_is_invalid; + return s8_invalid; +} diff --git a/src/core/core_type_info.h b/src/core/core_type_info.h new file mode 100644 index 0000000..24884fb --- /dev/null +++ b/src/core/core_type_info.h @@ -0,0 +1,364 @@ +#pragma once +#include "core_basic.h" +#include "core_arena.h" +#include "core_string.h" +#include "core_string16.h" +#include "core_math.h" + +typedef int type_kind_t; +enum { + type_kind_invalid, + + type_kind_i8, + type_kind_i16, + type_kind_i32, + type_kind_i64, + type_kind_b8, + type_kind_b16, + type_kind_b32, + type_kind_b64, + type_kind_u8, + type_kind_u16, + type_kind_u32, + type_kind_u64, + type_kind_f32, + type_kind_f64, + type_kind_isize, + type_kind_usize, + type_kind_int, + type_kind_char, + type_kind_void, + + type_kind_pointer, + type_kind_array, + type_kind_struct, + type_kind_union, + type_kind_enum, + + type_kind_first_basic = type_kind_i8, + type_kind_last_basic = type_kind_void, +}; + +typedef struct type_t type_t; +struct type_t { + type_kind_t kind; + s8_t name; + i32 size; + i32 count; + struct type_member_t *members; + type_t *base; +}; + +typedef struct type_member_t type_member_t; +struct type_member_t { + s8_t name; + type_t *type; + i64 value; + u64 offset; + b8 dont_serialize; +}; + +typedef struct mt_tweak_t mt_tweak_t; +struct mt_tweak_t { + type_t *type; + s8_t name; + void *ptr; + f32 min, max; +}; +#define mt_embed_file(name, path) +#define mt_tweak_f32(name, default, min, max) +#define mt_tweak_color(name, ...) +#define mt_tweak_b32(name, default) + +// +// serialization to string +#define ti_deserial_data(ARENA, DATA, TYPE) (TYPE *)ti__deserial_data(ARENA, DATA, type(TYPE)) +#define ti_serial_data(ARENA, DATA, TYPE) ti__serial_data(ARENA, DATA, type(TYPE)) + +fn void *ti__deserial_data(ma_arena_t *arena, s8_t data, type_t *type); +fn s8_t ti__serial_data(ma_arena_t *arena, void *p, type_t *type); + +// +// utilities +fn s8_t ti_enum_value_to_name(i64 value, type_t *type); +fn i64 ti_enum_name_to_value(s8_t name, type_t *type); +fn type_member_t *ti_get_member(s8_t name, type_t *type); + +// +// core type info data +#define type(X) (&type__##X) +#define DEFINE_ENUM(x) type_t type__##x = {type_kind_enum, s8_const(#x), sizeof(x), .members = members__##x, .count = lengthof(members__##x)} +#define DEFINE_STRUCT(x) type_t type__##x = {type_kind_struct, s8_const(#x), sizeof(x), .members = members__##x, .count = lengthof(members__##x)} +#define POINTER(x) (type_t){type_kind_pointer, s8_const(#x "*"), sizeof(void *), .base = &type__##x} + +static gb_read_only type_t type__i8 = {type_kind_i8, s8_const("i8"), sizeof(i8)}; +static gb_read_only type_t type__i16 = {type_kind_i16, s8_const("i16"), sizeof(i16)}; +static gb_read_only type_t type__i32 = {type_kind_i32, s8_const("i32"), sizeof(i32)}; +static gb_read_only type_t type__i64 = {type_kind_i64, s8_const("i64"), sizeof(i64)}; +static gb_read_only type_t type__u8 = {type_kind_u8, s8_const("u8"), sizeof(u8)}; +static gb_read_only type_t type__u16 = {type_kind_u16, s8_const("u16"), sizeof(u16)}; +static gb_read_only type_t type__u32 = {type_kind_u32, s8_const("u32"), sizeof(u32)}; +static gb_read_only type_t type__u64 = {type_kind_u64, s8_const("u64"), sizeof(u64)}; +static gb_read_only type_t type__b8 = {type_kind_b8, s8_const("b8"), sizeof(b8)}; +static gb_read_only type_t type__b16 = {type_kind_b16, s8_const("b16"), sizeof(b16)}; +static gb_read_only type_t type__b32 = {type_kind_b32, s8_const("b32"), sizeof(b32)}; +static gb_read_only type_t type__b64 = {type_kind_b64, s8_const("b64"), sizeof(b64)}; +static gb_read_only type_t type__f32 = {type_kind_f32, s8_const("f32"), sizeof(f32)}; +static gb_read_only type_t type__f64 = {type_kind_f64, s8_const("f64"), sizeof(f64)}; +static gb_read_only type_t type__isize = {type_kind_isize, s8_const("isize"), sizeof(isize)}; +static gb_read_only type_t type__usize = {type_kind_usize, s8_const("usize"), sizeof(usize)}; +static gb_read_only type_t type__int = {type_kind_int, s8_const("int"), sizeof(int)}; +static gb_read_only type_t type__char = {type_kind_char, s8_const("char"), sizeof(char)}; +static gb_read_only type_t type__void = {type_kind_void, s8_const("void")}; + +static gb_read_only type_t type__s8_t = { type_kind_struct, s8_const("s8_t"), sizeof(s8_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("str"), &POINTER(char), .offset = offsetof(s8_t, str)}, + {s8_const("len"), &type__i64, .offset = offsetof(s8_t, len)}, + } +}; + +static gb_read_only type_t type__s16_t = { type_kind_struct, s8_const("s16_t"), sizeof(s16_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("str"), &POINTER(u16), .offset = offsetof(s16_t, str)}, + {s8_const("len"), &type__i64, .offset = offsetof(s16_t, len)}, + } +}; + +static gb_read_only type_t type__s32_t = { type_kind_struct, s8_const("s32_t"), sizeof(s32_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("str"), &POINTER(u32), .offset = offsetof(s32_t, str)}, + {s8_const("len"), &type__i64, .offset = offsetof(s32_t, len)}, + } +}; + +static gb_read_only type_t type__ma_arena_t = { type_kind_struct, s8_const("ma_arena_t"), sizeof(ma_arena_t), .count = 6, + .members = (type_member_t[]){ + {s8_const("data"), &POINTER(u8), .offset = offsetof(ma_arena_t, data)}, + {s8_const("len"), &type__usize, .offset = offsetof(ma_arena_t, len)}, + {s8_const("base_len"), &type__usize, .offset = offsetof(ma_arena_t, base_len)}, + {s8_const("reserve"), &type__usize, .offset = offsetof(ma_arena_t, reserve)}, + {s8_const("commit"), &type__usize, .offset = offsetof(ma_arena_t, commit)}, + {s8_const("align"), &type__usize, .offset = offsetof(ma_arena_t, align)}, + } +}; + +static gb_read_only type_t type__sb8_node_t = {type_kind_struct, s8_const("sb8_node_t"), sizeof(sb8_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("next"), &POINTER(sb8_node_t), .offset = offsetof(sb8_node_t, next)}, + {s8_const("string"), &type__s8_t, .offset = offsetof(sb8_node_t, string)}, + } +}; + +static gb_read_only type_t type__sb8_t = { type_kind_struct, s8_const("sb8_t"), sizeof(sb8_t), .count = 4, + .members = (type_member_t[]){ + {s8_const("arena"), &POINTER(ma_arena_t), .offset = offsetof(sb8_t, arena)}, + {s8_const("first"), &POINTER(sb8_node_t), .offset = offsetof(sb8_t, first)}, + {s8_const("last"), &POINTER(sb8_node_t), .offset = offsetof(sb8_t, last)}, + {s8_const("indent"), &type__i32, .offset = offsetof(sb8_t, indent)}, + } +}; + +static gb_read_only type_t type__ma_temp_t = { type_kind_struct, s8_const("ma_temp_t"), sizeof(ma_temp_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("arena"), &POINTER(ma_arena_t), .offset = offsetof(ma_temp_t, arena)}, + {s8_const("len"), &type__usize, .offset = offsetof(ma_temp_t, len)}, + } +}; + +static gb_read_only type_t type__v2f32_t = { type_kind_struct, s8_const("v2f32_t"), sizeof(v2f32_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("x"), &type__f32, .offset = offsetof(v2f32_t, x)}, + {s8_const("y"), &type__f32, .offset = offsetof(v2f32_t, y)}, + } +}; + +static gb_read_only type_t type__v3f32_t = { type_kind_struct, s8_const("v3f32_t"), sizeof(v3f32_t), .count = 3, + .members = (type_member_t[]){ + {s8_const("x"), &type__f32, .offset = offsetof(v3f32_t, x)}, + {s8_const("y"), &type__f32, .offset = offsetof(v3f32_t, y)}, + {s8_const("z"), &type__f32, .offset = offsetof(v3f32_t, z)}, + } +}; + +static gb_read_only type_t type__v4f32_t = { type_kind_struct, s8_const("v4f32_t"), sizeof(v4f32_t), .count = 4, + .members = (type_member_t[]){ + {s8_const("x"), &type__f32, .offset = offsetof(v4f32_t, x)}, + {s8_const("y"), &type__f32, .offset = offsetof(v4f32_t, y)}, + {s8_const("z"), &type__f32, .offset = offsetof(v4f32_t, z)}, + {s8_const("w"), &type__f32, .offset = offsetof(v4f32_t, w)}, + } +}; + +static gb_read_only type_t type__r3f32_t = { type_kind_struct, s8_const("r3f32_t"), sizeof(r3f32_t), .count = 6, + .members = (type_member_t[]){ + {s8_const("x0"), &type__f32, .offset = offsetof(r3f32_t, x0)}, + {s8_const("y0"), &type__f32, .offset = offsetof(r3f32_t, y0)}, + {s8_const("x0"), &type__f32, .offset = offsetof(r3f32_t, z0)}, + {s8_const("x1"), &type__f32, .offset = offsetof(r3f32_t, x1)}, + {s8_const("y1"), &type__f32, .offset = offsetof(r3f32_t, y1)}, + {s8_const("x1"), &type__f32, .offset = offsetof(r3f32_t, z1)}, + } +}; + +static gb_read_only type_member_t members__r2f32_t[] = { + {s8_const("x0"), &type__f32, .offset = offsetof(r2f32_t, x0)}, + {s8_const("y0"), &type__f32, .offset = offsetof(r2f32_t, y0)}, + {s8_const("x1"), &type__f32, .offset = offsetof(r2f32_t, x1)}, + {s8_const("y1"), &type__f32, .offset = offsetof(r2f32_t, y1)}, +}; +static gb_read_only DEFINE_STRUCT(r2f32_t); + +static gb_read_only type_member_t members__r1f32_t[] = { + {s8_const("x0"), &type__f32, .offset = offsetof(r1f32_t, x0)}, + {s8_const("x1"), &type__f32, .offset = offsetof(r1f32_t, x1)}, +}; +static gb_read_only DEFINE_STRUCT(r1f32_t); + +static gb_read_only type_t type__v2f64_t = { type_kind_struct, s8_const("v2f64_t"), sizeof(v2f64_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("x"), &type__f64, .offset = offsetof(v2f64_t, x)}, + {s8_const("y"), &type__f64, .offset = offsetof(v2f64_t, y)}, + } +}; + +static gb_read_only type_t type__v3f64_t = { type_kind_struct, s8_const("v3f64_t"), sizeof(v3f64_t), .count = 3, + .members = (type_member_t[]){ + {s8_const("x"), &type__f64, .offset = offsetof(v3f64_t, x)}, + {s8_const("y"), &type__f64, .offset = offsetof(v3f64_t, y)}, + {s8_const("z"), &type__f64, .offset = offsetof(v3f64_t, z)}, + } +}; + +static gb_read_only type_t type__v4f64_t = { type_kind_struct, s8_const("v4f64_t"), sizeof(v4f64_t), .count = 4, + .members = (type_member_t[]){ + {s8_const("x"), &type__f64, .offset = offsetof(v4f64_t, x)}, + {s8_const("y"), &type__f64, .offset = offsetof(v4f64_t, y)}, + {s8_const("z"), &type__f64, .offset = offsetof(v4f64_t, z)}, + {s8_const("w"), &type__f64, .offset = offsetof(v4f64_t, w)}, + } +}; + +static gb_read_only type_t type__r3f64_t = { type_kind_struct, s8_const("r3f64_t"), sizeof(r3f64_t), .count = 6, + .members = (type_member_t[]){ + {s8_const("x0"), &type__f64, .offset = offsetof(r3f64_t, x0)}, + {s8_const("y0"), &type__f64, .offset = offsetof(r3f64_t, y0)}, + {s8_const("x0"), &type__f64, .offset = offsetof(r3f64_t, z0)}, + {s8_const("x1"), &type__f64, .offset = offsetof(r3f64_t, x1)}, + {s8_const("y1"), &type__f64, .offset = offsetof(r3f64_t, y1)}, + {s8_const("x1"), &type__f64, .offset = offsetof(r3f64_t, z1)}, + } +}; + +static gb_read_only type_member_t members__r2f64_t[] = { + {s8_const("x0"), &type__f64, .offset = offsetof(r2f64_t, x0)}, + {s8_const("y0"), &type__f64, .offset = offsetof(r2f64_t, y0)}, + {s8_const("x1"), &type__f64, .offset = offsetof(r2f64_t, x1)}, + {s8_const("y1"), &type__f64, .offset = offsetof(r2f64_t, y1)}, +}; +static gb_read_only DEFINE_STRUCT(r2f64_t); + +static gb_read_only type_member_t members__r1f64_t[] = { + {s8_const("x0"), &type__f64, .offset = offsetof(r1f64_t, x0)}, + {s8_const("x1"), &type__f64, .offset = offsetof(r1f64_t, x1)}, +}; +static gb_read_only DEFINE_STRUCT(r1f64_t); + +static gb_read_only type_t type__v2i32_t = { type_kind_struct, s8_const("v2i32_t"), sizeof(v2i32_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("x"), &type__i32, .offset = offsetof(v2i32_t, x)}, + {s8_const("y"), &type__i32, .offset = offsetof(v2i32_t, y)}, + } +}; + +static gb_read_only type_t type__v3i32_t = { type_kind_struct, s8_const("v3i32_t"), sizeof(v3i32_t), .count = 3, + .members = (type_member_t[]){ + {s8_const("x"), &type__i32, .offset = offsetof(v3i32_t, x)}, + {s8_const("y"), &type__i32, .offset = offsetof(v3i32_t, y)}, + {s8_const("z"), &type__i32, .offset = offsetof(v3i32_t, z)}, + } +}; + +static gb_read_only type_t type__v4i32_t = { type_kind_struct, s8_const("v4i32_t"), sizeof(v4i32_t), .count = 4, + .members = (type_member_t[]){ + {s8_const("x"), &type__i32, .offset = offsetof(v4i32_t, x)}, + {s8_const("y"), &type__i32, .offset = offsetof(v4i32_t, y)}, + {s8_const("z"), &type__i32, .offset = offsetof(v4i32_t, z)}, + {s8_const("w"), &type__i32, .offset = offsetof(v4i32_t, w)}, + } +}; + +static gb_read_only type_t type__r3i32_t = { type_kind_struct, s8_const("r3i32_t"), sizeof(r3i32_t), .count = 6, + .members = (type_member_t[]){ + {s8_const("x0"), &type__i32, .offset = offsetof(r3i32_t, x0)}, + {s8_const("y0"), &type__i32, .offset = offsetof(r3i32_t, y0)}, + {s8_const("x0"), &type__i32, .offset = offsetof(r3i32_t, z0)}, + {s8_const("x1"), &type__i32, .offset = offsetof(r3i32_t, x1)}, + {s8_const("y1"), &type__i32, .offset = offsetof(r3i32_t, y1)}, + {s8_const("x1"), &type__i32, .offset = offsetof(r3i32_t, z1)}, + } +}; + +static gb_read_only type_member_t members__r2i32_t[] = { + {s8_const("x0"), &type__i32, .offset = offsetof(r2i32_t, x0)}, + {s8_const("y0"), &type__i32, .offset = offsetof(r2i32_t, y0)}, + {s8_const("x1"), &type__i32, .offset = offsetof(r2i32_t, x1)}, + {s8_const("y1"), &type__i32, .offset = offsetof(r2i32_t, y1)}, +}; +static gb_read_only DEFINE_STRUCT(r2i32_t); + +static gb_read_only type_member_t members__r1i32_t[] = { + {s8_const("x0"), &type__i32, .offset = offsetof(r1i32_t, x0)}, + {s8_const("x1"), &type__i32, .offset = offsetof(r1i32_t, x1)}, +}; +static gb_read_only DEFINE_STRUCT(r1i32_t); + + +static gb_read_only type_t type__v2i64_t = { type_kind_struct, s8_const("v2i64_t"), sizeof(v2i64_t), .count = 2, + .members = (type_member_t[]){ + {s8_const("x"), &type__i64, .offset = offsetof(v2i64_t, x)}, + {s8_const("y"), &type__i64, .offset = offsetof(v2i64_t, y)}, + } +}; + +static gb_read_only type_t type__v3i64_t = { type_kind_struct, s8_const("v3i64_t"), sizeof(v3i64_t), .count = 3, + .members = (type_member_t[]){ + {s8_const("x"), &type__i64, .offset = offsetof(v3i64_t, x)}, + {s8_const("y"), &type__i64, .offset = offsetof(v3i64_t, y)}, + {s8_const("z"), &type__i64, .offset = offsetof(v3i64_t, z)}, + } +}; + +static gb_read_only type_t type__v4i64_t = { type_kind_struct, s8_const("v4i64_t"), sizeof(v4i64_t), .count = 4, + .members = (type_member_t[]){ + {s8_const("x"), &type__i64, .offset = offsetof(v4i64_t, x)}, + {s8_const("y"), &type__i64, .offset = offsetof(v4i64_t, y)}, + {s8_const("z"), &type__i64, .offset = offsetof(v4i64_t, z)}, + {s8_const("w"), &type__i64, .offset = offsetof(v4i64_t, w)}, + } +}; + +static gb_read_only type_t type__r3i64_t = { type_kind_struct, s8_const("r3i64_t"), sizeof(r3i64_t), .count = 6, + .members = (type_member_t[]){ + {s8_const("x0"), &type__i64, .offset = offsetof(r3i64_t, x0)}, + {s8_const("y0"), &type__i64, .offset = offsetof(r3i64_t, y0)}, + {s8_const("x0"), &type__i64, .offset = offsetof(r3i64_t, z0)}, + {s8_const("x1"), &type__i64, .offset = offsetof(r3i64_t, x1)}, + {s8_const("y1"), &type__i64, .offset = offsetof(r3i64_t, y1)}, + {s8_const("x1"), &type__i64, .offset = offsetof(r3i64_t, z1)}, + } +}; + +static gb_read_only type_member_t members__r2i64_t[] = { + {s8_const("x0"), &type__i64, .offset = offsetof(r2i64_t, x0)}, + {s8_const("y0"), &type__i64, .offset = offsetof(r2i64_t, y0)}, + {s8_const("x1"), &type__i64, .offset = offsetof(r2i64_t, x1)}, + {s8_const("y1"), &type__i64, .offset = offsetof(r2i64_t, y1)}, +}; +static gb_read_only DEFINE_STRUCT(r2i64_t); + +static gb_read_only type_member_t members__r1i64_t[] = { + {s8_const("x0"), &type__i64, .offset = offsetof(r1i64_t, x0)}, + {s8_const("x1"), &type__i64, .offset = offsetof(r1i64_t, x1)}, +}; +static gb_read_only DEFINE_STRUCT(r1i64_t); diff --git a/src/core/core_unicode.c b/src/core/core_unicode.c new file mode 100644 index 0000000..671aeb4 --- /dev/null +++ b/src/core/core_unicode.c @@ -0,0 +1,199 @@ +#include "core_unicode.h" + +fn utf32_result_t utf16_to_utf32(uint16_t *c, int max_advance) { + utf32_result_t result = {0}; + if (max_advance >= 1) { + result.advance = 1; + result.out_str = c[0]; + if (c[0] >= 0xD800 && c[0] <= 0xDBFF && c[1] >= 0xDC00 && c[1] <= 0xDFFF) { + if (max_advance >= 2) { + result.out_str = 0x10000; + result.out_str += (uint32_t)(c[0] & 0x03FF) << 10u | (c[1] & 0x03FF); + result.advance = 2; + } else { + result.error = 2; + } + } + } + else { + result.error = 1; + } + return result; +} + +fn utf8_result_t utf32_to_utf8(uint32_t codepoint) { + utf8_result_t result = {0}; + + if (codepoint <= 0x7F) { + result.len = 1; + result.out_str[0] = (char)codepoint; + } + else if (codepoint <= 0x7FF) { + result.len = 2; + result.out_str[0] = 0xc0 | (0x1f & (codepoint >> 6)); + result.out_str[1] = 0x80 | (0x3f & codepoint); + } + else if (codepoint <= 0xFFFF) { // 16 bit word + result.len = 3; + result.out_str[0] = 0xe0 | (0xf & (codepoint >> 12)); // 4 bits + result.out_str[1] = 0x80 | (0x3f & (codepoint >> 6)); // 6 bits + result.out_str[2] = 0x80 | (0x3f & codepoint); // 6 bits + } + else if (codepoint <= 0x10FFFF) { // 21 bit word + result.len = 4; + result.out_str[0] = 0xf0 | (0x7 & (codepoint >> 18)); // 3 bits + result.out_str[1] = 0x80 | (0x3f & (codepoint >> 12)); // 6 bits + result.out_str[2] = 0x80 | (0x3f & (codepoint >> 6)); // 6 bits + result.out_str[3] = 0x80 | (0x3f & codepoint); // 6 bits + } + else { + result.error = 1; + } + + return result; +} + +fn utf32_result_t utf8_to_utf32(char *c, int max_advance) { + utf32_result_t result = {0}; + + if ((c[0] & 0x80) == 0) { // Check if leftmost zero of first byte is unset + if (max_advance >= 1) { + result.out_str = c[0]; + result.advance = 1; + } + else result.error = 1; + } + + else if ((c[0] & 0xe0) == 0xc0) { + if ((c[1] & 0xc0) == 0x80) { // Continuation byte required + if (max_advance >= 2) { + result.out_str = (uint32_t)(c[0] & 0x1f) << 6u | (c[1] & 0x3f); + result.advance = 2; + } + else result.error = 2; + } + else result.error = 2; + } + + else if ((c[0] & 0xf0) == 0xe0) { + if ((c[1] & 0xc0) == 0x80 && (c[2] & 0xc0) == 0x80) { // Two continuation bytes required + if (max_advance >= 3) { + result.out_str = (uint32_t)(c[0] & 0xf) << 12u | (uint32_t)(c[1] & 0x3f) << 6u | (c[2] & 0x3f); + result.advance = 3; + } + else result.error = 3; + } + else result.error = 3; + } + + else if ((c[0] & 0xf8) == 0xf0) { + if ((c[1] & 0xc0) == 0x80 && (c[2] & 0xc0) == 0x80 && (c[3] & 0xc0) == 0x80) { // Three continuation bytes required + if (max_advance >= 4) { + result.out_str = (uint32_t)(c[0] & 0xf) << 18u | (uint32_t)(c[1] & 0x3f) << 12u | (uint32_t)(c[2] & 0x3f) << 6u | (uint32_t)(c[3] & 0x3f); + result.advance = 4; + } + else result.error = 4; + } + else result.error = 4; + } + else result.error = 4; + + return result; +} + +fn utf16_result_t utf32_to_utf16(uint32_t codepoint) { + utf16_result_t result = {0}; + if (codepoint < 0x10000) { + result.out_str[0] = (uint16_t)codepoint; + result.out_str[1] = 0; + result.len = 1; + } + else if (codepoint <= 0x10FFFF) { + uint32_t code = (codepoint - 0x10000); + result.out_str[0] = (uint16_t)(0xD800 | (code >> 10)); + result.out_str[1] = (uint16_t)(0xDC00 | (code & 0x3FF)); + result.len = 2; + } + else { + result.error = 1; + } + + return result; +} + +#define UTF__HANDLE_DECODE_ERROR(question_mark) \ + { \ + if (outlen < buffer_size - 1) buffer[outlen++] = (question_mark); \ + break; \ + } + +fn int64_t str_from_wstr(char *buffer, int64_t buffer_size, uint16_t *in, int64_t inlen) { + int64_t outlen = 0; + for (int64_t i = 0; i < inlen && in[i];) { + utf32_result_t decode = utf16_to_utf32((uint16_t *)(in + i), (int)(inlen - i)); + if (!decode.error) { + i += decode.advance; + utf8_result_t encode = utf32_to_utf8(decode.out_str); + if (!encode.error) { + for (int64_t j = 0; j < encode.len; j++) { + if (outlen < buffer_size - 1) { + buffer[outlen++] = encode.out_str[j]; + } + } + } + else UTF__HANDLE_DECODE_ERROR('?'); + } + else UTF__HANDLE_DECODE_ERROR('?'); + } + + buffer[outlen] = 0; + return outlen; +} + +fn int64_t wstr_from_str(uint16_t *buffer, int64_t buffer_size, char *in, int64_t inlen) { + int64_t outlen = 0; + for (int64_t i = 0; i < inlen;) { + utf32_result_t decode = utf8_to_utf32(in + i, (int)(inlen - i)); + if (!decode.error) { + i += decode.advance; + utf16_result_t encode = utf32_to_utf16(decode.out_str); + if (!encode.error) { + for (int64_t j = 0; j < encode.len; j++) { + if (outlen < buffer_size - 1) { + buffer[outlen++] = encode.out_str[j]; + } + } + } + else UTF__HANDLE_DECODE_ERROR(0x003f); + } + else UTF__HANDLE_DECODE_ERROR(0x003f); + } + + buffer[outlen] = 0; + return outlen; +} + +fn void utf8_advance(utf8_iter_t *iter) { + iter->i += iter->utf8_codepoint_byte_size; + utf32_result_t r = utf8_to_utf32(iter->str + iter->i, iter->len - iter->i); + if (r.error) { + iter->item = 0; + return; + } + + iter->utf8_codepoint_byte_size = r.advance; + iter->item = r.out_str; +} + +// @todo: s8_t, change name +fn utf8_iter_t utf8_iterate_ex(char *str, int len) { + utf8_iter_t result = {str, len}; + if (len) utf8_advance(&result); + return result; +} + +fn utf8_iter_t utf8_iterate(char *str) { + int length = 0; + while (str[length]) length += 1; + return utf8_iterate_ex(str, length); +} diff --git a/src/core/core_unicode.h b/src/core/core_unicode.h new file mode 100644 index 0000000..a4546ce --- /dev/null +++ b/src/core/core_unicode.h @@ -0,0 +1,56 @@ +#pragma once +#include "core_basic.h" + +typedef struct utf32_result_t utf32_result_t; +struct utf32_result_t { + uint32_t out_str; + int advance; + int error; +}; + +typedef struct utf16_result_t utf16_result_t; +struct utf16_result_t { + uint16_t out_str[2]; + int len; + int error; +}; + +typedef struct utf8_result_t utf8_result_t; +struct utf8_result_t { + uint8_t out_str[4]; + int len; + int error; +}; + +typedef struct utf8_iter_t utf8_iter_t; +struct utf8_iter_t { + char *str; + int len; + int utf8_codepoint_byte_size; + int i; + uint32_t item; +}; + +// +// codepoint conversions +fn utf32_result_t utf16_to_utf32(uint16_t *c, int max_advance); +fn utf8_result_t utf32_to_utf8(uint32_t codepoint); +fn utf32_result_t utf8_to_utf32(char *c, int max_advance); +fn utf16_result_t utf32_to_utf16(uint32_t codepoint); + +// +// widestring / string conversions +fn int64_t str_from_wstr(char *buffer, int64_t buffer_size, uint16_t *in, int64_t inlen); +fn int64_t wstr_from_str(uint16_t *buffer, int64_t buffer_size, char *in, int64_t inlen); + +// +// codepoint iterator +fn utf8_iter_t utf8_iterate(char *str); +fn utf8_iter_t utf8_iterate_ex(char *str, int len); +fn void utf8_advance(utf8_iter_t *iter); +/* example: +for (utf8_iter_t iter = utf8_iterate(string); iter.item; utf8_advance(&iter)) { + u32 codepoint = iter.item; +} + +*/ diff --git a/src/core/stb_sprintf.c b/src/core/stb_sprintf.c new file mode 100644 index 0000000..de50110 --- /dev/null +++ b/src/core/stb_sprintf.c @@ -0,0 +1,3 @@ +#define STB_SPRINTF_IMPLEMENTATION +#include "stb_sprintf.h" +#undef STB_SPRINTF_IMPLEMENTATION diff --git a/src/core/stb_sprintf.h b/src/core/stb_sprintf.h new file mode 100644 index 0000000..224ac90 --- /dev/null +++ b/src/core/stb_sprintf.h @@ -0,0 +1,1962 @@ +// stb_sprintf - v1.10 - public domain snprintf() implementation +// originally by Jeff Roberts / RAD Game Tools, 2015/10/20 +// http://github.com/nothings/stb +// +// allowed types: sc uidBboXx p AaGgEef n +// lengths : hh h ll j z t I64 I32 I +// +// Contributors: +// Fabian "ryg" Giesen (reformatting) +// github:aganm (attribute format) +// +// Contributors (bugfixes): +// github:d26435 +// github:trex78 +// github:account-login +// Jari Komppa (SI suffixes) +// Rohit Nirmal +// Marcin Wojdyr +// Leonard Ritter +// Stefano Zanotti +// Adam Allison +// Arvid Gerstmann +// Markus Kolb +// +// LICENSE: +// +// See end of file for license information. + +#ifndef STB_SPRINTF_H_INCLUDE +#define STB_SPRINTF_H_INCLUDE + +/* +Single file sprintf replacement. + +Originally written by Jeff Roberts at RAD Game Tools - 2015/10/20. +Hereby placed in public domain. + +This is a full sprintf replacement that supports everything that +the C runtime sprintfs support, including float/double, 64-bit integers, +hex floats, field parameters (%*.*d stuff), length reads backs, etc. + +Why would you need this if sprintf already exists? Well, first off, +it's *much* faster (see below). It's also much smaller than the CRT +versions code-space-wise. We've also added some simple improvements +that are super handy (commas in thousands, callbacks at buffer full, +for example). Finally, the format strings for MSVC and GCC differ +for 64-bit integers (among other small things), so this lets you use +the same format strings in cross platform code. + +It uses the standard single file trick of being both the header file +and the source itself. If you just include it normally, you just get +the header file function definitions. To get the code, you include +it from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first. + +It only uses va_args macros from the C runtime to do it's work. It +does cast doubles to S64s and shifts and divides U64s, which does +drag in CRT code on most platforms. + +It compiles to roughly 8K with float support, and 4K without. +As a comparison, when using MSVC static libs, calling sprintf drags +in 16K. + +API: +==== +int stbsp_sprintf( char * buf, char const * fmt, ... ) +int stbsp_snprintf( char * buf, int count, char const * fmt, ... ) + Convert an arg list into a buffer. stbsp_snprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintf( char * buf, char const * fmt, va_list va ) +int stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va ) + Convert a va_list arg list into a buffer. stbsp_vsnprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char +const * fmt, va_list va ) typedef char * STBSP_SPRINTFCB( char const * buf, void +* user, int len ); Convert into a buffer, calling back every STB_SPRINTF_MIN +chars. Your callback can then copy the chars out, print them or whatever. This +function is actually the workhorse for everything else. The buffer you pass in +must hold at least STB_SPRINTF_MIN characters. + // you return the next buffer to use or 0 to stop converting + +void stbsp_set_separators( char comma, char period ) + Set the comma and period characters to use. + +FLOATS/DOUBLES: +=============== +This code uses a internal float->ascii conversion method that uses +doubles with error correction (double-doubles, for ~105 bits of +precision). This conversion is round-trip perfect - that is, an atof +of the values output here will give you the bit-exact double back. + +One difference is that our insignificant digits will be different than +with MSVC or GCC (but they don't match each other either). We also +don't attempt to find the minimum length matching float (pre-MSVC15 +doesn't either). + +If you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT +and you'll save 4K of code space. + +64-BIT INTS: +============ +This library also supports 64-bit integers and you can use MSVC style or +GCC style indicators (%I64d or %lld). It supports the C99 specifiers +for size_t and ptr_diff_t (%jd %zd) as well. + +EXTRAS: +======= +Like some GCCs, for integers and floats, you can use a ' (single quote) +specifier and commas will be inserted on the thousands: "%'d" on 12345 +would print 12,345. + +For integers and floats, you can use a "$" specifier and the number +will be converted to float and then divided to get kilo, mega, giga or +tera and then printed, so "%$d" 1000 is "1.0 k", "%$.2d" 2536000 is +"2.53 M", etc. For byte values, use two $:s, like "%$$d" to turn +2536000 to "2.42 Mi". If you prefer JEDEC suffixes to SI ones, use three +$:s: "%$$$d" -> "2.42 M". To remove the space between the number and the +suffix, add "_" specifier: "%_$d" -> "2.53M". + +In addition to octal and hexadecimal conversions, you can print +integers in binary: "%b" for 256 would print 100. + +PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): +=================================================================== +"%d" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC) +"%24d" across all 32-bit ints (4.5x/4.2x faster) +"%x" across all 32-bit ints (4.5x/3.8x faster) +"%08x" across all 32-bit ints (4.3x/3.8x faster) +"%f" across e-10 to e+10 floats (7.3x/6.0x faster) +"%e" across e-10 to e+10 floats (8.1x/6.0x faster) +"%g" across e-10 to e+10 floats (10.0x/7.1x faster) +"%f" for values near e-300 (7.9x/6.5x faster) +"%f" for values near e+300 (10.0x/9.1x faster) +"%e" for values near e-300 (10.1x/7.0x faster) +"%e" for values near e+300 (9.2x/6.0x faster) +"%.320f" for values near e-300 (12.6x/11.2x faster) +"%a" for random values (8.6x/4.3x faster) +"%I64d" for 64-bits with 32-bit values (4.8x/3.4x faster) +"%I64d" for 64-bits > 32-bit values (4.9x/5.5x faster) +"%s%s%s" for 64 char strings (7.1x/7.3x faster) +"...512 char string..." ( 35.0x/32.5x faster!) +*/ + +#if defined(__clang__) +#if defined(__has_feature) && defined(__has_attribute) +#if __has_feature(address_sanitizer) +#if __has_attribute(__no_sanitize__) +#define STBSP__ASAN __attribute__((__no_sanitize__("address"))) +#elif __has_attribute(__no_sanitize_address__) +#define STBSP__ASAN __attribute__((__no_sanitize_address__)) +#elif __has_attribute(__no_address_safety_analysis__) +#define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) +#endif +#endif +#endif +#elif defined(__GNUC__) && \ + (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) +#if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__ +#define STBSP__ASAN __attribute__((__no_sanitize_address__)) +#endif +#endif + +#ifndef STBSP__ASAN +#define STBSP__ASAN +#endif + +#ifdef STB_SPRINTF_STATIC +#define STBSP__PUBLICDEC static +#define STBSP__PUBLICDEF static STBSP__ASAN +#else +#ifdef __cplusplus +#define STBSP__PUBLICDEC extern "C" +#define STBSP__PUBLICDEF extern "C" STBSP__ASAN +#else +#define STBSP__PUBLICDEC extern +#define STBSP__PUBLICDEF STBSP__ASAN +#endif +#endif + +#if defined(__has_attribute) +#if __has_attribute(format) +#define STBSP__ATTRIBUTE_FORMAT(fmt, va) \ + __attribute__((format(printf, fmt, va))) +#endif +#endif + +#ifndef STBSP__ATTRIBUTE_FORMAT +#define STBSP__ATTRIBUTE_FORMAT(fmt, va) +#endif + +#ifdef _MSC_VER +#define STBSP__NOTUSED(v) (void)(v) +#else +#define STBSP__NOTUSED(v) (void)sizeof(v) +#endif + +#include // for va_arg(), va_list() +#include // size_t, ptrdiff_t +#include + +#ifndef STB_SPRINTF_MIN +#define STB_SPRINTF_MIN 512 // how many characters per callback +#endif +typedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len); + +#ifndef STB_SPRINTF_DECORATE +#define STB_SPRINTF_DECORATE(name) \ + stbsp_##name // define this before including if you want to change the names +#endif + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, + va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, + char const *fmt, + va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, + ...) + STBSP__ATTRIBUTE_FORMAT(2, 3); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, + char const *fmt, ...) + STBSP__ATTRIBUTE_FORMAT(3, 4); + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, + void *user, char *buf, + char const *fmt, + va_list va); +STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, + char period); + +#endif // STB_SPRINTF_H_INCLUDE + +#ifdef STB_SPRINTF_IMPLEMENTATION + +#define stbsp__uint32 unsigned int +#define stbsp__int32 signed int + +#ifdef _MSC_VER +#define stbsp__uint64 unsigned __int64 +#define stbsp__int64 signed __int64 +#else +#define stbsp__uint64 unsigned long long +#define stbsp__int64 signed long long +#endif +#define stbsp__uint16 unsigned short + +#ifndef stbsp__uintptr +#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || \ + defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || \ + defined(__s390x__) +#define stbsp__uintptr stbsp__uint64 +#else +#define stbsp__uintptr stbsp__uint32 +#endif +#endif + +#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches + // GCC) +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define STB_SPRINTF_MSVC_MODE +#endif +#endif + +#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force + // stbsp_sprintf to always use aligned accesses +#define STBSP__UNALIGNED(code) +#else +#define STBSP__UNALIGNED(code) code +#endif + +#ifndef STB_SPRINTF_NOFLOAT +// internal float utility functions +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, + char *out, stbsp__int32 *decimal_pos, + double value, stbsp__uint32 frac_digits); +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, + double value); +#define STBSP__SPECIAL 0x7000 +#endif + +static char stbsp__period = '.'; +static char stbsp__comma = ','; +static struct { + short temp; // force next field to be 2-byte aligned + char pair[201]; +} stbsp__digitpair = {0, "00010203040506070809101112131415161718192021222324" + "25262728293031323334353637383940414243444546474849" + "50515253545556575859606162636465666768697071727374" + "75767778798081828384858687888990919293949596979899"}; + +STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, + char pperiod) { + stbsp__period = pperiod; + stbsp__comma = pcomma; +} + +#define STBSP__LEFTJUST 1 +#define STBSP__LEADINGPLUS 2 +#define STBSP__LEADINGSPACE 4 +#define STBSP__LEADING_0X 8 +#define STBSP__LEADINGZERO 16 +#define STBSP__INTMAX 32 +#define STBSP__TRIPLET_COMMA 64 +#define STBSP__NEGATIVE 128 +#define STBSP__METRIC_SUFFIX 256 +#define STBSP__HALFWIDTH 512 +#define STBSP__METRIC_NOSPACE 1024 +#define STBSP__METRIC_1024 2048 +#define STBSP__METRIC_JEDEC 4096 + +static void stbsp__lead_sign(stbsp__uint32 fl, char *sign) { + sign[0] = 0; + if (fl & STBSP__NEGATIVE) { + sign[0] = 1; + sign[1] = '-'; + } else if (fl & STBSP__LEADINGSPACE) { + sign[0] = 1; + sign[1] = ' '; + } else if (fl & STBSP__LEADINGPLUS) { + sign[0] = 1; + sign[1] = '+'; + } +} + +static STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, + stbsp__uint32 limit) { + char const *sn = s; + + // get up to 4-byte alignment + for (;;) { + if (((stbsp__uintptr)sn & 3) == 0) + break; + + if (!limit || *sn == 0) + return (stbsp__uint32)(sn - s); + + ++sn; + --limit; + } + + // scan over 4 bytes at a time to find terminating 0 + // this will intentionally scan up to 3 bytes past the end of buffers, + // but becase it works 4B aligned, it will never cross page boundaries + // (hence the STBSP__ASAN markup; the over-read here is intentional + // and harmless) + while (limit >= 4) { + stbsp__uint32 v = *(stbsp__uint32 *)sn; + // bit hack to find if there's a 0 byte in there + if ((v - 0x01010101) & (~v) & 0x80808080UL) + break; + + sn += 4; + limit -= 4; + } + + // handle the last few characters to find actual size + while (limit && *sn) { + ++sn; + --limit; + } + + return (stbsp__uint32)(sn - s); +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, + void *user, char *buf, + char const *fmt, + va_list va) { + static char hex[] = "0123456789abcdefxp"; + static char hexu[] = "0123456789ABCDEFXP"; + char *bf; + char const *f; + int tlen = 0; + + bf = buf; + f = fmt; + for (;;) { + stbsp__int32 fw, pr, tz; + stbsp__uint32 fl; + + // macros for the callback buffer stuff +#define stbsp__chk_cb_bufL(bytes) \ + { \ + int len = (int)(bf - buf); \ + if ((len + (bytes)) >= STB_SPRINTF_MIN) { \ + tlen += len; \ + if (0 == (bf = buf = callback(buf, user, len))) \ + goto done; \ + } \ + } +#define stbsp__chk_cb_buf(bytes) \ + { \ + if (callback) { \ + stbsp__chk_cb_bufL(bytes); \ + } \ + } +#define stbsp__flush_cb() \ + { \ + stbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \ + } // flush if there is even one byte in the buffer +#define stbsp__cb_buf_clamp(cl, v) \ + cl = v; \ + if (callback) { \ + int lg = STB_SPRINTF_MIN - (int)(bf - buf); \ + if (cl > lg) \ + cl = lg; \ + } + + // fast copy everything up to the next % (or end of string) + for (;;) { + while (((stbsp__uintptr)f) & 3) { + schk1: + if (f[0] == '%') + goto scandd; + schk2: + if (f[0] == 0) + goto endfmt; + stbsp__chk_cb_buf(1); + *bf++ = f[0]; + ++f; + } + for (;;) { + // Check if the next 4 bytes contain %(0x25) or end of string. + // Using the 'hasless' trick: + // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord + stbsp__uint32 v, c; + v = *(stbsp__uint32 *)f; + c = (~v) & 0x80808080; + if (((v ^ 0x25252525) - 0x01010101) & c) + goto schk1; + if ((v - 0x01010101) & c) + goto schk2; + if (callback) + if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4) + goto schk1; +#ifdef STB_SPRINTF_NOUNALIGNED + if (((stbsp__uintptr)bf) & 3) { + bf[0] = f[0]; + bf[1] = f[1]; + bf[2] = f[2]; + bf[3] = f[3]; + } else +#endif + { + *(stbsp__uint32 *)bf = v; + } + bf += 4; + f += 4; + } + } + scandd: + + ++f; + + // ok, we have a percent, read the modifiers first + fw = 0; + pr = -1; + fl = 0; + tz = 0; + + // flags + for (;;) { + switch (f[0]) { + // if we have left justify + case '-': + fl |= STBSP__LEFTJUST; + ++f; + continue; + // if we have leading plus + case '+': + fl |= STBSP__LEADINGPLUS; + ++f; + continue; + // if we have leading space + case ' ': + fl |= STBSP__LEADINGSPACE; + ++f; + continue; + // if we have leading 0x + case '#': + fl |= STBSP__LEADING_0X; + ++f; + continue; + // if we have thousand commas + case '\'': + fl |= STBSP__TRIPLET_COMMA; + ++f; + continue; + // if we have kilo marker (none->kilo->kibi->jedec) + case '$': + if (fl & STBSP__METRIC_SUFFIX) { + if (fl & STBSP__METRIC_1024) { + fl |= STBSP__METRIC_JEDEC; + } else { + fl |= STBSP__METRIC_1024; + } + } else { + fl |= STBSP__METRIC_SUFFIX; + } + ++f; + continue; + // if we don't want space between metric suffix and number + case '_': + fl |= STBSP__METRIC_NOSPACE; + ++f; + continue; + // if we have leading zero + case '0': + fl |= STBSP__LEADINGZERO; + ++f; + goto flags_done; + default: + goto flags_done; + } + } + flags_done: + + // get the field width + if (f[0] == '*') { + fw = va_arg(va, stbsp__uint32); + ++f; + } else { + while ((f[0] >= '0') && (f[0] <= '9')) { + fw = fw * 10 + f[0] - '0'; + f++; + } + } + // get the precision + if (f[0] == '.') { + ++f; + if (f[0] == '*') { + pr = va_arg(va, stbsp__uint32); + ++f; + } else { + pr = 0; + while ((f[0] >= '0') && (f[0] <= '9')) { + pr = pr * 10 + f[0] - '0'; + f++; + } + } + } + + // handle integer size overrides + switch (f[0]) { + // are we halfwidth? + case 'h': + fl |= STBSP__HALFWIDTH; + ++f; + if (f[0] == 'h') + ++f; // QUARTERWIDTH + break; + // are we 64-bit (unix style) + case 'l': + fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0); + ++f; + if (f[0] == 'l') { + fl |= STBSP__INTMAX; + ++f; + } + break; + // are we 64-bit on intmax? (c99) + case 'j': + fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit on size_t or ptrdiff_t? (c99) + case 'z': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + case 't': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit (msft style) + case 'I': + if ((f[1] == '6') && (f[2] == '4')) { + fl |= STBSP__INTMAX; + f += 3; + } else if ((f[1] == '3') && (f[2] == '2')) { + f += 3; + } else { + fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0); + ++f; + } + break; + default: + break; + } + + // handle each replacement + switch (f[0]) { +#define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307 + char num[STBSP__NUMSZ]; + char lead[8]; + char tail[8]; + char *s; + char const *h; + stbsp__uint32 l, n, cs; + stbsp__uint64 n64; +#ifndef STB_SPRINTF_NOFLOAT + double fv; +#endif + stbsp__int32 dp; + char const *sn; + struct STB_STRING { char *str; int64_t len; }; + struct STB_STRING str; + + case 'S': + str = va_arg(va, struct STB_STRING); + if (str.str == 0 && str.len != 0) { + str.str = (char *)"null"; + str.len = 4; + } + pr = (int)str.len; + s = (char *)str.str; + l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u); + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + + case 's': + // get the string + s = va_arg(va, char *); + if (s == 0) + s = (char *)"null"; + // get the length, limited to desired precision + // always limit to ~0u chars since our counts are 32b + l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u); + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + // copy the string in + goto scopy; + + case 'c': // char + // get the character + s = num + STBSP__NUMSZ - 1; + *s = (char)va_arg(va, int); + l = 1; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + + case 'n': // weird write-bytes specifier + { + int *d = va_arg(va, int *); + *d = tlen + (int)(bf - buf); + } break; + +#ifdef STB_SPRINTF_NOFLOAT + case 'A': // float + case 'a': // hex float + case 'G': // float + case 'g': // float + case 'E': // float + case 'e': // float + case 'f': // float + va_arg(va, double); // eat it + s = (char *)"No float"; + l = 8; + lead[0] = 0; + tail[0] = 0; + pr = 0; + cs = 0; + STBSP__NOTUSED(dp); + goto scopy; +#else + case 'A': // hex float + case 'a': // hex float + h = (f[0] == 'A') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv)) + fl |= STBSP__NEGATIVE; + + s = num + 64; + + stbsp__lead_sign(fl, lead); + + if (dp == -1023) + dp = (n64) ? -1022 : 0; + else + n64 |= (((stbsp__uint64)1) << 52); + n64 <<= (64 - 56); + if (pr < 15) + n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4)); + // add leading chars + +#ifdef STB_SPRINTF_MSVC_MODE + *s++ = '0'; + *s++ = 'x'; +#else + lead[1 + lead[0]] = '0'; + lead[2 + lead[0]] = 'x'; + lead[0] += 2; +#endif + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + if (pr) + *s++ = stbsp__period; + sn = s; + + // print the bits + n = pr; + if (n > 13) + n = 13; + if (pr > (stbsp__int32)n) + tz = pr - n; + pr = 0; + while (n--) { + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + } + + // print the expo + tail[1] = h[17]; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; + n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3)); + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + + dp = (int)(s - sn); + l = (int)(s - (num + 64)); + s = num + 64; + cs = 1 + (3 << 24); + goto scopy; + + case 'G': // float + case 'g': // float + h = (f[0] == 'G') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; + else if (pr == 0) + pr = 1; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000)) + fl |= STBSP__NEGATIVE; + + // clamp the precision and delete extra zeros after clamp + n = pr; + if (l > (stbsp__uint32)pr) + l = pr; + while ((l > 1) && (pr) && (sn[l - 1] == '0')) { + --pr; + --l; + } + + // should we use %e + if ((dp <= -4) || (dp > (stbsp__int32)n)) { + if (pr > (stbsp__int32)l) + pr = l - 1; + else if (pr) + --pr; // when using %e, there is one digit before the decimal + goto doexpfromg; + } + // this is the insane action to get the pr to match %g semantics for %f + if (dp > 0) { + pr = (dp < (stbsp__int32)l) ? l - dp : 0; + } else { + pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32)l : pr); + } + goto dofloatfromg; + + case 'E': // float + case 'e': // float + h = (f[0] == 'E') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000)) + fl |= STBSP__NEGATIVE; + doexpfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + // handle leading chars + *s++ = sn[0]; + + if (pr) + *s++ = stbsp__period; + + // handle after decimal + if ((l - 1) > (stbsp__uint32)pr) + l = pr + 1; + for (n = 1; n < l; n++) + *s++ = sn[n]; + // trailing zeros + tz = pr - (l - 1); + pr = 0; + // dump expo + tail[1] = h[0xe]; + dp -= 1; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; +#ifdef STB_SPRINTF_MSVC_MODE + n = 5; +#else + n = (dp >= 100) ? 5 : 4; +#endif + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + cs = 1 + (3 << 24); // how many tens + goto flt_lead; + + case 'f': // float + fv = va_arg(va, double); + doafloat: + // do kilos + if (fl & STBSP__METRIC_SUFFIX) { + double divisor; + divisor = 1000.0f; + if (fl & STBSP__METRIC_1024) + divisor = 1024.0; + while (fl < 0x4000000) { + if ((fv < divisor) && (fv > -divisor)) + break; + fv /= divisor; + fl += 0x1000000; + } + } + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr)) + fl |= STBSP__NEGATIVE; + dofloatfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + + // handle the three decimal varieties + if (dp <= 0) { + stbsp__int32 i; + // handle 0.000*000xxxx + *s++ = '0'; + if (pr) + *s++ = stbsp__period; + n = -dp; + if ((stbsp__int32)n > pr) + n = pr; + i = n; + while (i) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + i -= 4; + } + while (i) { + *s++ = '0'; + --i; + } + if ((stbsp__int32)(l + n) > pr) + l = pr - n; + i = l; + while (i) { + *s++ = *sn++; + --i; + } + tz = pr - (n + l); + cs = 1 + (3 << 24); // how many tens did we write (for commas below) + } else { + cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0; + if ((stbsp__uint32)dp >= l) { + // handle xxxx000*000.0 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= l) + break; + } + } + if (n < (stbsp__uint32)dp) { + n = dp - n; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (n) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --n; + } + while (n >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + n -= 4; + } + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = '0'; + --n; + } + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) { + *s++ = stbsp__period; + tz = pr; + } + } else { + // handle xxxxx.xxxx000*000 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= (stbsp__uint32)dp) + break; + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) + *s++ = stbsp__period; + if ((l - dp) > (stbsp__uint32)pr) + l = pr + dp; + while (n < l) { + *s++ = sn[n]; + ++n; + } + tz = pr - (l - dp); + } + } + pr = 0; + + // handle k,m,g,t + if (fl & STBSP__METRIC_SUFFIX) { + char idx; + idx = 1; + if (fl & STBSP__METRIC_NOSPACE) + idx = 0; + tail[0] = idx; + tail[1] = ' '; + { + if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'. + if (fl & STBSP__METRIC_1024) + tail[idx + 1] = "_KMGT"[fl >> 24]; + else + tail[idx + 1] = "_kMGT"[fl >> 24]; + idx++; + // If printing kibits and not in jedec, add the 'i'. + if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) { + tail[idx + 1] = 'i'; + idx++; + } + tail[0] = idx; + } + } + }; + + flt_lead: + // get the length that we copied + l = (stbsp__uint32)(s - (num + 64)); + s = num + 64; + goto scopy; +#endif + + case 'B': // upper binary + case 'b': // lower binary + h = (f[0] == 'B') ? hexu : hex; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[0xb]; + } + l = (8 << 4) | (1 << 8); + goto radixnum; + + case 'o': // octal + h = hexu; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 1; + lead[1] = '0'; + } + l = (3 << 4) | (3 << 8); + goto radixnum; + + case 'p': // pointer + fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0; + pr = sizeof(void *) * 2; + fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros + // fall through - to X + + case 'X': // upper hex + case 'x': // lower hex + h = (f[0] == 'X') ? hexu : hex; + l = (4 << 4) | (4 << 8); + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[16]; + } + radixnum: + // get the number + if (fl & STBSP__INTMAX) + n64 = va_arg(va, stbsp__uint64); + else + n64 = va_arg(va, stbsp__uint32); + + s = num + STBSP__NUMSZ; + dp = 0; + // clear tail, and clear leading if value is zero + tail[0] = 0; + if (n64 == 0) { + lead[0] = 0; + if (pr == 0) { + l = 0; + cs = 0; + goto scopy; + } + } + // convert to string + for (;;) { + *--s = h[n64 & ((1 << (l >> 8)) - 1)]; + n64 >>= (l >> 8); + if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr))) + break; + if (fl & STBSP__TRIPLET_COMMA) { + ++l; + if ((l & 15) == ((l >> 4) & 15)) { + l &= ~15; + *--s = stbsp__comma; + } + } + }; + // get the tens and the comma pos + cs = + (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24); + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + // copy it + goto scopy; + + case 'u': // unsigned + case 'i': + case 'd': // integer + // get the integer and abs it + if (fl & STBSP__INTMAX) { + stbsp__int64 i64 = va_arg(va, stbsp__int64); + n64 = (stbsp__uint64)i64; + if ((f[0] != 'u') && (i64 < 0)) { + n64 = (stbsp__uint64)-i64; + fl |= STBSP__NEGATIVE; + } + } else { + stbsp__int32 i = va_arg(va, stbsp__int32); + n64 = (stbsp__uint32)i; + if ((f[0] != 'u') && (i < 0)) { + n64 = (stbsp__uint32)-i; + fl |= STBSP__NEGATIVE; + } + } + +#ifndef STB_SPRINTF_NOFLOAT + if (fl & STBSP__METRIC_SUFFIX) { + if (n64 < 1024) + pr = 0; + else if (pr == -1) + pr = 1; + fv = (double)(stbsp__int64)n64; + goto doafloat; + } +#endif + + // convert to string + s = num + STBSP__NUMSZ; + l = 0; + + for (;;) { + // do in 32-bit chunks (avoid lots of 64-bit divides even with constant + // denominators) + char *o = s - 8; + if (n64 >= 100000000) { + n = (stbsp__uint32)(n64 % 100000000); + n64 /= 100000000; + } else { + n = (stbsp__uint32)n64; + n64 = 0; + } + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + do { + s -= 2; + *(stbsp__uint16 *)s = + *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + } while (n); + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = (char)(n % 10) + '0'; + n /= 10; + } + } + if (n64 == 0) { + if ((s[0] == '0') && (s != (num + STBSP__NUMSZ))) + ++s; + break; + } + while (s != o) + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = '0'; + } + } + + tail[0] = 0; + stbsp__lead_sign(fl, lead); + + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + if (l == 0) { + *--s = '0'; + l = 1; + } + cs = l + (3 << 24); + if (pr < 0) + pr = 0; + + scopy: + // get fw=leading/trailing space, pr=leading zeros + if (pr < (stbsp__int32)l) + pr = l; + n = pr + lead[0] + tail[0] + tz; + if (fw < (stbsp__int32)n) + fw = n; + fw -= n; + pr -= l; + + // handle right justify and leading zeros + if ((fl & STBSP__LEFTJUST) == 0) { + if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr + { + pr = (fw > pr) ? fw : pr; + fw = 0; + } else { + fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas + } + } + + // copy the spaces and/or zeros + if (fw + pr) { + stbsp__int32 i; + stbsp__uint32 c; + + // copy leading spaces (or when doing %8.4d stuff) + if ((fl & STBSP__LEFTJUST) == 0) + while (fw > 0) { + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = ' '; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leader + sn = lead + 1; + while (lead[0]) { + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leading zeros + c = cs >> 24; + cs &= 0xffffff; + cs = (fl & STBSP__TRIPLET_COMMA) + ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) + : 0; + while (pr > 0) { + stbsp__cb_buf_clamp(i, pr); + pr -= i; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + } + while (i) { + if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) { + cs = 0; + *bf++ = stbsp__comma; + } else + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + } + + // copy leader if there is still one + sn = lead + 1; + while (lead[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy the string + n = l; + while (n) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, n); + n -= i; + STBSP__UNALIGNED(while (i >= 4) { + *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s; + bf += 4; + s += 4; + i -= 4; + }) + while (i) { + *bf++ = *s++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy trailing zeros + while (tz) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tz); + tz -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy tail if there is one + sn = tail + 1; + while (tail[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tail[0]); + tail[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // handle the left justify + if (fl & STBSP__LEFTJUST) + if (fw > 0) { + while (fw) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i--) + *bf++ = ' '; + stbsp__chk_cb_buf(1); + } + } + break; + + default: // unknown, just copy code + s = num + STBSP__NUMSZ - 1; + *s = f[0]; + l = 1; + fw = fl = 0; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + } + ++f; + } +endfmt: + + if (!callback) + *bf = 0; + else + stbsp__flush_cb(); + +done: + return tlen + (int)(bf - buf); +} + +// cleanup +#undef STBSP__LEFTJUST +#undef STBSP__LEADINGPLUS +#undef STBSP__LEADINGSPACE +#undef STBSP__LEADING_0X +#undef STBSP__LEADINGZERO +#undef STBSP__INTMAX +#undef STBSP__TRIPLET_COMMA +#undef STBSP__NEGATIVE +#undef STBSP__METRIC_SUFFIX +#undef STBSP__NUMSZ +#undef stbsp__chk_cb_bufL +#undef stbsp__chk_cb_buf +#undef stbsp__flush_cb +#undef stbsp__cb_buf_clamp + +// ============================================================================ +// wrapper functions + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, + ...) { + int result; + va_list va; + va_start(va, fmt); + result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); + va_end(va); + return result; +} + +typedef struct stbsp__context { + char *buf; + int count; + int length; + char tmp[STB_SPRINTF_MIN]; +} stbsp__context; + +static char *stbsp__clamp_callback(const char *buf, void *user, int len) { + stbsp__context *c = (stbsp__context *)user; + c->length += len; + + if (len > c->count) + len = c->count; + + if (len) { + if (buf != c->buf) { + const char *s, *se; + char *d; + d = c->buf; + s = buf; + se = buf + len; + do { + *d++ = *s++; + } while (s < se); + } + c->buf += len; + c->count -= len; + } + + if (c->count <= 0) + return c->tmp; + return (c->count >= STB_SPRINTF_MIN) + ? c->buf + : c->tmp; // go direct into buffer if you can +} + +static char *stbsp__count_clamp_callback(const char *buf, void *user, int len) { + stbsp__context *c = (stbsp__context *)user; + (void)sizeof(buf); + + c->length += len; + return c->tmp; // go direct into buffer if you can +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, + char const *fmt, + va_list va) { + stbsp__context c; + + if ((count == 0) && !buf) { + c.length = 0; + + STB_SPRINTF_DECORATE(vsprintfcb) + (stbsp__count_clamp_callback, &c, c.tmp, fmt, va); + } else { + int l; + + c.buf = buf; + c.count = count; + c.length = 0; + + STB_SPRINTF_DECORATE(vsprintfcb) + (stbsp__clamp_callback, &c, stbsp__clamp_callback(0, &c, 0), fmt, va); + + // zero-terminate + l = (int)(c.buf - buf); + if (l >= count) // should never be greater, only equal (or less) than count + l = count - 1; + buf[l] = 0; + } + + return c.length; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, + char const *fmt, ...) { + int result; + va_list va; + va_start(va, fmt); + + result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va); + va_end(va); + + return result; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, + va_list va) { + return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); +} + +// ======================================================================= +// low level float utility functions + +#ifndef STB_SPRINTF_NOFLOAT + +// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox) +#define STBSP__COPYFP(dest, src) \ + { \ + int cn; \ + for (cn = 0; cn < 8; cn++) \ + ((char *)&dest)[cn] = ((char *)&src)[cn]; \ + } + +// get float info +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, + double value) { + double d; + stbsp__int64 b = 0; + + // load value and round at the frac_digits + d = value; + + STBSP__COPYFP(b, d); + + *bits = b & ((((stbsp__uint64)1) << 52) - 1); + *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023); + + return (stbsp__int32)((stbsp__uint64)b >> 63); +} + +static double const stbsp__bot[23] = { + 1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, + 1e+008, 1e+009, 1e+010, 1e+011, 1e+012, 1e+013, 1e+014, 1e+015, + 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022}; +static double const stbsp__negbot[22] = { + 1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, + 1e-009, 1e-010, 1e-011, 1e-012, 1e-013, 1e-014, 1e-015, 1e-016, + 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022}; +static double const stbsp__negboterr[22] = { + -5.551115123125783e-018, -2.0816681711721684e-019, + -2.0816681711721686e-020, -4.7921736023859299e-021, + -8.1803053914031305e-022, 4.5251888174113741e-023, + 4.5251888174113739e-024, -2.0922560830128471e-025, + -6.2281591457779853e-026, -3.6432197315497743e-027, + 6.0503030718060191e-028, 2.0113352370744385e-029, + -3.0373745563400371e-030, 1.1806906454401013e-032, + -7.7705399876661076e-032, 2.0902213275965398e-033, + -7.1542424054621921e-034, -7.1542424054621926e-035, + 2.4754073164739869e-036, 5.4846728545790429e-037, + 9.2462547772103625e-038, -4.8596774326570872e-039}; +static double const stbsp__top[13] = {1e+023, 1e+046, 1e+069, 1e+092, 1e+115, + 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, + 1e+253, 1e+276, 1e+299}; +static double const stbsp__negtop[13] = {1e-023, 1e-046, 1e-069, 1e-092, 1e-115, + 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, + 1e-253, 1e-276, 1e-299}; +static double const stbsp__toperr[13] = {8388608, + 6.8601809640529717e+028, + -7.253143638152921e+052, + -4.3377296974619174e+075, + -1.5559416129466825e+098, + -3.2841562489204913e+121, + -3.7745893248228135e+144, + -1.7356668416969134e+167, + -3.8893577551088374e+190, + -9.9566444326005119e+213, + 6.3641293062232429e+236, + -5.2069140800249813e+259, + -5.2504760255204387e+282}; +static double const stbsp__negtoperr[13] = { + 3.9565301985100693e-040, -2.299904345391321e-063, + 3.6506201437945798e-086, 1.1875228833981544e-109, + -5.0644902316928607e-132, -6.7156837247865426e-155, + -2.812077463003139e-178, -5.7778912386589953e-201, + 7.4997100559334532e-224, -4.6439668915134491e-247, + -6.3691100762962136e-270, -9.436808465446358e-293, + 8.0970921678014997e-317}; + +#if defined(_MSC_VER) && (_MSC_VER <= 1200) +static stbsp__uint64 const stbsp__powten[20] = {1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000U}; +#define stbsp__tento19th ((stbsp__uint64)1000000000000000000) +#else +static stbsp__uint64 const stbsp__powten[20] = {1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000ULL, + 100000000000ULL, + 1000000000000ULL, + 10000000000000ULL, + 100000000000000ULL, + 1000000000000000ULL, + 10000000000000000ULL, + 100000000000000000ULL, + 1000000000000000000ULL, + 10000000000000000000ULL}; +#define stbsp__tento19th (1000000000000000000ULL) +#endif + +#define stbsp__ddmulthi(oh, ol, xh, yh) \ + { \ + double ahi = 0, alo, bhi = 0, blo; \ + stbsp__int64 bt; \ + oh = xh * yh; \ + STBSP__COPYFP(bt, xh); \ + bt &= ((~(stbsp__uint64)0) << 27); \ + STBSP__COPYFP(ahi, bt); \ + alo = xh - ahi; \ + STBSP__COPYFP(bt, yh); \ + bt &= ((~(stbsp__uint64)0) << 27); \ + STBSP__COPYFP(bhi, bt); \ + blo = yh - bhi; \ + ol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \ + } + +#define stbsp__ddtoS64(ob, xh, xl) \ + { \ + double ahi = 0, alo, vh, t; \ + ob = (stbsp__int64)xh; \ + vh = (double)ob; \ + ahi = (xh - vh); \ + t = (ahi - xh); \ + alo = (xh - (ahi - t)) - (vh + t); \ + ob += (stbsp__int64)(ahi + alo + xl); \ + } + +#define stbsp__ddrenorm(oh, ol) \ + { \ + double s; \ + s = oh + ol; \ + ol = ol - (s - oh); \ + oh = s; \ + } + +#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh); + +#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl); + +static void +stbsp__raise_to_power10(double *ohi, double *olo, double d, + stbsp__int32 power) // power can be -323 to +350 +{ + double ph, pl; + if ((power >= 0) && (power <= 22)) { + stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]); + } else { + stbsp__int32 e, et, eb; + double p2h, p2l; + + e = power; + if (power < 0) + e = -e; + et = (e * 0x2c9) >> 14; /* %23 */ + if (et > 13) + et = 13; + eb = e - (et * 23); + + ph = d; + pl = 0.0; + if (power < 0) { + if (eb) { + --eb; + stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]); + stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]); + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], + stbsp__negtoperr[et]); + ph = p2h; + pl = p2l; + } + } else { + if (eb) { + e = eb; + if (eb > 22) + eb = 22; + e -= eb; + stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]); + if (e) { + stbsp__ddrenorm(ph, pl); + stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]); + stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl); + ph = p2h; + pl = p2l; + } + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]); + ph = p2h; + pl = p2l; + } + } + } + stbsp__ddrenorm(ph, pl); + *ohi = ph; + *olo = pl; +} + +// given a float value, returns the significant bits in bits, and the position +// of the +// decimal point in decimal_pos. +/-INF and NAN are specified by special +// values returned in the decimal_pos parameter. +// frac_digits is absolute normally, but if you want from first significant +// digits (got %g and %e), or in 0x80000000 +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, + char *out, stbsp__int32 *decimal_pos, + double value, + stbsp__uint32 frac_digits) { + double d; + stbsp__int64 bits = 0; + stbsp__int32 expo, e, ng, tens; + + d = value; + STBSP__COPYFP(bits, d); + expo = (stbsp__int32)((bits >> 52) & 2047); + ng = (stbsp__int32)((stbsp__uint64)bits >> 63); + if (ng) + d = -d; + + if (expo == 2047) // is nan or inf? + { + *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? "NaN" : "Inf"; + *decimal_pos = STBSP__SPECIAL; + *len = 3; + return ng; + } + + if (expo == 0) // is zero or denormal + { + if (((stbsp__uint64)bits << 1) == 0) // do zero + { + *decimal_pos = 1; + *start = out; + out[0] = '0'; + *len = 1; + return ng; + } + // find the right expo for denormals + { + stbsp__int64 v = ((stbsp__uint64)1) << 51; + while ((bits & v) == 0) { + --expo; + v >>= 1; + } + } + } + + // find the decimal exponent as well as the decimal bits of the value + { + double ph, pl; + + // log10 estimate - very specifically tweaked to hit or undershoot by no + // more than 1 of log10 of all expos 1..2046 + tens = expo - 1023; + tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1); + + // move the significant bits into position and stick them into an int + stbsp__raise_to_power10(&ph, &pl, d, 18 - tens); + + // get full as much precision from double-double as possible + stbsp__ddtoS64(bits, ph, pl); + + // check if we undershot + if (((stbsp__uint64)bits) >= stbsp__tento19th) + ++tens; + } + + // now do the rounding in integer land + frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) + : (tens + frac_digits); + if ((frac_digits < 24)) { + stbsp__uint32 dg = 1; + if ((stbsp__uint64)bits >= stbsp__powten[9]) + dg = 10; + while ((stbsp__uint64)bits >= stbsp__powten[dg]) { + ++dg; + if (dg == 20) + goto noround; + } + if (frac_digits < dg) { + stbsp__uint64 r; + // add 0.5 at the right position and round + e = dg - frac_digits; + if ((stbsp__uint32)e >= 24) + goto noround; + r = stbsp__powten[e]; + bits = bits + (r / 2); + if ((stbsp__uint64)bits >= stbsp__powten[dg]) + ++tens; + bits /= r; + } + noround:; + } + + // kill long trailing runs of zeros + if (bits) { + stbsp__uint32 n; + for (;;) { + if (bits <= 0xffffffff) + break; + if (bits % 1000) + goto donez; + bits /= 1000; + } + n = (stbsp__uint32)bits; + while ((n % 1000) == 0) + n /= 1000; + bits = n; + donez:; + } + + // convert to string + out += 64; + e = 0; + for (;;) { + stbsp__uint32 n; + char *o = out - 8; + // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, + // constant denomiators be damned) + if (bits >= 100000000) { + n = (stbsp__uint32)(bits % 100000000); + bits /= 100000000; + } else { + n = (stbsp__uint32)bits; + bits = 0; + } + while (n) { + out -= 2; + *(stbsp__uint16 *)out = + *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + e += 2; + } + if (bits == 0) { + if ((e) && (out[0] == '0')) { + ++out; + --e; + } + break; + } + while (out != o) { + *--out = '0'; + ++e; + } + } + + *decimal_pos = tens; + *start = out; + *len = e; + return ng; +} + +#undef stbsp__ddmulthi +#undef stbsp__ddrenorm +#undef stbsp__ddmultlo +#undef stbsp__ddmultlos +#undef STBSP__SPECIAL +#undef STBSP__COPYFP + +#endif // STB_SPRINTF_NOFLOAT + +// clean up +#undef stbsp__uint16 +#undef stbsp__uint32 +#undef stbsp__int32 +#undef stbsp__uint64 +#undef stbsp__int64 +#undef STBSP__UNALIGNED + +#endif // STB_SPRINTF_IMPLEMENTATION + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +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. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +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 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. +------------------------------------------------------------------------------ +*/ diff --git a/src/os/os.c b/src/os/os.c new file mode 100644 index 0000000..00a0437 --- /dev/null +++ b/src/os/os.c @@ -0,0 +1,654 @@ +#include "os.h" +#include "core/core_string16.h" +#include "core/core_platform.h" +#include "core/core_log.h" + +/////////////////////////////////// +#if PLATFORM_WINDOWS +#define NOMINMAX +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +/////////////////////////////// +fn os_date_t os_local_time(void) { + SYSTEMTIME lt; + GetLocalTime(<); + os_date_t result = {0}; + result.ms = lt.wMilliseconds; + result.sec = lt.wSecond; + result.min = lt.wMinute; + result.hour = lt.wHour; + result.day = lt.wDay; + result.month = lt.wMonth; + result.year = lt.wYear; + return result; +} + +fn os_date_t os_universal_time(void) { + SYSTEMTIME lt; + GetSystemTime(<); + os_date_t result = {0}; + result.ms = lt.wMilliseconds; + result.sec = lt.wSecond; + result.min = lt.wMinute; + result.hour = lt.wHour; + result.day = lt.wDay; + result.month = lt.wMonth; + result.year = lt.wYear; + return result; +} + +static int64_t win32_counts_per_second; +fn f64 os_seconds(void) { + if (win32_counts_per_second == 0) { + LARGE_INTEGER freq; + QueryPerformanceFrequency(&freq); + win32_counts_per_second = freq.QuadPart; + } + + LARGE_INTEGER time; + QueryPerformanceCounter(&time); + f64 result = (f64)time.QuadPart / (f64)win32_counts_per_second; + return result; +} + +// @todo: revise these conversions +fn f64 os_get_microseconds(void) { + f64 secs = os_seconds(); + f64 result = secs * 1000000.0; + return result; +} + +fn f64 os_milliseconds(void) { + f64 secs = os_seconds(); + f64 result = secs * 1000.0; + return result; +} + +fn void os_sleep(u32 milliseconds) { + Sleep(milliseconds); +} + +/////////////////////////////// +// files +fn b32 os_copy(s8_t from, s8_t to, b32 overwrite) { + BOOL fail_if_exists = true; + if (overwrite) fail_if_exists = false; + ma_temp_t scratch = ma_begin_scratch(); + s16_t from16 = s16_from_s8(scratch.arena, from); + s16_t to16 = s16_from_s8(scratch.arena, to); + BOOL success = CopyFileW(from16.str, to16.str, fail_if_exists); + ma_end_scratch(scratch); + return success ? true : false; +} + +fn b32 os_delete(s8_t path) { + ma_temp_t scratch = ma_begin_scratch(); + s16_t path16 = s16_from_s8(scratch.arena, path); + BOOL success = DeleteFileW(path16.str); + ma_end_scratch(scratch); + return success ? true : false; +} + +fn os_mkdir_t os_mkdir(s8_t path) { + os_mkdir_t result = os_mkdir_success; + ma_temp_t scratch = ma_begin_scratch(); + s16_t path16 = s16_from_s8(scratch.arena, path); + BOOL success = CreateDirectoryW(path16.str, NULL); + if (success == 0) { + DWORD error = GetLastError(); + if (error == ERROR_ALREADY_EXISTS) result = os_mkdir_file_exists; + else if (error == ERROR_PATH_NOT_FOUND) result = os_mkdir_path_not_found; + else result = os_mkdir_other_error; + } + ma_end_scratch(scratch); + return result; +} + +fn os_write_t os_write(s8_t path, s8_t content) { + os_write_t result = os_write_other_error; + ma_temp_t scratch = ma_begin_scratch(); + s16_t path16 = s16_from_s8(scratch.arena, path); + HANDLE handle = CreateFileW(path16.str, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (handle != INVALID_HANDLE_VALUE) { + assert_expr(content.len == (DWORD)content.len); + DWORD bytes_written = 0; + BOOL error = WriteFile(handle, content.str, (DWORD)content.len, &bytes_written, NULL); + if (error == TRUE) { + if (bytes_written == content.len) { + result = os_write_success; + } + } + CloseHandle(handle); + } else result = os_write_path_not_found; + ma_end_scratch(scratch); + return result; +} + +// @todo: improve to return error codes +fn s8_t os_read(ma_arena_t *arena, s8_t path) { + s8_t result = {0}; + ma_temp_t scratch = ma_begin_scratch1(arena); + s16_t path16 = s16_from_s8(scratch.arena, path); + HANDLE handle = CreateFileW(path16.str, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (handle != INVALID_HANDLE_VALUE) { + LARGE_INTEGER file_size; + if (GetFileSizeEx(handle, &file_size)) { + if (file_size.QuadPart != 0) { + result.len = file_size.QuadPart; + result.str = ma_push_array(arena, char, result.len + 1); + assert(result.len == (i64)(DWORD)result.len); + DWORD read; + if (ReadFile(handle, result.str, (DWORD)result.len, &read, NULL)) { // @todo: can only read 32 byte size files? + if (read == result.len) { + result.str[result.len] = 0; + } + } + + } + } + CloseHandle(handle); + } + ma_end_scratch(scratch); + return result; +} + +typedef struct w32_file_iter_t w32_file_iter_t; +struct w32_file_iter_t { + HANDLE handle; + WIN32_FIND_DATAW data; +}; + +fn void os_advance(os_iter_t *it) { + while (FindNextFileW(it->w32->handle, &it->w32->data) != 0) { + WIN32_FIND_DATAW *data = &it->w32->data; + + // Skip '.' and '..' + if (data->cFileName[0] == '.' && data->cFileName[1] == '.' && data->cFileName[2] == 0) continue; + if (data->cFileName[0] == '.' && data->cFileName[1] == 0) continue; + + it->is_directory = data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + it->name = s8_from_s16(it->arena, s16_make(data->cFileName, str16_len(data->cFileName))); + + char *separator = it->path.str[it->path.len - 1] == '/' ? "" : "/"; + it->rel = s8_printf(it->arena, "%S%s%S", it->path, separator, it->name); + it->abs = os_abs(it->arena, it->rel); + it->is_valid = true; + s8_normalize_path_unsafe(it->rel); + s8_normalize_path_unsafe(it->abs); + + return; + } + + it->is_valid = false; + DWORD error = GetLastError(); + assert(error == ERROR_NO_MORE_FILES); + FindClose(it->w32->handle); +} + +fn os_iter_t *os_iter(ma_arena_t *arena, s8_t path) { + os_iter_t *it = ma_push_type(arena, os_iter_t); + it->w32 = ma_push_type(arena, w32_file_iter_t); + it->arena = arena; + it->path = path; + it->is_valid = true; + + ma_temp_t scratch = ma_begin_scratch1(arena); + s8_t mod_path = s8_printf(scratch.arena, "%S\\*", path); + s16_t mod_path16 = s16_from_s8(scratch.arena, mod_path); + + it->w32->handle = FindFirstFileW(mod_path16.str, &it->w32->data); + if (it->w32->handle == INVALID_HANDLE_VALUE) { + it->is_valid = false; + } + + if (it->is_valid) { + assert(it->w32->data.cFileName[0] == '.' && it->w32->data.cFileName[1] == 0); + os_advance(it); + } + + ma_end_scratch(scratch); + return it; +} + +fn i64 os_mod_time(s8_t file) { + WIN32_FIND_DATAW data; + ma_temp_t scratch = ma_begin_scratch(); + s16_t wpath = s16_from_s8(scratch.arena, file); + HANDLE handle = FindFirstFileW(wpath.str, &data); + i64 result = -1; + if (handle != INVALID_HANDLE_VALUE) { + FindClose(handle); + FILETIME time = data.ftLastWriteTime; + result = (i64)time.dwHighDateTime << 32 | time.dwLowDateTime; + } + ma_end_scratch(scratch); + return result; +} + +fn s8_t os_abs(ma_arena_t *arena, s8_t rel) { + const int buffer_size = 2048; + ma_temp_t scratch = ma_begin_scratch1(arena); + s16_t rel16 = s16_from_s8(scratch.arena, rel); + wchar_t *buffer = ma_push_array(scratch.arena, wchar_t, buffer_size); + DWORD written = GetFullPathNameW(rel16.str, buffer_size, buffer, 0); + assert(written != 0); + assert((i64)written < (i64)buffer_size); + s8_t result = s8_from_s16(arena, s16_make(buffer, written)); + ma_end_scratch(scratch); + return result; +} + +fn s8_t os_exe(ma_arena_t *arena) { + const int buffer_size = 2048; + ma_temp_t scratch = ma_begin_scratch1(arena); + wchar_t *buffer = ma_push_array(scratch.arena, wchar_t, buffer_size); + DWORD wsize = GetModuleFileNameW(0, buffer, buffer_size); + assert(wsize != 0); + s8_t result = s8_from_s16(arena, s16_make(buffer, wsize)); + s8_normalize_path_unsafe(result); + ma_end_scratch(scratch); + return result; +} + +fn s8_t os_exe_dir(ma_arena_t *arena) { + ma_temp_t scratch = ma_begin_scratch1(arena); + s8_t exe = os_exe(scratch.arena); + s8_t path = s8_chop_last_slash(exe); + s8_t result = s8_printf(arena, "%S", path); + ma_end_scratch(scratch); + return result; +} + +fn b32 os_is_dir(s8_t path) { + ma_temp_t scratch = ma_begin_scratch(); + s16_t path16 = s16_from_s8(scratch.arena, path); + DWORD dwAttrib = GetFileAttributesW(path16.str); + ma_end_scratch(scratch); + return dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY); +} + +fn b32 os_is_file(s8_t path) { + ma_temp_t scratch = ma_begin_scratch(); + s16_t path16 = s16_from_s8(scratch.arena, path); + DWORD dwAttrib = GetFileAttributesW(path16.str); + ma_end_scratch(scratch); + b32 is_file = (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) == 0; + return dwAttrib != INVALID_FILE_ATTRIBUTES && is_file; +} + +fn b32 os_is_abs(s8_t path) { + b32 result = path.len > 3 && char_is_alphabetic(path.str[0]) && path.str[1] == ':' && path.str[2] == '/'; + return result; +} + +fn b32 os_exists(s8_t path) { + ma_temp_t scratch = ma_begin_scratch(); + s16_t path16 = s16_from_s8(scratch.arena, path); + DWORD attribs = GetFileAttributesW(path16.str); + ma_end_scratch(scratch); + return attribs == INVALID_FILE_ATTRIBUTES ? false : true; +} + +fn s8_t os_cwd(ma_arena_t *arena) { + ma_temp_t scratch = ma_begin_scratch1(arena); + const u32 buffer_size = 1024; + wchar_t *buffer = ma_push_array(scratch.arena, wchar_t, buffer_size); + DWORD wsize = GetCurrentDirectoryW(buffer_size, buffer); + assert(wsize != 0); + assert(wsize <= buffer_size); + s8_t path = s8_from_s16(scratch.arena, s16_make(buffer, wsize)); + s8_normalize_path_unsafe(path); + s8_t result = s8_printf(arena, "%S", path); + ma_end_scratch(scratch); + return result; +} + +fn void os_set_cwd(s8_t path) { + ma_temp_t scratch = ma_begin_scratch(); + s16_t path16 = s16_from_s8(scratch.arena, path); + SetCurrentDirectoryW(path16.str); + ma_end_scratch(scratch); +} + +/////////////////////////////// +// threading + +typedef struct w32_thread_t w32_thread_t; +struct w32_thread_t { + HANDLE handle; + DWORD id; +}; + +fn os_thread_t os_thread_create(ma_arena_t *arena, os_thread_fn_t *func, void *user_data) { + assert(func); + + LPSECURITY_ATTRIBUTES security_attribs = NULL; + SIZE_T stack_size = 0; + DWORD creation_flags = 0; + DWORD thread_id = 0; + HANDLE thread_handle = CreateThread(security_attribs, stack_size, (LPTHREAD_START_ROUTINE)func, user_data, creation_flags, &thread_id); + if (thread_handle == NULL) { + debugf("%s.CreatedThread failed: %d", __FUNCTION__, GetLastError()); + return (os_thread_t){.exited = true}; + } + + os_thread_t result = {0}; + result.w32 = ma_push_type(arena, w32_thread_t); + result.w32->handle = thread_handle; + result.w32->id = thread_id; + return result; +} + +fn i32 os_thread_join(os_thread_t *thread) { + DWORD return_value_indicates_event = WaitForSingleObject(thread->w32->handle, INFINITE); + if (return_value_indicates_event != WAIT_OBJECT_0) { + debugf("%s.WaitForSingleObject failed: %d", __FUNCTION__, GetLastError()); + } + + DWORD exit_code = 0; + BOOL if_fails_then_zero = GetExitCodeThread(thread->w32->handle, &exit_code); + if (if_fails_then_zero == 0) { + debugf("%s.GetExitCodeThread failed: %d", __FUNCTION__, GetLastError()); + } else { + thread->exit_code = exit_code; + } + + CloseHandle(thread->w32->handle); + thread->exited = true; + return thread->exit_code; +} + +// @todo: +// This will probably create 16 arenas or more XD +// fn i32 os__thread_log(void *data) { +// os_core_init(); +// debugf("testing"); +// return 0; +// } + +// fn void os_test_threads(void) { +// os_thread_t threads[16]; +// ma_temp_t scratch = ma_begin_scratch(); +// for (int i = 0; i < lengthof(threads); i += 1) { +// threads[i] = os_thread_create(scratch.arena, os__thread_log, NULL); +// } +// for (int i = 0; i < lengthof(threads); i += 1) { +// os_thread_join(&threads[i]); +// } +// ma_end_scratch(scratch); +// } + +fn s8_t os_appdata(ma_arena_t *arena, s8_t name) { + assert(name.len != 0); + assert(name.str); + assert(arena); + + wchar_t *out_path = NULL; + HRESULT hr = SHGetKnownFolderPath(&FOLDERID_RoamingAppData, KF_FLAG_CREATE, NULL, &out_path); + if (!SUCCEEDED(hr)) { + debugf("%s.SHGetKnownFolderPath failed with hr: %d", __FUNCTION__, hr); + return s8_null; + } + + s16_t appdata_path = s16_from_str16((u16 *)out_path); + + ma_temp_t scratch = ma_begin_scratch1(arena); + s8_t tmp = s8_from_s16(scratch.arena, appdata_path); + s8_normalize_path_unsafe(tmp); + s8_t path = s8_printf(arena, "%S/%S", tmp, name); + os_mkdir_t mkdir_status = os_mkdir(path); + if (mkdir_status != os_mkdir_success && mkdir_status != os_mkdir_file_exists) { + debugf("%s.os_mkdir failed with status: %d, for: %S", __FUNCTION__, mkdir_status, path); + path = s8_null; + } + + CoTaskMemFree(out_path); + ma_end_scratch(scratch); + return path; +} + +/////////////////////////////////// +#elif PLATFORM_POSIX +/////////////////////////////////// +#include +#include +#include +#include +fn os_date_t os_local_time(void) { + os_date_t result = {0}; + time_t t = time(NULL); + struct tm *lt = localtime(&t); + result.sec = lt->tm_sec; + result.min = lt->tm_min; + result.hour = lt->tm_hour; + result.day = lt->tm_mday; + result.month = lt->tm_mon; + result.year = lt->tm_year; + return result; +} + +fn os_date_t os_universal_time(void) { + os_date_t result = {0}; + time_t t = time(NULL); + struct tm u = {0}; + gmtime_r(&t, &u); + result.sec = u.tm_sec; + result.min = u.tm_min; + result.hour = u.tm_hour; + result.day = u.tm_mday; + result.month = u.tm_mon; + result.year = u.tm_year; + return result; +} + +fn f64 os_get_microseconds(void) { + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + u64 result = t.tv_sec*million(1) + (t.tv_nsec/thousand(1)); + return (f64)result; +} + +fn f64 os_get_milliseconds(void) { + u64 micros = os_get_microseconds(); + f64 result = (f64)micros / 1000.0; + return result; +} + +fn s8_t os_exe(ma_arena_t *arena) { + const i32 buffer_size = 2048; + ma_temp_t temp = ma_begin_scratch1(arena); + char *buffer = ma_push_array(arena, char, buffer_size); + ssize_t size = readlink("/proc/self/exe", buffer, buffer_size); + assert(size < buffer_size); // @todo:? + assert(size != -1); + s8_t string = s8_copy(arena, s8_make(buffer, size)); + ma_end_scratch(temp); + return string; +} + +fn s8_t os_exe_dir(ma_arena_t *arena) { + ma_temp_t temp = ma_begin_scratch1(arena); + s8_t exe = os_exe(temp.arena); + s8_t dir = s8_chop_last_slash(exe); + s8_t result = s8_copy(arena, dir); + ma_end_scratch(temp); + return result; +} + +fn s8_t os_cwd(ma_arena_t *arena) { + const i32 buffer_size = 2048; + ma_temp_t temp = ma_begin_scratch1(arena); + char *buffer = ma_push_array(arena, char, buffer_size); + char *ok = getcwd(buffer, buffer_size); + assert(ok); + s8_t result = s8_copy(arena, s8_from_char(buffer)); + ma_end_scratch(temp); + return result; +} + +fn void os_set_cwd(s8_t path) { + ma_temp_t temp = ma_begin_scratch(); + chdir(s8_copy(temp.arena, path).str); + ma_end_scratch(temp); +} + +fn b32 os_exists(s8_t path) { + ma_temp_t temp = ma_begin_scratch(); + s8_t copy = s8_copy(temp.arena, path); + int ok = access(copy.str, F_OK); + ma_end_scratch(temp); + return ok == 0 ? true : false; +} + +fn b32 os_is_dir(s8_t path) { + b32 result = false; + ma_temp_t temp = ma_begin_scratch(); + s8_t copy = s8_copy(temp.arena, path); + DIR *dir = opendir(copy.str); + if (dir) { + result = true; + closedir(dir); + } + ma_end_scratch(temp); + return result; +} + +fn b32 os_is_file(s8_t path) { + ma_temp_t temp = ma_begin_scratch(); + s8_t copy = s8_copy(temp.arena, path); + struct stat path_stat; + stat(copy.str, &path_stat); + ma_end_scratch(temp); + b32 result = S_ISREG(path_stat.st_mode); + return result; +} + +fn b32 os_is_abs(s8_t path) { + b32 result = path.len && path.str[0] == '/'; + return result; +} + +fn s8_t os_abs(ma_arena_t *arena, s8_t path) { + ma_temp_t temp = ma_begin_scratch1(arena); + s8_t null_term_path = s8_copy(temp.arena, path); + char buffer[PATH_MAX]; + char *resolved_path = realpath(null_term_path.str, buffer); + s8_t result = s8_copy(arena, s8_from_char(resolved_path)); + ma_end_scratch(temp); + return result; +} + +fn s8_t os_read(ma_arena_t *arena, s8_t path) { + s8_t result = {0}; + ma_temp_t temp = ma_begin_scratch1(arena); + s8_t copy_path = s8_copy(temp.arena, path); + FILE *fd = fopen(copy_path.str, "rb"); + if (fd) { + fseek(fd, 0, SEEK_END); + long size = ftell(fd); + fseek(fd, 0, SEEK_SET); + char *string = malloc(size + 1); + fread(string, size, 1, fd); + fclose(fd); + + result = s8_make(string, size); + result.str[result.len] = 0; + } + ma_end_scratch(temp); + return result; +} + +fn os_write_t os_write(s8_t path, s8_t content) { + os_write_t result = os_write_path_not_found; + ma_temp_t scratch = ma_begin_scratch(); + s8_t copy_path = s8_copy(scratch.arena, path); + FILE *fd = fopen(copy_path.str, "w"); + if (fd) { + size_t size_written = fwrite(content.str, 1, content.len, fd); + assert((int64_t)size_written == content.len); + fclose(fd); + result = os_write_success; + } + ma_end_scratch(scratch); + return result; +} + +fn b32 os_copy(s8_t src_path, s8_t dst_path, b32 overwrite) { + if (overwrite == false && os_exists(dst_path)) { + return 0; + } + + ma_temp_t temp = ma_begin_scratch(); + s8_t src_data = os_read(temp.arena, src_path); + os_write_t write_result = os_write(dst_path, src_data); + b32 result = write_result == os_write_success; + ma_end_scratch(temp); + return result; +} + +fn b32 os_delete(s8_t path) { + ma_temp_t scratch = ma_begin_scratch(); + s8_t copy_path = s8_copy(scratch.arena, path); + int rc = unlink(copy_path.str); + ma_end_scratch(scratch); + return (b32)(rc == 0); +} + +fn void os_advance(os_iter_t *it) { + struct dirent *file = NULL; + while ((file = readdir((DIR *)it->unix_dir)) != NULL) { + if (file->d_name[0] == '.' && file->d_name[1] == '.' && file->d_name[2] == 0) { + continue; + } + if (file->d_name[0] == '.' && file->d_name[1] == 0) { + continue; + } + + it->is_directory = file->d_type == DT_DIR; + it->name = s8_copy(it->arena, s8_from_char(file->d_name)); + + const char *separator = it->path.str[it->path.len - 1] == '/' ? "" : "/"; + it->rel = s8_printf(it->arena, "%S%s%s", it->path, separator, file->d_name); + it->abs = os_abs(it->arena, it->rel); + it->is_valid = true; + return; + } + + it->is_valid = false; + closedir((DIR *)it->unix_dir); +} + +fn os_iter_t *os_iter(ma_arena_t *arena, s8_t path) { + os_iter_t *it = ma_push_type(arena, os_iter_t); + it->arena = arena; + it->path = s8_copy(arena, path); + it->unix_dir = opendir(s8_copy(arena, it->path).str); + if (it->unix_dir) { + it->is_valid = true; + os_advance(it); + } + return it; +} + +/////////////////////////////////// +#endif // PLATFORM_POSIX +/////////////////////////////////// + +fn s8_t os_format_date(ma_arena_t *arena, os_date_t date) { + s8_t result = s8_printf(arena, "%04u-%02u-%02u %02u:%02u:%02u.%03u", date.year, date.month, date.day, date.hour, date.min, date.sec, date.ms); + return result; +} + + +#if PLATFORM_WINDOWS || PLATFORM_POSIX +fn int os_systemf(const char *string, ...) { + ma_temp_t scratch = ma_begin_scratch(); + S8_FMT(scratch.arena, string, result); + int error_code = system(result.str); + ma_end_scratch(scratch); + return error_code; +} +#endif diff --git a/src/os/os.h b/src/os/os.h new file mode 100644 index 0000000..77f57b3 --- /dev/null +++ b/src/os/os.h @@ -0,0 +1,90 @@ +#pragma once +#include "core/core_basic.h" +#include "core/core_string.h" + +typedef struct os_date_t os_date_t; +struct os_date_t { + u16 ms; + u16 sec; + u16 min; + u16 hour; + u16 day; + u16 month; + u16 year; +}; + +typedef struct os_iter_t os_iter_t; +struct os_iter_t { + s8_t abs; + s8_t rel; + s8_t name; + b8 is_directory; + b8 is_valid; + + s8_t path; + ma_arena_t *arena; + + union { + struct w32_file_iter_t *w32; + void *platform; + void *unix_dir; + }; +}; + +typedef enum { + os_mkdir_success, + os_mkdir_file_exists, + os_mkdir_path_not_found, + os_mkdir_other_error, +} os_mkdir_t; + +typedef enum { + os_write_success, + os_write_path_not_found, + os_write_other_error, +} os_write_t; + +fn os_date_t os_local_time(void); +fn os_date_t os_universal_time(void); +fn s8_t os_format_date(ma_arena_t *arena, os_date_t date); +fn f64 os_seconds(void); +fn f64 os_milliseconds(void); +fn f64 os_get_microseconds(void); + +fn b32 os_copy(s8_t from, s8_t to, b32 overwrite); +fn b32 os_delete(s8_t path); +fn os_mkdir_t os_mkdir(s8_t path); +fn os_write_t os_write(s8_t path, s8_t content); +fn s8_t os_read(ma_arena_t *arena, s8_t path); + +fn void os_advance(os_iter_t *it); +fn os_iter_t *os_iter(ma_arena_t *arena, s8_t path); + +fn i64 os_mod_time(s8_t file); +fn s8_t os_abs(ma_arena_t *arena, s8_t rel); +fn s8_t os_exe(ma_arena_t *arena); +fn s8_t os_exe_dir(ma_arena_t *arena); +fn b32 os_is_dir(s8_t path); +fn b32 os_is_file(s8_t path); +fn b32 os_is_abs(s8_t path); +fn b32 os_exists(s8_t path); + +fn s8_t os_cwd(ma_arena_t *arena); +fn void os_set_cwd(s8_t new_cwd); + +fn s8_t os_appdata(ma_arena_t *arena, s8_t name); + + +typedef i32 os_thread_fn_t(void *user_data); +typedef struct os_thread_t os_thread_t; +struct os_thread_t { + b32 exited; + i32 exit_code; + union { + struct w32_thread_t *w32; + void *ptr; + }; +}; + +fn os_thread_t os_thread_create(ma_arena_t *arena, os_thread_fn_t *func, void *user_data); +fn i32 os_thread_wait_for_exit(os_thread_t *thread); diff --git a/src/scratch/FiraCode-Regular.ttf b/src/scratch/FiraCode-Regular.ttf new file mode 100644 index 0000000..b8a44d2 Binary files /dev/null and b/src/scratch/FiraCode-Regular.ttf differ diff --git a/src/scratch/fira_code.c b/src/scratch/fira_code.c new file mode 100644 index 0000000..f1b7f17 --- /dev/null +++ b/src/scratch/fira_code.c @@ -0,0 +1,2950 @@ +#include "core/core_basic.h" +gb_read_only u8 main_font_data[] = { +0,1,0,0,0,16,1,0,0,4,0,0,71,68,69,70,9,171,18,85,0,0,2,40,0,0,1,242,71,80,79,83,196,118,81,155,0,0,24,140,0,0,22,52,71,83,85,66,112,248,190,150,0,0,222,16,0,0,83,202,79,83,47,50, +138,149,152,224,0,0,1,200,0,0,0,96,83,84,65,84,121,145,108,221,0,0,1,96,0,0,0,46,99,109,97,112,147,243,132,151,0,0,75,136,0,0,65,218,103,97,115,112,0,0,0,16,0,0,1,20,0,0,0,8,103,108,121,102, +162,238,89,238,0,1,49,220,0,1,174,124,104,101,97,100,18,231,38,251,0,0,1,144,0,0,0,54,104,104,101,97,3,44,4,186,0,0,1,60,0,0,0,36,104,109,116,120,114,171,8,181,0,0,46,192,0,0,28,198,108,111,99,97, +196,86,92,95,0,0,10,28,0,0,14,110,109,97,120,112,7,164,2,130,0,0,1,28,0,0,0,32,110,97,109,101,175,39,227,15,0,0,4,28,0,0,5,254,112,111,115,116,105,61,50,193,0,0,141,100,0,0,80,169,112,114,101,112, +104,6,140,133,0,0,1,12,0,0,0,7,184,1,255,133,176,4,141,0,0,1,0,1,255,255,0,15,0,1,0,0,7,54,2,6,0,96,0,120,0,10,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,3,0,1,0,0, +7,188,253,124,0,0,9,96,242,29,246,176,9,80,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,45,0,1,0,1,0,8,0,1,0,0,0,20,0,1,0,0,0,28,0,2,119,103,104,116,1,0,0,0,0,2,0,3, +0,0,0,2,1,2,1,144,0,0,2,188,0,0,0,0,0,1,0,0,0,5,0,131,5,237,6,224,95,15,60,245,0,3,7,208,0,0,0,0,219,9,45,119,0,0,0,0,221,85,174,190,242,29,252,24,9,80,9,96,0,0,0,6, +0,2,0,0,0,0,0,0,0,4,4,185,1,144,0,5,0,0,4,244,4,146,0,0,0,146,4,244,4,146,0,0,2,171,0,50,2,120,0,0,2,11,8,9,5,0,0,2,0,4,224,0,2,239,18,1,249,251,2,0,32,24,0,0, +0,0,67,84,68,66,0,192,0,13,255,255,7,188,253,124,0,0,8,116,3,232,96,0,0,159,223,215,0,0,4,29,5,97,0,0,0,32,0,5,0,1,0,2,0,56,0,0,0,0,0,0,0,18,0,0,0,0,0,1,0,2,0,0, +0,28,0,0,0,12,0,2,0,2,6,227,6,241,0,0,7,19,7,19,0,15,0,1,0,3,6,242,6,243,7,20,0,2,0,73,0,1,0,40,0,1,0,42,0,43,0,1,0,45,0,95,0,1,0,97,0,153,0,1,0,155,0,183, +0,1,0,185,0,205,0,1,0,207,0,218,0,1,0,220,0,232,0,1,0,234,1,14,0,1,1,16,1,18,0,1,1,20,1,20,0,1,1,22,1,22,0,2,1,26,1,61,0,1,1,63,1,71,0,1,1,73,1,75,0,1,1,77, +1,87,0,1,1,89,1,94,0,1,1,97,1,97,0,1,1,99,1,110,0,1,1,112,1,116,0,1,1,118,1,118,0,1,1,120,1,120,0,1,1,122,1,129,0,1,1,131,1,153,0,1,1,155,1,168,0,1,1,170,1,171,0,1, +1,173,1,184,0,1,1,186,1,205,0,1,1,207,1,231,0,1,1,233,1,234,0,1,1,236,1,238,0,1,1,241,1,241,0,1,1,243,2,4,0,1,2,6,2,6,0,1,2,8,2,8,0,1,2,10,2,17,0,1,2,19,2,39, +0,1,2,41,2,41,0,1,2,43,2,56,0,1,2,58,2,68,0,1,2,70,2,254,0,1,3,0,3,0,0,1,3,2,3,131,0,1,3,136,3,137,0,1,3,141,3,141,0,1,4,139,4,139,0,1,4,166,4,166,0,1,4,168, +4,168,0,1,4,211,4,211,0,1,4,245,4,245,0,1,4,249,4,249,0,1,6,17,6,17,0,1,6,38,6,39,0,1,6,41,6,41,0,1,6,58,6,58,0,1,6,60,6,60,0,1,6,62,6,63,0,1,6,65,6,66,0,1, +6,68,6,71,0,1,6,73,6,81,0,1,6,83,6,83,0,1,6,96,6,99,0,1,6,102,6,108,0,1,6,110,6,110,0,1,6,113,6,114,0,1,6,220,6,220,0,1,6,227,6,243,0,3,6,246,6,246,0,1,7,19,7,20, +0,3,7,24,7,24,0,1,7,26,7,32,0,1,7,36,7,36,0,1,7,38,7,38,0,1,0,0,0,0,0,29,1,98,0,3,0,1,4,9,0,0,0,172,3,240,0,3,0,1,4,9,0,1,0,18,3,222,0,3,0,1,4,9, +0,2,0,14,3,208,0,3,0,1,4,9,0,3,0,54,3,154,0,3,0,1,4,9,0,4,0,34,3,120,0,3,0,1,4,9,0,5,0,26,3,94,0,3,0,1,4,9,0,6,0,32,3,62,0,3,0,1,4,9,0,7,0,104, +2,214,0,3,0,1,4,9,0,8,0,108,2,106,0,3,0,1,4,9,0,9,0,108,2,106,0,3,0,1,4,9,0,11,0,34,2,72,0,3,0,1,4,9,0,12,0,34,2,72,0,3,0,1,4,9,0,13,1,32,1,40,0,3, +0,1,4,9,0,14,0,52,0,244,0,3,0,1,4,9,0,25,0,16,0,228,0,3,0,1,4,9,1,0,0,12,0,216,0,3,0,1,4,9,1,1,0,10,0,206,0,3,0,1,4,9,1,2,0,14,3,208,0,3,0,1,4,9, +1,3,0,12,0,194,0,3,0,1,4,9,1,4,0,12,0,182,0,3,0,1,4,9,1,5,0,16,0,166,0,3,0,1,4,9,1,6,0,8,0,158,0,3,0,1,4,9,1,7,0,10,0,148,0,3,0,1,4,9,1,8,0,28, +0,120,0,3,0,1,4,9,1,9,0,32,3,62,0,3,0,1,4,9,1,10,0,30,0,90,0,3,0,1,4,9,1,11,0,30,0,60,0,3,0,1,4,9,1,12,0,34,0,26,0,3,0,1,4,9,1,13,0,26,0,0,0,70, +0,105,0,114,0,97,0,67,0,111,0,100,0,101,0,45,0,66,0,111,0,108,0,100,0,70,0,105,0,114,0,97,0,67,0,111,0,100,0,101,0,45,0,83,0,101,0,109,0,105,0,66,0,111,0,108,0,100,0,70,0,105,0,114, +0,97,0,67,0,111,0,100,0,101,0,45,0,77,0,101,0,100,0,105,0,117,0,109,0,70,0,105,0,114,0,97,0,67,0,111,0,100,0,101,0,45,0,82,0,101,0,116,0,105,0,110,0,97,0,70,0,105,0,114,0,97,0,67, +0,111,0,100,0,101,0,45,0,76,0,105,0,103,0,104,0,116,0,82,0,111,0,109,0,97,0,110,0,66,0,111,0,108,0,100,0,83,0,101,0,109,0,105,0,66,0,111,0,108,0,100,0,77,0,101,0,100,0,105,0,117,0,109, +0,82,0,101,0,116,0,105,0,110,0,97,0,76,0,105,0,103,0,104,0,116,0,87,0,101,0,105,0,103,0,104,0,116,0,70,0,105,0,114,0,97,0,67,0,111,0,100,0,101,0,104,0,116,0,116,0,112,0,58,0,47,0,47, +0,115,0,99,0,114,0,105,0,112,0,116,0,115,0,46,0,115,0,105,0,108,0,46,0,111,0,114,0,103,0,47,0,79,0,70,0,76,0,84,0,104,0,105,0,115,0,32,0,70,0,111,0,110,0,116,0,32,0,83,0,111,0,102, +0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,100,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,116,0,104,0,101,0,32,0,83,0,73,0,76,0,32, +0,79,0,112,0,101,0,110,0,32,0,70,0,111,0,110,0,116,0,32,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,44,0,32,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,49,0,46,0,32, +0,84,0,104,0,105,0,115,0,32,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,32,0,105,0,115,0,32,0,97,0,118,0,97,0,105,0,108,0,97,0,98,0,108,0,101,0,32,0,119,0,105,0,116,0,104,0,32,0,97, +0,32,0,70,0,65,0,81,0,32,0,97,0,116,0,58,0,32,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,115,0,99,0,114,0,105,0,112,0,116,0,115,0,46,0,115,0,105,0,108,0,46,0,111,0,114,0,103,0,47, +0,79,0,70,0,76,0,104,0,116,0,116,0,112,0,115,0,58,0,47,0,47,0,116,0,111,0,110,0,115,0,107,0,121,0,46,0,109,0,101,0,67,0,97,0,114,0,114,0,111,0,105,0,115,0,32,0,67,0,111,0,114,0,112, +0,111,0,114,0,97,0,116,0,101,0,44,0,32,0,69,0,100,0,101,0,110,0,115,0,112,0,105,0,101,0,107,0,101,0,114,0,109,0,97,0,110,0,110,0,32,0,65,0,71,0,44,0,32,0,78,0,105,0,107,0,105,0,116, +0,97,0,32,0,80,0,114,0,111,0,107,0,111,0,112,0,111,0,118,0,70,0,105,0,114,0,97,0,32,0,77,0,111,0,110,0,111,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97, +0,114,0,107,0,32,0,111,0,102,0,32,0,84,0,104,0,101,0,32,0,77,0,111,0,122,0,105,0,108,0,108,0,97,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,70,0,105, +0,114,0,97,0,67,0,111,0,100,0,101,0,45,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,53,0,46,0,48,0,48,0,50,0,70,0,105,0,114,0,97,0,32, +0,67,0,111,0,100,0,101,0,32,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,53,0,46,0,48,0,48,0,50,0,59,0,67,0,84,0,68,0,66,0,59,0,70,0,105,0,114,0,97,0,67,0,111,0,100,0,101,0,45, +0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,70,0,105,0,114,0,97,0,32,0,67,0,111,0,100,0,101,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116, +0,32,0,50,0,48,0,49,0,52,0,45,0,50,0,48,0,50,0,48,0,32,0,84,0,104,0,101,0,32,0,70,0,105,0,114,0,97,0,32,0,67,0,111,0,100,0,101,0,32,0,80,0,114,0,111,0,106,0,101,0,99,0,116, +0,32,0,65,0,117,0,116,0,104,0,111,0,114,0,115,0,32,0,40,0,104,0,116,0,116,0,112,0,115,0,58,0,47,0,47,0,103,0,105,0,116,0,104,0,117,0,98,0,46,0,99,0,111,0,109,0,47,0,116,0,111,0,110, +0,115,0,107,0,121,0,47,0,70,0,105,0,114,0,97,0,67,0,111,0,100,0,101,0,41,0,0,0,0,0,80,0,108,0,119,0,130,0,141,0,152,0,163,0,174,0,186,0,197,0,208,0,248,1,4,1,69,1,119,1,131,1,143, +1,154,1,166,1,178,1,222,2,17,2,28,2,36,2,61,2,72,2,83,2,94,2,105,2,116,2,127,2,138,2,149,2,161,2,183,2,240,2,251,3,6,3,17,3,28,3,52,3,83,3,94,3,118,3,156,3,167,3,178,3,189,3,200, +3,211,3,222,3,233,3,245,4,0,4,34,4,45,4,70,4,81,4,97,4,109,4,120,4,131,4,143,4,168,4,211,4,245,5,0,5,11,5,22,5,78,5,89,5,139,5,150,5,161,5,172,5,183,5,194,5,205,5,216,6,33,6,44, +6,55,6,123,6,162,6,202,7,8,7,51,7,62,7,73,7,84,7,153,7,164,7,175,7,186,7,197,7,208,8,13,8,32,8,58,8,69,8,80,8,91,8,125,8,136,8,147,8,158,8,169,8,180,8,191,8,202,8,213,8,224,8,235, +8,255,9,29,9,40,9,51,9,62,9,73,9,104,9,127,9,138,9,149,9,160,9,171,9,193,9,204,9,215,9,226,9,238,9,249,10,4,10,15,10,26,10,91,10,102,10,113,10,124,10,135,10,146,10,157,10,169,10,180,10,191,11,34, +11,45,11,97,11,143,11,154,11,165,11,176,11,187,11,198,11,251,12,74,12,86,12,148,12,203,12,214,12,225,12,236,12,247,13,2,13,13,13,24,13,35,13,120,13,160,14,7,14,18,14,29,14,42,14,53,14,89,14,133,14,144,14,182, +14,204,14,215,14,226,14,237,14,248,15,3,15,14,15,84,15,95,15,109,15,120,15,164,15,192,15,204,15,231,15,242,16,13,16,45,16,57,16,69,16,80,16,92,16,136,16,191,16,227,16,238,17,40,17,51,17,62,17,109,17,120,17,164, +17,175,17,186,17,197,17,208,17,219,17,230,17,241,18,54,18,65,18,76,18,161,18,213,19,10,19,63,19,109,19,120,19,131,19,143,19,208,19,219,19,230,19,241,19,252,20,7,20,84,20,123,20,172,20,184,20,196,20,208,20,242,20,253, +21,8,21,19,21,30,21,41,21,52,21,63,21,75,21,86,21,97,21,119,21,147,21,158,21,169,21,180,21,191,21,220,21,254,22,9,22,20,22,31,22,42,22,64,22,75,22,86,22,97,22,109,22,120,22,131,22,142,22,153,22,186,22,224, +23,12,23,44,23,44,23,82,23,90,23,159,23,231,24,27,24,61,24,69,24,112,24,120,24,137,24,148,24,172,24,232,24,240,24,251,25,6,25,46,25,116,25,148,25,159,25,170,25,237,26,9,26,20,26,56,26,64,26,72,26,80,26,99, +26,107,26,115,26,123,26,158,26,169,26,228,26,236,27,18,27,45,27,70,27,105,27,131,27,171,27,213,27,255,28,54,28,102,28,110,28,164,28,215,28,223,28,234,28,242,29,26,29,86,29,127,29,178,29,254,30,42,30,106,30,141,30,188, +30,238,31,44,31,127,31,135,31,143,31,180,31,192,32,10,32,36,32,102,32,152,32,163,32,201,32,240,33,19,33,49,33,83,33,115,33,178,33,207,34,36,34,113,34,142,34,150,34,182,34,223,35,6,35,54,35,101,35,137,35,184,36,8, +36,19,36,27,36,38,36,98,36,145,36,191,36,225,37,17,37,70,37,81,37,92,37,100,37,111,37,168,37,179,37,190,37,201,38,0,38,11,38,22,38,33,38,88,38,99,38,110,38,121,38,132,38,143,38,154,38,181,38,192,38,246,39,49, +39,63,39,100,39,177,39,243,40,36,40,102,40,160,40,168,40,221,41,36,41,94,41,148,41,199,42,2,42,10,42,18,42,54,42,133,42,202,42,245,43,34,43,80,43,167,43,244,44,35,44,43,44,117,44,178,44,194,44,205,44,229,45,30, +45,38,45,49,45,60,45,100,45,164,45,196,45,207,45,218,46,30,46,58,46,69,46,103,46,144,46,168,46,176,46,195,46,203,46,211,46,230,46,238,46,249,47,82,47,90,47,124,47,153,47,178,47,213,47,239,48,21,48,63,48,108,48,162, +48,212,48,220,49,14,49,64,49,72,49,83,49,91,49,99,49,155,49,198,49,255,50,7,50,55,50,116,50,151,50,190,50,240,51,46,51,117,51,125,51,133,51,170,51,181,51,251,52,19,52,84,52,134,52,145,52,184,52,220,53,2,53,37, +53,71,53,104,53,133,53,196,54,19,54,92,54,121,54,146,54,178,54,218,54,255,55,43,55,85,55,120,55,165,55,240,55,251,56,3,56,14,56,73,56,118,56,164,56,198,56,242,57,36,57,47,57,58,57,66,57,77,57,133,57,144,57,155, +57,166,57,221,57,232,57,243,57,254,58,50,58,61,58,72,58,83,58,94,58,105,58,116,58,142,58,153,58,204,59,6,59,42,59,50,59,138,59,197,59,246,60,56,60,114,60,165,60,220,61,29,61,84,61,136,61,204,62,37,62,45,62,53, +62,91,62,168,62,236,63,21,63,82,63,128,63,207,64,23,64,67,64,75,64,83,64,91,64,99,64,122,64,130,64,138,64,146,64,203,64,211,64,219,64,241,64,249,65,1,65,28,65,36,65,44,65,52,65,82,65,90,65,98,65,157,65,165, +65,206,66,7,66,19,66,31,66,43,66,55,66,67,66,79,66,91,66,102,66,113,66,132,66,165,66,173,66,230,67,28,67,60,67,91,67,125,67,177,67,218,67,230,67,241,68,41,68,49,68,99,68,107,68,156,68,169,68,182,68,194,68,206, +68,218,68,230,68,242,68,254,69,10,69,22,69,34,69,46,69,57,69,68,69,79,69,90,69,101,69,112,69,123,69,134,69,145,69,156,69,167,69,179,69,191,69,203,69,215,69,227,69,239,69,251,70,7,70,19,70,31,70,43,70,55,70,67, +70,79,70,91,70,103,70,115,70,127,70,139,70,151,70,163,70,175,70,187,70,199,70,211,70,223,70,235,70,247,71,3,71,15,71,27,71,39,71,51,71,63,71,75,71,87,71,99,71,110,71,121,71,133,71,145,71,157,71,169,71,181,71,193, +71,205,71,217,71,229,71,241,71,253,72,9,72,21,72,33,72,45,72,56,72,67,72,79,72,91,72,103,72,115,72,127,72,139,72,151,72,163,72,175,72,187,72,199,72,211,72,223,72,235,72,247,73,3,73,15,73,27,73,39,73,107,73,180, +73,223,74,43,74,106,74,169,74,215,75,18,75,50,75,95,75,139,75,147,75,179,76,6,76,14,76,61,76,111,76,170,76,226,77,15,77,56,77,121,77,169,77,220,78,34,78,45,78,56,78,67,78,78,78,89,78,100,78,111,78,122,78,133, +78,144,78,155,78,184,78,216,79,4,79,50,79,63,79,76,79,127,79,191,79,233,80,30,80,84,80,168,80,251,81,56,81,128,81,214,82,19,82,93,82,139,82,147,82,155,82,163,82,203,83,5,83,16,83,27,83,38,83,49,83,60,83,71, +83,82,83,93,83,104,83,115,83,126,83,137,83,148,83,159,83,173,83,187,83,201,83,215,83,229,83,243,84,1,84,15,84,29,84,43,84,57,84,68,84,79,84,90,84,101,84,112,84,123,84,134,84,145,84,156,84,167,84,178,84,189,84,200, +84,211,84,222,84,233,84,244,84,255,85,10,85,22,85,37,85,52,85,67,85,82,85,97,85,112,85,127,85,142,85,157,85,172,85,187,85,198,85,209,85,220,85,231,85,242,85,253,86,8,86,19,86,30,86,41,86,52,86,63,86,74,86,146, +86,218,87,57,87,68,87,79,87,90,87,101,87,112,87,123,87,134,87,145,87,156,87,167,87,178,87,189,87,200,87,211,87,222,87,233,87,244,87,255,88,10,88,21,88,32,88,43,88,54,88,135,88,216,89,63,89,74,89,85,89,96,89,107, +89,118,89,129,89,140,89,151,89,162,89,173,89,184,89,196,89,211,89,226,89,241,90,0,90,15,90,30,90,45,90,60,90,75,90,90,90,105,90,113,90,121,90,142,90,153,90,227,91,28,91,68,91,104,91,160,91,236,92,44,92,76,92,133, +92,159,92,205,93,18,93,47,93,100,93,169,93,187,94,16,94,79,94,143,94,203,95,16,95,42,95,89,95,153,95,182,95,235,96,48,96,68,96,153,96,214,97,27,97,36,97,45,97,54,97,63,97,72,97,81,97,90,97,99,97,108,97,117, +97,161,97,179,97,219,98,22,98,49,98,97,98,159,98,177,98,249,99,46,99,55,99,64,99,73,99,82,99,91,99,100,99,109,99,118,99,127,99,136,99,145,99,154,99,163,99,172,99,181,99,190,99,199,99,208,99,217,99,226,99,241,100,12, +100,72,100,151,100,252,101,44,101,133,101,202,102,36,102,145,102,223,103,49,103,161,103,253,104,130,104,252,105,88,105,116,105,145,105,184,105,229,106,27,106,58,106,89,106,149,106,209,106,218,106,247,107,27,107,40,107,96,107,110,107,125,107,144, +107,175,107,235,107,243,107,251,107,251,107,251,107,251,107,251,107,251,107,251,107,251,107,251,107,251,108,10,108,25,108,65,108,74,108,83,108,120,108,157,108,223,109,33,109,52,109,71,109,87,109,104,109,115,109,136,109,145,109,154,109,162,109,170, +109,178,109,186,109,194,109,202,109,210,109,218,109,218,109,218,109,218,109,231,109,244,110,1,110,13,110,21,110,34,110,42,110,50,110,63,110,82,110,90,110,98,110,106,110,114,110,122,110,122,110,122,110,150,110,200,110,251,111,45,111,74,111,103, +111,139,111,175,111,196,111,217,111,239,111,254,112,6,112,14,112,22,112,30,112,63,112,96,112,115,112,139,112,186,113,0,113,26,113,97,113,132,113,145,113,162,113,227,113,240,114,60,114,102,114,115,114,132,114,219,115,18,115,31,115,44,115,115, +115,144,115,180,116,0,116,117,116,191,116,203,116,220,117,15,117,28,117,116,117,233,118,47,118,119,118,190,119,49,119,119,119,176,120,11,120,23,120,53,120,65,120,82,120,103,120,114,120,123,120,132,120,145,120,158,120,169,120,235,121,34,121,92, +121,152,121,210,121,239,122,12,122,41,122,79,122,131,122,169,122,182,122,195,122,208,123,42,123,87,123,144,123,165,123,176,123,184,123,192,123,192,123,192,123,192,123,192,123,192,123,192,123,192,123,192,123,246,124,64,124,145,124,205,125,12,125,64, +125,107,125,158,125,217,126,14,126,57,126,57,126,141,126,162,126,173,126,181,126,192,126,200,126,215,126,250,127,23,127,57,127,100,127,140,127,149,127,158,127,185,127,196,127,223,127,234,128,9,128,38,128,61,128,100,128,123,128,131,128,147,128,164, +128,173,128,182,128,209,128,251,129,47,129,98,129,149,129,200,129,236,130,25,130,69,130,105,130,130,130,143,130,169,130,215,130,235,131,10,131,32,131,53,131,82,131,110,131,142,131,219,132,5,132,21,132,43,132,128,132,205,132,227,132,238,133,21, +133,32,133,78,133,86,133,110,133,139,133,164,133,215,134,21,134,35,134,61,134,88,134,99,134,110,134,121,134,213,135,85,135,94,135,103,135,111,135,154,135,165,135,181,135,192,135,203,135,214,135,225,135,236,135,247,136,11,136,47,136,98,136,109, +136,120,136,171,136,191,136,202,136,235,137,35,137,69,137,96,137,107,137,118,137,126,137,147,137,158,137,166,137,166,137,166,137,166,137,166,137,166,137,166,137,166,137,199,137,232,138,11,138,45,138,80,138,114,138,148,138,182,138,236,139,34,139,45, +139,72,139,115,139,126,139,136,139,161,139,172,139,183,139,247,140,30,140,69,140,110,140,150,140,170,140,205,140,232,141,4,141,31,141,77,141,88,141,177,141,188,141,223,142,24,142,35,142,81,142,154,142,165,142,206,142,217,143,13,143,72,143,99, +143,113,143,126,143,140,143,154,143,168,143,182,143,196,143,210,143,224,143,238,143,251,144,9,144,23,144,37,144,51,144,65,144,79,144,93,144,107,144,121,144,135,144,149,144,166,144,186,144,203,144,220,144,234,145,0,145,17,146,72,148,174,149,195, +149,228,150,26,150,80,150,126,150,172,150,218,151,9,151,31,151,53,151,95,151,156,151,218,152,24,152,85,152,159,152,249,153,51,153,89,153,126,153,159,153,192,153,214,153,236,154,2,154,23,154,39,154,64,154,96,154,110,154,124,154,145,154,166, +154,182,154,199,154,215,154,232,155,1,155,20,155,39,155,58,155,77,155,90,155,104,155,128,155,154,155,175,155,196,155,229,155,249,156,19,156,45,156,67,156,89,156,113,156,138,156,164,156,190,156,224,157,0,157,33,157,53,157,98,157,124,157,148, +157,174,157,198,157,220,157,242,158,7,158,28,158,63,158,98,158,112,158,134,158,192,158,221,159,0,159,35,159,83,159,128,159,177,159,250,160,8,160,28,160,50,160,72,160,93,160,113,160,143,160,176,160,209,160,240,161,17,161,31,161,39,161,53, +161,61,161,75,161,89,161,103,161,116,161,129,161,143,161,162,161,179,161,201,161,218,161,240,162,9,162,29,162,46,162,68,162,85,162,107,162,133,162,154,162,176,162,190,162,210,162,227,162,244,163,2,163,16,163,35,163,69,163,104,163,118,163,145, +163,173,163,187,163,207,163,224,163,243,164,4,164,18,164,44,164,64,164,84,164,112,164,134,164,156,164,181,164,203,164,225,164,251,165,22,165,33,165,44,165,59,165,78,165,99,165,113,165,126,165,145,165,176,165,207,165,220,165,244,166,13,166,27, +166,46,166,74,166,96,166,118,166,143,166,165,166,187,166,213,166,240,167,9,167,28,167,50,167,67,167,89,167,106,167,132,167,152,167,175,167,192,167,215,167,232,168,1,168,21,168,41,168,67,168,87,168,107,168,134,168,160,168,186,168,213,168,235, +169,14,169,56,169,251,170,22,170,56,170,89,170,129,170,163,170,204,170,245,171,37,171,146,171,255,172,86,172,169,172,222,173,37,173,79,173,141,173,178,173,194,173,214,173,234,173,245,174,4,174,101,174,176,174,206,175,50,175,138,175,216,176,8, +176,55,176,114,176,128,176,149,176,206,176,231,177,11,177,67,177,147,177,167,177,184,177,244,178,45,178,65,178,80,178,100,178,120,178,140,178,169,178,189,178,209,178,229,178,249,180,11,180,26,180,46,180,66,180,86,180,106,180,126,180,141,180,156, +180,171,181,19,181,34,181,61,181,114,181,170,181,222,182,18,182,61,183,5,183,33,183,44,183,78,183,202,183,252,184,11,184,31,184,46,184,66,184,99,184,126,184,141,184,156,184,171,184,186,184,206,184,226,184,246,185,1,185,21,185,31,185,41, +185,56,185,71,185,71,185,71,185,162,185,241,186,109,186,130,186,143,186,163,187,52,187,62,187,72,187,85,187,101,187,140,187,173,187,199,188,47,188,82,188,128,188,167,188,187,188,214,188,249,189,30,189,83,189,148,189,198,190,8,190,18,190,29, +190,40,190,83,190,186,191,49,191,87,191,141,191,151,191,179,191,189,191,200,191,210,191,227,191,238,192,12,192,57,192,67,192,209,193,40,193,105,193,249,194,23,194,35,194,44,194,53,194,62,194,110,194,137,194,147,194,181,194,214,194,235,194,245, +195,16,195,27,195,55,195,66,195,87,195,107,195,127,195,147,195,167,195,247,196,38,196,100,196,153,196,191,196,238,197,40,197,78,197,130,197,173,197,201,197,239,197,249,198,4,198,14,198,24,198,35,198,46,198,56,198,67,198,77,198,87,198,98, +198,109,198,141,198,151,198,250,199,95,199,212,200,38,200,72,200,120,200,165,200,215,200,223,200,231,200,241,201,13,201,26,201,40,201,55,201,63,201,71,201,86,201,101,201,109,201,129,201,148,201,178,201,186,201,194,201,202,201,216,201,227,201,236, +201,247,202,18,202,26,202,40,202,54,202,92,202,115,202,130,202,145,202,168,202,187,202,206,202,236,203,24,203,62,203,76,203,114,203,150,203,165,203,173,203,182,203,191,203,206,203,221,203,230,203,250,204,13,204,43,204,52,204,61,204,70,204,78, +204,93,204,108,204,116,204,143,204,158,204,173,204,219,204,228,204,237,205,9,205,45,205,81,205,117,205,153,205,210,206,10,206,57,206,103,206,172,206,180,206,195,206,203,206,211,206,219,209,34,210,193,211,67,214,5,214,69,214,109,214,223,214,237, +215,1,215,12,215,23,215,53,215,62,0,0,0,1,0,0,0,10,0,64,0,104,0,6,68,70,76,84,0,38,99,121,114,108,0,38,103,114,101,107,0,38,108,97,116,110,0,38,122,105,110,104,0,38,122,121,121,121,0,38,0,4,0,0, +0,0,255,255,0,3,0,0,0,1,0,2,0,3,99,112,115,112,0,34,109,97,114,107,0,28,109,107,109,107,0,20,0,0,0,2,0,2,0,3,0,0,0,1,0,1,0,0,0,1,0,0,0,4,21,164,0,200,0,138,0,10,0,6, +0,16,0,1,0,10,0,1,0,1,0,102,0,26,0,1,0,36,0,12,0,3,18,94,0,8,14,152,0,1,2,99,6,129,0,1,0,3,6,227,6,239,7,19,0,16,0,0,21,86,0,0,21,86,0,0,21,86,0,0,21,86,0,0, +21,80,0,0,21,86,0,0,21,86,0,0,21,86,0,0,21,86,0,0,21,86,0,0,21,86,0,0,21,86,0,0,21,74,0,0,21,68,0,0,21,62,0,0,21,86,0,2,0,2,6,227,6,241,0,0,7,19,7,19,0,15,0,6, +0,16,0,1,0,10,0,0,0,1,0,42,0,22,0,1,0,28,0,12,0,1,0,4,0,1,2,107,254,135,0,1,0,1,7,20,0,3,0,0,20,192,0,0,20,192,0,0,20,186,0,1,0,3,6,242,6,243,7,20,0,4,0,0, +0,1,0,8,0,1,20,196,18,218,0,2,20,76,0,12,3,99,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,188,20,148,18,188, +20,148,18,200,20,148,18,182,18,176,18,182,18,176,18,182,18,176,18,182,18,176,18,182,18,176,18,182,18,176,18,170,20,148,18,164,18,158,18,170,20,148,18,164,18,158,18,152,18,146,18,152,18,146,18,152,18,146,18,152,18,146,18,152, +18,146,18,152,18,146,18,152,18,146,18,152,18,146,18,152,18,146,18,152,18,146,18,200,20,148,18,140,18,134,18,140,18,134,18,140,18,134,18,140,18,134,18,140,18,134,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200, +20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,128,20,148,18,128,20,148,18,122,18,116,18,122,18,116,18,110,18,104,18,110,18,104,18,110,18,104,18,110,18,104,18,110, +18,104,18,98,18,92,18,200,20,148,18,86,20,148,18,86,20,148,18,86,20,148,18,86,20,148,18,86,20,148,18,86,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200, +20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,18,80,18,200,18,80,18,200,18,80,18,200,18,80,18,74,18,68,18,74,18,68,18,74,18,68,18,74,18,68,18,74, +18,68,18,74,18,68,18,62,18,56,18,62,18,56,18,62,18,56,18,62,18,56,18,62,18,56,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200, +20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,50,20,148,18,50,20,148,18,50,20,148,18,50,20,148,18,50,20,148,18,44,20,148,18,44,20,148,18,44, +20,148,18,44,20,148,18,182,18,176,18,86,20,148,18,200,20,148,18,74,18,68,18,44,20,148,18,38,20,148,18,38,20,148,18,38,20,148,18,38,20,148,18,32,20,148,18,38,20,148,18,38,20,148,18,38,20,148,18,38,20,148,18,38, +20,148,18,26,0,0,18,26,0,0,18,20,20,148,18,14,18,8,18,14,18,8,18,14,18,8,18,14,18,8,18,14,18,8,18,14,18,8,18,20,20,148,18,2,17,252,17,246,17,240,17,234,20,148,17,234,20,148,17,234,20,148,17,234, +20,148,17,234,20,148,17,228,20,148,17,234,20,148,17,234,20,148,17,234,20,148,17,234,20,148,17,222,17,216,17,210,0,0,17,210,0,0,17,210,0,0,17,210,0,0,17,210,0,0,18,20,20,148,18,20,20,148,18,20,20,148,0,0, +20,148,17,204,0,0,17,204,0,0,17,204,0,0,17,204,0,0,17,198,0,0,17,204,0,0,17,204,0,0,17,204,0,0,17,204,0,0,17,204,0,0,17,192,0,0,17,192,0,0,17,192,0,0,18,20,17,186,18,20,17,186,20,178, +20,148,17,180,17,174,17,180,17,174,17,180,17,174,17,180,17,174,17,180,17,174,17,180,17,174,20,178,20,148,20,178,17,168,20,178,17,168,18,26,18,158,20,178,17,168,20,178,17,168,20,178,17,168,20,178,20,148,20,178,20,148,20,178, +20,148,20,178,20,148,17,162,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,0,0,20,178,0,0,20,178,20,148,20,178,20,148,18,20,17,156,20,178,20,148,17,150,17,144,17,150,17,144,17,150,17,144,17,150,17,144,17,138, +18,68,17,138,18,68,17,138,18,68,17,138,18,68,17,138,18,68,17,138,18,68,17,132,17,126,17,132,17,126,17,132,17,126,17,132,17,126,17,132,17,126,20,178,0,0,20,178,0,0,20,178,0,0,20,178,0,0,17,162,0,0,20,178, +0,0,20,178,0,0,20,178,0,0,20,178,0,0,20,178,0,0,20,178,0,0,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,17,162,20,148,20,178,20,148,20,178,20,148,20,178,0,0,20,178,0,0,20,178,0,0,17,162, +0,0,20,178,0,0,17,234,20,148,17,234,20,148,17,234,20,148,17,234,20,148,18,14,18,8,20,178,17,168,20,178,20,148,17,138,18,68,17,234,20,148,0,0,20,148,17,192,0,0,17,120,17,174,17,150,17,144,18,200,18,194,18,200, +20,148,18,200,20,148,17,114,17,108,17,114,17,108,17,114,17,108,18,200,17,156,18,152,18,146,18,152,18,146,18,152,18,146,18,200,20,148,17,102,17,96,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,17,90,20,148,17,90, +20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,182,18,176,18,62,18,56,17,84,20,148,17,84,20,148,18,200,20,148,18,200,20,148,17,78,20,148,0,0,20,148,18,200,20,148,18,200, +20,148,0,0,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,74,18,68,18,200,20,148,17,72,20,148,18,200,20,148,18,200,20,148,18,128,20,148,18,200,20,148,18,200,20,148,18,200,17,156,18,200,20,148,18,200, +20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,17,66,0,0,18,200,20,148,18,200,20,148,17,60,20,148,17,54,20,148,17,48,17,42,18,200,17,156,18,200,20,148,17,102,17,96,17,90,20,148,18,200,20,148,17,36, +17,30,18,200,17,156,18,200,20,148,18,200,17,156,18,182,18,176,18,62,18,56,18,50,20,148,18,50,20,148,18,200,20,148,18,200,17,156,17,78,20,148,17,78,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200, +20,148,18,200,17,156,18,200,20,148,17,78,20,148,18,200,18,194,18,200,18,194,18,188,20,148,18,152,18,146,18,164,20,148,18,164,20,148,18,200,20,148,17,102,17,96,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200, +20,148,17,72,20,148,17,84,20,148,17,84,20,148,17,84,20,148,17,78,20,148,17,114,17,108,18,200,20,148,17,24,17,18,18,170,17,12,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,17,156,18,200,20,148,18,200, +20,148,18,140,18,134,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,17,6,17,0,18,200,17,156,18,200,17,156,18,200,20,148,18,200,20,148,18,200,20,148,18,200,17,156,18,200, +17,156,18,38,20,148,18,20,20,148,16,250,16,244,16,250,16,244,16,250,16,244,20,178,17,156,17,234,20,148,17,234,20,148,17,228,20,148,20,178,20,148,16,238,16,232,20,178,20,148,20,178,20,148,20,178,20,148,16,226,20,148,16,226, +20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,18,14,18,8,20,178,20,148,20,178,0,0,20,178,0,0,18,20,17,156,20,178,20,148,16,220,20,148,0,0,16,214,20,178,20,148,20,178,20,148,0,0, +20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,17,138,18,68,20,178,20,148,16,208,20,148,0,0,20,148,17,198,0,0,17,192,0,0,18,20,20,148,20,178,20,148,20,178,20,148,18,20,17,156,20,178,18,56,16,202, +20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,16,196,0,0,20,178,17,156,16,190,0,0,16,184,20,148,16,178,20,148,16,172,16,166,20,178,17,156,16,238,16,232,16,226,20,148,20,178,20,148,17,210, +17,96,20,178,17,156,20,178,17,156,18,14,18,8,20,178,20,148,20,178,17,156,20,178,17,156,20,178,20,148,20,178,17,156,16,160,16,154,16,220,20,148,18,20,20,148,16,148,16,142,17,180,17,174,20,178,20,148,20,178,17,156,20,178, +17,156,18,38,20,148,18,32,20,148,18,26,0,0,17,234,20,148,16,184,0,0,16,136,0,0,17,162,20,148,16,130,16,232,20,178,20,148,17,162,20,148,17,162,20,148,16,190,0,0,16,124,0,0,16,118,20,148,20,178,0,0,17,162, +0,0,20,178,0,0,16,112,20,148,16,250,16,244,17,162,20,148,20,178,17,156,20,178,17,156,20,178,20,148,18,20,20,148,18,20,20,148,20,178,20,148,20,178,17,156,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178, +20,148,20,178,17,156,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,17,156,20,178,17,156,20,178,20,148,20,178,17,156,20,178,17,156,20,178,17,156,18,128,20,148,18,200,18,194,18,200,20,148,17,114,17,108,18,200, +20,148,18,152,18,146,18,44,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,122,18,116,18,200,20,148,18,86,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,62,18,56,18,50,20,148,18,200, +20,148,18,200,20,148,18,200,20,148,18,200,17,168,18,200,18,194,18,152,18,146,18,200,20,148,18,200,20,148,18,200,20,148,18,50,20,148,18,200,17,168,18,200,20,148,18,50,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200, +17,156,18,200,0,0,16,106,16,100,18,200,20,148,18,200,20,148,0,0,17,156,16,94,0,0,16,94,0,0,16,94,0,0,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,16,88, +18,194,16,82,18,194,16,76,18,194,16,70,18,194,16,64,18,194,16,58,18,194,16,52,18,194,16,46,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,18,194,18,200,16,40,16,88,16,40,16,82,16,40,16,76,16,40,16,70, +16,40,16,64,16,40,16,58,16,40,16,52,16,40,16,46,16,40,16,34,18,146,16,28,18,146,16,22,18,146,16,16,18,146,16,10,18,146,16,4,18,146,18,152,18,146,18,152,18,146,15,254,20,148,15,248,20,148,15,242,20,148,15,236, +20,148,15,230,20,148,15,224,20,148,15,218,20,148,15,212,20,148,18,200,20,148,18,200,20,148,18,200,15,206,15,254,15,206,15,248,15,206,15,242,15,206,15,236,15,206,15,230,15,206,15,224,15,206,15,218,15,206,15,212,15,206,15,200, +20,148,15,194,20,148,15,188,20,148,15,182,20,148,15,176,20,148,15,170,20,148,15,164,20,148,15,158,20,148,18,200,20,148,18,200,20,148,18,200,20,148,18,200,20,148,15,152,20,148,15,146,20,148,15,170,20,148,15,140,20,148,15,134, +20,148,15,128,20,148,18,200,20,148,18,200,20,148,15,122,20,148,15,116,20,148,16,10,20,148,15,110,20,148,15,104,20,148,18,50,20,148,18,50,20,148,18,50,20,148,18,50,20,148,15,98,17,168,15,92,17,30,15,86,17,168,15,80, +17,168,15,134,17,168,15,128,17,168,15,74,17,168,15,68,17,168,18,200,17,168,18,200,17,168,18,200,15,62,15,98,15,62,15,92,15,62,15,86,15,62,15,80,15,62,15,134,15,62,15,128,15,62,15,74,15,62,15,68,15,62,20,160, +18,68,18,20,17,156,20,178,17,156,18,20,20,148,15,56,15,50,18,20,17,156,20,154,15,44,18,20,20,148,15,38,20,148,20,178,20,148,18,20,20,148,20,178,17,156,20,178,20,148,18,20,17,156,20,178,20,148,20,178,20,148,15,32, +17,156,20,178,17,156,20,178,20,148,20,178,20,148,20,178,20,148,20,178,17,156,20,178,17,156,20,178,17,156,20,178,18,56,15,38,20,148,15,26,20,148,15,38,20,148,20,178,20,148,17,162,20,148,20,178,20,148,20,178,20,148,20,178, +18,56,20,160,18,68,15,56,15,50,20,154,15,44,20,178,20,148,20,178,17,156,20,178,20,148,20,178,20,148,20,178,17,156,20,178,17,156,20,178,17,156,18,20,20,148,18,20,17,156,20,178,17,156,18,20,20,148,20,178,20,148,20,178, +20,148,20,178,17,156,20,178,20,148,17,192,0,0,20,178,20,148,18,20,17,156,20,178,17,156,15,20,15,14,15,8,18,68,15,2,18,68,14,252,18,68,14,246,18,68,14,240,18,68,14,234,18,68,14,228,18,68,14,222,18,68,20,160, +18,68,20,160,18,68,20,160,18,68,20,160,18,68,20,160,18,68,20,160,14,216,14,210,14,216,14,204,14,216,15,8,14,216,15,2,14,216,14,252,14,216,14,246,14,216,14,240,14,216,14,234,14,216,14,228,14,216,14,222,14,216,14,198, +14,216,14,192,15,50,14,186,15,50,14,180,15,50,14,174,15,50,14,168,15,50,14,162,15,50,15,56,15,50,15,56,15,50,14,156,15,44,14,150,15,44,14,144,15,44,14,138,15,44,14,132,15,44,14,252,15,44,14,126,15,44,14,120, +15,44,20,154,15,44,20,154,15,44,20,154,15,44,20,154,14,114,14,108,14,114,14,102,14,114,14,156,14,114,14,150,14,114,14,144,14,114,14,138,14,114,14,132,14,114,14,252,14,114,14,126,14,114,14,120,14,114,14,96,14,114,14,90, +20,148,14,84,20,148,14,78,20,148,14,72,20,148,14,66,20,148,14,60,20,148,14,54,20,148,14,48,20,148,15,38,20,148,15,38,20,148,15,38,20,148,15,38,20,148,15,38,20,148,15,38,20,148,15,38,20,148,15,38,20,148,14,42, +20,148,14,36,20,148,14,30,20,148,14,24,20,148,14,18,20,148,14,12,20,148,20,178,20,148,20,178,20,148,14,6,17,156,14,0,17,156,14,42,20,148,14,36,20,148,14,30,20,148,14,24,20,148,14,18,20,148,14,12,20,148,13,250, +20,148,13,244,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,20,178,20,148,14,42,18,56,14,36,18,56,14,30,18,56,14,24,18,56,14,18,18,56,14,12,18,56,13,250, +18,56,13,244,18,56,20,178,18,56,20,178,18,56,20,178,18,56,20,178,13,238,13,232,13,238,13,226,13,238,14,42,13,238,14,36,13,238,14,30,13,238,14,24,13,238,14,18,13,238,14,12,13,238,13,250,13,238,13,244,13,238,13,220, +13,238,18,200,20,148,18,182,18,176,18,200,20,148,13,214,13,208,20,148,18,200,18,200,20,148,13,214,13,208,20,148,17,102,13,202,13,196,13,190,20,148,18,20,20,148,16,208,20,148,17,162,0,0,13,184,0,0,13,178,0,0,13,172, +0,0,13,166,0,0,13,160,0,0,13,154,0,0,13,148,0,0,13,142,0,0,13,232,0,0,13,226,0,0,0,1,2,84,6,185,0,1,2,119,6,182,0,1,1,93,6,59,0,1,2,11,6,67,0,1,2,143,6,67,0,1,1,179, +6,59,0,1,2,89,6,59,0,1,2,95,6,59,0,1,2,88,5,106,0,1,2,123,1,39,0,1,2,123,6,145,0,1,2,37,0,0,0,1,2,46,5,97,0,1,2,91,5,175,0,1,2,68,6,58,0,1,2,97,6,58,0,1, +2,235,254,135,0,1,2,92,6,185,0,1,2,148,6,182,0,1,2,29,6,59,0,1,2,171,6,59,0,1,1,123,6,59,0,1,2,87,6,67,0,1,2,92,6,67,0,1,1,167,6,59,0,1,2,16,6,59,0,1,2,158,6,59, +0,1,2,61,6,185,0,1,2,117,6,182,0,1,1,92,6,59,0,1,2,56,6,67,0,1,2,61,6,67,0,1,1,136,6,59,0,1,1,241,6,59,0,1,2,128,6,59,0,1,2,89,5,175,0,1,2,65,6,58,0,1,2,94, +6,58,0,1,1,168,254,135,0,1,2,89,6,185,0,1,2,145,6,182,0,1,2,84,6,67,0,1,2,89,6,67,0,1,1,164,6,59,0,1,2,14,6,59,0,1,2,156,6,59,0,1,1,155,6,59,0,1,2,119,6,67,0,1, +2,124,6,67,0,1,1,199,6,59,0,1,2,49,6,59,0,1,2,191,6,59,0,1,2,44,5,175,0,1,2,21,6,58,0,1,2,50,6,58,0,1,2,230,254,135,0,1,2,45,6,185,0,1,2,101,6,182,0,1,1,76,6,59, +0,1,2,40,6,67,0,1,2,45,6,67,0,1,1,120,6,59,0,1,1,225,6,59,0,1,2,111,6,59,0,1,2,152,254,113,0,1,2,164,4,29,0,1,2,57,5,120,0,1,2,101,4,29,0,1,2,57,4,29,0,1,1,19, +0,0,0,1,2,108,0,0,0,1,2,120,4,29,0,1,2,240,254,135,0,1,255,132,5,116,0,1,255,164,5,114,0,1,255,132,5,112,0,1,254,167,5,104,0,1,255,232,5,116,0,1,0,51,5,115,0,1,254,223,5,116,0,1, +254,22,5,104,0,1,255,177,5,116,0,1,0,15,5,115,0,1,254,149,5,104,0,1,255,55,5,112,0,1,255,130,5,112,0,1,255,230,5,116,0,1,0,52,5,115,0,1,255,109,5,116,0,1,255,141,5,114,0,1,254,166,5,104, +0,1,255,71,5,112,0,1,255,255,5,112,0,1,255,48,5,104,0,1,0,29,5,116,0,1,0,27,5,115,0,1,2,237,254,135,0,1,255,70,5,116,0,1,255,101,5,114,0,1,254,127,5,104,0,1,255,32,5,112,0,1,255,133, +5,112,0,1,254,169,5,104,0,1,255,206,5,115,0,1,255,244,5,115,0,1,254,210,5,104,0,1,255,115,5,112,0,1,255,217,5,112,0,1,254,253,5,104,0,1,0,34,5,115,0,1,0,72,5,115,0,1,2,233,254,135,0,1, +0,83,5,116,0,1,0,113,5,113,0,1,255,124,5,104,0,1,0,29,5,112,0,1,0,104,5,112,0,1,255,147,5,104,0,1,0,201,5,116,0,1,0,237,5,115,0,1,2,94,5,97,0,1,1,85,0,0,0,1,2,167,5,97, +0,1,2,62,5,120,0,1,2,77,5,120,0,1,2,90,5,120,0,1,2,75,5,122,0,1,2,87,5,120,0,1,2,79,0,0,0,1,2,79,5,197,0,1,2,68,0,0,0,1,2,42,4,29,0,1,1,205,0,0,0,1,2,230, +4,29,0,1,1,254,6,129,0,1,2,87,4,29,0,1,2,90,4,29,0,1,2,59,4,29,0,1,1,118,5,24,0,1,2,77,4,29,0,1,2,76,0,0,0,1,2,62,4,29,0,1,2,128,4,29,0,1,2,89,0,0,0,1, +2,75,4,30,0,1,1,144,0,0,0,1,2,169,4,29,0,1,2,77,0,0,0,1,2,116,5,97,0,1,2,55,0,0,0,1,1,181,0,0,0,1,3,6,5,97,0,1,2,91,0,0,0,1,2,91,5,97,0,1,1,164,0,0, +0,1,2,246,5,97,0,1,1,234,7,197,0,1,2,66,5,97,0,1,2,54,5,97,0,1,2,67,5,98,0,1,2,67,5,97,0,1,2,108,5,97,0,1,2,127,5,97,0,1,2,75,0,0,0,1,2,84,5,97,0,1,1,103, +0,0,0,1,2,185,5,97,0,1,2,18,5,97,0,1,2,231,0,0,0,1,1,229,5,24,0,1,2,103,4,29,0,1,1,203,0,0,0,1,2,149,4,29,0,1,2,88,254,113,0,1,2,88,5,120,0,1,2,90,0,0,0,1, +2,209,0,0,0,1,2,18,5,197,0,1,2,99,0,0,0,1,2,223,4,29,0,1,2,91,5,120,0,1,2,91,4,29,0,1,2,75,4,29,0,1,2,11,0,0,0,1,2,228,5,197,0,1,2,109,5,120,0,1,2,109,4,29, +0,1,2,93,0,0,0,1,2,93,5,197,0,1,2,30,0,0,0,1,2,30,5,197,0,1,2,166,0,0,0,1,2,176,4,12,0,1,2,88,5,197,0,1,2,105,4,29,0,1,2,72,5,120,0,1,2,72,4,29,0,1,2,125, +5,97,0,1,2,95,5,97,0,1,2,86,0,0,0,1,2,86,5,97,0,1,2,81,0,0,0,1,2,99,5,97,0,1,2,85,0,0,0,1,2,85,5,97,0,1,2,147,0,0,0,1,1,100,5,97,0,1,2,151,0,0,0,1, +1,103,5,97,0,1,2,133,0,0,0,1,2,141,5,97,0,1,2,187,5,97,0,1,2,149,0,0,0,1,2,148,5,97,0,1,2,139,0,0,0,1,2,130,5,97,0,1,2,107,0,0,0,1,2,74,5,97,0,1,2,55,5,97, +0,1,2,187,0,0,0,1,2,219,5,97,0,1,2,211,5,97,0,1,2,84,0,0,0,1,2,88,5,97,0,2,0,61,0,1,0,40,0,0,0,42,0,43,0,40,0,45,0,95,0,42,0,97,0,153,0,93,0,155,0,183,0,150, +0,185,0,205,0,179,0,207,0,218,0,200,0,220,0,232,0,212,0,234,1,14,0,225,1,16,1,18,1,6,1,20,1,20,1,9,1,26,1,61,1,10,1,63,1,71,1,46,1,73,1,75,1,55,1,77,1,87,1,58,1,89,1,94, +1,69,1,97,1,97,1,75,1,99,1,110,1,76,1,112,1,116,1,88,1,118,1,118,1,93,1,120,1,120,1,94,1,122,1,129,1,95,1,131,1,153,1,103,1,155,1,168,1,126,1,170,1,171,1,140,1,173,1,184,1,142,1,186, +1,189,1,154,1,191,1,205,1,158,1,207,1,231,1,173,1,233,1,234,1,198,1,236,1,238,1,200,1,243,1,255,1,203,2,2,2,4,1,216,2,8,2,8,1,219,2,10,2,17,1,220,2,19,2,39,1,228,2,41,2,41,1,249, +2,43,2,53,1,250,2,55,2,56,2,5,2,58,2,68,2,7,2,70,2,245,2,18,2,247,2,247,2,194,2,249,2,254,2,195,3,0,3,0,2,201,3,2,3,131,2,202,3,136,3,137,3,76,3,141,3,141,3,78,4,166,4,166, +3,79,4,168,4,168,3,80,4,211,4,211,3,81,4,245,4,245,3,82,4,249,4,249,3,83,6,17,6,17,3,84,6,38,6,38,3,85,6,60,6,60,3,86,6,220,6,220,3,87,6,246,6,246,3,88,7,24,7,24,3,89,7,26, +7,32,3,90,7,36,7,36,3,97,7,38,7,38,3,98,0,19,0,0,0,114,0,0,0,114,0,0,0,114,0,0,0,114,0,0,0,108,0,0,0,114,0,0,0,114,0,0,0,114,0,0,0,114,0,0,0,114,0,0,0,114,0,0, +0,114,0,0,0,102,0,0,0,96,0,0,0,90,0,1,0,84,0,1,0,84,0,0,0,114,0,1,0,78,0,1,1,214,0,0,0,1,2,88,0,0,0,1,2,85,4,29,0,1,2,41,4,29,0,1,2,187,4,29,0,1,2,5, +4,29,0,1,2,88,4,29,0,2,0,2,6,227,6,243,0,0,7,19,7,20,0,17,0,1,0,0,0,1,0,8,0,1,0,10,0,5,0,5,0,10,0,2,0,3,0,1,0,133,0,0,1,26,1,169,0,133,2,58,2,206,1,21, +4,176,0,80,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,255,232,4,176,255,232,4,176,0,193,4,176,0,127,4,176,0,127, +4,176,0,127,4,176,0,127,4,176,0,127,4,176,0,127,4,176,0,167,4,176,0,41,4,176,0,167,4,176,0,41,4,176,0,251,4,176,0,251,4,176,0,251,4,176,0,251,4,176,0,251,4,176,0,251,4,176,0,251,4,176,0,251, +4,176,0,251,4,176,0,251,4,176,1,21,4,176,0,91,4,176,0,91,4,176,0,91,4,176,0,91,4,176,0,91,4,176,0,167,4,176,0,4,4,176,0,167,4,176,0,206,4,176,0,23,4,176,0,206,4,176,0,206,4,176,0,206, +4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,145,4,176,0,145,4,176,0,210,4,176,0,210,4,176,1,15,4,176,0,127,4,176,1,15,4,176,1,15,4,176,1,15,4,176,0,81, +4,176,0,61,4,176,0,167,4,176,0,167,4,176,0,167,4,176,0,167,4,176,0,167,4,176,0,167,4,176,0,93,4,176,0,93,4,176,0,93,4,176,0,93,4,176,0,93,4,176,0,93,4,176,0,93,4,176,0,93,4,176,0,93, +4,176,0,93,4,176,0,93,4,176,255,253,4,176,0,231,4,176,0,215,4,176,0,91,4,176,0,203,4,176,0,203,4,176,0,203,4,176,0,203,4,176,0,87,4,176,0,87,4,176,0,87,4,176,0,87,4,176,0,87,4,176,0,87, +4,176,0,147,4,176,0,80,4,176,0,80,4,176,0,80,4,176,0,80,4,176,0,80,4,176,0,145,4,176,0,145,4,176,0,145,4,176,0,145,4,176,0,145,4,176,0,145,4,176,0,145,4,176,0,145,4,176,0,145,4,176,0,145, +4,176,0,145,4,176,0,49,4,176,0,9,4,176,0,9,4,176,0,9,4,176,0,9,4,176,0,9,4,176,0,62,4,176,0,47,4,176,0,47,4,176,0,47,4,176,0,47,4,176,0,47,4,176,0,143,4,176,0,143,4,176,0,143, +4,176,0,143,4,176,0,127,4,176,0,167,4,176,0,93,4,176,0,87,4,176,0,143,4,176,0,137,4,176,0,137,4,176,0,137,4,176,0,137,4,176,0,137,4,176,0,137,4,176,0,137,4,176,0,137,4,176,0,137,4,176,0,137, +4,176,255,244,4,176,255,244,4,176,0,201,4,176,0,183,4,176,0,183,4,176,0,183,4,176,0,183,4,176,0,183,4,176,0,183,4,176,0,136,4,176,0,134,4,176,0,79,4,176,0,141,4,176,0,157,4,176,0,157,4,176,0,157, +4,176,0,157,4,176,0,157,4,176,0,157,4,176,0,157,4,176,0,157,4,176,0,157,4,176,0,157,4,176,0,188,4,176,0,131,4,176,0,131,4,176,0,131,4,176,0,131,4,176,0,131,4,176,0,201,4,176,0,39,4,176,0,201, +4,176,0,241,4,176,0,241,4,176,0,241,4,176,0,241,4,176,0,241,4,176,0,241,4,176,0,241,4,176,0,241,4,176,0,97,4,176,0,241,4,176,0,241,4,176,0,241,4,176,0,191,4,176,0,191,4,176,0,191,4,176,0,212, +4,176,0,212,4,176,0,201,4,176,0,120,4,176,0,120,4,176,0,120,4,176,0,120,4,176,0,120,4,176,0,120,4,176,0,101,4,176,0,201,4,176,0,201,4,176,0,1,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201, +4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,255,251,4,176,0,201,4,176,0,201,4,176,0,147,4,176,0,211, +4,176,0,211,4,176,0,211,4,176,0,211,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,192,4,176,0,159,4,176,0,159,4,176,0,159,4,176,0,159,4,176,0,159,4,176,0,201, +4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,121,4,176,0,35,4,176,0,35,4,176,0,35,4,176,0,35,4,176,0,35, +4,176,0,111,4,176,0,123,4,176,0,123,4,176,0,123,4,176,0,123,4,176,0,123,4,176,0,205,4,176,0,205,4,176,0,205,4,176,0,205,4,176,0,183,4,176,0,201,4,176,0,147,4,176,0,147,4,176,0,205,4,176,0,193, +4,176,0,241,4,176,0,191,4,176,0,120,4,176,0,0,4,176,0,211,4,176,0,193,4,176,247,100,4,176,0,204,4,176,0,192,4,176,1,79,4,176,0,41,4,176,0,201,4,176,0,193,4,176,1,16,4,176,1,16,4,176,1,16, +4,176,0,0,4,176,0,251,4,176,0,251,4,176,0,251,4,176,0,24,4,176,0,70,4,176,0,167,4,176,0,167,4,176,0,167,4,176,0,167,4,176,0,189,4,176,0,189,4,176,0,30,4,176,0,61,4,176,0,167,4,176,0,93, +4,176,0,167,4,176,0,231,4,176,0,127,4,176,0,80,4,176,0,53,4,176,0,53,4,176,0,26,4,176,0,62,4,176,0,101,4,176,0,167,4,176,0,93,4,176,0,93,4,176,0,167,4,176,0,189,4,176,0,1,4,176,0,62, +4,176,0,3,4,176,0,83,4,176,0,87,4,176,0,115,4,176,0,84,4,176,0,206,4,176,0,206,4,176,0,145,4,176,255,247,4,176,0,93,4,176,0,67,4,176,255,247,4,176,0,33,4,176,0,20,4,176,0,80,4,176,0,41, +4,176,0,74,4,176,0,75,4,176,0,37,4,176,0,165,4,176,0,27,4,176,0,93,4,176,0,56,4,176,0,56,4,176,0,18,4,176,0,132,4,176,0,170,4,176,0,24,4,176,0,70,4,176,0,189,4,176,0,189,4,176,0,74, +4,176,0,23,4,176,0,170,4,176,0,135,4,176,0,55,4,176,0,167,4,176,0,71,4,176,0,127,4,176,0,80,4,176,0,47,4,176,0,47,4,176,0,62,4,176,0,0,4,176,0,101,4,176,0,101,4,176,0,167,4,176,0,167, +4,176,0,1,4,176,0,1,4,176,0,206,4,176,0,24,4,176,0,167,4,176,0,39,4,176,0,167,4,176,0,145,4,176,0,101,4,176,0,37,4,176,0,41,4,176,0,41,4,176,255,232,4,176,0,251,4,176,0,89,4,176,0,89, +4,176,0,24,4,176,0,70,4,176,0,141,4,176,0,167,4,176,0,167,4,176,0,93,4,176,0,93,4,176,0,93,4,176,0,84,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,101,4,176,1,16,4,176,0,62,4,176,0,127, +4,176,0,29,4,176,0,62,4,176,0,97,4,176,0,18,4,176,0,50,4,176,0,145,4,176,0,10,4,176,0,98,4,176,0,91,4,176,0,31,4,176,0,119,4,176,0,30,4,176,0,9,4,176,0,109,4,176,0,16,4,176,0,91, +4,176,0,9,4,176,0,178,4,176,255,243,4,176,0,53,4,176,0,60,4,176,0,231,4,176,255,82,4,176,255,231,4,176,0,106,4,176,0,7,4,176,0,137,4,176,0,151,4,176,0,223,4,176,1,60,4,176,1,60,4,176,1,60, +4,176,0,52,4,176,0,157,4,176,0,157,4,176,0,157,4,176,0,39,4,176,0,108,4,176,0,201,4,176,0,201,4,176,0,201,4,176,0,186,4,176,0,211,4,176,0,211,4,176,0,84,4,176,0,85,4,176,0,201,4,176,0,147, +4,176,0,201,4,176,0,201,4,176,0,183,4,176,0,131,4,176,0,123,4,176,0,123,4,176,0,57,4,176,0,111,4,176,0,170,4,176,0,189,4,176,0,97,4,176,0,97,4,176,0,201,4,176,0,252,4,176,0,66,4,176,0,124, +4,176,0,7,4,176,0,145,4,176,0,147,4,176,0,183,4,176,0,183,4,176,0,241,4,176,0,241,4,176,0,191,4,176,0,39,4,176,0,111,4,176,0,105,4,176,0,39,4,176,0,53,4,176,0,117,4,176,0,151,4,176,0,72, +4,176,0,104,4,176,0,43,4,176,0,70,4,176,0,161,4,176,0,83,4,176,0,147,4,176,0,114,4,176,0,114,4,176,255,255,4,176,0,189,4,176,0,205,4,176,0,48,4,176,0,108,4,176,0,211,4,176,0,211,4,176,0,77, +4,176,0,15,4,176,0,172,4,176,0,178,4,176,0,188,4,176,0,56,4,176,0,115,4,176,0,183,4,176,0,131,4,176,0,115,4,176,0,115,4,176,0,111,4,176,0,0,4,176,0,150,4,176,0,170,4,176,0,203,4,176,0,193, +4,176,0,21,4,176,0,21,4,176,0,120,4,176,0,39,4,176,0,214,4,176,0,83,4,176,0,201,4,176,0,204,4,176,0,170,4,176,0,105,4,176,0,137,4,176,0,137,4,176,255,244,4,176,0,157,4,176,0,147,4,176,0,147, +4,176,0,39,4,176,0,108,4,176,0,123,4,176,0,201,4,176,0,201,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,183,4,176,0,123,4,176,0,123,4,176,0,123,4,176,0,170,4,176,1,60,4,176,0,124,4,176,0,143, +4,176,0,91,4,176,0,111,4,176,0,136,4,176,0,18,4,176,0,21,4,176,0,153,4,176,0,11,4,176,0,91,4,176,0,147,4,176,0,7,4,176,0,166,4,176,0,84,4,176,0,34,4,176,0,88,4,176,0,11,4,176,0,147, +4,176,0,35,4,176,0,206,4,176,255,237,4,176,0,56,4,176,0,139,4,176,0,205,4,176,255,108,4,176,255,235,4,176,0,103,4,176,0,73,4,176,0,145,4,176,0,41,4,176,0,193,4,176,1,16,4,176,0,41,4,176,0,251, +4,176,0,143,4,176,0,167,4,176,0,93,4,176,0,206,4,176,0,210,4,176,0,49,4,176,0,61,4,176,0,167,4,176,0,153,4,176,0,93,4,176,0,167,4,176,0,231,4,176,0,146,4,176,0,80,4,176,0,47,4,176,0,21, +4,176,0,62,4,176,0,27,4,176,0,93,4,176,0,41,4,176,255,195,4,176,255,111,4,176,255,150,4,176,255,175,4,176,255,11,4,176,255,174,4,176,0,206,4,176,0,47,4,176,0,228,4,176,0,72,4,176,0,167,4,176,0,93, +4,176,0,149,4,176,0,253,4,176,0,141,4,176,0,51,4,176,0,201,4,176,0,75,4,176,255,29,4,176,0,75,4,176,0,93,4,176,0,215,4,176,0,127,4,176,0,61,4,176,0,65,4,176,0,127,4,176,0,65,4,176,0,41, +4,176,0,41,4,176,255,31,4,176,255,28,4,176,255,81,4,176,255,96,4,176,255,12,4,176,255,13,4,176,0,27,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,0,41,4,176,255,31,4,176,255,28, +4,176,255,81,4,176,255,96,4,176,255,12,4,176,255,13,4,176,255,204,4,176,255,173,4,176,254,136,4,176,254,141,4,176,254,167,4,176,254,183,4,176,255,176,4,176,255,195,4,176,255,120,4,176,255,90,4,176,254,53,4,176,254,57, +4,176,254,83,4,176,254,99,4,176,254,1,4,176,254,0,4,176,255,92,4,176,255,111,4,176,0,167,4,176,255,120,4,176,255,90,4,176,254,53,4,176,254,57,4,176,254,83,4,176,254,99,4,176,254,1,4,176,254,0,4,176,255,159, +4,176,255,169,4,176,254,188,4,176,254,179,4,176,254,122,4,176,254,138,4,176,254,40,4,176,254,39,4,176,255,173,4,176,255,150,4,176,0,206,4,176,0,206,4,176,255,184,4,176,255,113,4,176,254,50,4,176,254,54,4,176,254,106, +4,176,254,122,4,176,255,77,4,176,255,135,4,176,255,154,4,176,255,61,4,176,254,39,4,176,253,250,4,176,253,152,4,176,255,49,4,176,255,11,4,176,0,47,4,176,0,47,4,176,255,182,4,176,255,116,4,176,254,51,4,176,254,56, +4,176,254,106,4,176,254,122,4,176,254,63,4,176,254,62,4,176,255,77,4,176,255,134,4,176,0,93,4,176,255,182,4,176,255,116,4,176,254,51,4,176,254,56,4,176,254,106,4,176,254,122,4,176,254,63,4,176,254,62,4,176,0,117, +4,176,0,182,4,176,0,86,4,176,0,135,4,176,0,166,4,176,0,221,4,176,0,146,4,176,0,147,4,176,0,125,4,176,0,173,4,176,0,97,4,176,0,177,4,176,0,63,4,176,0,197,4,176,0,147,4,176,0,13,4,176,0,187, +4,176,0,203,4,176,0,147,4,176,0,78,4,176,0,206,4,176,0,67,4,176,0,108,4,176,0,83,4,176,0,53,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,147,4,176,0,53, +4,176,0,117,4,176,0,166,4,176,0,146,4,176,0,219,4,176,0,37,4,176,0,191,4,176,0,183,4,176,0,183,4,176,0,183,4,176,0,147,4,176,0,139,4,176,0,251,4,176,0,174,4,176,0,63,4,176,0,124,4,176,0,157, +4,176,0,153,4,176,0,89,4,176,0,17,4,176,0,123,4,176,0,187,4,176,0,183,4,176,0,191,4,176,0,183,4,176,0,201,4,176,0,40,4,176,0,89,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117, +4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117, +4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,117,4,176,0,166,4,176,0,166,4,176,0,166,4,176,0,166,4,176,0,166,4,176,0,166,4,176,0,166,4,176,0,166,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146, +4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,146, +4,176,0,146,4,176,0,146,4,176,0,146,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,125, +4,176,0,125,4,176,0,125,4,176,0,125,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,147,4,176,0,187,4,176,0,187,4,176,0,206,4,176,0,206,4,176,0,206, +4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,206,4,176,0,53,4,176,0,53,4,176,0,53, +4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53, +4,176,0,53,4,176,0,53,4,176,0,53,4,176,0,53,4,176,1,138,4,176,1,138,4,176,0,60,4,176,0,60,4,176,0,122,4,176,0,127,4,176,0,51,4,176,0,167,4,176,0,121,4,176,0,91,4,176,0,121,4,176,0,143, +4,176,0,149,4,176,0,190,4,176,0,118,4,176,0,103,4,176,0,144,4,176,0,154,4,176,0,159,4,176,0,195,4,176,0,131,4,176,0,133,4,176,0,149,4,176,0,103,4,176,0,103,4,176,0,211,4,176,0,153,4,176,0,125, +4,176,0,125,4,176,0,170,4,176,0,159,4,176,0,183,4,176,0,131,4,176,0,133,4,176,0,103,4,176,1,35,4,176,1,143,4,176,1,52,4,176,1,39,4,176,1,37,4,176,1,55,4,176,1,40,4,176,1,63,4,176,1,27, +4,176,1,38,4,176,1,35,4,176,1,143,4,176,1,52,4,176,1,39,4,176,1,37,4,176,1,55,4,176,1,40,4,176,1,63,4,176,1,27,4,176,1,38,4,176,1,35,4,176,1,143,4,176,1,52,4,176,1,39,4,176,1,37, +4,176,1,55,4,176,1,40,4,176,1,63,4,176,1,27,4,176,1,38,4,176,1,35,4,176,1,143,4,176,1,52,4,176,1,39,4,176,1,37,4,176,1,55,4,176,1,40,4,176,1,63,4,176,1,27,4,176,1,38,0,0,253,203, +4,176,0,34,4,176,255,248,4,176,255,234,4,176,255,174,4,176,255,254,4,176,255,251,4,176,255,220,4,176,255,162,4,176,255,201,4,176,255,185,4,176,0,20,4,176,0,13,4,176,255,234,4,176,255,228,4,176,255,244,4,176,255,245, +4,176,1,167,4,176,1,153,4,176,1,181,4,176,1,151,4,176,0,64,4,176,1,209,4,176,1,209,4,176,0,179,4,176,0,210,4,176,1,167,4,176,1,101,4,176,0,97,4,176,1,96,4,176,0,106,4,176,0,105,4,176,0,105, +4,176,0,188,4,176,1,211,4,176,0,210,4,176,1,181,4,176,0,97,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,146,4,176,0,105, +4,176,1,181,4,176,1,185,4,176,1,201,4,176,0,249,4,176,1,91,4,176,0,235,4,176,1,41,4,176,1,112,4,176,1,75,4,176,2,56,4,176,0,131,4,176,0,200,4,176,0,200,4,176,1,185,4,176,1,201,4,176,0,249, +4,176,1,91,4,176,0,235,4,176,1,41,4,176,1,112,4,176,1,75,4,176,2,56,4,176,0,131,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,199,4,176,1,32,4,176,0,65,4,176,0,0,4,176,0,65,4,176,0,71, +4,176,0,0,4,176,0,0,4,176,0,100,4,176,0,100,4,176,0,199,4,176,1,32,4,176,0,65,4,176,0,0,4,176,0,199,4,176,0,0,4,176,0,0,4,176,1,177,4,176,0,219,4,176,0,219,4,176,0,217,4,176,1,179, +4,176,1,177,4,176,0,165,4,176,0,165,4,176,1,121,4,176,1,121,4,176,1,71,4,176,1,239,4,176,0,165,4,176,0,165,4,176,1,121,4,176,1,121,4,176,1,185,4,176,1,201,4,176,252,176,4,176,248,2,4,176,252,73, +4,176,252,89,4,176,253,136,4,176,252,155,4,176,252,185,4,176,253,231,4,176,249,217,4,176,249,15,4,176,249,195,4,176,253,75,4,176,252,183,4,176,253,205,4,176,249,69,4,176,248,71,4,176,253,0,4,176,253,175,4,176,254,17, +4,176,248,213,4,176,252,35,4,176,247,115,4,176,253,97,4,176,252,203,4,176,252,103,4,176,251,227,4,176,247,201,4,176,251,168,4,176,251,249,4,176,252,50,4,176,252,50,4,176,252,50,4,176,252,130,4,176,252,130,4,176,252,50, +4,176,251,189,4,176,252,50,4,176,247,130,4,176,252,89,4,176,252,129,4,176,252,29,4,176,247,209,4,176,252,245,4,176,252,245,4,176,1,185,4,176,1,201,4,176,255,236,4,176,0,249,4,176,255,236,4,176,255,236,4,176,255,236, +4,176,255,236,4,176,255,236,4,176,0,106,4,176,255,236,4,176,255,236,4,176,0,71,4,176,251,60,4,176,251,60,4,176,252,133,4,176,255,236,4,176,255,236,4,176,0,100,4,176,253,55,4,176,252,35,4,176,247,115,4,176,1,108, +4,176,1,73,4,176,1,170,4,176,1,168,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,0,0,0,0,4,176,0,0,4,176,0,0,0,0,0,0,4,176,0,212,4,176,0,69,4,176,0,138,4,176,0,252,4,176,0,71, +4,176,0,215,4,176,0,127,4,176,0,127,4,176,0,167,4,176,0,149,4,176,0,79,4,176,0,0,4,176,0,87,4,176,1,115,4,176,0,144,4,176,1,167,4,176,1,26,4,176,2,11,4,176,0,35,4,176,0,159,4,176,0,171, +4,176,0,59,4,176,0,49,4,176,0,254,4,176,1,109,4,176,1,109,4,176,0,211,4,176,0,149,4,176,0,159,4,176,0,41,4,176,0,155,4,176,1,248,4,176,2,11,4,176,0,220,4,176,2,11,4,176,2,11,4,176,2,11, +4,176,2,11,4,176,1,111,4,176,1,111,4,176,1,115,4,176,0,59,4,176,0,49,4,176,0,111,4,176,0,71,4,176,0,49,4,176,0,211,4,176,0,49,4,176,0,71,4,176,0,171,4,176,0,131,4,176,0,231,4,176,0,250, +4,176,0,231,4,176,0,211,4,176,0,211,4,176,0,176,4,176,0,176,4,176,0,213,4,176,0,211,4,176,0,231,4,176,0,190,4,176,0,87,4,176,0,231,4,176,0,147,4,176,255,243,4,176,0,51,4,176,0,132,4,176,0,132, +4,176,0,147,4,176,0,147,4,176,0,155,4,176,0,41,4,176,0,54,4,176,0,201,4,176,0,58,4,176,0,177,4,176,0,178,4,176,2,11,4,176,2,11,4,176,2,11,4,176,2,11,4,176,0,84,4,176,0,84,4,176,0,37, +4,176,0,37,4,176,1,109,4,176,1,109,4,176,1,181,4,176,0,49,4,176,0,111,4,176,0,231,4,176,1,15,4,176,2,11,4,176,1,14,4,176,2,11,4,176,0,178,4,176,0,178,4,176,0,171,4,176,0,49,4,176,0,49, +4,176,0,111,4,176,0,111,4,176,0,111,4,176,0,74,4,176,0,111,4,176,0,149,4,176,0,144,4,176,0,59,4,176,0,171,4,176,0,41,4,176,0,74,4,176,255,243,4,176,0,131,4,176,0,118,4,176,0,131,4,176,0,0, +4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,255,231,4,176,0,78,4,176,0,45,4,176,0,78,4,176,255,231,4,176,0,78,4,176,0,45,4,176,0,78,4,176,255,107,4,176,255,231, +4,176,0,44,4,176,0,52,4,176,0,57,4,176,0,58,4,176,0,103,4,176,0,58,4,176,0,103,9,96,0,140,9,96,1,238,4,176,0,0,4,176,255,176,4,176,0,0,4,176,255,176,4,176,0,38,4,176,255,181,4,176,0,0, +4,176,0,0,4,176,255,176,4,176,255,220,4,176,255,220,9,96,0,59,9,96,0,59,9,96,0,59,9,96,0,59,9,96,0,59,9,96,0,59,9,96,0,145,9,96,0,59,9,96,0,59,9,96,0,59,9,96,0,59,9,96,0,59, +4,176,255,176,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0, +4,176,0,0,4,176,0,0,4,176,2,88,4,176,4,26,4,176,0,0,4,176,2,88,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,0,0,4,176,2,88,4,176,0,0,4,176,0,0,4,176,0,100,4,176,0,0, +4,176,0,0,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,2,88,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60, +4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,2,88,4,176,2,88,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,134,4,176,1,28,4,176,0,60,4,176,0,60, +4,176,1,28,4,176,2,8,4,176,2,8,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,2,8,4,176,255,246,4,176,255,246,4,176,2,8,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246, +4,176,255,246,4,176,1,104,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,2,8,4,176,1,104,4,176,1,104,4,176,1,104,4,176,255,246,4,176,255,246,4,176,1,104,4,176,255,246,4,176,255,246,4,176,255,246, +4,176,255,246,4,176,255,246,4,176,255,246,4,176,1,104,4,176,2,8,4,176,2,8,4,176,1,104,4,176,255,246,4,176,255,246,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60, +4,176,0,60,4,176,0,60,4,176,0,60,4,176,1,28,4,176,1,28,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60, +4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60,4,176,255,246,4,176,255,246,4,176,255,246,4,176,1,104,4,176,1,104,4,176,255,246,4,176,255,246,4,176,255,246, +4,176,255,246,4,176,2,8,4,176,1,104,4,176,255,246,4,176,0,80,4,176,1,104,4,176,1,104,4,176,255,246,4,176,255,246,4,176,1,104,4,176,255,246,4,176,255,246,4,176,255,246,4,176,0,75,4,176,1,104,4,176,2,8, +4,176,0,80,4,176,1,104,4,176,1,104,4,176,255,246,4,176,255,246,4,176,1,104,4,176,1,104,4,176,1,104,4,176,255,246,4,176,255,246,4,176,1,104,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246, +4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,181,4,176,255,186,4,176,255,181,4,176,0,80,4,176,2,8,4,176,2,8,4,176,255,246,4,176,255,246,4,176,0,75,4,176,2,8,4,176,2,8,4,176,0,80,4,176,2,8, +4,176,2,8,4,176,1,104,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,1,104,4,176,1,104, +4,176,255,246,4,176,255,246,4,176,255,246,4,176,255,246,4,176,1,104,4,176,2,8,4,176,255,246,4,176,255,246,4,176,1,104,4,176,255,246,4,176,255,246,4,176,2,8,4,176,2,8,4,176,255,246,4,176,255,246,4,176,2,8, +4,176,0,65,4,176,0,65,4,176,0,65,4,176,0,0,4,176,0,161,4,176,0,161,4,176,0,161,4,176,0,161,4,176,0,161,4,176,0,161,4,176,0,161,4,176,0,161,4,176,0,60,4,176,0,60,4,176,0,60,4,176,0,60, +4,176,1,22,4,176,0,120,4,176,0,140,4,176,0,140,4,176,0,100,4,176,0,208,4,176,0,143,4,176,0,14,4,176,0,59,4,176,1,8,4,176,0,19,4,176,0,107,4,176,0,85,4,176,0,212,4,176,0,59,4,176,0,93, +4,176,0,25,4,176,0,131,4,176,0,59,4,176,2,13,4,176,2,12,4,176,0,173,4,176,0,181,4,176,0,181,4,176,0,42,4,176,0,56,4,176,0,64,4,176,0,100,4,176,255,211,4,176,255,246,4,176,0,42,4,176,0,242, +4,176,0,38,4,176,0,55,4,176,0,55,4,176,0,0,4,176,0,55,4,176,0,55,4,176,0,55,4,176,0,55,4,176,255,98,4,176,1,27,4,176,0,83,4,176,0,83,4,176,0,83,4,176,0,83,4,176,0,83,4,176,1,35, +4,176,1,35,4,176,0,230,4,176,255,208,4,176,0,255,4,176,0,80,4,176,0,0,4,176,255,96,4,176,254,232,4,176,255,96,4,176,0,30,4,176,255,106,4,176,0,59,4,176,0,169,4,176,0,169,4,176,255,231,4,176,255,196, +4,176,1,33,4,176,0,55,4,176,0,255,4,176,0,55,4,176,0,38,4,176,0,38,4,176,1,11,4,176,0,229,4,176,0,229,4,176,0,229,4,176,0,29,4,176,0,29,4,176,0,29,4,176,0,207,4,176,0,29,4,176,0,116, +4,176,0,134,4,176,0,248,4,176,0,216,4,176,0,0,4,176,0,0,4,176,0,83,4,176,0,83,4,176,255,253,4,176,1,109,4,176,1,111,4,176,1,109,4,176,252,31,4,176,253,183,4,176,253,184,4,176,254,77,4,176,248,173, +4,176,245,201,4,176,250,23,4,176,253,153,4,176,252,110,4,176,252,55,4,176,247,235,4,176,251,211,4,176,252,35,4,176,247,115,4,176,253,191,4,176,251,255,4,176,247,179,4,176,242,29,4,176,252,100,4,176,248,24,4,176,253,77, +4,176,249,1,4,176,244,181,4,176,248,224,4,176,252,60,4,176,248,84,4,176,252,100,4,176,248,24,4,176,253,152,4,176,252,100,4,176,252,98,4,176,248,22,4,176,252,134,4,176,248,24,4,176,246,228,4,176,252,0,4,176,248,24, +4,176,252,71,4,176,251,167,4,176,252,173,4,176,252,129,4,176,247,89,4,176,252,71,4,176,251,172,4,176,1,109,4,176,1,111,4,176,1,109,4,176,251,60,4,176,255,236,4,176,251,60,4,176,254,159,4,176,251,60,4,176,255,236, +4,176,251,60,4,176,254,159,4,176,255,236,4,176,2,13,4,176,255,236,4,176,2,13,4,176,255,236,4,176,255,236,4,176,255,236,4,176,0,249,4,176,251,60,4,176,255,236,4,176,251,60,4,176,252,111,4,176,1,31,4,176,255,236, +4,176,251,60,4,176,255,236,4,176,251,60,4,176,252,111,4,176,1,31,4,176,255,236,4,176,251,60,4,176,255,236,4,176,251,60,4,176,252,69,4,176,255,236,4,176,0,245,4,176,251,60,4,176,255,236,4,176,251,60,4,176,252,69, +4,176,255,236,4,176,0,245,4,176,253,191,4,176,253,189,4,176,252,114,4,176,252,0,4,176,248,24,4,176,253,55,4,176,252,35,4,176,247,115,4,176,0,218,4,176,0,48,4,176,0,183,4,176,1,165,4,176,1,165,4,176,1,205, +4,176,1,20,4,176,1,74,4,176,1,165,0,0,1,27,0,0,1,223,0,0,1,106,0,0,1,119,0,0,1,19,0,0,1,17,0,0,1,17,0,0,1,45,0,0,1,122,0,0,1,18,0,0,1,76,0,0,0,172,0,0,1,19, +0,0,2,0,0,0,1,134,0,0,1,227,0,0,1,119,4,176,0,255,4,176,255,206,4,176,1,27,4,176,1,221,4,176,1,113,4,176,1,119,4,176,1,19,4,176,1,18,4,176,1,18,4,176,1,45,4,176,1,122,4,176,1,15, +4,176,1,74,4,176,1,116,4,176,1,147,4,176,1,252,4,176,1,227,4,176,1,26,4,176,1,220,4,176,1,111,4,176,1,107,4,176,1,18,4,176,1,18,4,176,1,18,4,176,1,47,4,176,1,121,4,176,1,15,4,176,1,73, +4,176,1,116,4,176,1,173,4,176,1,173,0,0,1,15,0,0,1,138,4,176,1,219,4,176,1,207,4,176,1,30,4,176,1,227,4,176,1,227,4,176,1,229,4,176,1,63,4,176,1,68,4,176,1,63,4,176,1,65,4,176,1,18, +4,176,1,13,4,176,1,27,4,176,1,30,4,176,1,21,4,176,1,106,4,176,1,210,4,176,1,119,4,176,1,207,4,176,1,15,0,0,0,84,0,0,1,246,0,0,5,230,4,176,253,218,0,147,1,73,0,2,0,0,0,0,0,200, +0,24,1,47,1,44,0,0,0,0,0,4,0,0,0,3,0,0,51,76,0,0,0,4,0,0,0,36,0,3,0,1,0,0,51,76,0,3,0,10,0,0,0,36,0,12,0,0,0,0,51,40,0,0,0,0,0,0,4,66,0,0,0,13, +0,0,0,13,0,0,4,137,0,0,0,32,0,0,0,32,0,0,4,133,0,0,0,33,0,0,0,33,0,0,3,229,0,0,0,34,0,0,0,34,0,0,4,53,0,0,0,35,0,0,0,35,0,0,3,237,0,0,0,36,0,0,0,36, +0,0,4,141,0,0,0,37,0,0,0,37,0,0,4,223,0,0,0,38,0,0,0,38,0,0,6,43,0,0,0,39,0,0,0,39,0,0,4,54,0,0,0,40,0,0,0,41,0,0,4,3,0,0,0,42,0,0,0,42,0,0,3,235, +0,0,0,43,0,0,0,43,0,0,4,189,0,0,0,44,0,0,0,44,0,0,3,225,0,0,0,45,0,0,0,45,0,0,4,26,0,0,0,46,0,0,0,46,0,0,3,224,0,0,0,47,0,0,0,47,0,0,3,238,0,0,0,48, +0,0,0,57,0,0,3,144,0,0,0,58,0,0,0,59,0,0,3,226,0,0,0,60,0,0,0,60,0,0,4,196,0,0,0,61,0,0,0,61,0,0,4,193,0,0,0,62,0,0,0,62,0,0,4,195,0,0,0,63,0,0,0,63, +0,0,3,231,0,0,0,64,0,0,0,64,0,0,6,42,0,0,0,65,0,0,0,65,0,0,0,1,0,0,0,66,0,0,0,67,0,0,0,13,0,0,0,68,0,0,0,68,0,0,0,20,0,0,0,69,0,0,0,69,0,0,0,24, +0,0,0,70,0,0,0,71,0,0,0,34,0,0,0,72,0,0,0,72,0,0,0,40,0,0,0,73,0,0,0,73,0,0,0,43,0,0,0,74,0,0,0,74,0,0,0,54,0,0,0,75,0,0,0,75,0,0,0,56,0,0,0,76, +0,0,0,76,0,0,0,58,0,0,0,77,0,0,0,78,0,0,0,64,0,0,0,79,0,0,0,79,0,0,0,71,0,0,0,80,0,0,0,80,0,0,0,83,0,0,0,81,0,0,0,82,0,0,0,85,0,0,0,83,0,0,0,83, +0,0,0,90,0,0,0,84,0,0,0,84,0,0,0,97,0,0,0,85,0,0,0,85,0,0,0,102,0,0,0,86,0,0,0,87,0,0,0,113,0,0,0,88,0,0,0,89,0,0,0,119,0,0,0,90,0,0,0,90,0,0,0,125, +0,0,0,91,0,0,0,91,0,0,4,7,0,0,0,92,0,0,0,92,0,0,3,239,0,0,0,93,0,0,0,93,0,0,4,8,0,0,0,94,0,0,0,94,0,0,4,203,0,0,0,95,0,0,0,95,0,0,4,34,0,0,0,96, +0,0,0,96,0,0,6,248,0,0,0,97,0,0,0,97,0,0,0,134,0,0,0,98,0,0,0,99,0,0,0,146,0,0,0,100,0,0,0,100,0,0,0,153,0,0,0,101,0,0,0,101,0,0,0,157,0,0,0,102,0,0,0,103, +0,0,0,167,0,0,0,104,0,0,0,104,0,0,0,173,0,0,0,105,0,0,0,105,0,0,0,176,0,0,0,106,0,0,0,106,0,0,0,188,0,0,0,107,0,0,0,107,0,0,0,191,0,0,0,108,0,0,0,108,0,0,0,194, +0,0,0,109,0,0,0,110,0,0,0,200,0,0,0,111,0,0,0,111,0,0,0,208,0,0,0,112,0,0,0,112,0,0,0,220,0,0,0,113,0,0,0,114,0,0,0,222,0,0,0,115,0,0,0,115,0,0,0,227,0,0,0,116, +0,0,0,116,0,0,0,234,0,0,0,117,0,0,0,117,0,0,0,239,0,0,0,118,0,0,0,119,0,0,0,250,0,0,0,120,0,0,0,121,0,0,1,0,0,0,0,122,0,0,0,122,0,0,1,6,0,0,0,123,0,0,0,123, +0,0,4,5,0,0,0,124,0,0,0,124,0,0,6,51,0,0,0,125,0,0,0,125,0,0,4,6,0,0,0,126,0,0,0,126,0,0,4,201,0,0,0,160,0,0,0,160,0,0,4,134,0,0,0,161,0,0,0,161,0,0,3,230, +0,0,0,162,0,0,0,162,0,0,4,139,0,0,0,163,0,0,0,163,0,0,4,148,0,0,0,164,0,0,0,164,0,0,4,140,0,0,0,165,0,0,0,165,0,0,4,149,0,0,0,166,0,0,0,166,0,0,6,52,0,0,0,167, +0,0,0,167,0,0,6,45,0,0,0,168,0,0,0,168,0,0,6,246,0,0,0,169,0,0,0,169,0,0,6,46,0,0,0,170,0,0,0,170,0,0,1,23,0,0,0,171,0,0,0,171,0,0,4,49,0,0,0,172,0,0,0,172, +0,0,4,202,0,0,0,173,0,0,0,173,0,0,4,27,0,0,0,174,0,0,0,174,0,0,6,47,0,0,0,175,0,0,0,175,0,0,7,0,0,0,0,176,0,0,0,176,0,0,6,49,0,0,0,177,0,0,0,177,0,0,4,199, +0,0,0,178,0,0,0,179,0,0,3,199,0,0,0,180,0,0,0,180,0,0,6,249,0,0,0,181,0,0,0,181,0,0,4,215,0,0,0,182,0,0,0,182,0,0,6,44,0,0,0,183,0,0,0,183,0,0,3,233,0,0,0,184, +0,0,0,184,0,0,7,1,0,0,0,185,0,0,0,185,0,0,3,198,0,0,0,186,0,0,0,186,0,0,1,24,0,0,0,187,0,0,0,187,0,0,4,50,0,0,0,188,0,0,0,188,0,0,3,212,0,0,0,189,0,0,0,189, +0,0,3,209,0,0,0,190,0,0,0,190,0,0,3,213,0,0,0,191,0,0,0,191,0,0,3,232,0,0,0,192,0,0,0,192,0,0,0,6,0,0,0,193,0,0,0,193,0,0,0,2,0,0,0,194,0,0,0,194,0,0,0,4, +0,0,0,195,0,0,0,195,0,0,0,10,0,0,0,196,0,0,0,196,0,0,0,5,0,0,0,197,0,0,0,197,0,0,0,9,0,0,0,198,0,0,0,198,0,0,0,11,0,0,0,199,0,0,0,199,0,0,0,17,0,0,0,200, +0,0,0,200,0,0,0,31,0,0,0,201,0,0,0,201,0,0,0,25,0,0,0,202,0,0,0,203,0,0,0,28,0,0,0,204,0,0,0,204,0,0,0,50,0,0,0,205,0,0,0,205,0,0,0,45,0,0,0,206,0,0,0,207, +0,0,0,47,0,0,0,208,0,0,0,208,0,0,0,21,0,0,0,209,0,0,0,209,0,0,0,70,0,0,0,210,0,0,0,210,0,0,0,76,0,0,0,211,0,0,0,211,0,0,0,72,0,0,0,212,0,0,0,212,0,0,0,74, +0,0,0,213,0,0,0,213,0,0,0,81,0,0,0,214,0,0,0,214,0,0,0,75,0,0,0,215,0,0,0,215,0,0,4,191,0,0,0,216,0,0,0,216,0,0,0,79,0,0,0,217,0,0,0,217,0,0,0,107,0,0,0,218, +0,0,0,218,0,0,0,103,0,0,0,219,0,0,0,220,0,0,0,105,0,0,0,221,0,0,0,221,0,0,0,121,0,0,0,222,0,0,0,222,0,0,0,84,0,0,0,223,0,0,0,223,0,0,0,233,0,0,0,224,0,0,0,224, +0,0,0,139,0,0,0,225,0,0,0,225,0,0,0,135,0,0,0,226,0,0,0,226,0,0,0,137,0,0,0,227,0,0,0,227,0,0,0,143,0,0,0,228,0,0,0,228,0,0,0,138,0,0,0,229,0,0,0,229,0,0,0,142, +0,0,0,230,0,0,0,230,0,0,0,144,0,0,0,231,0,0,0,231,0,0,0,150,0,0,0,232,0,0,0,232,0,0,0,164,0,0,0,233,0,0,0,233,0,0,0,158,0,0,0,234,0,0,0,235,0,0,0,161,0,0,0,236, +0,0,0,236,0,0,0,183,0,0,0,237,0,0,0,237,0,0,0,178,0,0,0,238,0,0,0,239,0,0,0,180,0,0,0,240,0,0,0,240,0,0,0,154,0,0,0,241,0,0,0,241,0,0,0,207,0,0,0,242,0,0,0,242, +0,0,0,213,0,0,0,243,0,0,0,243,0,0,0,209,0,0,0,244,0,0,0,244,0,0,0,211,0,0,0,245,0,0,0,245,0,0,0,218,0,0,0,246,0,0,0,246,0,0,0,212,0,0,0,247,0,0,0,247,0,0,4,192, +0,0,0,248,0,0,0,248,0,0,0,216,0,0,0,249,0,0,0,249,0,0,0,244,0,0,0,250,0,0,0,250,0,0,0,240,0,0,0,251,0,0,0,252,0,0,0,242,0,0,0,253,0,0,0,253,0,0,1,2,0,0,0,254, +0,0,0,254,0,0,0,221,0,0,0,255,0,0,0,255,0,0,1,4,0,0,1,0,0,0,1,0,0,0,0,7,0,0,1,1,0,0,1,1,0,0,0,140,0,0,1,2,0,0,1,2,0,0,0,3,0,0,1,3,0,0,1,3, +0,0,0,136,0,0,1,4,0,0,1,4,0,0,0,8,0,0,1,5,0,0,1,5,0,0,0,141,0,0,1,6,0,0,1,6,0,0,0,15,0,0,1,7,0,0,1,7,0,0,0,148,0,0,1,8,0,0,1,8,0,0,0,18, +0,0,1,9,0,0,1,9,0,0,0,151,0,0,1,10,0,0,1,10,0,0,0,19,0,0,1,11,0,0,1,11,0,0,0,152,0,0,1,12,0,0,1,12,0,0,0,16,0,0,1,13,0,0,1,13,0,0,0,149,0,0,1,14, +0,0,1,14,0,0,0,22,0,0,1,15,0,0,1,15,0,0,0,155,0,0,1,16,0,0,1,16,0,0,0,23,0,0,1,17,0,0,1,17,0,0,0,156,0,0,1,18,0,0,1,18,0,0,0,32,0,0,1,19,0,0,1,19, +0,0,0,165,0,0,1,20,0,0,1,20,0,0,0,26,0,0,1,21,0,0,1,21,0,0,0,159,0,0,1,22,0,0,1,22,0,0,0,30,0,0,1,23,0,0,1,23,0,0,0,163,0,0,1,24,0,0,1,24,0,0,0,33, +0,0,1,25,0,0,1,25,0,0,0,166,0,0,1,26,0,0,1,26,0,0,0,27,0,0,1,27,0,0,1,27,0,0,0,160,0,0,1,28,0,0,1,28,0,0,0,37,0,0,1,29,0,0,1,29,0,0,0,170,0,0,1,30, +0,0,1,30,0,0,0,36,0,0,1,31,0,0,1,31,0,0,0,169,0,0,1,32,0,0,1,32,0,0,0,39,0,0,1,33,0,0,1,33,0,0,0,172,0,0,1,34,0,0,1,34,0,0,0,38,0,0,1,35,0,0,1,35, +0,0,0,171,0,0,1,36,0,0,1,36,0,0,0,42,0,0,1,37,0,0,1,37,0,0,0,175,0,0,1,38,0,0,1,38,0,0,0,41,0,0,1,39,0,0,1,39,0,0,0,174,0,0,1,40,0,0,1,40,0,0,0,53, +0,0,1,41,0,0,1,41,0,0,0,187,0,0,1,42,0,0,1,42,0,0,0,51,0,0,1,43,0,0,1,43,0,0,0,185,0,0,1,44,0,0,1,44,0,0,0,46,0,0,1,45,0,0,1,45,0,0,0,179,0,0,1,46, +0,0,1,46,0,0,0,52,0,0,1,47,0,0,1,47,0,0,0,186,0,0,1,48,0,0,1,48,0,0,0,49,0,0,1,49,0,0,1,49,0,0,0,177,0,0,1,50,0,0,1,50,0,0,0,44,0,0,1,51,0,0,1,51, +0,0,0,184,0,0,1,52,0,0,1,52,0,0,0,55,0,0,1,53,0,0,1,53,0,0,0,190,0,0,1,54,0,0,1,54,0,0,0,57,0,0,1,55,0,0,1,56,0,0,0,192,0,0,1,57,0,0,1,57,0,0,0,59, +0,0,1,58,0,0,1,58,0,0,0,195,0,0,1,59,0,0,1,59,0,0,0,61,0,0,1,60,0,0,1,60,0,0,0,197,0,0,1,61,0,0,1,61,0,0,0,60,0,0,1,62,0,0,1,62,0,0,0,196,0,0,1,63, +0,0,1,63,0,0,0,62,0,0,1,64,0,0,1,64,0,0,0,198,0,0,1,65,0,0,1,65,0,0,0,63,0,0,1,66,0,0,1,66,0,0,0,199,0,0,1,67,0,0,1,67,0,0,0,66,0,0,1,68,0,0,1,68, +0,0,0,202,0,0,1,69,0,0,1,69,0,0,0,68,0,0,1,70,0,0,1,70,0,0,0,205,0,0,1,71,0,0,1,71,0,0,0,67,0,0,1,72,0,0,1,72,0,0,0,204,0,0,1,73,0,0,1,73,0,0,0,203, +0,0,1,74,0,0,1,74,0,0,0,69,0,0,1,75,0,0,1,75,0,0,0,206,0,0,1,76,0,0,1,76,0,0,0,78,0,0,1,77,0,0,1,77,0,0,0,215,0,0,1,78,0,0,1,78,0,0,0,73,0,0,1,79, +0,0,1,79,0,0,0,210,0,0,1,80,0,0,1,80,0,0,0,77,0,0,1,81,0,0,1,81,0,0,0,214,0,0,1,82,0,0,1,82,0,0,0,82,0,0,1,83,0,0,1,83,0,0,0,219,0,0,1,84,0,0,1,84, +0,0,0,87,0,0,1,85,0,0,1,85,0,0,0,224,0,0,1,86,0,0,1,86,0,0,0,89,0,0,1,87,0,0,1,87,0,0,0,226,0,0,1,88,0,0,1,88,0,0,0,88,0,0,1,89,0,0,1,89,0,0,0,225, +0,0,1,90,0,0,1,90,0,0,0,91,0,0,1,91,0,0,1,91,0,0,0,228,0,0,1,92,0,0,1,92,0,0,0,94,0,0,1,93,0,0,1,93,0,0,0,231,0,0,1,94,0,0,1,94,0,0,0,93,0,0,1,95, +0,0,1,95,0,0,0,230,0,0,1,96,0,0,1,96,0,0,0,92,0,0,1,97,0,0,1,97,0,0,0,229,0,0,1,98,0,0,1,98,0,0,0,100,0,0,1,99,0,0,1,99,0,0,0,237,0,0,1,100,0,0,1,100, +0,0,0,99,0,0,1,101,0,0,1,101,0,0,0,236,0,0,1,102,0,0,1,102,0,0,0,98,0,0,1,103,0,0,1,103,0,0,0,235,0,0,1,104,0,0,1,104,0,0,0,112,0,0,1,105,0,0,1,105,0,0,0,249, +0,0,1,106,0,0,1,106,0,0,0,109,0,0,1,107,0,0,1,107,0,0,0,246,0,0,1,108,0,0,1,108,0,0,0,104,0,0,1,109,0,0,1,109,0,0,0,241,0,0,1,110,0,0,1,110,0,0,0,111,0,0,1,111, +0,0,1,111,0,0,0,248,0,0,1,112,0,0,1,112,0,0,0,108,0,0,1,113,0,0,1,113,0,0,0,245,0,0,1,114,0,0,1,114,0,0,0,110,0,0,1,115,0,0,1,115,0,0,0,247,0,0,1,116,0,0,1,116, +0,0,0,116,0,0,1,117,0,0,1,117,0,0,0,253,0,0,1,118,0,0,1,118,0,0,0,122,0,0,1,119,0,0,1,119,0,0,1,3,0,0,1,120,0,0,1,120,0,0,0,123,0,0,1,121,0,0,1,121,0,0,0,126, +0,0,1,122,0,0,1,122,0,0,1,7,0,0,1,123,0,0,1,123,0,0,0,128,0,0,1,124,0,0,1,124,0,0,1,9,0,0,1,125,0,0,1,125,0,0,0,127,0,0,1,126,0,0,1,126,0,0,1,8,0,0,1,146, +0,0,1,146,0,0,4,144,0,0,1,252,0,0,1,252,0,0,0,12,0,0,1,253,0,0,1,253,0,0,0,145,0,0,1,254,0,0,1,254,0,0,0,80,0,0,1,255,0,0,1,255,0,0,0,217,0,0,2,24,0,0,2,24, +0,0,0,95,0,0,2,25,0,0,2,25,0,0,0,232,0,0,2,26,0,0,2,26,0,0,0,101,0,0,2,27,0,0,2,27,0,0,0,238,0,0,2,55,0,0,2,55,0,0,0,189,0,0,2,185,0,0,2,185,0,0,6,226, +0,0,2,186,0,0,2,186,0,0,6,224,0,0,2,188,0,0,2,188,0,0,6,223,0,0,2,198,0,0,2,199,0,0,6,251,0,0,2,201,0,0,2,201,0,0,6,225,0,0,2,216,0,0,2,216,0,0,6,253,0,0,2,217, +0,0,2,217,0,0,6,247,0,0,2,218,0,0,2,218,0,0,6,254,0,0,2,219,0,0,2,219,0,0,7,2,0,0,2,220,0,0,2,220,0,0,6,255,0,0,2,221,0,0,2,221,0,0,6,250,0,0,3,0,0,0,3,1, +0,0,6,229,0,0,3,2,0,0,3,2,0,0,6,232,0,0,3,3,0,0,3,5,0,0,6,236,0,0,3,6,0,0,3,6,0,0,6,234,0,0,3,7,0,0,3,7,0,0,6,228,0,0,3,8,0,0,3,8,0,0,6,227, +0,0,3,10,0,0,3,10,0,0,6,235,0,0,3,11,0,0,3,11,0,0,6,231,0,0,3,12,0,0,3,12,0,0,6,233,0,0,3,15,0,0,3,15,0,0,6,239,0,0,3,19,0,0,3,20,0,0,6,240,0,0,3,38, +0,0,3,39,0,0,6,242,0,0,3,53,0,0,3,54,0,0,6,244,0,0,3,66,0,0,3,66,0,0,7,19,0,0,3,69,0,0,3,69,0,0,7,20,0,0,3,112,0,0,3,112,0,0,2,92,0,0,3,113,0,0,3,113, +0,0,2,243,0,0,3,114,0,0,3,114,0,0,2,93,0,0,3,115,0,0,3,115,0,0,2,244,0,0,3,116,0,0,3,117,0,0,6,221,0,0,3,118,0,0,3,118,0,0,2,94,0,0,3,119,0,0,3,119,0,0,2,245, +0,0,3,122,0,0,3,122,0,0,3,133,0,0,3,123,0,0,3,125,0,0,2,246,0,0,3,126,0,0,3,126,0,0,4,130,0,0,3,127,0,0,3,127,0,0,2,58,0,0,3,132,0,0,3,132,0,0,7,21,0,0,3,133, +0,0,3,133,0,0,7,23,0,0,3,134,0,0,3,134,0,0,2,83,0,0,3,135,0,0,3,135,0,0,4,129,0,0,3,136,0,0,3,138,0,0,2,84,0,0,3,140,0,0,3,140,0,0,2,87,0,0,3,142,0,0,3,143, +0,0,2,88,0,0,3,144,0,0,3,144,0,0,2,234,0,0,3,145,0,0,3,161,0,0,2,59,0,0,3,163,0,0,3,169,0,0,2,76,0,0,3,170,0,0,3,171,0,0,2,90,0,0,3,172,0,0,3,174,0,0,2,240, +0,0,3,175,0,0,3,175,0,0,2,232,0,0,3,176,0,0,3,176,0,0,2,237,0,0,3,177,0,0,3,201,0,0,2,207,0,0,3,202,0,0,3,202,0,0,2,233,0,0,3,203,0,0,3,203,0,0,2,236,0,0,3,204, +0,0,3,204,0,0,2,238,0,0,3,205,0,0,3,205,0,0,2,235,0,0,3,206,0,0,3,206,0,0,2,239,0,0,3,207,0,0,3,207,0,0,2,100,0,0,3,208,0,0,3,209,0,0,2,255,0,0,3,210,0,0,3,212, +0,0,2,101,0,0,3,213,0,0,3,214,0,0,3,1,0,0,3,215,0,0,3,215,0,0,2,254,0,0,3,216,0,0,3,216,0,0,2,95,0,0,3,217,0,0,3,217,0,0,2,249,0,0,3,218,0,0,3,218,0,0,2,96, +0,0,3,219,0,0,3,219,0,0,2,250,0,0,3,220,0,0,3,220,0,0,2,97,0,0,3,221,0,0,3,221,0,0,2,251,0,0,3,222,0,0,3,222,0,0,2,98,0,0,3,223,0,0,3,223,0,0,2,252,0,0,3,224, +0,0,3,224,0,0,2,99,0,0,3,225,0,0,3,225,0,0,2,253,0,0,3,240,0,0,3,243,0,0,3,3,0,0,3,244,0,0,3,244,0,0,2,104,0,0,3,245,0,0,3,245,0,0,3,7,0,0,3,246,0,0,3,246, +0,0,6,220,0,0,3,247,0,0,3,247,0,0,2,105,0,0,3,248,0,0,3,248,0,0,3,8,0,0,3,249,0,0,3,250,0,0,2,106,0,0,3,251,0,0,3,252,0,0,3,9,0,0,3,253,0,0,3,255,0,0,2,108, +0,0,4,0,0,0,4,1,0,0,1,34,0,0,4,2,0,0,4,2,0,0,1,75,0,0,4,3,0,0,4,3,0,0,1,30,0,0,4,4,0,0,4,4,0,0,1,67,0,0,4,5,0,0,4,5,0,0,1,66,0,0,4,6, +0,0,4,8,0,0,1,69,0,0,4,9,0,0,4,10,0,0,1,64,0,0,4,11,0,0,4,11,0,0,1,72,0,0,4,12,0,0,4,12,0,0,1,43,0,0,4,13,0,0,4,13,0,0,1,40,0,0,4,14,0,0,4,14, +0,0,1,53,0,0,4,15,0,0,4,15,0,0,1,60,0,0,4,16,0,0,4,19,0,0,1,26,0,0,4,20,0,0,4,21,0,0,1,32,0,0,4,22,0,0,4,25,0,0,1,36,0,0,4,26,0,0,4,26,0,0,1,42, +0,0,4,27,0,0,4,35,0,0,1,44,0,0,4,36,0,0,4,37,0,0,1,54,0,0,4,38,0,0,4,38,0,0,1,57,0,0,4,39,0,0,4,39,0,0,1,56,0,0,4,40,0,0,4,41,0,0,1,58,0,0,4,42, +0,0,4,43,0,0,1,62,0,0,4,44,0,0,4,44,0,0,1,61,0,0,4,45,0,0,4,45,0,0,1,68,0,0,4,46,0,0,4,47,0,0,1,73,0,0,4,48,0,0,4,51,0,0,1,170,0,0,4,52,0,0,4,53, +0,0,1,176,0,0,4,54,0,0,4,57,0,0,1,180,0,0,4,58,0,0,4,58,0,0,1,186,0,0,4,59,0,0,4,67,0,0,1,188,0,0,4,68,0,0,4,69,0,0,1,198,0,0,4,70,0,0,4,70,0,0,1,201, +0,0,4,71,0,0,4,71,0,0,1,200,0,0,4,72,0,0,4,73,0,0,1,202,0,0,4,74,0,0,4,75,0,0,1,206,0,0,4,76,0,0,4,76,0,0,1,205,0,0,4,77,0,0,4,77,0,0,1,212,0,0,4,78, +0,0,4,79,0,0,1,217,0,0,4,80,0,0,4,81,0,0,1,178,0,0,4,82,0,0,4,82,0,0,1,219,0,0,4,83,0,0,4,83,0,0,1,174,0,0,4,84,0,0,4,84,0,0,1,211,0,0,4,85,0,0,4,85, +0,0,1,210,0,0,4,86,0,0,4,88,0,0,1,213,0,0,4,89,0,0,4,90,0,0,1,208,0,0,4,91,0,0,4,91,0,0,1,216,0,0,4,92,0,0,4,92,0,0,1,187,0,0,4,93,0,0,4,93,0,0,1,184, +0,0,4,94,0,0,4,94,0,0,1,197,0,0,4,95,0,0,4,95,0,0,1,204,0,0,4,96,0,0,4,96,0,0,1,76,0,0,4,97,0,0,4,97,0,0,1,220,0,0,4,98,0,0,4,98,0,0,1,77,0,0,4,99, +0,0,4,99,0,0,1,221,0,0,4,100,0,0,4,100,0,0,1,78,0,0,4,101,0,0,4,101,0,0,1,222,0,0,4,102,0,0,4,102,0,0,1,79,0,0,4,103,0,0,4,103,0,0,1,223,0,0,4,104,0,0,4,104, +0,0,1,80,0,0,4,105,0,0,4,105,0,0,1,224,0,0,4,106,0,0,4,106,0,0,1,81,0,0,4,107,0,0,4,107,0,0,1,225,0,0,4,108,0,0,4,108,0,0,1,82,0,0,4,109,0,0,4,109,0,0,1,226, +0,0,4,110,0,0,4,110,0,0,1,83,0,0,4,111,0,0,4,111,0,0,1,227,0,0,4,112,0,0,4,112,0,0,1,84,0,0,4,113,0,0,4,113,0,0,1,228,0,0,4,114,0,0,4,114,0,0,1,85,0,0,4,115, +0,0,4,115,0,0,1,229,0,0,4,116,0,0,4,116,0,0,1,86,0,0,4,117,0,0,4,117,0,0,1,230,0,0,4,118,0,0,4,118,0,0,1,87,0,0,4,119,0,0,4,119,0,0,1,231,0,0,4,120,0,0,4,120, +0,0,1,88,0,0,4,121,0,0,4,121,0,0,1,232,0,0,4,138,0,0,4,138,0,0,1,41,0,0,4,139,0,0,4,139,0,0,1,185,0,0,4,140,0,0,4,140,0,0,1,164,0,0,4,141,0,0,4,141,0,0,2,52, +0,0,4,142,0,0,4,142,0,0,1,165,0,0,4,143,0,0,4,143,0,0,2,53,0,0,4,144,0,0,4,144,0,0,1,31,0,0,4,145,0,0,4,145,0,0,1,175,0,0,4,146,0,0,4,146,0,0,1,89,0,0,4,147, +0,0,4,147,0,0,1,233,0,0,4,148,0,0,4,148,0,0,1,90,0,0,4,149,0,0,4,149,0,0,1,234,0,0,4,150,0,0,4,150,0,0,1,91,0,0,4,151,0,0,4,151,0,0,1,235,0,0,4,152,0,0,4,152, +0,0,1,92,0,0,4,153,0,0,4,153,0,0,1,236,0,0,4,154,0,0,4,154,0,0,1,93,0,0,4,155,0,0,4,155,0,0,1,237,0,0,4,156,0,0,4,156,0,0,1,94,0,0,4,157,0,0,4,157,0,0,1,238, +0,0,4,158,0,0,4,158,0,0,1,95,0,0,4,159,0,0,4,159,0,0,1,239,0,0,4,160,0,0,4,160,0,0,1,96,0,0,4,161,0,0,4,161,0,0,1,240,0,0,4,162,0,0,4,162,0,0,1,97,0,0,4,163, +0,0,4,163,0,0,1,241,0,0,4,164,0,0,4,164,0,0,1,98,0,0,4,165,0,0,4,165,0,0,1,242,0,0,4,166,0,0,4,166,0,0,1,99,0,0,4,167,0,0,4,167,0,0,1,244,0,0,4,168,0,0,4,168, +0,0,1,101,0,0,4,169,0,0,4,169,0,0,1,245,0,0,4,170,0,0,4,170,0,0,1,102,0,0,4,171,0,0,4,171,0,0,1,246,0,0,4,172,0,0,4,172,0,0,1,103,0,0,4,173,0,0,4,173,0,0,1,247, +0,0,4,174,0,0,4,174,0,0,1,104,0,0,4,175,0,0,4,175,0,0,1,248,0,0,4,176,0,0,4,176,0,0,1,105,0,0,4,177,0,0,4,177,0,0,1,249,0,0,4,178,0,0,4,178,0,0,1,106,0,0,4,179, +0,0,4,179,0,0,1,250,0,0,4,180,0,0,4,180,0,0,1,107,0,0,4,181,0,0,4,181,0,0,1,251,0,0,4,182,0,0,4,182,0,0,1,108,0,0,4,183,0,0,4,183,0,0,1,252,0,0,4,184,0,0,4,184, +0,0,1,109,0,0,4,185,0,0,4,185,0,0,1,253,0,0,4,186,0,0,4,186,0,0,1,110,0,0,4,187,0,0,4,187,0,0,1,254,0,0,4,188,0,0,4,188,0,0,1,112,0,0,4,189,0,0,4,189,0,0,2,0, +0,0,4,190,0,0,4,190,0,0,1,113,0,0,4,191,0,0,4,191,0,0,2,1,0,0,4,192,0,0,4,193,0,0,1,114,0,0,4,194,0,0,4,194,0,0,2,3,0,0,4,195,0,0,4,195,0,0,1,116,0,0,4,196, +0,0,4,196,0,0,2,4,0,0,4,197,0,0,4,197,0,0,1,117,0,0,4,198,0,0,4,198,0,0,2,5,0,0,4,199,0,0,4,199,0,0,1,118,0,0,4,200,0,0,4,200,0,0,2,6,0,0,4,201,0,0,4,201, +0,0,1,119,0,0,4,202,0,0,4,202,0,0,2,7,0,0,4,203,0,0,4,203,0,0,1,120,0,0,4,204,0,0,4,204,0,0,2,8,0,0,4,205,0,0,4,205,0,0,1,121,0,0,4,206,0,0,4,206,0,0,2,9, +0,0,4,207,0,0,4,207,0,0,2,2,0,0,4,208,0,0,4,208,0,0,1,122,0,0,4,209,0,0,4,209,0,0,2,10,0,0,4,210,0,0,4,210,0,0,1,123,0,0,4,211,0,0,4,211,0,0,2,11,0,0,4,212, +0,0,4,212,0,0,1,124,0,0,4,213,0,0,4,213,0,0,2,12,0,0,4,214,0,0,4,214,0,0,1,125,0,0,4,215,0,0,4,215,0,0,2,13,0,0,4,216,0,0,4,216,0,0,1,126,0,0,4,217,0,0,4,217, +0,0,2,14,0,0,4,218,0,0,4,218,0,0,1,127,0,0,4,219,0,0,4,219,0,0,2,15,0,0,4,220,0,0,4,220,0,0,1,128,0,0,4,221,0,0,4,221,0,0,2,16,0,0,4,222,0,0,4,222,0,0,1,129, +0,0,4,223,0,0,4,223,0,0,2,17,0,0,4,224,0,0,4,224,0,0,1,130,0,0,4,225,0,0,4,225,0,0,2,18,0,0,4,226,0,0,4,226,0,0,1,131,0,0,4,227,0,0,4,227,0,0,2,19,0,0,4,228, +0,0,4,228,0,0,1,132,0,0,4,229,0,0,4,229,0,0,2,20,0,0,4,230,0,0,4,230,0,0,1,133,0,0,4,231,0,0,4,231,0,0,2,21,0,0,4,232,0,0,4,232,0,0,1,134,0,0,4,233,0,0,4,233, +0,0,2,22,0,0,4,234,0,0,4,234,0,0,1,135,0,0,4,235,0,0,4,235,0,0,2,23,0,0,4,236,0,0,4,236,0,0,1,136,0,0,4,237,0,0,4,237,0,0,2,24,0,0,4,238,0,0,4,238,0,0,1,137, +0,0,4,239,0,0,4,239,0,0,2,25,0,0,4,240,0,0,4,240,0,0,1,138,0,0,4,241,0,0,4,241,0,0,2,26,0,0,4,242,0,0,4,242,0,0,1,139,0,0,4,243,0,0,4,243,0,0,2,27,0,0,4,244, +0,0,4,244,0,0,1,140,0,0,4,245,0,0,4,245,0,0,2,28,0,0,4,246,0,0,4,246,0,0,1,141,0,0,4,247,0,0,4,247,0,0,2,29,0,0,4,248,0,0,4,248,0,0,1,142,0,0,4,249,0,0,4,249, +0,0,2,30,0,0,4,250,0,0,4,250,0,0,1,143,0,0,4,251,0,0,4,251,0,0,2,31,0,0,4,252,0,0,4,252,0,0,1,144,0,0,4,253,0,0,4,253,0,0,2,32,0,0,4,254,0,0,4,254,0,0,1,145, +0,0,4,255,0,0,4,255,0,0,2,33,0,0,5,0,0,0,5,0,0,0,1,146,0,0,5,1,0,0,5,1,0,0,2,34,0,0,5,2,0,0,5,2,0,0,1,147,0,0,5,3,0,0,5,3,0,0,2,35,0,0,5,4, +0,0,5,4,0,0,1,148,0,0,5,5,0,0,5,5,0,0,2,36,0,0,5,6,0,0,5,6,0,0,1,149,0,0,5,7,0,0,5,7,0,0,2,37,0,0,5,8,0,0,5,8,0,0,1,150,0,0,5,9,0,0,5,9, +0,0,2,38,0,0,5,10,0,0,5,10,0,0,1,151,0,0,5,11,0,0,5,11,0,0,2,39,0,0,5,12,0,0,5,12,0,0,1,152,0,0,5,13,0,0,5,13,0,0,2,40,0,0,5,14,0,0,5,14,0,0,1,153, +0,0,5,15,0,0,5,15,0,0,2,41,0,0,5,16,0,0,5,16,0,0,1,154,0,0,5,17,0,0,5,17,0,0,2,42,0,0,5,18,0,0,5,18,0,0,1,155,0,0,5,19,0,0,5,19,0,0,2,43,0,0,5,20, +0,0,5,20,0,0,1,156,0,0,5,21,0,0,5,21,0,0,2,44,0,0,5,22,0,0,5,22,0,0,1,157,0,0,5,23,0,0,5,23,0,0,2,45,0,0,5,24,0,0,5,24,0,0,1,158,0,0,5,25,0,0,5,25, +0,0,2,46,0,0,5,26,0,0,5,26,0,0,1,159,0,0,5,27,0,0,5,27,0,0,2,47,0,0,5,28,0,0,5,28,0,0,1,160,0,0,5,29,0,0,5,29,0,0,2,48,0,0,5,30,0,0,5,30,0,0,1,161, +0,0,5,31,0,0,5,31,0,0,2,49,0,0,5,32,0,0,5,32,0,0,1,162,0,0,5,33,0,0,5,33,0,0,2,50,0,0,5,34,0,0,5,34,0,0,1,163,0,0,5,35,0,0,5,35,0,0,2,51,0,0,5,36, +0,0,5,36,0,0,1,100,0,0,5,37,0,0,5,37,0,0,1,243,0,0,5,38,0,0,5,38,0,0,1,111,0,0,5,39,0,0,5,39,0,0,1,255,0,0,5,40,0,0,5,40,0,0,1,166,0,0,5,41,0,0,5,41, +0,0,2,54,0,0,5,42,0,0,5,42,0,0,1,167,0,0,5,43,0,0,5,43,0,0,2,55,0,0,5,44,0,0,5,44,0,0,1,168,0,0,5,45,0,0,5,45,0,0,2,56,0,0,5,46,0,0,5,46,0,0,1,169, +0,0,5,47,0,0,5,47,0,0,2,57,0,0,20,5,0,0,20,5,0,0,3,134,0,0,20,10,0,0,20,10,0,0,3,135,0,0,30,128,0,0,30,128,0,0,0,118,0,0,30,129,0,0,30,129,0,0,0,255,0,0,30,130, +0,0,30,130,0,0,0,115,0,0,30,131,0,0,30,131,0,0,0,252,0,0,30,132,0,0,30,132,0,0,0,117,0,0,30,133,0,0,30,133,0,0,0,254,0,0,30,158,0,0,30,158,0,0,0,96,0,0,30,242,0,0,30,242, +0,0,0,124,0,0,30,243,0,0,30,243,0,0,1,5,0,0,31,0,0,0,31,7,0,0,3,11,0,0,31,8,0,0,31,15,0,0,2,111,0,0,31,16,0,0,31,21,0,0,3,36,0,0,31,24,0,0,31,29,0,0,2,132, +0,0,31,32,0,0,31,39,0,0,3,44,0,0,31,40,0,0,31,47,0,0,2,140,0,0,31,48,0,0,31,55,0,0,3,67,0,0,31,56,0,0,31,63,0,0,2,159,0,0,31,64,0,0,31,69,0,0,3,83,0,0,31,72, +0,0,31,77,0,0,2,171,0,0,31,80,0,0,31,87,0,0,3,93,0,0,31,89,0,0,31,89,0,0,2,180,0,0,31,91,0,0,31,91,0,0,2,181,0,0,31,93,0,0,31,93,0,0,2,182,0,0,31,95,0,0,31,95, +0,0,2,183,0,0,31,96,0,0,31,103,0,0,3,109,0,0,31,104,0,0,31,111,0,0,2,188,0,0,31,112,0,0,31,113,0,0,3,19,0,0,31,114,0,0,31,115,0,0,3,42,0,0,31,116,0,0,31,117,0,0,3,52, +0,0,31,118,0,0,31,119,0,0,3,75,0,0,31,120,0,0,31,121,0,0,3,89,0,0,31,122,0,0,31,123,0,0,3,101,0,0,31,124,0,0,31,125,0,0,3,117,0,0,31,128,0,0,31,135,0,0,3,27,0,0,31,136, +0,0,31,143,0,0,2,124,0,0,31,144,0,0,31,151,0,0,3,58,0,0,31,152,0,0,31,159,0,0,2,151,0,0,31,160,0,0,31,167,0,0,3,123,0,0,31,168,0,0,31,175,0,0,2,199,0,0,31,176,0,0,31,177, +0,0,3,22,0,0,31,178,0,0,31,178,0,0,3,25,0,0,31,179,0,0,31,179,0,0,3,24,0,0,31,180,0,0,31,180,0,0,3,26,0,0,31,182,0,0,31,182,0,0,3,21,0,0,31,183,0,0,31,183,0,0,3,35, +0,0,31,184,0,0,31,185,0,0,2,121,0,0,31,186,0,0,31,187,0,0,2,119,0,0,31,188,0,0,31,188,0,0,2,123,0,0,31,189,0,0,31,189,0,0,7,25,0,0,31,190,0,0,31,190,0,0,3,132,0,0,31,191, +0,0,31,191,0,0,7,24,0,0,31,192,0,0,31,192,0,0,7,40,0,0,31,193,0,0,31,193,0,0,7,35,0,0,31,194,0,0,31,194,0,0,3,56,0,0,31,195,0,0,31,195,0,0,3,55,0,0,31,196,0,0,31,196, +0,0,3,57,0,0,31,198,0,0,31,198,0,0,3,54,0,0,31,199,0,0,31,199,0,0,3,66,0,0,31,200,0,0,31,201,0,0,2,138,0,0,31,202,0,0,31,204,0,0,2,148,0,0,31,205,0,0,31,205,0,0,7,27, +0,0,31,206,0,0,31,206,0,0,7,29,0,0,31,207,0,0,31,207,0,0,7,31,0,0,31,208,0,0,31,211,0,0,3,78,0,0,31,214,0,0,31,214,0,0,3,77,0,0,31,215,0,0,31,215,0,0,3,82,0,0,31,216, +0,0,31,217,0,0,2,169,0,0,31,218,0,0,31,219,0,0,2,167,0,0,31,221,0,0,31,221,0,0,7,28,0,0,31,222,0,0,31,222,0,0,7,30,0,0,31,223,0,0,31,223,0,0,7,32,0,0,31,224,0,0,31,227, +0,0,3,104,0,0,31,228,0,0,31,229,0,0,3,91,0,0,31,230,0,0,31,230,0,0,3,103,0,0,31,231,0,0,31,231,0,0,3,108,0,0,31,232,0,0,31,233,0,0,2,186,0,0,31,234,0,0,31,235,0,0,2,184, +0,0,31,236,0,0,31,236,0,0,2,179,0,0,31,237,0,0,31,238,0,0,7,33,0,0,31,239,0,0,31,239,0,0,7,36,0,0,31,242,0,0,31,242,0,0,3,121,0,0,31,243,0,0,31,243,0,0,3,120,0,0,31,244, +0,0,31,244,0,0,3,122,0,0,31,246,0,0,31,246,0,0,3,119,0,0,31,247,0,0,31,247,0,0,3,131,0,0,31,248,0,0,31,249,0,0,2,177,0,0,31,250,0,0,31,252,0,0,2,196,0,0,31,253,0,0,31,253, +0,0,7,38,0,0,31,254,0,0,31,254,0,0,7,26,0,0,32,7,0,0,32,8,0,0,4,131,0,0,32,11,0,0,32,11,0,0,4,135,0,0,32,18,0,0,32,18,0,0,4,31,0,0,32,19,0,0,32,21,0,0,4,28, +0,0,32,22,0,0,32,22,0,0,3,236,0,0,32,23,0,0,32,23,0,0,4,35,0,0,32,24,0,0,32,25,0,0,4,47,0,0,32,26,0,0,32,26,0,0,4,43,0,0,32,28,0,0,32,29,0,0,4,45,0,0,32,30, +0,0,32,30,0,0,4,44,0,0,32,32,0,0,32,33,0,0,6,54,0,0,32,34,0,0,32,34,0,0,3,234,0,0,32,38,0,0,32,38,0,0,3,228,0,0,32,48,0,0,32,48,0,0,4,224,0,0,32,57,0,0,32,58, +0,0,4,51,0,0,32,68,0,0,32,68,0,0,3,207,0,0,32,74,0,0,32,74,0,0,3,240,0,0,32,112,0,0,32,112,0,0,3,197,0,0,32,116,0,0,32,121,0,0,3,201,0,0,32,122,0,0,32,122,0,0,4,226, +0,0,32,123,0,0,32,123,0,0,4,178,0,0,32,124,0,0,32,124,0,0,4,164,0,0,32,125,0,0,32,126,0,0,4,13,0,0,32,127,0,0,32,127,0,0,1,25,0,0,32,128,0,0,32,137,0,0,3,167,0,0,32,138, +0,0,32,138,0,0,4,225,0,0,32,139,0,0,32,139,0,0,4,177,0,0,32,140,0,0,32,140,0,0,4,163,0,0,32,141,0,0,32,142,0,0,4,1,0,0,32,172,0,0,32,172,0,0,4,143,0,0,32,175,0,0,32,175, +0,0,4,142,0,0,32,185,0,0,32,185,0,0,4,147,0,0,32,186,0,0,32,186,0,0,4,145,0,0,32,189,0,0,32,189,0,0,4,146,0,0,33,2,0,0,33,2,0,0,3,137,0,0,33,13,0,0,33,13,0,0,3,138, +0,0,33,19,0,0,33,19,0,0,6,53,0,0,33,21,0,0,33,21,0,0,3,139,0,0,33,22,0,0,33,22,0,0,6,57,0,0,33,25,0,0,33,26,0,0,3,140,0,0,33,29,0,0,33,29,0,0,3,142,0,0,33,34, +0,0,33,34,0,0,6,48,0,0,33,36,0,0,33,36,0,0,3,143,0,0,33,46,0,0,33,46,0,0,6,56,0,0,33,83,0,0,33,84,0,0,3,210,0,0,33,85,0,0,33,94,0,0,3,214,0,0,33,95,0,0,33,95, +0,0,3,208,0,0,33,138,0,0,33,138,0,0,6,112,0,0,33,139,0,0,33,139,0,0,6,111,0,0,33,144,0,0,33,144,0,0,5,12,0,0,33,145,0,0,33,145,0,0,5,6,0,0,33,146,0,0,33,146,0,0,5,8, +0,0,33,147,0,0,33,147,0,0,5,10,0,0,33,148,0,0,33,149,0,0,5,14,0,0,33,150,0,0,33,150,0,0,5,13,0,0,33,151,0,0,33,151,0,0,5,7,0,0,33,152,0,0,33,152,0,0,5,9,0,0,33,153, +0,0,33,153,0,0,5,11,0,0,33,169,0,0,33,169,0,0,5,18,0,0,33,176,0,0,33,179,0,0,5,19,0,0,33,222,0,0,33,222,0,0,6,93,0,0,33,223,0,0,33,223,0,0,6,92,0,0,33,228,0,0,33,229, +0,0,5,16,0,0,33,230,0,0,33,230,0,0,5,28,0,0,33,231,0,0,33,233,0,0,5,25,0,0,33,234,0,0,33,234,0,0,6,85,0,0,34,0,0,0,34,0,0,0,4,249,0,0,34,2,0,0,34,2,0,0,4,216, +0,0,34,3,0,0,34,3,0,0,4,166,0,0,34,4,0,0,34,4,0,0,4,245,0,0,34,5,0,0,34,5,0,0,4,205,0,0,34,6,0,0,34,6,0,0,4,211,0,0,34,7,0,0,34,7,0,0,4,168,0,0,34,8, +0,0,34,8,0,0,4,161,0,0,34,9,0,0,34,9,0,0,4,184,0,0,34,10,0,0,34,10,0,0,4,162,0,0,34,11,0,0,34,11,0,0,4,240,0,0,34,12,0,0,34,12,0,0,4,183,0,0,34,13,0,0,34,13, +0,0,4,155,0,0,34,15,0,0,34,15,0,0,4,212,0,0,34,17,0,0,34,17,0,0,4,213,0,0,34,18,0,0,34,18,0,0,4,190,0,0,34,21,0,0,34,21,0,0,4,157,0,0,34,25,0,0,34,25,0,0,4,154, +0,0,34,26,0,0,34,26,0,0,4,214,0,0,34,30,0,0,34,30,0,0,4,204,0,0,34,39,0,0,34,43,0,0,4,206,0,0,34,52,0,0,34,52,0,0,4,246,0,0,34,53,0,0,34,53,0,0,4,153,0,0,34,54, +0,0,34,54,0,0,4,227,0,0,34,72,0,0,34,72,0,0,4,200,0,0,34,96,0,0,34,96,0,0,4,194,0,0,34,97,0,0,34,97,0,0,4,165,0,0,34,98,0,0,34,98,0,0,4,185,0,0,34,100,0,0,34,100, +0,0,4,198,0,0,34,101,0,0,34,101,0,0,4,197,0,0,34,130,0,0,34,130,0,0,4,238,0,0,34,131,0,0,34,131,0,0,4,241,0,0,34,132,0,0,34,133,0,0,4,186,0,0,34,134,0,0,34,135,0,0,4,228, +0,0,34,136,0,0,34,137,0,0,4,181,0,0,34,138,0,0,34,138,0,0,4,239,0,0,34,139,0,0,34,139,0,0,4,242,0,0,34,162,0,0,34,162,0,0,4,237,0,0,34,163,0,0,34,163,0,0,4,244,0,0,34,164, +0,0,34,164,0,0,4,243,0,0,34,165,0,0,34,165,0,0,4,250,0,0,34,166,0,0,34,166,0,0,4,152,0,0,34,167,0,0,34,167,0,0,4,179,0,0,34,168,0,0,34,168,0,0,4,248,0,0,34,169,0,0,34,169, +0,0,4,167,0,0,34,170,0,0,34,170,0,0,4,247,0,0,34,171,0,0,34,171,0,0,4,160,0,0,34,172,0,0,34,172,0,0,4,159,0,0,34,173,0,0,34,173,0,0,4,188,0,0,34,174,0,0,34,174,0,0,4,158, +0,0,34,175,0,0,34,175,0,0,4,180,0,0,35,0,0,0,35,0,0,0,6,50,0,0,35,2,0,0,35,2,0,0,6,84,0,0,35,3,0,0,35,3,0,0,6,64,0,0,35,4,0,0,35,4,0,0,5,29,0,0,35,5, +0,0,35,5,0,0,6,101,0,0,35,6,0,0,35,6,0,0,6,100,0,0,35,16,0,0,35,16,0,0,4,230,0,0,35,24,0,0,35,24,0,0,6,94,0,0,35,32,0,0,35,32,0,0,4,170,0,0,35,33,0,0,35,33, +0,0,4,169,0,0,35,36,0,0,35,36,0,0,5,30,0,0,35,37,0,0,35,37,0,0,6,91,0,0,35,38,0,0,35,38,0,0,6,88,0,0,35,39,0,0,35,39,0,0,6,86,0,0,35,40,0,0,35,40,0,0,6,90, +0,0,35,43,0,0,35,43,0,0,6,87,0,0,35,135,0,0,35,135,0,0,6,40,0,0,35,136,0,0,35,136,0,0,6,82,0,0,35,139,0,0,35,139,0,0,6,61,0,0,35,155,0,0,35,155,0,0,4,219,0,0,35,156, +0,0,35,157,0,0,4,217,0,0,35,158,0,0,35,158,0,0,4,222,0,0,35,159,0,0,35,160,0,0,4,220,0,0,35,161,0,0,35,161,0,0,4,176,0,0,35,162,0,0,35,163,0,0,4,174,0,0,35,164,0,0,35,164, +0,0,4,236,0,0,35,165,0,0,35,166,0,0,4,234,0,0,35,167,0,0,35,167,0,0,4,173,0,0,35,168,0,0,35,168,0,0,4,172,0,0,35,169,0,0,35,169,0,0,4,171,0,0,35,170,0,0,35,170,0,0,4,156, +0,0,35,171,0,0,35,171,0,0,4,233,0,0,35,172,0,0,35,172,0,0,4,232,0,0,35,173,0,0,35,173,0,0,4,231,0,0,35,206,0,0,35,206,0,0,6,95,0,0,35,207,0,0,35,207,0,0,6,89,0,0,36,0, +0,0,36,0,0,0,6,99,0,0,36,1,0,0,36,2,0,0,6,106,0,0,36,3,0,0,36,4,0,0,6,74,0,0,36,5,0,0,36,5,0,0,6,77,0,0,36,6,0,0,36,6,0,0,6,39,0,0,36,7,0,0,36,7, +0,0,6,58,0,0,36,8,0,0,36,8,0,0,6,41,0,0,36,9,0,0,36,9,0,0,6,83,0,0,36,10,0,0,36,10,0,0,6,96,0,0,36,11,0,0,36,11,0,0,6,114,0,0,36,12,0,0,36,12,0,0,6,80, +0,0,36,13,0,0,36,13,0,0,6,63,0,0,36,14,0,0,36,14,0,0,6,104,0,0,36,15,0,0,36,15,0,0,6,103,0,0,36,16,0,0,36,16,0,0,6,65,0,0,36,17,0,0,36,17,0,0,6,69,0,0,36,18, +0,0,36,18,0,0,6,71,0,0,36,19,0,0,36,19,0,0,6,70,0,0,36,20,0,0,36,20,0,0,6,68,0,0,36,21,0,0,36,21,0,0,6,97,0,0,36,22,0,0,36,22,0,0,6,110,0,0,36,23,0,0,36,23, +0,0,6,76,0,0,36,24,0,0,36,24,0,0,6,62,0,0,36,25,0,0,36,25,0,0,6,73,0,0,36,26,0,0,36,26,0,0,6,108,0,0,36,27,0,0,36,28,0,0,6,78,0,0,36,29,0,0,36,29,0,0,6,81, +0,0,36,30,0,0,36,30,0,0,6,102,0,0,36,31,0,0,36,31,0,0,6,113,0,0,36,32,0,0,36,32,0,0,6,105,0,0,36,33,0,0,36,33,0,0,6,66,0,0,36,34,0,0,36,34,0,0,6,60,0,0,36,35, +0,0,36,35,0,0,6,59,0,0,36,36,0,0,36,36,0,0,6,98,0,0,36,37,0,0,36,37,0,0,6,67,0,0,36,38,0,0,36,38,0,0,6,109,0,0,37,0,0,0,37,0,0,0,5,122,0,0,37,1,0,0,37,1, +0,0,5,202,0,0,37,2,0,0,37,2,0,0,5,123,0,0,37,3,0,0,37,3,0,0,5,215,0,0,37,4,0,0,37,4,0,0,5,238,0,0,37,5,0,0,37,5,0,0,5,208,0,0,37,6,0,0,37,6,0,0,5,239, +0,0,37,7,0,0,37,7,0,0,5,209,0,0,37,8,0,0,37,8,0,0,5,235,0,0,37,9,0,0,37,9,0,0,5,205,0,0,37,10,0,0,37,10,0,0,5,236,0,0,37,11,0,0,37,11,0,0,5,206,0,0,37,12, +0,0,37,12,0,0,5,113,0,0,37,13,0,0,37,13,0,0,5,193,0,0,37,14,0,0,37,14,0,0,5,187,0,0,37,15,0,0,37,15,0,0,5,201,0,0,37,16,0,0,37,16,0,0,5,115,0,0,37,17,0,0,37,17, +0,0,5,191,0,0,37,18,0,0,37,18,0,0,5,185,0,0,37,19,0,0,37,19,0,0,5,200,0,0,37,20,0,0,37,20,0,0,5,114,0,0,37,21,0,0,37,21,0,0,6,5,0,0,37,22,0,0,37,22,0,0,5,255, +0,0,37,23,0,0,37,23,0,0,5,214,0,0,37,24,0,0,37,24,0,0,5,116,0,0,37,25,0,0,37,25,0,0,6,3,0,0,37,26,0,0,37,26,0,0,5,253,0,0,37,27,0,0,37,27,0,0,5,212,0,0,37,28, +0,0,37,28,0,0,5,120,0,0,37,29,0,0,37,29,0,0,6,11,0,0,37,30,0,0,37,30,0,0,5,254,0,0,37,31,0,0,37,31,0,0,5,188,0,0,37,32,0,0,37,32,0,0,6,8,0,0,37,33,0,0,37,33, +0,0,5,194,0,0,37,34,0,0,37,34,0,0,6,4,0,0,37,35,0,0,37,35,0,0,5,218,0,0,37,36,0,0,37,36,0,0,5,121,0,0,37,37,0,0,37,37,0,0,6,10,0,0,37,38,0,0,37,38,0,0,5,252, +0,0,37,39,0,0,37,39,0,0,5,186,0,0,37,40,0,0,37,40,0,0,6,7,0,0,37,41,0,0,37,41,0,0,5,192,0,0,37,42,0,0,37,42,0,0,6,2,0,0,37,43,0,0,37,43,0,0,5,217,0,0,37,44, +0,0,37,44,0,0,5,118,0,0,37,45,0,0,37,45,0,0,5,220,0,0,37,46,0,0,37,46,0,0,5,243,0,0,37,47,0,0,37,47,0,0,5,190,0,0,37,48,0,0,37,48,0,0,5,184,0,0,37,49,0,0,37,49, +0,0,5,246,0,0,37,50,0,0,37,50,0,0,5,223,0,0,37,51,0,0,37,51,0,0,5,199,0,0,37,52,0,0,37,52,0,0,5,119,0,0,37,53,0,0,37,53,0,0,5,221,0,0,37,54,0,0,37,54,0,0,5,244, +0,0,37,55,0,0,37,55,0,0,6,1,0,0,37,56,0,0,37,56,0,0,5,251,0,0,37,57,0,0,37,57,0,0,5,247,0,0,37,58,0,0,37,58,0,0,5,224,0,0,37,59,0,0,37,59,0,0,5,211,0,0,37,60, +0,0,37,60,0,0,5,117,0,0,37,61,0,0,37,61,0,0,5,222,0,0,37,62,0,0,37,62,0,0,5,245,0,0,37,63,0,0,37,63,0,0,6,9,0,0,37,64,0,0,37,64,0,0,5,250,0,0,37,65,0,0,37,65, +0,0,5,189,0,0,37,66,0,0,37,66,0,0,6,6,0,0,37,67,0,0,37,67,0,0,5,226,0,0,37,68,0,0,37,68,0,0,5,249,0,0,37,69,0,0,37,69,0,0,5,219,0,0,37,70,0,0,37,70,0,0,5,242, +0,0,37,71,0,0,37,71,0,0,5,195,0,0,37,72,0,0,37,72,0,0,6,0,0,0,37,73,0,0,37,73,0,0,5,248,0,0,37,74,0,0,37,74,0,0,5,225,0,0,37,75,0,0,37,75,0,0,5,216,0,0,37,76, +0,0,37,76,0,0,5,230,0,0,37,77,0,0,37,77,0,0,5,196,0,0,37,78,0,0,37,78,0,0,5,231,0,0,37,79,0,0,37,79,0,0,5,197,0,0,37,80,0,0,37,80,0,0,5,141,0,0,37,81,0,0,37,81, +0,0,5,129,0,0,37,82,0,0,37,83,0,0,5,149,0,0,37,84,0,0,37,84,0,0,5,137,0,0,37,85,0,0,37,85,0,0,5,127,0,0,37,86,0,0,37,86,0,0,5,126,0,0,37,87,0,0,37,87,0,0,5,130, +0,0,37,88,0,0,37,88,0,0,5,148,0,0,37,89,0,0,37,89,0,0,5,147,0,0,37,90,0,0,37,90,0,0,5,136,0,0,37,91,0,0,37,91,0,0,5,133,0,0,37,92,0,0,37,92,0,0,5,132,0,0,37,93, +0,0,37,93,0,0,5,131,0,0,37,94,0,0,37,95,0,0,5,134,0,0,37,96,0,0,37,96,0,0,5,140,0,0,37,97,0,0,37,98,0,0,5,124,0,0,37,99,0,0,37,99,0,0,5,128,0,0,37,100,0,0,37,101, +0,0,5,145,0,0,37,102,0,0,37,102,0,0,5,139,0,0,37,103,0,0,37,104,0,0,5,143,0,0,37,105,0,0,37,105,0,0,5,138,0,0,37,106,0,0,37,106,0,0,5,152,0,0,37,107,0,0,37,107,0,0,5,151, +0,0,37,108,0,0,37,108,0,0,5,142,0,0,37,109,0,0,37,112,0,0,6,12,0,0,37,113,0,0,37,113,0,0,5,229,0,0,37,114,0,0,37,114,0,0,5,228,0,0,37,115,0,0,37,115,0,0,5,227,0,0,37,116, +0,0,37,116,0,0,5,233,0,0,37,117,0,0,37,117,0,0,5,240,0,0,37,118,0,0,37,118,0,0,5,237,0,0,37,119,0,0,37,119,0,0,5,232,0,0,37,120,0,0,37,120,0,0,5,203,0,0,37,121,0,0,37,121, +0,0,5,210,0,0,37,122,0,0,37,122,0,0,5,207,0,0,37,123,0,0,37,123,0,0,5,198,0,0,37,124,0,0,37,124,0,0,5,234,0,0,37,125,0,0,37,125,0,0,5,241,0,0,37,126,0,0,37,126,0,0,5,204, +0,0,37,127,0,0,37,127,0,0,5,213,0,0,37,128,0,0,37,128,0,0,5,57,0,0,37,129,0,0,37,136,0,0,5,49,0,0,37,137,0,0,37,137,0,0,5,65,0,0,37,138,0,0,37,138,0,0,5,64,0,0,37,139, +0,0,37,139,0,0,5,63,0,0,37,140,0,0,37,140,0,0,5,62,0,0,37,141,0,0,37,141,0,0,5,61,0,0,37,142,0,0,37,142,0,0,5,60,0,0,37,143,0,0,37,143,0,0,5,59,0,0,37,144,0,0,37,144, +0,0,5,66,0,0,37,145,0,0,37,147,0,0,5,78,0,0,37,148,0,0,37,148,0,0,5,58,0,0,37,149,0,0,37,159,0,0,5,67,0,0,37,160,0,0,37,171,0,0,5,153,0,0,37,172,0,0,37,173,0,0,5,110, +0,0,37,174,0,0,37,174,0,0,5,109,0,0,37,175,0,0,37,175,0,0,5,112,0,0,37,178,0,0,37,178,0,0,5,174,0,0,37,182,0,0,37,182,0,0,5,175,0,0,37,186,0,0,37,186,0,0,5,178,0,0,37,188, +0,0,37,188,0,0,5,176,0,0,37,192,0,0,37,192,0,0,5,177,0,0,37,196,0,0,37,196,0,0,5,179,0,0,37,198,0,0,37,199,0,0,5,106,0,0,37,201,0,0,37,201,0,0,5,95,0,0,37,202,0,0,37,202, +0,0,5,108,0,0,37,203,0,0,37,203,0,0,5,82,0,0,37,206,0,0,37,206,0,0,5,96,0,0,37,207,0,0,37,207,0,0,5,81,0,0,37,208,0,0,37,211,0,0,5,84,0,0,37,213,0,0,37,213,0,0,5,90, +0,0,37,214,0,0,37,215,0,0,5,88,0,0,37,217,0,0,37,219,0,0,5,97,0,0,37,220,0,0,37,223,0,0,5,102,0,0,37,224,0,0,37,225,0,0,5,100,0,0,37,226,0,0,37,228,0,0,5,181,0,0,37,229, +0,0,37,229,0,0,5,180,0,0,37,231,0,0,37,235,0,0,5,165,0,0,37,239,0,0,37,239,0,0,5,83,0,0,37,240,0,0,37,243,0,0,5,170,0,0,37,244,0,0,37,247,0,0,5,91,0,0,38,16,0,0,38,18, +0,0,6,16,0,0,38,32,0,0,38,32,0,0,6,19,0,0,38,48,0,0,38,55,0,0,6,20,0,0,38,57,0,0,38,60,0,0,6,28,0,0,38,64,0,0,38,64,0,0,6,32,0,0,38,66,0,0,38,66,0,0,6,33, +0,0,38,96,0,0,38,96,0,0,6,34,0,0,38,99,0,0,38,99,0,0,6,35,0,0,38,101,0,0,38,102,0,0,6,36,0,0,38,106,0,0,38,107,0,0,6,218,0,0,39,19,0,0,39,19,0,0,6,38,0,0,39,112, +0,0,39,113,0,0,4,11,0,0,39,161,0,0,39,161,0,0,5,48,0,0,39,232,0,0,39,233,0,0,4,127,0,0,39,240,0,0,39,241,0,0,5,34,0,0,39,242,0,0,39,243,0,0,5,23,0,0,39,244,0,0,39,255, +0,0,5,36,0,0,43,5,0,0,43,5,0,0,5,33,0,0,43,6,0,0,43,7,0,0,5,31,0,0,46,58,0,0,46,58,0,0,4,33,0,0,46,59,0,0,46,59,0,0,4,32,0,0,48,12,0,0,48,13,0,0,4,9, +0,0,224,0,0,0,224,3,0,0,7,41,0,0,224,160,0,0,224,162,0,0,7,45,0,0,224,176,0,0,224,179,0,0,7,48,0,0,254,255,0,0,254,255,0,0,4,138,0,0,255,98,0,0,255,99,0,0,4,21,0,1,213,57, +0,1,213,57,0,0,3,136,0,1,243,16,0,1,243,16,0,0,6,72,0,4,14,142,0,0,1,114,1,0,0,7,0,114,0,13,0,47,0,57,0,126,1,126,1,146,1,255,2,27,2,55,2,186,2,188,2,199,2,201,2,221,3,8, +3,12,3,15,3,20,3,39,3,54,3,66,3,69,3,119,3,127,3,138,3,140,3,144,3,161,3,169,3,176,3,201,3,225,3,243,4,26,4,35,4,58,4,67,4,121,5,47,20,5,20,10,30,133,30,158,30,243,31,7,31,15,31,21, +31,29,31,39,31,47,31,55,31,63,31,69,31,77,31,87,31,89,31,91,31,93,31,95,31,103,31,111,31,125,31,135,31,143,31,151,31,159,31,167,31,175,31,180,31,196,31,207,31,211,31,219,31,239,31,244,31,254,32,8,32,11,32,26, +32,30,32,34,32,38,32,48,32,58,32,68,32,74,32,112,32,121,32,127,32,137,32,142,32,172,32,175,32,186,32,189,33,2,33,13,33,19,33,22,33,26,33,29,33,34,33,36,33,46,33,84,33,94,33,95,33,139,33,153,33,169,33,179, +33,223,33,234,34,0,34,13,34,15,34,18,34,21,34,26,34,30,34,43,34,54,34,72,34,98,34,101,34,139,34,175,35,0,35,6,35,16,35,24,35,33,35,40,35,43,35,136,35,139,35,173,35,207,36,38,37,128,37,136,37,148,37,159, +37,171,37,175,37,178,37,182,37,186,37,188,37,192,37,196,37,199,37,203,37,207,37,211,37,215,37,229,37,235,37,243,37,247,38,18,38,32,38,55,38,60,38,64,38,66,38,96,38,99,38,102,38,107,39,19,39,113,39,161,39,233,39,243, +39,255,43,7,46,59,48,13,224,3,224,162,224,179,254,255,255,99,255,255,0,0,0,13,0,32,0,48,0,58,0,160,1,146,1,252,2,24,2,55,2,185,2,188,2,198,2,201,2,216,3,0,3,10,3,15,3,19,3,38,3,53,3,66, +3,69,3,112,3,122,3,132,3,140,3,142,3,145,3,163,3,170,3,177,3,202,3,240,3,244,4,27,4,36,4,59,4,68,4,138,20,5,20,10,30,128,30,158,30,242,31,0,31,8,31,16,31,24,31,32,31,40,31,48,31,56,31,64, +31,72,31,80,31,89,31,91,31,93,31,95,31,96,31,104,31,112,31,128,31,136,31,144,31,152,31,160,31,168,31,176,31,182,31,198,31,208,31,214,31,221,31,242,31,246,32,7,32,11,32,18,32,28,32,32,32,38,32,48,32,57,32,68, +32,74,32,112,32,116,32,122,32,128,32,138,32,172,32,175,32,185,32,189,33,2,33,13,33,19,33,21,33,25,33,29,33,34,33,36,33,46,33,83,33,85,33,95,33,138,33,144,33,169,33,176,33,222,33,228,34,0,34,2,34,15,34,17, +34,21,34,25,34,30,34,39,34,52,34,72,34,96,34,100,34,130,34,162,35,0,35,2,35,16,35,24,35,32,35,36,35,43,35,135,35,139,35,155,35,206,36,0,37,0,37,129,37,137,37,149,37,160,37,172,37,178,37,182,37,186,37,188, +37,192,37,196,37,198,37,201,37,206,37,208,37,213,37,217,37,231,37,239,37,244,38,16,38,32,38,48,38,57,38,64,38,66,38,96,38,99,38,101,38,106,39,19,39,112,39,161,39,232,39,240,39,244,43,5,46,58,48,12,224,0,224,160, +224,176,254,255,255,98,255,255,4,124,0,0,3,96,0,0,0,0,2,254,0,0,0,0,254,134,0,0,4,35,4,53,4,24,0,0,0,0,0,0,3,224,3,221,3,204,3,191,3,209,3,207,0,0,0,0,0,0,254,203,0,0,254,170, +254,169,0,0,255,30,0,0,255,19,0,0,253,17,0,0,253,129,0,0,0,0,239,129,239,125,0,0,225,194,0,0,228,11,227,103,228,20,227,108,228,12,227,100,228,19,227,103,228,19,227,99,228,13,227,91,227,90,227,89,227,88,228,13, +227,84,0,0,227,155,226,244,227,170,226,255,227,219,227,31,0,0,0,0,0,0,227,126,0,0,0,0,0,0,0,0,228,124,228,124,0,0,0,0,0,0,227,190,228,176,227,250,227,139,227,166,227,85,227,85,0,0,227,39,0,0,227,227, +227,223,0,0,227,213,226,135,226,125,229,34,0,0,226,115,226,113,229,14,226,107,229,10,226,127,226,129,226,113,0,0,0,0,227,105,227,99,0,0,0,0,226,249,0,0,226,197,0,0,226,136,0,0,226,174,226,167,0,0,226,128,0,0, +0,0,0,0,0,0,227,50,0,0,225,214,227,70,0,0,0,0,227,44,0,0,226,178,0,0,0,0,0,0,0,0,223,176,0,0,223,174,223,249,0,0,223,252,223,249,223,248,223,244,223,241,223,239,223,164,0,0,0,0,223,132,0,0, +0,0,223,190,0,0,223,103,224,0,223,243,223,228,223,227,223,224,223,223,223,194,223,192,223,191,224,112,223,19,220,155,221,143,220,151,0,0,221,48,0,0,0,0,211,253,39,41,38,141,38,128,5,139,4,179,0,1,0,0,1,112,0,0, +1,140,2,20,0,0,3,206,3,212,0,0,3,216,0,0,0,0,0,0,3,212,3,222,3,238,0,0,0,0,0,0,0,0,0,0,0,0,3,230,3,244,3,254,0,0,4,8,0,0,0,0,4,8,0,0,4,18,0,0,4,62,0,0, +4,136,0,0,4,178,5,28,0,0,0,0,6,98,0,0,6,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,74,0,0,0,0,0,0,0,0,0,0, +0,0,6,88,6,96,6,124,0,0,6,140,6,150,6,186,6,190,0,0,0,0,6,202,6,218,6,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,212,0,0,6,220,0,0,0,0,6,224,0,0,0,0,0,0,0,0,6,218, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,204,6,206,0,0,0,0,6,220,6,222,0,0,6,232,0,0,6,252,0,0,6,252,0,0,0,0,6,250,0,0,6,252,7,0,7,2,7,20,0,0,7,44,0,0,0,0, +7,48,7,50,0,0,7,56,0,0,7,56,7,92,7,94,7,170,0,0,8,168,0,0,0,0,8,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,178,8,182,0,0,8,182,8,186,0,0,8,208,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,186,0,0,8,190,8,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,133,3,229,4,53,3,237,4,141,4,223,6,43,4,54,4,3,4,4, +3,235,4,189,3,225,4,26,3,224,3,238,3,226,3,227,4,196,4,193,4,195,3,231,6,42,0,1,0,13,0,14,0,20,0,24,0,34,0,35,0,40,0,43,0,54,0,56,0,58,0,64,0,65,0,71,0,83,0,85,0,86,0,90, +0,97,0,102,0,113,0,114,0,119,0,120,0,125,4,7,3,239,4,8,4,203,4,34,6,248,0,134,0,146,0,147,0,153,0,157,0,167,0,168,0,173,0,176,0,188,0,191,0,194,0,200,0,201,0,208,0,220,0,222,0,223,0,227, +0,234,0,239,0,250,0,251,1,0,1,1,1,6,4,5,6,51,4,6,4,201,4,134,3,230,4,139,4,148,4,140,4,149,6,52,6,45,6,246,6,46,1,23,4,49,4,202,4,27,6,47,7,0,6,49,4,199,3,199,3,200,6,249, +4,215,6,44,3,233,7,1,3,198,1,24,4,50,3,212,3,209,3,213,3,232,0,6,0,2,0,4,0,10,0,5,0,9,0,11,0,17,0,31,0,25,0,28,0,29,0,50,0,45,0,47,0,48,0,21,0,70,0,76,0,72,0,74, +0,81,0,75,4,191,0,79,0,107,0,103,0,105,0,106,0,121,0,84,0,233,0,139,0,135,0,137,0,143,0,138,0,142,0,144,0,150,0,164,0,158,0,161,0,162,0,183,0,178,0,180,0,181,0,154,0,207,0,213,0,209,0,211, +0,218,0,212,4,192,0,216,0,244,0,240,0,242,0,243,1,2,0,221,1,4,0,7,0,140,0,3,0,136,0,8,0,141,0,15,0,148,0,18,0,151,0,19,0,152,0,16,0,149,0,22,0,155,0,23,0,156,0,32,0,165,0,26, +0,159,0,30,0,163,0,33,0,166,0,27,0,160,0,37,0,170,0,36,0,169,0,39,0,172,0,38,0,171,0,42,0,175,0,41,0,174,0,53,0,187,0,51,0,185,0,46,0,179,0,52,0,186,0,49,0,177,0,44,0,184,0,55, +0,190,0,57,0,192,0,193,0,59,0,195,0,61,0,197,0,60,0,196,0,62,0,198,0,63,0,199,0,66,0,202,0,68,0,205,0,67,0,204,0,203,0,69,0,206,0,78,0,215,0,73,0,210,0,77,0,214,0,82,0,219,0,87, +0,224,0,89,0,226,0,88,0,225,0,91,0,228,0,94,0,231,0,93,0,230,0,92,0,229,0,100,0,237,0,99,0,236,0,98,0,235,0,112,0,249,0,109,0,246,0,104,0,241,0,111,0,248,0,108,0,245,0,110,0,247,0,116, +0,253,0,122,1,3,0,123,0,126,1,7,0,128,1,9,0,127,1,8,0,12,0,145,0,80,0,217,0,95,0,232,0,101,0,238,6,226,6,224,6,253,6,247,6,254,7,2,6,255,6,250,6,229,6,230,6,232,6,236,6,237,6,238, +6,234,6,228,6,227,6,235,6,231,6,233,2,92,2,243,2,93,2,244,6,221,6,222,2,94,2,245,3,133,2,246,2,247,2,248,4,130,2,58,7,21,7,23,2,83,4,129,2,84,2,85,2,86,2,88,2,89,2,234,2,90,2,91, +2,240,2,241,2,242,2,232,2,237,2,233,2,236,2,238,2,235,2,239,2,100,2,255,3,0,2,101,2,102,2,103,3,1,3,2,2,254,2,95,2,249,2,96,2,250,2,97,2,251,2,98,2,252,2,99,2,253,2,104,3,7,6,220, +2,105,3,8,2,106,2,107,3,9,3,10,2,108,2,109,2,110,1,34,1,35,1,75,1,30,1,67,1,66,1,69,1,70,1,71,1,64,1,65,1,72,1,43,1,40,1,53,1,60,1,26,1,27,1,28,1,29,1,32,1,33,1,36, +1,37,1,38,1,39,1,42,1,54,1,55,1,57,1,56,1,58,1,59,1,62,1,63,1,61,1,68,1,73,1,74,1,170,1,171,1,172,1,173,1,176,1,177,1,180,1,181,1,182,1,183,1,186,1,198,1,199,1,201,1,200,1,202, +1,203,1,206,1,207,1,205,1,212,1,217,1,218,1,178,1,179,1,219,1,174,1,211,1,210,1,213,1,214,1,215,1,208,1,209,1,216,1,187,1,184,1,197,1,204,1,76,1,220,1,77,1,221,1,78,1,222,1,79,1,223,1,80, +1,224,1,81,1,225,1,82,1,226,1,83,1,227,1,84,1,228,1,85,1,229,1,86,1,230,1,87,1,231,1,88,1,232,1,41,1,185,1,164,2,52,1,165,2,53,1,31,1,175,1,89,1,233,1,90,1,234,1,91,1,235,1,92, +1,236,1,93,1,237,1,94,1,238,1,95,1,239,1,96,1,240,1,97,1,241,1,98,1,242,1,99,1,244,1,101,1,245,1,102,1,246,1,103,1,247,1,104,1,248,1,105,1,249,1,106,1,250,1,107,1,251,1,108,1,252,1,109, +1,253,1,110,1,254,1,112,2,0,1,113,2,1,1,114,1,115,2,3,1,116,2,4,1,117,2,5,1,118,2,6,1,119,2,7,1,120,2,8,1,121,2,9,2,2,1,122,2,10,1,123,2,11,1,124,2,12,1,125,2,13,1,126, +2,14,1,127,2,15,1,128,2,16,1,129,2,17,1,130,2,18,1,131,2,19,1,132,2,20,1,133,2,21,1,134,2,22,1,135,2,23,1,136,2,24,1,137,2,25,1,138,2,26,1,139,2,27,1,140,2,28,1,141,2,29,1,142, +2,30,1,143,2,31,1,144,2,32,1,145,2,33,1,146,2,34,1,147,2,35,1,148,2,36,1,149,2,37,1,150,2,38,1,151,2,39,1,152,2,40,1,153,2,41,1,154,2,42,1,155,2,43,1,156,2,44,1,157,2,45,1,158, +2,46,1,159,2,47,1,160,2,48,1,161,2,49,1,162,2,50,1,163,2,51,1,100,1,243,1,111,1,255,1,166,2,54,1,167,2,55,1,168,2,56,1,169,2,57,0,118,0,255,0,115,0,252,0,117,0,254,0,124,1,5,3,19, +3,20,3,42,3,43,3,52,3,53,3,75,3,76,3,89,3,90,3,101,3,102,3,117,3,118,3,22,3,23,3,25,3,24,3,26,3,21,3,35,2,121,2,122,2,119,2,120,2,123,7,25,3,132,7,24,7,40,7,35,3,56,3,55, +3,57,3,54,3,66,2,138,2,139,2,148,2,149,2,150,7,27,7,29,7,31,3,77,3,82,2,169,2,170,2,167,2,168,7,28,7,30,7,32,3,104,3,105,3,106,3,107,3,91,3,92,3,103,3,108,2,186,2,187,2,184,2,185, +2,179,7,33,7,34,7,36,3,121,3,120,3,122,3,119,3,131,2,177,2,178,2,196,2,197,2,198,7,38,7,26,4,31,4,28,4,29,4,30,3,236,4,35,4,47,4,48,4,43,4,45,4,46,4,44,6,54,6,55,3,234,4,226, +4,178,4,164,4,13,4,14,1,25,4,225,4,177,4,163,4,1,4,2,4,147,4,145,3,139,6,57,6,112,6,111,5,12,5,6,5,8,5,10,5,14,5,15,5,13,5,7,5,9,5,11,6,93,6,92,5,16,5,17,5,28,5,25, +5,26,5,27,6,85,4,216,4,166,4,245,4,205,4,211,4,168,4,161,4,184,4,162,4,240,4,183,4,155,4,213,4,190,4,154,4,214,4,246,4,153,4,227,4,194,4,165,4,185,4,198,4,197,4,238,4,241,4,186,4,187,4,228, +4,229,4,181,4,182,4,239,4,242,4,237,4,244,4,243,4,250,4,152,4,179,4,248,4,167,4,247,4,160,4,159,4,188,4,158,4,180,6,84,6,64,5,29,6,101,6,100,4,170,4,169,5,30,6,91,6,88,6,86,6,90,6,40, +6,82,4,219,4,217,4,218,4,222,4,220,4,221,4,176,4,174,4,175,4,236,4,234,4,235,4,173,4,172,4,171,4,156,4,233,4,232,4,231,6,95,6,89,6,99,6,106,6,107,6,74,6,75,6,77,6,39,6,58,6,41,6,83, +6,96,6,114,6,80,6,63,6,104,6,103,6,65,6,69,6,71,6,70,6,68,6,97,6,110,6,76,6,62,6,73,6,108,6,78,6,79,6,81,6,102,6,113,6,105,6,66,6,60,6,59,6,98,6,67,6,109,5,122,5,202,5,123, +5,215,5,238,5,208,5,239,5,209,5,235,5,205,5,236,5,206,5,113,5,193,5,187,5,201,5,115,5,191,5,185,5,200,5,114,6,5,5,255,5,214,5,116,6,3,5,253,5,212,5,120,6,11,5,254,5,188,6,8,5,194,6,4, +5,218,5,121,6,10,5,252,5,186,6,7,5,192,6,2,5,217,5,118,5,220,5,243,5,190,5,184,5,246,5,223,5,199,5,119,5,221,5,244,6,1,5,251,5,247,5,224,5,211,5,117,5,222,5,245,6,9,5,250,5,189,6,6, +5,226,5,249,5,219,5,242,5,195,6,0,5,248,5,225,5,216,5,230,5,196,5,231,5,197,5,141,5,129,5,149,5,150,5,137,5,127,5,126,5,130,5,148,5,147,5,136,5,133,5,132,5,131,5,134,5,135,5,140,5,124,5,125, +5,128,5,145,5,146,5,139,5,143,5,144,5,138,5,152,5,151,5,142,6,12,6,13,6,14,6,15,5,229,5,228,5,227,5,233,5,240,5,237,5,232,5,203,5,210,5,207,5,198,5,234,5,241,5,204,5,213,5,57,5,65,5,64, +5,63,5,62,5,61,5,60,5,59,5,66,5,78,5,79,5,80,5,58,5,110,5,111,5,109,5,112,5,95,5,108,5,82,5,96,5,81,5,90,5,88,5,89,5,97,5,98,5,99,5,102,5,103,5,104,5,105,5,100,5,101,5,181, +5,182,5,183,5,180,5,83,5,170,5,171,5,172,5,173,5,34,5,35,5,23,5,24,5,33,5,31,5,32,4,33,4,32,0,0,0,2,0,0,0,0,0,0,255,156,0,50,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7,54,0,0,0,36,0,201,1,2,0,199,0,98,0,173,1,3,1,4,0,99,0,174,0,144,1,5,0,37,0,38,0,253,0,255,0,100,1,6,1,7,0,39,0,233,1,8,1,9,0,40,0,101,1,10,1,11,0,200, +0,202,1,12,0,203,1,13,1,14,0,41,0,42,0,248,1,15,1,16,1,17,0,43,1,18,1,19,0,44,1,20,0,204,1,21,0,205,0,206,0,250,0,207,1,22,1,23,1,24,0,45,1,25,0,46,1,26,0,47,1,27,1,28, +1,29,1,30,0,226,0,48,0,49,1,31,1,32,1,33,1,34,0,102,0,50,0,208,1,35,0,209,0,103,0,211,1,36,1,37,0,145,1,38,0,175,0,176,0,51,0,237,0,52,0,53,1,39,1,40,1,41,0,54,1,42,0,228, +0,251,1,43,1,44,1,45,0,55,1,46,1,47,1,48,1,49,0,56,0,212,1,50,0,213,0,104,0,214,1,51,1,52,1,53,1,54,1,55,0,57,0,58,1,56,1,57,1,58,1,59,0,59,0,60,0,235,1,60,0,187,1,61, +0,61,1,62,0,230,1,63,1,64,1,65,1,66,1,67,1,68,0,68,0,105,1,69,0,107,0,108,0,106,1,70,1,71,0,110,0,109,0,160,1,72,0,69,0,70,0,254,1,0,0,111,1,73,1,74,0,71,0,234,1,75,1,1, +0,72,0,112,1,76,1,77,0,114,0,115,1,78,0,113,1,79,1,80,0,73,0,74,0,249,1,81,1,82,1,83,0,75,1,84,1,85,0,76,0,215,0,116,1,86,0,118,0,119,1,87,0,117,1,88,1,89,1,90,1,91,0,77, +1,92,1,93,0,78,1,94,1,95,0,79,1,96,1,97,1,98,1,99,0,227,0,80,0,81,1,100,1,101,1,102,1,103,1,104,0,120,0,82,0,121,1,105,0,123,0,124,0,122,1,106,1,107,0,161,1,108,0,125,0,177,0,83, +0,238,0,84,0,85,1,109,1,110,1,111,0,86,1,112,0,229,0,252,1,113,1,114,0,137,0,87,1,115,1,116,1,117,1,118,0,88,0,126,1,119,0,128,0,129,0,127,1,120,1,121,1,122,1,123,1,124,0,89,0,90,1,125, +1,126,1,127,1,128,0,91,0,92,0,236,1,129,0,186,1,130,0,93,1,131,0,231,1,132,1,133,1,134,1,135,1,136,1,137,1,138,1,139,1,140,1,141,1,142,1,143,1,144,1,145,0,157,0,158,1,146,1,147,1,148,1,149, +1,150,1,151,1,152,1,153,1,154,1,155,1,156,1,157,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,1,176,1,177,1,178,1,179,1,180,1,181, +1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213, +1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243,1,244,1,245, +1,246,1,247,1,248,1,249,1,250,1,251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21, +2,22,2,23,2,24,2,25,2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,2,39,2,40,2,41,2,42,2,43,2,44,2,45,2,46,2,47,2,48,2,49,2,50,2,51,2,52,2,53, +2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,64,2,65,2,66,2,67,2,68,2,69,2,70,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,2,81,2,82,2,83,2,84,2,85, +2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117, +2,118,2,119,2,120,2,121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,2,132,2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2,145,2,146,2,147,2,148,2,149, +2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157,2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,2,168,2,169,2,170,2,171,2,172,2,173,2,174,2,175,2,176,2,177,2,178,2,179,2,180,2,181, +2,182,2,183,2,184,2,185,2,186,2,187,2,188,2,189,2,190,2,191,2,192,2,193,2,194,2,195,2,196,2,197,2,198,2,199,2,200,2,201,2,202,2,203,2,204,2,205,2,206,2,207,2,208,2,209,2,210,2,211,2,212,2,213, +2,214,2,215,2,216,2,217,2,218,2,219,2,220,2,221,2,222,2,223,2,224,2,225,2,226,2,227,2,228,2,229,2,230,2,231,2,232,2,233,2,234,2,235,2,236,2,237,2,238,2,239,2,240,2,241,2,242,2,243,2,244,2,245, +2,246,2,247,2,248,2,249,2,250,2,251,2,252,2,253,2,254,2,255,3,0,3,1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3,16,3,17,3,18,3,19,3,20,3,21, +3,22,3,23,3,24,3,25,3,26,3,27,3,28,3,29,3,30,3,31,3,32,3,33,3,34,3,35,3,36,3,37,3,38,3,39,3,40,3,41,3,42,3,43,3,44,3,45,3,46,3,47,3,48,3,49,3,50,3,51,3,52,3,53, +3,54,3,55,3,56,3,57,3,58,3,59,3,60,3,61,3,62,3,63,3,64,3,65,3,66,3,67,3,68,3,69,3,70,3,71,3,72,3,73,3,74,3,75,3,76,3,77,3,78,3,79,3,80,3,81,3,82,3,83,3,84,3,85, +3,86,0,155,3,87,3,88,3,89,3,90,3,91,3,92,3,93,3,94,3,95,3,96,3,97,3,98,3,99,3,100,3,101,3,102,3,103,3,104,3,105,3,106,3,107,3,108,3,109,3,110,3,111,3,112,3,113,3,114,3,115,3,116, +3,117,3,118,3,119,3,120,3,121,3,122,3,123,3,124,3,125,3,126,3,127,3,128,3,129,3,130,3,131,3,132,3,133,3,134,3,135,3,136,3,137,3,138,3,139,3,140,3,141,3,142,3,143,3,144,3,145,3,146,3,147,3,148, +3,149,3,150,3,151,3,152,3,153,3,154,3,155,3,156,3,157,3,158,3,159,3,160,3,161,3,162,3,163,3,164,3,165,3,166,3,167,3,168,3,169,3,170,3,171,3,172,3,173,3,174,3,175,3,176,3,177,3,178,3,179,3,180, +3,181,3,182,3,183,3,184,3,185,3,186,3,187,3,188,3,189,3,190,3,191,3,192,3,193,3,194,3,195,3,196,3,197,3,198,3,199,3,200,3,201,3,202,3,203,3,204,3,205,3,206,3,207,3,208,3,209,3,210,3,211,3,212, +3,213,3,214,3,215,3,216,3,217,3,218,3,219,3,220,3,221,3,222,3,223,3,224,3,225,3,226,3,227,3,228,3,229,3,230,3,231,3,232,3,233,3,234,3,235,3,236,3,237,3,238,3,239,3,240,3,241,3,242,3,243,3,244, +3,245,3,246,3,247,3,248,3,249,3,250,3,251,3,252,3,253,3,254,3,255,4,0,4,1,4,2,4,3,4,4,4,5,4,6,4,7,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,4,8,4,9,4,10, +4,11,4,12,4,13,4,14,4,15,4,16,4,17,4,18,4,19,4,20,4,21,4,22,4,23,4,24,4,25,4,26,4,27,4,28,4,29,4,30,4,31,4,32,4,33,4,34,4,35,4,36,4,37,4,38,4,39,4,40,4,41,4,42, +4,43,4,44,4,45,4,46,4,47,4,48,4,49,4,50,4,51,4,52,4,53,4,54,4,55,4,56,4,57,4,58,4,59,4,60,0,188,4,61,0,244,4,62,4,63,0,245,0,246,4,64,4,65,4,66,4,67,4,68,4,69,4,70, +4,71,4,72,4,73,0,17,0,15,0,29,0,30,0,171,0,4,0,163,0,34,0,162,0,195,0,135,0,13,4,74,0,6,0,18,0,63,4,75,4,76,4,77,4,78,4,79,4,80,4,81,4,82,4,83,4,84,4,85,4,86,4,87, +4,88,4,89,4,90,4,91,4,92,4,93,0,11,0,12,0,94,0,96,0,62,0,64,4,94,4,95,4,96,4,97,4,98,4,99,4,100,4,101,4,102,4,103,4,104,4,105,4,106,4,107,4,108,4,109,4,110,0,16,4,111,0,178, +0,179,4,112,4,113,4,114,4,115,0,66,4,116,4,117,4,118,4,119,4,120,4,121,4,122,4,123,0,196,0,197,0,180,0,181,0,182,0,183,0,169,0,170,0,190,0,191,0,5,0,10,4,124,4,125,4,126,4,127,4,128,4,129, +4,130,4,131,4,132,4,133,4,134,4,135,4,136,4,137,4,138,4,139,4,140,4,141,4,142,4,143,4,144,4,145,4,146,4,147,4,148,4,149,4,150,4,151,4,152,4,153,4,154,4,155,4,156,4,157,4,158,4,159,4,160,4,161, +4,162,4,163,4,164,4,165,4,166,4,167,4,168,4,169,4,170,4,171,4,172,4,173,4,174,4,175,4,176,4,177,4,178,4,179,4,180,4,181,4,182,4,183,4,184,4,185,4,186,4,187,4,188,4,189,4,190,4,191,4,192,4,193, +4,194,4,195,4,196,4,197,4,198,4,199,4,200,4,201,0,3,4,202,4,203,4,204,4,205,4,206,0,132,0,189,0,7,4,207,4,208,0,166,4,209,4,210,4,211,0,133,0,150,4,212,4,213,4,214,4,215,4,216,4,217,4,218, +4,219,4,220,4,221,4,222,4,223,4,224,4,225,4,226,4,227,4,228,4,229,4,230,4,231,4,232,4,233,4,234,4,235,4,236,4,237,4,238,4,239,4,240,4,241,4,242,4,243,4,244,4,245,4,246,4,247,4,248,4,249,4,250, +0,14,0,239,0,240,0,184,0,32,0,143,0,33,0,31,0,149,0,148,0,147,0,167,0,97,0,164,0,65,0,146,4,251,4,252,4,253,4,254,4,255,0,156,5,0,0,154,0,153,0,165,5,1,0,152,5,2,5,3,5,4,5,5, +5,6,5,7,0,8,0,198,5,8,5,9,5,10,5,11,5,12,5,13,5,14,5,15,5,16,5,17,5,18,5,19,5,20,5,21,5,22,5,23,5,24,5,25,5,26,5,27,5,28,5,29,5,30,5,31,5,32,5,33,5,34,5,35, +5,36,5,37,5,38,5,39,5,40,5,41,5,42,5,43,5,44,5,45,5,46,5,47,5,48,5,49,5,50,5,51,5,52,5,53,5,54,5,55,5,56,5,57,5,58,5,59,5,60,5,61,5,62,5,63,5,64,5,65,5,66,5,67, +5,68,5,69,5,70,5,71,5,72,5,73,5,74,5,75,5,76,5,77,5,78,5,79,5,80,5,81,5,82,5,83,5,84,5,85,5,86,5,87,5,88,5,89,5,90,5,91,5,92,5,93,5,94,5,95,5,96,5,97,5,98,5,99, +5,100,5,101,5,102,5,103,5,104,5,105,5,106,5,107,5,108,5,109,5,110,5,111,5,112,5,113,5,114,5,115,5,116,5,117,5,118,5,119,5,120,5,121,5,122,5,123,5,124,5,125,5,126,5,127,5,128,5,129,5,130,5,131, +5,132,5,133,5,134,5,135,5,136,5,137,5,138,5,139,5,140,5,141,5,142,5,143,5,144,5,145,5,146,0,185,5,147,5,148,5,149,5,150,5,151,5,152,5,153,5,154,5,155,5,156,5,157,5,158,5,159,5,160,5,161,5,162, +5,163,5,164,5,165,5,166,5,167,5,168,5,169,5,170,5,171,5,172,5,173,5,174,5,175,5,176,5,177,5,178,5,179,5,180,5,181,5,182,5,183,5,184,5,185,5,186,5,187,5,188,5,189,5,190,5,191,5,192,5,193,5,194, +5,195,5,196,5,197,5,198,5,199,5,200,5,201,5,202,5,203,5,204,5,205,5,206,5,207,5,208,5,209,5,210,5,211,5,212,5,213,5,214,5,215,5,216,5,217,5,218,5,219,5,220,5,221,5,222,5,223,5,224,5,225,5,226, +5,227,5,228,5,229,5,230,5,231,5,232,5,233,5,234,5,235,5,236,5,237,5,238,5,239,5,240,5,241,5,242,5,243,5,244,5,245,5,246,5,247,5,248,5,249,5,250,5,251,5,252,5,253,5,254,5,255,6,0,6,1,6,2, +6,3,6,4,6,5,6,6,6,7,6,8,6,9,6,10,6,11,6,12,6,13,6,14,6,15,6,16,6,17,6,18,6,19,6,20,6,21,6,22,6,23,6,24,6,25,6,26,6,27,6,28,6,29,6,30,6,31,6,32,6,33,6,34, +6,35,6,36,6,37,6,38,6,39,6,40,6,41,6,42,6,43,6,44,6,45,6,46,6,47,6,48,6,49,6,50,6,51,6,52,6,53,6,54,6,55,6,56,6,57,6,58,6,59,6,60,6,61,6,62,6,63,6,64,6,65,6,66, +6,67,6,68,6,69,6,70,6,71,6,72,6,73,6,74,6,75,6,76,6,77,6,78,6,79,0,35,0,9,0,136,0,134,0,139,0,138,0,140,0,131,6,80,0,95,0,232,6,81,0,130,0,194,6,82,6,83,6,84,6,85,6,86, +6,87,6,88,6,89,6,90,6,91,6,92,6,93,6,94,6,95,6,96,6,97,6,98,6,99,6,100,6,101,6,102,6,103,6,104,6,105,6,106,6,107,6,108,6,109,6,110,6,111,6,112,6,113,6,114,6,115,6,116,6,117,6,118, +6,119,6,120,6,121,6,122,6,123,6,124,6,125,6,126,6,127,6,128,6,129,6,130,6,131,6,132,6,133,6,134,6,135,6,136,6,137,6,138,6,139,6,140,6,141,6,142,6,143,6,144,6,145,6,146,6,147,6,148,6,149,6,150, +6,151,6,152,6,153,6,154,6,155,6,156,6,157,6,158,6,159,6,160,6,161,6,162,6,163,6,164,6,165,6,166,6,167,6,168,6,169,6,170,6,171,6,172,6,173,6,174,6,175,6,176,6,177,6,178,6,179,6,180,6,181,6,182, +6,183,6,184,6,185,6,186,6,187,6,188,6,189,6,190,6,191,6,192,6,193,6,194,6,195,6,196,6,197,6,198,6,199,6,200,6,201,6,202,6,203,6,204,6,205,6,206,6,207,6,208,6,209,6,210,6,211,6,212,6,213,6,214, +6,215,6,216,6,217,6,218,6,219,6,220,6,221,6,222,6,223,6,224,6,225,6,226,6,227,6,228,6,229,6,230,6,231,6,232,6,233,6,234,6,235,6,236,6,237,6,238,6,239,6,240,6,241,6,242,6,243,6,244,6,245,6,246, +6,247,6,248,6,249,6,250,6,251,6,252,6,253,6,254,6,255,7,0,7,1,7,2,7,3,7,4,7,5,7,6,7,7,7,8,7,9,7,10,7,11,7,12,7,13,7,14,7,15,0,142,0,220,0,67,0,141,0,223,0,216,0,225, +0,219,0,221,0,217,0,218,0,222,0,224,7,16,7,17,7,18,7,19,7,20,7,21,7,22,7,23,7,24,7,25,7,26,7,27,7,28,7,29,7,30,7,31,7,32,7,33,7,34,7,35,7,36,7,37,7,38,7,39,7,40,7,41, +7,42,7,43,7,44,7,45,7,46,7,47,7,48,7,49,7,50,7,51,7,52,7,53,7,54,7,55,7,56,7,57,7,58,7,59,7,60,7,61,7,62,7,63,7,64,7,65,7,66,6,65,98,114,101,118,101,7,65,109,97,99,114,111, +110,7,65,111,103,111,110,101,107,7,65,69,97,99,117,116,101,11,67,99,105,114,99,117,109,102,108,101,120,10,67,100,111,116,97,99,99,101,110,116,6,68,99,97,114,111,110,6,68,99,114,111,97,116,6,69,98,114,101,118,101,6,69,99, +97,114,111,110,10,69,100,111,116,97,99,99,101,110,116,7,69,109,97,99,114,111,110,7,69,111,103,111,110,101,107,11,71,99,105,114,99,117,109,102,108,101,120,7,117,110,105,48,49,50,50,10,71,100,111,116,97,99,99,101,110,116,4,72, +98,97,114,11,72,99,105,114,99,117,109,102,108,101,120,2,73,74,6,73,98,114,101,118,101,7,73,109,97,99,114,111,110,7,73,111,103,111,110,101,107,6,73,116,105,108,100,101,11,74,99,105,114,99,117,109,102,108,101,120,7,117,110,105, +48,49,51,54,6,76,97,99,117,116,101,6,76,99,97,114,111,110,7,117,110,105,48,49,51,66,4,76,100,111,116,6,78,97,99,117,116,101,6,78,99,97,114,111,110,7,117,110,105,48,49,52,53,3,69,110,103,6,79,98,114,101,118,101, +13,79,104,117,110,103,97,114,117,109,108,97,117,116,7,79,109,97,99,114,111,110,11,79,115,108,97,115,104,97,99,117,116,101,6,82,97,99,117,116,101,6,82,99,97,114,111,110,7,117,110,105,48,49,53,54,6,83,97,99,117,116,101,11, +83,99,105,114,99,117,109,102,108,101,120,7,117,110,105,48,50,49,56,7,117,110,105,49,69,57,69,4,84,98,97,114,6,84,99,97,114,111,110,7,117,110,105,48,49,54,50,7,117,110,105,48,50,49,65,6,85,98,114,101,118,101,13,85, +104,117,110,103,97,114,117,109,108,97,117,116,7,85,109,97,99,114,111,110,7,85,111,103,111,110,101,107,5,85,114,105,110,103,6,85,116,105,108,100,101,6,87,97,99,117,116,101,11,87,99,105,114,99,117,109,102,108,101,120,9,87,100,105, +101,114,101,115,105,115,6,87,103,114,97,118,101,11,89,99,105,114,99,117,109,102,108,101,120,6,89,103,114,97,118,101,6,90,97,99,117,116,101,10,90,100,111,116,97,99,99,101,110,116,14,67,97,99,117,116,101,46,108,111,99,108,80,76, +75,14,78,97,99,117,116,101,46,108,111,99,108,80,76,75,14,79,97,99,117,116,101,46,108,111,99,108,80,76,75,14,83,97,99,117,116,101,46,108,111,99,108,80,76,75,14,90,97,99,117,116,101,46,108,111,99,108,80,76,75,6,97,98, +114,101,118,101,7,97,109,97,99,114,111,110,7,97,111,103,111,110,101,107,7,97,101,97,99,117,116,101,11,99,99,105,114,99,117,109,102,108,101,120,10,99,100,111,116,97,99,99,101,110,116,6,100,99,97,114,111,110,6,101,98,114,101,118, +101,6,101,99,97,114,111,110,10,101,100,111,116,97,99,99,101,110,116,7,101,109,97,99,114,111,110,7,101,111,103,111,110,101,107,11,103,99,105,114,99,117,109,102,108,101,120,7,117,110,105,48,49,50,51,10,103,100,111,116,97,99,99,101, +110,116,4,104,98,97,114,11,104,99,105,114,99,117,109,102,108,101,120,6,105,98,114,101,118,101,9,105,46,108,111,99,108,84,82,75,2,105,106,7,105,109,97,99,114,111,110,7,105,111,103,111,110,101,107,6,105,116,105,108,100,101,7,117, +110,105,48,50,51,55,11,106,99,105,114,99,117,109,102,108,101,120,7,117,110,105,48,49,51,55,12,107,103,114,101,101,110,108,97,110,100,105,99,6,108,97,99,117,116,101,6,108,99,97,114,111,110,7,117,110,105,48,49,51,67,4,108,100, +111,116,6,110,97,99,117,116,101,11,110,97,112,111,115,116,114,111,112,104,101,6,110,99,97,114,111,110,7,117,110,105,48,49,52,54,3,101,110,103,6,111,98,114,101,118,101,13,111,104,117,110,103,97,114,117,109,108,97,117,116,7,111,109, +97,99,114,111,110,11,111,115,108,97,115,104,97,99,117,116,101,6,114,97,99,117,116,101,6,114,99,97,114,111,110,7,117,110,105,48,49,53,55,6,115,97,99,117,116,101,11,115,99,105,114,99,117,109,102,108,101,120,7,117,110,105,48,50, +49,57,4,116,98,97,114,6,116,99,97,114,111,110,7,117,110,105,48,49,54,51,7,117,110,105,48,50,49,66,6,117,98,114,101,118,101,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,117,109,97,99,114,111,110,7,117,111,103,111, +110,101,107,5,117,114,105,110,103,6,117,116,105,108,100,101,6,119,97,99,117,116,101,11,119,99,105,114,99,117,109,102,108,101,120,9,119,100,105,101,114,101,115,105,115,6,119,103,114,97,118,101,11,121,99,105,114,99,117,109,102,108,101,120, +6,121,103,114,97,118,101,6,122,97,99,117,116,101,10,122,100,111,116,97,99,99,101,110,116,14,99,97,99,117,116,101,46,108,111,99,108,80,76,75,14,110,97,99,117,116,101,46,108,111,99,108,80,76,75,14,111,97,99,117,116,101,46,108, +111,99,108,80,76,75,14,115,97,99,117,116,101,46,108,111,99,108,80,76,75,14,122,97,99,117,116,101,46,108,111,99,108,80,76,75,10,120,46,109,117,108,116,105,112,108,121,10,105,46,115,97,108,116,95,108,111,119,10,106,46,115,97,108, +116,95,108,111,119,10,108,46,115,97,108,116,95,108,111,119,8,119,46,115,112,97,99,101,114,6,114,46,115,115,48,49,15,120,46,109,117,108,116,105,112,108,121,46,116,111,115,102,10,119,95,119,95,119,46,108,105,103,97,7,117,110,105,50, +48,55,70,7,117,110,105,48,52,49,48,7,117,110,105,48,52,49,49,7,117,110,105,48,52,49,50,7,117,110,105,48,52,49,51,7,117,110,105,48,52,48,51,7,117,110,105,48,52,57,48,7,117,110,105,48,52,49,52,7,117,110,105,48, +52,49,53,7,117,110,105,48,52,48,48,7,117,110,105,48,52,48,49,7,117,110,105,48,52,49,54,7,117,110,105,48,52,49,55,7,117,110,105,48,52,49,56,7,117,110,105,48,52,49,57,7,117,110,105,48,52,48,68,7,117,110,105,48, +52,56,65,7,117,110,105,48,52,49,65,7,117,110,105,48,52,48,67,7,117,110,105,48,52,49,66,7,117,110,105,48,52,49,67,7,117,110,105,48,52,49,68,7,117,110,105,48,52,49,69,7,117,110,105,48,52,49,70,7,117,110,105,48, +52,50,48,7,117,110,105,48,52,50,49,7,117,110,105,48,52,50,50,7,117,110,105,48,52,50,51,7,117,110,105,48,52,48,69,7,117,110,105,48,52,50,52,7,117,110,105,48,52,50,53,7,117,110,105,48,52,50,55,7,117,110,105,48, +52,50,54,7,117,110,105,48,52,50,56,7,117,110,105,48,52,50,57,7,117,110,105,48,52,48,70,7,117,110,105,48,52,50,67,7,117,110,105,48,52,50,65,7,117,110,105,48,52,50,66,7,117,110,105,48,52,48,57,7,117,110,105,48, +52,48,65,7,117,110,105,48,52,48,53,7,117,110,105,48,52,48,52,7,117,110,105,48,52,50,68,7,117,110,105,48,52,48,54,7,117,110,105,48,52,48,55,7,117,110,105,48,52,48,56,7,117,110,105,48,52,48,66,7,117,110,105,48, +52,50,69,7,117,110,105,48,52,50,70,7,117,110,105,48,52,48,50,7,117,110,105,48,52,54,48,7,117,110,105,48,52,54,50,7,117,110,105,48,52,54,52,7,117,110,105,48,52,54,54,7,117,110,105,48,52,54,56,7,117,110,105,48, +52,54,65,7,117,110,105,48,52,54,67,7,117,110,105,48,52,54,69,7,117,110,105,48,52,55,48,7,117,110,105,48,52,55,50,7,117,110,105,48,52,55,52,7,117,110,105,48,52,55,54,7,117,110,105,48,52,55,56,7,117,110,105,48, +52,57,50,7,117,110,105,48,52,57,52,7,117,110,105,48,52,57,54,7,117,110,105,48,52,57,56,7,117,110,105,48,52,57,65,7,117,110,105,48,52,57,67,7,117,110,105,48,52,57,69,7,117,110,105,48,52,65,48,7,117,110,105,48, +52,65,50,7,117,110,105,48,52,65,52,7,117,110,105,48,52,65,54,7,117,110,105,48,53,50,52,7,117,110,105,48,52,65,56,7,117,110,105,48,52,65,65,7,117,110,105,48,52,65,67,9,85,115,116,114,97,105,116,99,121,15,85,115, +116,114,97,105,116,115,116,114,111,107,101,99,121,7,117,110,105,48,52,66,50,7,117,110,105,48,52,66,52,7,117,110,105,48,52,66,54,7,117,110,105,48,52,66,56,7,117,110,105,48,52,66,65,7,117,110,105,48,53,50,54,7,117,110, +105,48,52,66,67,7,117,110,105,48,52,66,69,7,117,110,105,48,52,67,48,7,117,110,105,48,52,67,49,7,117,110,105,48,52,67,51,7,117,110,105,48,52,67,53,7,117,110,105,48,52,67,55,7,117,110,105,48,52,67,57,7,117,110, +105,48,52,67,66,7,117,110,105,48,52,67,68,7,117,110,105,48,52,68,48,7,117,110,105,48,52,68,50,7,117,110,105,48,52,68,52,7,117,110,105,48,52,68,54,7,117,110,105,48,52,68,56,7,117,110,105,48,52,68,65,7,117,110, +105,48,52,68,67,7,117,110,105,48,52,68,69,7,117,110,105,48,52,69,48,7,117,110,105,48,52,69,50,7,117,110,105,48,52,69,52,7,117,110,105,48,52,69,54,7,117,110,105,48,52,69,56,7,117,110,105,48,52,69,65,7,117,110, +105,48,52,69,67,7,117,110,105,48,52,69,69,7,117,110,105,48,52,70,48,7,117,110,105,48,52,70,50,7,117,110,105,48,52,70,52,7,117,110,105,48,52,70,54,7,117,110,105,48,52,70,56,7,117,110,105,48,52,70,65,7,117,110, +105,48,52,70,67,7,117,110,105,48,52,70,69,7,117,110,105,48,53,48,48,7,117,110,105,48,53,48,50,7,117,110,105,48,53,48,52,7,117,110,105,48,53,48,54,7,117,110,105,48,53,48,56,7,117,110,105,48,53,48,65,7,117,110, +105,48,53,48,67,7,117,110,105,48,53,48,69,7,117,110,105,48,53,49,48,7,117,110,105,48,53,49,50,7,117,110,105,48,53,49,52,7,117,110,105,48,53,49,54,7,117,110,105,48,53,49,56,7,117,110,105,48,53,49,65,7,117,110, +105,48,53,49,67,7,117,110,105,48,53,49,69,7,117,110,105,48,53,50,48,7,117,110,105,48,53,50,50,7,117,110,105,48,52,56,67,7,117,110,105,48,52,56,69,7,117,110,105,48,53,50,56,7,117,110,105,48,53,50,65,7,117,110, +105,48,53,50,67,7,117,110,105,48,53,50,69,7,117,110,105,48,52,51,48,7,117,110,105,48,52,51,49,7,117,110,105,48,52,51,50,7,117,110,105,48,52,51,51,7,117,110,105,48,52,53,51,7,117,110,105,48,52,57,49,7,117,110, +105,48,52,51,52,7,117,110,105,48,52,51,53,7,117,110,105,48,52,53,48,7,117,110,105,48,52,53,49,7,117,110,105,48,52,51,54,7,117,110,105,48,52,51,55,7,117,110,105,48,52,51,56,7,117,110,105,48,52,51,57,7,117,110, +105,48,52,53,68,7,117,110,105,48,52,56,66,7,117,110,105,48,52,51,65,7,117,110,105,48,52,53,67,7,117,110,105,48,52,51,66,7,117,110,105,48,52,51,67,7,117,110,105,48,52,51,68,7,117,110,105,48,52,51,69,7,117,110, +105,48,52,51,70,7,117,110,105,48,52,52,48,7,117,110,105,48,52,52,49,7,117,110,105,48,52,52,50,7,117,110,105,48,52,52,51,7,117,110,105,48,52,53,69,7,117,110,105,48,52,52,52,7,117,110,105,48,52,52,53,7,117,110, +105,48,52,52,55,7,117,110,105,48,52,52,54,7,117,110,105,48,52,52,56,7,117,110,105,48,52,52,57,7,117,110,105,48,52,53,70,7,117,110,105,48,52,52,67,7,117,110,105,48,52,52,65,7,117,110,105,48,52,52,66,7,117,110, +105,48,52,53,57,7,117,110,105,48,52,53,65,7,117,110,105,48,52,53,53,7,117,110,105,48,52,53,52,7,117,110,105,48,52,52,68,7,117,110,105,48,52,53,54,7,117,110,105,48,52,53,55,7,117,110,105,48,52,53,56,7,117,110, +105,48,52,53,66,7,117,110,105,48,52,52,69,7,117,110,105,48,52,52,70,7,117,110,105,48,52,53,50,7,117,110,105,48,52,54,49,7,117,110,105,48,52,54,51,7,117,110,105,48,52,54,53,7,117,110,105,48,52,54,55,7,117,110, +105,48,52,54,57,7,117,110,105,48,52,54,66,7,117,110,105,48,52,54,68,7,117,110,105,48,52,54,70,7,117,110,105,48,52,55,49,7,117,110,105,48,52,55,51,7,117,110,105,48,52,55,53,7,117,110,105,48,52,55,55,7,117,110, +105,48,52,55,57,7,117,110,105,48,52,57,51,7,117,110,105,48,52,57,53,7,117,110,105,48,52,57,55,7,117,110,105,48,52,57,57,7,117,110,105,48,52,57,66,7,117,110,105,48,52,57,68,7,117,110,105,48,52,57,70,7,117,110, +105,48,52,65,49,7,117,110,105,48,52,65,51,7,117,110,105,48,52,65,53,7,117,110,105,48,53,50,53,7,117,110,105,48,52,65,55,7,117,110,105,48,52,65,57,7,117,110,105,48,52,65,66,7,117,110,105,48,52,65,68,9,117,115, +116,114,97,105,116,99,121,15,117,115,116,114,97,105,116,115,116,114,111,107,101,99,121,7,117,110,105,48,52,66,51,7,117,110,105,48,52,66,53,7,117,110,105,48,52,66,55,7,117,110,105,48,52,66,57,7,117,110,105,48,52,66,66,7, +117,110,105,48,53,50,55,7,117,110,105,48,52,66,68,7,117,110,105,48,52,66,70,7,117,110,105,48,52,67,70,7,117,110,105,48,52,67,50,7,117,110,105,48,52,67,52,7,117,110,105,48,52,67,54,7,117,110,105,48,52,67,56,7, +117,110,105,48,52,67,65,7,117,110,105,48,52,67,67,7,117,110,105,48,52,67,69,7,117,110,105,48,52,68,49,7,117,110,105,48,52,68,51,7,117,110,105,48,52,68,53,7,117,110,105,48,52,68,55,7,117,110,105,48,52,68,57,7, +117,110,105,48,52,68,66,7,117,110,105,48,52,68,68,7,117,110,105,48,52,68,70,7,117,110,105,48,52,69,49,7,117,110,105,48,52,69,51,7,117,110,105,48,52,69,53,7,117,110,105,48,52,69,55,7,117,110,105,48,52,69,57,7, +117,110,105,48,52,69,66,7,117,110,105,48,52,69,68,7,117,110,105,48,52,69,70,7,117,110,105,48,52,70,49,7,117,110,105,48,52,70,51,7,117,110,105,48,52,70,53,7,117,110,105,48,52,70,55,7,117,110,105,48,52,70,57,7, +117,110,105,48,52,70,66,7,117,110,105,48,52,70,68,7,117,110,105,48,52,70,70,7,117,110,105,48,53,48,49,7,117,110,105,48,53,48,51,7,117,110,105,48,53,48,53,7,117,110,105,48,53,48,55,7,117,110,105,48,53,48,57,7, +117,110,105,48,53,48,66,7,117,110,105,48,53,48,68,7,117,110,105,48,53,48,70,7,117,110,105,48,53,49,49,7,117,110,105,48,53,49,51,7,117,110,105,48,53,49,53,7,117,110,105,48,53,49,55,7,117,110,105,48,53,49,57,7, +117,110,105,48,53,49,66,7,117,110,105,48,53,49,68,7,117,110,105,48,53,49,70,7,117,110,105,48,53,50,49,7,117,110,105,48,53,50,51,7,117,110,105,48,52,56,68,7,117,110,105,48,52,56,70,7,117,110,105,48,53,50,57,7, +117,110,105,48,53,50,66,7,117,110,105,48,53,50,68,7,117,110,105,48,53,50,70,8,89,111,116,103,114,101,101,107,5,65,108,112,104,97,4,66,101,116,97,5,71,97,109,109,97,7,117,110,105,48,51,57,52,7,69,112,115,105,108,111, +110,4,90,101,116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97,6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,110,2,80,105,3,82,104,111,5,83,105,103,109,97, +3,84,97,117,7,85,112,115,105,108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,7,117,110,105,48,51,65,57,10,65,108,112,104,97,116,111,110,111,115,12,69,112,115,105,108,111,110,116,111,110,111,115,8,69,116,97,116,111,110,111, +115,9,73,111,116,97,116,111,110,111,115,12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,12,73,111,116,97,100,105,101,114,101,115,105,115,15,85,112, +115,105,108,111,110,100,105,101,114,101,115,105,115,7,117,110,105,48,51,55,48,7,117,110,105,48,51,55,50,7,117,110,105,48,51,55,54,7,117,110,105,48,51,68,56,7,117,110,105,48,51,68,65,7,117,110,105,48,51,68,67,7,117,110, +105,48,51,68,69,7,117,110,105,48,51,69,48,7,117,110,105,48,51,67,70,7,117,110,105,48,51,68,50,7,117,110,105,48,51,68,51,7,117,110,105,48,51,68,52,7,117,110,105,48,51,70,52,7,117,110,105,48,51,70,55,7,117,110, +105,48,51,70,57,7,117,110,105,48,51,70,65,7,117,110,105,48,51,70,68,7,117,110,105,48,51,70,69,7,117,110,105,48,51,70,70,7,117,110,105,49,70,48,56,7,117,110,105,49,70,48,57,7,117,110,105,49,70,48,65,7,117,110, +105,49,70,48,66,7,117,110,105,49,70,48,67,7,117,110,105,49,70,48,68,7,117,110,105,49,70,48,69,7,117,110,105,49,70,48,70,7,117,110,105,49,70,66,65,7,117,110,105,49,70,66,66,7,117,110,105,49,70,66,56,7,117,110, +105,49,70,66,57,7,117,110,105,49,70,66,67,7,117,110,105,49,70,56,56,7,117,110,105,49,70,56,57,7,117,110,105,49,70,56,65,7,117,110,105,49,70,56,66,7,117,110,105,49,70,56,67,7,117,110,105,49,70,56,68,7,117,110, +105,49,70,56,69,7,117,110,105,49,70,56,70,7,117,110,105,49,70,49,56,7,117,110,105,49,70,49,57,7,117,110,105,49,70,49,65,7,117,110,105,49,70,49,66,7,117,110,105,49,70,49,67,7,117,110,105,49,70,49,68,7,117,110, +105,49,70,67,56,7,117,110,105,49,70,67,57,7,117,110,105,49,70,50,56,7,117,110,105,49,70,50,57,7,117,110,105,49,70,50,65,7,117,110,105,49,70,50,66,7,117,110,105,49,70,50,67,7,117,110,105,49,70,50,68,7,117,110, +105,49,70,50,69,7,117,110,105,49,70,50,70,7,117,110,105,49,70,67,65,7,117,110,105,49,70,67,66,7,117,110,105,49,70,67,67,7,117,110,105,49,70,57,56,7,117,110,105,49,70,57,57,7,117,110,105,49,70,57,65,7,117,110, +105,49,70,57,66,7,117,110,105,49,70,57,67,7,117,110,105,49,70,57,68,7,117,110,105,49,70,57,69,7,117,110,105,49,70,57,70,7,117,110,105,49,70,51,56,7,117,110,105,49,70,51,57,7,117,110,105,49,70,51,65,7,117,110, +105,49,70,51,66,7,117,110,105,49,70,51,67,7,117,110,105,49,70,51,68,7,117,110,105,49,70,51,69,7,117,110,105,49,70,51,70,7,117,110,105,49,70,68,65,7,117,110,105,49,70,68,66,7,117,110,105,49,70,68,56,7,117,110, +105,49,70,68,57,7,117,110,105,49,70,52,56,7,117,110,105,49,70,52,57,7,117,110,105,49,70,52,65,7,117,110,105,49,70,52,66,7,117,110,105,49,70,52,67,7,117,110,105,49,70,52,68,7,117,110,105,49,70,70,56,7,117,110, +105,49,70,70,57,7,117,110,105,49,70,69,67,7,117,110,105,49,70,53,57,7,117,110,105,49,70,53,66,7,117,110,105,49,70,53,68,7,117,110,105,49,70,53,70,7,117,110,105,49,70,69,65,7,117,110,105,49,70,69,66,7,117,110, +105,49,70,69,56,7,117,110,105,49,70,69,57,7,117,110,105,49,70,54,56,7,117,110,105,49,70,54,57,7,117,110,105,49,70,54,65,7,117,110,105,49,70,54,66,7,117,110,105,49,70,54,67,7,117,110,105,49,70,54,68,7,117,110, +105,49,70,54,69,7,117,110,105,49,70,54,70,7,117,110,105,49,70,70,65,7,117,110,105,49,70,70,66,7,117,110,105,49,70,70,67,7,117,110,105,49,70,65,56,7,117,110,105,49,70,65,57,7,117,110,105,49,70,65,65,7,117,110, +105,49,70,65,66,7,117,110,105,49,70,65,67,7,117,110,105,49,70,65,68,7,117,110,105,49,70,65,69,7,117,110,105,49,70,65,70,5,97,108,112,104,97,4,98,101,116,97,5,103,97,109,109,97,5,100,101,108,116,97,7,101,112,115, +105,108,111,110,4,122,101,116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,97,6,108,97,109,98,100,97,7,117,110,105,48,51,66,67,2,110,117,2,120,105,7,111,109,105,99,114,111,110,3,114,104,111,7, +117,110,105,48,51,67,50,5,115,105,103,109,97,3,116,97,117,7,117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,109,101,103,97,9,105,111,116,97,116,111,110,111,115,12,105,111,116,97,100,105,101,114,101,115, +105,115,17,105,111,116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,115,15,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,20,117,112,115,105,108,111,110,100,105,101,114,101,115,105, +115,116,111,110,111,115,12,111,109,105,99,114,111,110,116,111,110,111,115,10,111,109,101,103,97,116,111,110,111,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,7, +117,110,105,48,51,55,49,7,117,110,105,48,51,55,51,7,117,110,105,48,51,55,55,25,114,101,118,101,114,115,101,100,108,117,110,97,116,101,115,105,103,109,97,115,121,109,98,111,108,23,100,111,116,116,101,100,108,117,110,97,116,101,115,105, +103,109,97,115,121,109,98,111,108,31,114,101,118,101,114,115,101,100,100,111,116,116,101,100,108,117,110,97,116,101,115,105,103,109,97,115,121,109,98,111,108,7,117,110,105,48,51,68,57,7,117,110,105,48,51,68,66,7,117,110,105,48,51,68, +68,7,117,110,105,48,51,68,70,7,117,110,105,48,51,69,49,7,117,110,105,48,51,68,55,7,117,110,105,48,51,68,48,7,117,110,105,48,51,68,49,7,117,110,105,48,51,68,53,7,117,110,105,48,51,68,54,7,117,110,105,48,51,70, +48,7,117,110,105,48,51,70,49,7,117,110,105,48,51,70,50,7,117,110,105,48,51,70,51,7,117,110,105,48,51,70,53,7,117,110,105,48,51,70,56,7,117,110,105,48,51,70,66,7,117,110,105,48,51,70,67,7,117,110,105,49,70,48, +48,7,117,110,105,49,70,48,49,7,117,110,105,49,70,48,50,7,117,110,105,49,70,48,51,7,117,110,105,49,70,48,52,7,117,110,105,49,70,48,53,7,117,110,105,49,70,48,54,7,117,110,105,49,70,48,55,7,117,110,105,49,70,55, +48,7,117,110,105,49,70,55,49,7,117,110,105,49,70,66,54,7,117,110,105,49,70,66,48,7,117,110,105,49,70,66,49,7,117,110,105,49,70,66,51,7,117,110,105,49,70,66,50,7,117,110,105,49,70,66,52,7,117,110,105,49,70,56, +48,7,117,110,105,49,70,56,49,7,117,110,105,49,70,56,50,7,117,110,105,49,70,56,51,7,117,110,105,49,70,56,52,7,117,110,105,49,70,56,53,7,117,110,105,49,70,56,54,7,117,110,105,49,70,56,55,7,117,110,105,49,70,66, +55,7,117,110,105,49,70,49,48,7,117,110,105,49,70,49,49,7,117,110,105,49,70,49,50,7,117,110,105,49,70,49,51,7,117,110,105,49,70,49,52,7,117,110,105,49,70,49,53,7,117,110,105,49,70,55,50,7,117,110,105,49,70,55, +51,7,117,110,105,49,70,50,48,7,117,110,105,49,70,50,49,7,117,110,105,49,70,50,50,7,117,110,105,49,70,50,51,7,117,110,105,49,70,50,52,7,117,110,105,49,70,50,53,7,117,110,105,49,70,50,54,7,117,110,105,49,70,50, +55,7,117,110,105,49,70,55,52,7,117,110,105,49,70,55,53,7,117,110,105,49,70,67,54,7,117,110,105,49,70,67,51,7,117,110,105,49,70,67,50,7,117,110,105,49,70,67,52,7,117,110,105,49,70,57,48,7,117,110,105,49,70,57, +49,7,117,110,105,49,70,57,50,7,117,110,105,49,70,57,51,7,117,110,105,49,70,57,52,7,117,110,105,49,70,57,53,7,117,110,105,49,70,57,54,7,117,110,105,49,70,57,55,7,117,110,105,49,70,67,55,7,117,110,105,49,70,51, +48,7,117,110,105,49,70,51,49,7,117,110,105,49,70,51,50,7,117,110,105,49,70,51,51,7,117,110,105,49,70,51,52,7,117,110,105,49,70,51,53,7,117,110,105,49,70,51,54,7,117,110,105,49,70,51,55,7,117,110,105,49,70,55, +54,7,117,110,105,49,70,55,55,7,117,110,105,49,70,68,54,7,117,110,105,49,70,68,48,7,117,110,105,49,70,68,49,7,117,110,105,49,70,68,50,7,117,110,105,49,70,68,51,7,117,110,105,49,70,68,55,7,117,110,105,49,70,52, +48,7,117,110,105,49,70,52,49,7,117,110,105,49,70,52,50,7,117,110,105,49,70,52,51,7,117,110,105,49,70,52,52,7,117,110,105,49,70,52,53,7,117,110,105,49,70,55,56,7,117,110,105,49,70,55,57,7,117,110,105,49,70,69, +52,7,117,110,105,49,70,69,53,7,117,110,105,49,70,53,48,7,117,110,105,49,70,53,49,7,117,110,105,49,70,53,50,7,117,110,105,49,70,53,51,7,117,110,105,49,70,53,52,7,117,110,105,49,70,53,53,7,117,110,105,49,70,53, +54,7,117,110,105,49,70,53,55,7,117,110,105,49,70,55,65,7,117,110,105,49,70,55,66,7,117,110,105,49,70,69,54,7,117,110,105,49,70,69,48,7,117,110,105,49,70,69,49,7,117,110,105,49,70,69,50,7,117,110,105,49,70,69, +51,7,117,110,105,49,70,69,55,7,117,110,105,49,70,54,48,7,117,110,105,49,70,54,49,7,117,110,105,49,70,54,50,7,117,110,105,49,70,54,51,7,117,110,105,49,70,54,52,7,117,110,105,49,70,54,53,7,117,110,105,49,70,54, +54,7,117,110,105,49,70,54,55,7,117,110,105,49,70,55,67,7,117,110,105,49,70,55,68,7,117,110,105,49,70,70,54,7,117,110,105,49,70,70,51,7,117,110,105,49,70,70,50,7,117,110,105,49,70,70,52,7,117,110,105,49,70,65, +48,7,117,110,105,49,70,65,49,7,117,110,105,49,70,65,50,7,117,110,105,49,70,65,51,7,117,110,105,49,70,65,52,7,117,110,105,49,70,65,53,7,117,110,105,49,70,65,54,7,117,110,105,49,70,65,55,7,117,110,105,49,70,70, +55,7,117,110,105,49,70,66,69,7,117,110,105,48,51,55,65,18,99,97,110,97,100,105,97,110,115,121,108,108,97,98,105,99,115,111,18,99,97,110,97,100,105,97,110,115,121,108,108,97,98,105,99,115,97,6,117,49,68,53,51,57,7,117, +110,105,50,49,48,50,7,117,110,105,50,49,48,68,7,117,110,105,50,49,49,53,7,117,110,105,50,49,49,57,7,117,110,105,50,49,49,65,7,117,110,105,50,49,49,68,7,117,110,105,50,49,50,52,9,122,101,114,111,46,122,101,114,111, +9,122,101,114,111,46,116,111,115,102,14,122,101,114,111,46,122,101,114,111,46,116,111,115,102,8,111,110,101,46,116,111,115,102,8,116,119,111,46,116,111,115,102,10,116,104,114,101,101,46,116,111,115,102,9,102,111,117,114,46,116,111,115,102, +9,102,105,118,101,46,116,111,115,102,8,115,105,120,46,116,111,115,102,10,115,101,118,101,110,46,116,111,115,102,10,101,105,103,104,116,46,116,111,115,102,9,110,105,110,101,46,116,111,115,102,14,122,101,114,111,46,116,111,115,102,46,122,101, +114,111,7,117,110,105,50,48,56,48,7,117,110,105,50,48,56,49,7,117,110,105,50,48,56,50,7,117,110,105,50,48,56,51,7,117,110,105,50,48,56,52,7,117,110,105,50,48,56,53,7,117,110,105,50,48,56,54,7,117,110,105,50,48, +56,55,7,117,110,105,50,48,56,56,7,117,110,105,50,48,56,57,9,122,101,114,111,46,100,110,111,109,8,111,110,101,46,100,110,111,109,8,116,119,111,46,100,110,111,109,10,116,104,114,101,101,46,100,110,111,109,9,102,111,117,114,46,100, +110,111,109,9,102,105,118,101,46,100,110,111,109,8,115,105,120,46,100,110,111,109,10,115,101,118,101,110,46,100,110,111,109,10,101,105,103,104,116,46,100,110,111,109,9,110,105,110,101,46,100,110,111,109,9,122,101,114,111,46,110,117,109,114, +8,111,110,101,46,110,117,109,114,8,116,119,111,46,110,117,109,114,10,116,104,114,101,101,46,110,117,109,114,9,102,111,117,114,46,110,117,109,114,9,102,105,118,101,46,110,117,109,114,8,115,105,120,46,110,117,109,114,10,115,101,118,101,110, +46,110,117,109,114,10,101,105,103,104,116,46,110,117,109,114,9,110,105,110,101,46,110,117,109,114,7,117,110,105,50,48,55,48,7,117,110,105,48,48,66,57,7,117,110,105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,50,48, +55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,54,7,117,110,105,50,48,55,55,7,117,110,105,50,48,55,56,7,117,110,105,50,48,55,57,7,117,110,105,50,49,53,70,7,117,110,105,50,49,53,51,7,117,110,105,50,49, +53,52,7,117,110,105,50,49,53,53,7,117,110,105,50,49,53,54,7,117,110,105,50,49,53,55,7,117,110,105,50,49,53,56,7,117,110,105,50,49,53,57,7,117,110,105,50,49,53,65,9,111,110,101,101,105,103,104,116,104,12,116,104,114, +101,101,101,105,103,104,116,104,115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110,101,105,103,104,116,104,115,7,117,110,105,50,48,49,54,7,117,110,105,50,48,52,65,15,101,120,99,108,97,109,100,111,119,110,46,99,97, +115,101,17,113,117,101,115,116,105,111,110,100,111,119,110,46,99,97,115,101,12,99,111,108,111,110,46,99,101,110,116,101,114,11,97,115,116,101,114,105,115,107,46,108,99,13,112,101,114,105,111,100,46,115,112,97,99,101,114,12,99,111,108,111, +110,46,115,112,97,99,101,114,16,115,101,109,105,99,111,108,111,110,46,115,112,97,99,101,114,13,101,120,99,108,97,109,46,115,112,97,99,101,114,15,113,117,101,115,116,105,111,110,46,115,112,97,99,101,114,15,97,115,116,101,114,105,115,107, +46,115,112,97,99,101,114,17,110,117,109,98,101,114,115,105,103,110,46,115,112,97,99,101,114,12,115,108,97,115,104,46,115,112,97,99,101,114,16,98,97,99,107,115,108,97,115,104,46,115,112,97,99,101,114,14,98,97,99,107,115,108,97,115, +104,46,115,115,48,54,20,98,97,99,107,115,108,97,115,104,46,116,104,105,99,107,46,115,115,48,54,8,99,111,108,111,110,46,117,99,7,117,110,105,50,48,56,68,7,117,110,105,50,48,56,69,7,117,110,105,51,48,48,67,7,117,110,105, +51,48,48,68,7,117,110,105,50,55,55,48,7,117,110,105,50,55,55,49,7,117,110,105,50,48,55,68,7,117,110,105,50,48,55,69,14,112,97,114,101,110,108,101,102,116,46,99,97,115,101,15,112,97,114,101,110,114,105,103,104,116,46,99, +97,115,101,14,98,114,97,99,101,108,101,102,116,46,99,97,115,101,15,98,114,97,99,101,114,105,103,104,116,46,99,97,115,101,16,98,114,97,99,107,101,116,108,101,102,116,46,99,97,115,101,17,98,114,97,99,107,101,116,114,105,103,104,116, +46,99,97,115,101,7,117,110,105,70,70,54,50,7,117,110,105,70,70,54,51,16,98,114,97,99,101,108,101,102,116,46,115,112,97,99,101,114,18,98,114,97,99,107,101,116,108,101,102,116,46,115,112,97,99,101,114,19,98,114,97,99,107,101, +116,114,105,103,104,116,46,115,112,97,99,101,114,7,117,110,105,48,48,65,68,7,117,110,105,50,48,49,53,10,102,105,103,117,114,101,100,97,115,104,7,117,110,105,50,69,51,66,7,117,110,105,50,69,51,65,13,117,110,100,101,114,115,99, +111,114,101,100,98,108,11,104,121,112,104,101,110,46,99,97,115,101,12,117,110,105,48,48,65,68,46,99,97,115,101,11,101,110,100,97,115,104,46,99,97,115,101,11,101,109,100,97,115,104,46,99,97,115,101,9,104,121,112,104,101,110,46,108, +99,13,104,121,112,104,101,110,46,115,112,97,99,101,114,17,117,110,100,101,114,115,99,111,114,101,46,115,112,97,99,101,114,18,103,117,105,108,108,101,109,111,116,108,101,102,116,46,99,97,115,101,19,103,117,105,108,108,101,109,111,116,114,105, +103,104,116,46,99,97,115,101,18,103,117,105,108,115,105,110,103,108,108,101,102,116,46,99,97,115,101,19,103,117,105,108,115,105,110,103,108,114,105,103,104,116,46,99,97,115,101,14,112,97,114,101,110,108,101,102,116,46,100,110,111,109,15,112, +97,114,101,110,114,105,103,104,116,46,100,110,111,109,18,104,121,112,104,101,110,95,104,121,112,104,101,110,46,108,105,103,97,25,104,121,112,104,101,110,95,104,121,112,104,101,110,95,104,121,112,104,101,110,46,108,105,103,97,22,104,121,112,104, +101,110,95,97,115,99,105,105,116,105,108,100,101,46,108,105,103,97,18,98,114,97,99,101,108,101,102,116,95,98,97,114,46,108,105,103,97,20,98,114,97,99,107,101,116,108,101,102,116,95,98,97,114,46,108,105,103,97,28,98,114,97,99,107, +101,116,114,105,103,104,116,95,110,117,109,98,101,114,115,105,103,110,46,108,105,103,97,18,112,101,114,105,111,100,95,104,121,112,104,101,110,46,108,105,103,97,18,112,101,114,105,111,100,95,112,101,114,105,111,100,46,108,105,103,97,25,112,101, +114,105,111,100,95,112,101,114,105,111,100,95,112,101,114,105,111,100,46,108,105,103,97,24,112,101,114,105,111,100,95,112,101,114,105,111,100,95,101,113,117,97,108,46,108,105,103,97,23,112,101,114,105,111,100,95,112,101,114,105,111,100,95,108, +101,115,115,46,108,105,103,97,20,112,101,114,105,111,100,95,113,117,101,115,116,105,111,110,46,108,105,103,97,17,112,101,114,105,111,100,95,101,113,117,97,108,46,108,105,103,97,16,99,111,108,111,110,95,99,111,108,111,110,46,108,105,103,97, +22,99,111,108,111,110,95,99,111,108,111,110,95,99,111,108,111,110,46,108,105,103,97,22,99,111,108,111,110,95,99,111,108,111,110,95,101,113,117,97,108,46,108,105,103,97,16,99,111,108,111,110,95,101,113,117,97,108,46,108,105,103,97,24, +115,101,109,105,99,111,108,111,110,95,115,101,109,105,99,111,108,111,110,46,108,105,103,97,18,101,120,99,108,97,109,95,101,120,99,108,97,109,46,108,105,103,97,25,101,120,99,108,97,109,95,101,120,99,108,97,109,95,112,101,114,105,111,100, +46,108,105,103,97,17,101,120,99,108,97,109,95,101,113,117,97,108,46,108,105,103,97,23,101,120,99,108,97,109,95,101,113,117,97,108,95,101,113,117,97,108,46,108,105,103,97,20,113,117,101,115,116,105,111,110,95,112,101,114,105,111,100,46, +108,105,103,97,22,113,117,101,115,116,105,111,110,95,113,117,101,115,116,105,111,110,46,108,105,103,97,19,113,117,101,115,116,105,111,110,95,101,113,117,97,108,46,108,105,103,97,22,97,115,116,101,114,105,115,107,95,97,115,116,101,114,105,115, +107,46,108,105,103,97,31,97,115,116,101,114,105,115,107,95,97,115,116,101,114,105,115,107,95,97,115,116,101,114,105,115,107,46,108,105,103,97,21,97,115,116,101,114,105,115,107,95,103,114,101,97,116,101,114,46,108,105,103,97,19,97,115,116, +101,114,105,115,107,95,115,108,97,115,104,46,108,105,103,97,25,110,117,109,98,101,114,115,105,103,110,95,112,97,114,101,110,108,101,102,116,46,108,105,103,97,25,110,117,109,98,101,114,115,105,103,110,95,98,114,97,99,101,108,101,102,116,46, +108,105,103,97,27,110,117,109,98,101,114,115,105,103,110,95,98,114,97,99,107,101,116,108,101,102,116,46,108,105,103,97,21,110,117,109,98,101,114,115,105,103,110,95,99,111,108,111,110,46,108,105,103,97,22,110,117,109,98,101,114,115,105,103, +110,95,101,120,99,108,97,109,46,108,105,103,97,24,110,117,109,98,101,114,115,105,103,110,95,113,117,101,115,116,105,111,110,46,108,105,103,97,21,110,117,109,98,101,114,115,105,103,110,95,101,113,117,97,108,46,108,105,103,97,26,110,117,109, +98,101,114,115,105,103,110,95,117,110,100,101,114,115,99,111,114,101,46,108,105,103,97,36,110,117,109,98,101,114,115,105,103,110,95,117,110,100,101,114,115,99,111,114,101,95,112,97,114,101,110,108,101,102,116,46,108,105,103,97,19,115,108,97, +115,104,95,97,115,116,101,114,105,115,107,46,108,105,103,97,18,115,108,97,115,104,95,103,114,101,97,116,101,114,46,108,105,103,97,16,115,108,97,115,104,95,115,108,97,115,104,46,108,105,103,97,22,115,108,97,115,104,95,115,108,97,115,104, +95,115,108,97,115,104,46,108,105,103,97,20,115,108,97,115,104,95,98,97,99,107,115,108,97,115,104,46,108,105,103,97,20,98,97,99,107,115,108,97,115,104,95,115,108,97,115,104,46,108,105,103,97,14,112,97,114,101,110,108,101,102,116,46, +110,117,109,114,15,112,97,114,101,110,114,105,103,104,116,46,110,117,109,114,17,104,121,112,104,101,110,95,109,105,100,100,108,101,46,115,101,113,16,104,121,112,104,101,110,95,115,116,97,114,116,46,115,101,113,14,104,121,112,104,101,110,95,101, +110,100,46,115,101,113,22,99,111,108,111,110,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,23,101,120,99,108,97,109,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,18,110,117,109,98,101,114,115,105,103,110, +95,101,110,100,46,115,101,113,21,110,117,109,98,101,114,115,105,103,110,95,109,105,100,100,108,101,46,115,101,113,20,110,117,109,98,101,114,115,105,103,110,95,115,116,97,114,116,46,115,101,113,19,115,108,97,115,104,95,101,113,117,97,108,95, +101,110,100,46,115,101,113,22,115,108,97,115,104,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,21,115,108,97,115,104,95,101,113,117,97,108,95,115,116,97,114,116,46,115,101,113,25,115,108,97,115,104,95,115,108,97,115,104, +95,101,113,117,97,108,95,101,110,100,46,115,101,113,28,115,108,97,115,104,95,115,108,97,115,104,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,27,115,108,97,115,104,95,115,108,97,115,104,95,101,113,117,97,108,95,115,116, +97,114,116,46,115,101,113,18,117,110,100,101,114,115,99,111,114,101,95,101,110,100,46,115,101,113,21,117,110,100,101,114,115,99,111,114,101,95,109,105,100,100,108,101,46,115,101,113,20,117,110,100,101,114,115,99,111,114,101,95,115,116,97,114, +116,46,115,101,113,22,101,120,99,108,97,109,95,97,115,99,105,105,116,105,108,100,101,46,115,115,48,55,17,101,120,99,108,97,109,95,101,113,117,97,108,46,115,115,48,56,23,101,120,99,108,97,109,95,101,113,117,97,108,95,101,113,117,97, +108,46,115,115,48,56,7,117,110,105,50,55,69,56,7,117,110,105,50,55,69,57,9,97,110,111,116,101,108,101,105,97,7,117,110,105,48,51,55,69,7,117,110,105,50,48,48,55,7,117,110,105,50,48,48,56,7,117,110,105,48,48,65,48, +7,117,110,105,50,48,48,66,10,117,110,105,50,48,48,55,46,116,102,2,67,82,7,117,110,105,70,69,70,70,7,117,110,105,50,48,65,70,4,69,117,114,111,7,117,110,105,50,48,66,65,7,117,110,105,50,48,66,68,7,117,110,105,50, +48,66,57,13,100,111,108,108,97,114,46,115,112,97,99,101,114,11,100,111,108,108,97,114,46,115,115,48,52,7,117,110,105,50,50,65,54,7,117,110,105,50,50,51,53,7,117,110,105,50,50,49,57,7,117,110,105,50,50,48,68,7,117,110, +105,50,51,65,65,7,117,110,105,50,50,49,53,7,117,110,105,50,50,65,69,7,117,110,105,50,50,65,67,7,117,110,105,50,50,65,66,7,101,108,101,109,101,110,116,7,117,110,105,50,50,48,65,14,101,113,117,97,108,115,105,110,102,101, +114,105,111,114,7,117,110,105,50,48,55,67,11,101,113,117,105,118,97,108,101,110,99,101,11,101,120,105,115,116,101,110,116,105,97,108,7,117,110,105,50,50,65,57,8,103,114,97,100,105,101,110,116,10,105,110,116,101,103,114,97,108,98,116, +10,105,110,116,101,103,114,97,108,116,112,7,117,110,105,50,51,65,57,7,117,110,105,50,51,65,56,7,117,110,105,50,51,65,55,7,117,110,105,50,51,65,50,7,117,110,105,50,51,65,51,7,117,110,105,50,51,65,49,7,117,110,105,50, +48,56,66,7,117,110,105,50,48,55,66,7,117,110,105,50,50,65,55,7,117,110,105,50,50,65,70,7,117,110,105,50,50,56,56,7,117,110,105,50,50,56,57,7,117,110,105,50,50,48,67,10,110,111,116,101,108,101,109,101,110,116,7,117, +110,105,50,50,54,50,9,110,111,116,115,117,98,115,101,116,7,117,110,105,50,50,56,53,7,117,110,105,50,50,65,68,8,101,109,112,116,121,115,101,116,10,108,111,103,105,99,97,108,97,110,100,9,108,111,103,105,99,97,108,111,114,12,105, +110,116,101,114,115,101,99,116,105,111,110,5,117,110,105,111,110,7,117,110,105,50,50,48,54,7,117,110,105,48,48,66,53,7,117,110,105,50,51,57,67,7,117,110,105,50,51,57,68,7,117,110,105,50,51,57,66,7,117,110,105,50,51,57, +70,7,117,110,105,50,51,65,48,7,117,110,105,50,51,57,69,7,117,110,105,50,48,56,65,7,117,110,105,50,48,55,65,7,117,110,105,50,50,51,54,12,114,101,102,108,101,120,115,117,98,115,101,116,14,114,101,102,108,101,120,115,117,112, +101,114,115,101,116,13,114,101,118,108,111,103,105,99,97,108,110,111,116,7,117,110,105,50,51,65,68,7,117,110,105,50,51,65,67,7,117,110,105,50,51,65,66,7,117,110,105,50,51,65,53,7,117,110,105,50,51,65,54,7,117,110,105,50, +51,65,52,7,117,110,105,50,50,65,50,12,112,114,111,112,101,114,115,117,98,115,101,116,7,117,110,105,50,50,56,65,8,115,117,99,104,116,104,97,116,14,112,114,111,112,101,114,115,117,112,101,114,115,101,116,7,117,110,105,50,50,56,66, +7,117,110,105,50,50,65,52,7,117,110,105,50,50,65,51,7,117,110,105,50,50,48,52,9,116,104,101,114,101,102,111,114,101,7,117,110,105,50,50,65,65,7,117,110,105,50,50,65,56,9,117,110,105,118,101,114,115,97,108,7,117,110,105, +50,50,65,53,13,105,110,102,105,110,105,116,121,46,99,97,115,101,14,103,114,101,97,116,101,114,46,99,101,110,116,101,114,11,108,101,115,115,46,99,101,110,116,101,114,7,112,108,117,115,46,108,99,11,112,108,117,115,46,115,112,97,99,101, +114,12,101,113,117,97,108,46,115,112,97,99,101,114,14,103,114,101,97,116,101,114,46,115,112,97,99,101,114,11,108,101,115,115,46,115,112,97,99,101,114,17,97,115,99,105,105,116,105,108,100,101,46,115,112,97,99,101,114,18,97,115,99,105, +105,99,105,114,99,117,109,46,115,112,97,99,101,114,14,112,101,114,99,101,110,116,46,115,112,97,99,101,114,7,97,114,114,111,119,117,112,7,117,110,105,50,49,57,55,10,97,114,114,111,119,114,105,103,104,116,7,117,110,105,50,49,57,56, +9,97,114,114,111,119,100,111,119,110,7,117,110,105,50,49,57,57,9,97,114,114,111,119,108,101,102,116,7,117,110,105,50,49,57,54,9,97,114,114,111,119,98,111,116,104,11,97,114,114,111,119,117,112,100,111,119,110,7,117,110,105,50,49, +69,52,7,117,110,105,50,49,69,53,7,117,110,105,50,49,65,57,7,117,110,105,50,49,66,48,7,117,110,105,50,49,66,49,7,117,110,105,50,49,66,50,7,117,110,105,50,49,66,51,7,117,110,105,50,55,70,50,7,117,110,105,50,55, +70,51,7,117,110,105,50,49,69,55,7,117,110,105,50,49,69,56,7,117,110,105,50,49,69,57,7,117,110,105,50,49,69,54,7,117,110,105,50,51,48,52,7,117,110,105,50,51,50,52,7,117,110,105,50,66,48,54,7,117,110,105,50,66, +48,55,7,117,110,105,50,66,48,53,7,117,110,105,50,55,70,48,7,117,110,105,50,55,70,49,7,117,110,105,50,55,70,52,7,117,110,105,50,55,70,53,7,117,110,105,50,55,70,54,7,117,110,105,50,55,70,55,7,117,110,105,50,55, +70,56,7,117,110,105,50,55,70,57,7,117,110,105,50,55,70,65,7,117,110,105,50,55,70,66,7,117,110,105,50,55,70,67,7,117,110,105,50,55,70,68,7,117,110,105,50,55,70,69,7,117,110,105,50,55,70,70,15,98,108,97,99,107, +82,105,103,104,116,65,114,114,111,119,7,117,110,105,50,53,56,49,7,117,110,105,50,53,56,50,7,117,110,105,50,53,56,51,9,100,111,119,110,66,108,111,99,107,7,117,110,105,50,53,56,53,7,117,110,105,50,53,56,54,7,117,110,105, +50,53,56,55,5,98,108,111,99,107,7,117,112,66,108,111,99,107,7,117,110,105,50,53,57,52,7,117,110,105,50,53,56,70,7,117,110,105,50,53,56,69,7,117,110,105,50,53,56,68,7,108,102,98,108,111,99,107,7,117,110,105,50,53, +56,66,7,117,110,105,50,53,56,65,7,117,110,105,50,53,56,57,7,114,116,98,108,111,99,107,7,117,110,105,50,53,57,53,17,113,117,97,100,114,97,110,116,76,111,119,101,114,76,101,102,116,18,113,117,97,100,114,97,110,116,76,111,119, +101,114,82,105,103,104,116,17,113,117,97,100,114,97,110,116,85,112,112,101,114,76,101,102,116,42,113,117,97,100,114,97,110,116,85,112,112,101,114,76,101,102,116,65,110,100,76,111,119,101,114,76,101,102,116,65,110,100,76,111,119,101,114,82, +105,103,104,116,30,113,117,97,100,114,97,110,116,85,112,112,101,114,76,101,102,116,65,110,100,76,111,119,101,114,82,105,103,104,116,42,113,117,97,100,114,97,110,116,85,112,112,101,114,76,101,102,116,65,110,100,85,112,112,101,114,82,105,103, +104,116,65,110,100,76,111,119,101,114,76,101,102,116,43,113,117,97,100,114,97,110,116,85,112,112,101,114,76,101,102,116,65,110,100,85,112,112,101,114,82,105,103,104,116,65,110,100,76,111,119,101,114,82,105,103,104,116,18,113,117,97,100,114, +97,110,116,85,112,112,101,114,82,105,103,104,116,30,113,117,97,100,114,97,110,116,85,112,112,101,114,82,105,103,104,116,65,110,100,76,111,119,101,114,76,101,102,116,43,113,117,97,100,114,97,110,116,85,112,112,101,114,82,105,103,104,116,65, +110,100,76,111,119,101,114,76,101,102,116,65,110,100,76,111,119,101,114,82,105,103,104,116,7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100,101,7,117,110,105,50,53,67,70,6,99,105,114,99,108,101,7,117,110, +105,50,53,69,70,7,117,110,105,50,53,68,48,7,117,110,105,50,53,68,49,7,117,110,105,50,53,68,50,7,117,110,105,50,53,68,51,7,117,110,105,50,53,68,54,7,117,110,105,50,53,68,55,7,117,110,105,50,53,68,53,7,117,110, +105,50,53,70,52,7,117,110,105,50,53,70,53,7,117,110,105,50,53,70,54,7,117,110,105,50,53,70,55,7,117,110,105,50,53,67,57,7,117,110,105,50,53,67,69,9,105,110,118,99,105,114,99,108,101,7,117,110,105,50,53,68,65,7, +117,110,105,50,53,68,66,7,117,110,105,50,53,69,48,7,117,110,105,50,53,69,49,7,117,110,105,50,53,68,67,7,117,110,105,50,53,68,68,7,117,110,105,50,53,68,69,7,117,110,105,50,53,68,70,7,117,110,105,50,53,67,54,7, +117,110,105,50,53,67,55,7,117,110,105,50,53,65,69,10,102,105,108,108,101,100,114,101,99,116,7,117,110,105,50,53,65,68,7,117,110,105,50,53,65,70,7,117,110,105,50,53,48,67,7,117,110,105,50,53,49,52,7,117,110,105,50,53, +49,48,7,117,110,105,50,53,49,56,7,117,110,105,50,53,51,67,7,117,110,105,50,53,50,67,7,117,110,105,50,53,51,52,7,117,110,105,50,53,49,67,7,117,110,105,50,53,50,52,7,117,110,105,50,53,48,48,7,117,110,105,50,53, +48,50,7,117,110,105,50,53,54,49,7,117,110,105,50,53,54,50,7,117,110,105,50,53,53,54,7,117,110,105,50,53,53,53,7,117,110,105,50,53,54,51,7,117,110,105,50,53,53,49,7,117,110,105,50,53,53,55,7,117,110,105,50,53, +53,68,7,117,110,105,50,53,53,67,7,117,110,105,50,53,53,66,7,117,110,105,50,53,53,69,7,117,110,105,50,53,53,70,7,117,110,105,50,53,53,65,7,117,110,105,50,53,53,52,7,117,110,105,50,53,54,57,7,117,110,105,50,53, +54,54,7,117,110,105,50,53,54,48,7,117,110,105,50,53,53,48,7,117,110,105,50,53,54,67,7,117,110,105,50,53,54,55,7,117,110,105,50,53,54,56,7,117,110,105,50,53,54,52,7,117,110,105,50,53,54,53,7,117,110,105,50,53, +53,57,7,117,110,105,50,53,53,56,7,117,110,105,50,53,53,50,7,117,110,105,50,53,53,51,7,117,110,105,50,53,54,66,7,117,110,105,50,53,54,65,9,102,105,108,108,101,100,98,111,120,7,117,110,105,50,53,65,49,29,119,104,105, +116,101,83,113,117,97,114,101,87,105,116,104,82,111,117,110,100,101,100,67,111,114,110,101,114,115,7,117,110,105,50,53,65,51,7,117,110,105,50,53,65,52,7,117,110,105,50,53,65,53,7,117,110,105,50,53,65,54,7,117,110,105,50,53, +65,55,7,117,110,105,50,53,65,56,7,117,110,105,50,53,65,57,7,117,110,105,50,53,65,65,7,117,110,105,50,53,65,66,7,117,110,105,50,53,69,55,7,117,110,105,50,53,69,56,7,117,110,105,50,53,69,57,7,117,110,105,50,53, +69,65,7,117,110,105,50,53,69,66,32,119,104,105,116,101,83,113,117,97,114,101,87,105,116,104,85,112,112,101,114,76,101,102,116,81,117,97,100,114,97,110,116,32,119,104,105,116,101,83,113,117,97,114,101,87,105,116,104,76,111,119,101,114, +76,101,102,116,81,117,97,100,114,97,110,116,33,119,104,105,116,101,83,113,117,97,114,101,87,105,116,104,76,111,119,101,114,82,105,103,104,116,81,117,97,100,114,97,110,116,33,119,104,105,116,101,83,113,117,97,114,101,87,105,116,104,85,112, +112,101,114,82,105,103,104,116,81,117,97,100,114,97,110,116,15,116,114,105,97,103,117,112,84,114,105,97,110,103,108,101,7,117,110,105,50,53,66,54,12,116,114,105,97,110,103,108,101,100,111,119,110,7,117,110,105,50,53,67,48,13,116,114, +105,97,110,103,108,101,114,105,103,104,116,7,116,114,105,97,103,108,102,23,98,108,97,99,107,85,112,112,101,114,82,105,103,104,116,84,114,105,97,110,103,108,101,23,98,108,97,99,107,76,111,119,101,114,82,105,103,104,116,84,114,105,97,110, +103,108,101,22,98,108,97,99,107,76,111,119,101,114,76,101,102,116,84,114,105,97,110,103,108,101,22,98,108,97,99,107,85,112,112,101,114,76,101,102,116,84,114,105,97,110,103,108,101,7,117,110,105,50,53,51,48,7,117,110,105,50,53,49, +50,7,117,110,105,50,53,50,55,7,117,110,105,50,53,48,69,7,117,110,105,50,53,49,70,7,117,110,105,50,53,52,49,7,117,110,105,50,53,50,70,7,117,110,105,50,53,49,49,7,117,110,105,50,53,50,57,7,117,110,105,50,53,48, +68,7,117,110,105,50,53,50,49,7,117,110,105,50,53,52,55,7,117,110,105,50,53,52,68,7,117,110,105,50,53,52,70,7,117,110,105,50,53,55,66,7,117,110,105,50,53,51,51,7,117,110,105,50,53,49,51,7,117,110,105,50,53,48, +70,7,117,110,105,50,53,48,49,7,117,110,105,50,53,55,56,7,117,110,105,50,53,55,69,7,117,110,105,50,53,48,57,7,117,110,105,50,53,48,66,7,117,110,105,50,53,55,65,7,117,110,105,50,53,48,53,7,117,110,105,50,53,48, +55,7,117,110,105,50,53,55,57,7,117,110,105,50,53,51,66,7,117,110,105,50,53,49,66,7,117,110,105,50,53,55,70,7,117,110,105,50,53,49,55,7,117,110,105,50,53,48,51,7,117,110,105,50,53,52,66,7,117,110,105,50,53,50, +66,7,117,110,105,50,53,50,51,7,117,110,105,50,53,52,53,7,117,110,105,50,53,50,68,7,117,110,105,50,53,51,53,7,117,110,105,50,53,51,68,7,117,110,105,50,53,51,50,7,117,110,105,50,53,51,65,7,117,110,105,50,53,52, +65,7,117,110,105,50,53,52,51,7,117,110,105,50,53,55,51,7,117,110,105,50,53,55,50,7,117,110,105,50,53,55,49,7,117,110,105,50,53,52,67,7,117,110,105,50,53,52,69,7,117,110,105,50,53,55,55,7,117,110,105,50,53,55, +52,7,117,110,105,50,53,55,67,7,117,110,105,50,53,48,56,7,117,110,105,50,53,48,65,7,117,110,105,50,53,55,54,7,117,110,105,50,53,48,52,7,117,110,105,50,53,48,54,7,117,110,105,50,53,55,53,7,117,110,105,50,53,55, +68,7,117,110,105,50,53,52,54,7,117,110,105,50,53,50,69,7,117,110,105,50,53,51,54,7,117,110,105,50,53,51,69,7,117,110,105,50,53,51,49,7,117,110,105,50,53,51,57,7,117,110,105,50,53,52,57,7,117,110,105,50,53,52, +52,7,117,110,105,50,53,52,48,7,117,110,105,50,53,51,56,7,117,110,105,50,53,50,54,7,117,110,105,50,53,49,65,7,117,110,105,50,53,49,69,7,117,110,105,50,53,49,54,7,117,110,105,50,53,52,56,7,117,110,105,50,53,51, +55,7,117,110,105,50,53,50,65,7,117,110,105,50,53,49,57,7,117,110,105,50,53,50,50,7,117,110,105,50,53,49,53,7,117,110,105,50,53,52,50,7,117,110,105,50,53,50,56,7,117,110,105,50,53,50,48,7,117,110,105,50,53,51, +70,7,117,110,105,50,53,50,53,7,117,110,105,50,53,49,68,7,117,110,105,50,53,54,68,7,117,110,105,50,53,54,69,7,117,110,105,50,53,54,70,7,117,110,105,50,53,55,48,7,117,110,105,50,54,49,48,7,117,110,105,50,54,49, +49,7,117,110,105,50,54,49,50,7,117,110,105,50,54,50,48,7,117,110,105,50,54,51,48,7,117,110,105,50,54,51,49,7,117,110,105,50,54,51,50,7,117,110,105,50,54,51,51,7,117,110,105,50,54,51,52,7,117,110,105,50,54,51, +53,7,117,110,105,50,54,51,54,7,117,110,105,50,54,51,55,7,117,110,105,50,54,51,57,9,115,109,105,108,101,102,97,99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,6,102,101,109,97,108,101,4,109,97,108,101, +5,115,112,97,100,101,4,99,108,117,98,5,104,101,97,114,116,7,100,105,97,109,111,110,100,7,117,110,105,50,55,49,51,18,97,99,107,110,111,119,108,101,100,103,101,99,111,110,116,114,111,108,7,117,110,105,50,51,56,55,16,98,97,99, +107,115,112,97,99,101,99,111,110,116,114,111,108,7,117,110,105,50,51,48,48,7,117,110,105,50,49,49,51,9,101,115,116,105,109,97,116,101,100,7,117,110,105,50,49,49,54,11,98,101,108,108,99,111,110,116,114,111,108,7,117,110,105,50, +52,50,51,7,117,110,105,50,52,50,50,7,117,110,105,50,51,56,66,13,99,97,110,99,101,108,99,111,110,116,114,111,108,21,99,97,114,114,105,97,103,101,82,101,116,117,114,110,99,111,110,116,114,111,108,7,117,110,105,50,51,48,51,21, +100,97,116,97,76,105,110,107,69,115,99,97,112,101,99,111,110,116,114,111,108,13,100,101,108,101,116,101,99,111,110,116,114,111,108,20,100,101,108,101,116,101,70,111,114,109,84,119,111,99,111,110,116,114,111,108,24,100,101,118,105,99,101,67, +111,110,116,114,111,108,70,111,117,114,99,111,110,116,114,111,108,23,100,101,118,105,99,101,67,111,110,116,114,111,108,79,110,101,99,111,110,116,114,111,108,25,100,101,118,105,99,101,67,111,110,116,114,111,108,84,104,114,101,101,99,111,110,116, +114,111,108,23,100,101,118,105,99,101,67,111,110,116,114,111,108,84,119,111,99,111,110,116,114,111,108,18,103,108,111,98,101,87,105,116,104,77,101,114,105,100,105,97,110,115,18,101,110,100,79,102,77,101,100,105,117,109,99,111,110,116,114,111, +108,16,101,110,100,79,102,84,101,120,116,99,111,110,116,114,111,108,24,101,110,100,79,102,84,114,97,110,115,109,105,115,115,105,111,110,99,111,110,116,114,111,108,29,101,110,100,79,102,84,114,97,110,115,109,105,115,115,105,111,110,66,108,111, +99,107,99,111,110,116,114,111,108,14,101,110,113,117,105,114,121,99,111,110,116,114,111,108,13,101,115,99,97,112,101,99,111,110,116,114,111,108,20,102,105,108,101,83,101,112,97,114,97,116,111,114,99,111,110,116,114,111,108,15,102,111,114,109, +70,101,101,100,99,111,110,116,114,111,108,21,103,114,111,117,112,83,101,112,97,114,97,116,111,114,99,111,110,116,114,111,108,7,117,110,105,50,51,56,56,27,104,111,114,105,122,111,110,116,97,108,84,97,98,117,108,97,116,105,111,110,99,111, +110,116,114,111,108,5,104,111,117,115,101,7,117,110,105,50,49,69,65,7,117,110,105,50,51,50,55,7,117,110,105,50,51,50,66,7,117,110,105,50,51,50,54,7,117,110,105,50,51,67,70,7,117,110,105,50,51,50,56,7,117,110,105,50, +51,50,53,7,117,110,105,50,49,68,70,7,117,110,105,50,49,68,69,7,117,110,105,50,51,49,56,7,117,110,105,50,51,67,69,15,108,105,110,101,70,101,101,100,99,111,110,116,114,111,108,26,110,101,103,97,116,105,118,101,65,99,107,110, +111,119,108,101,100,103,101,99,111,110,116,114,111,108,14,110,101,119,108,105,110,101,99,111,110,116,114,111,108,11,110,117,108,108,99,111,110,116,114,111,108,7,117,110,105,50,51,48,54,7,117,110,105,50,51,48,53,22,114,101,99,111,114,100, +83,101,112,97,114,97,116,111,114,99,111,110,116,114,111,108,14,115,104,105,102,116,73,110,99,111,110,116,114,111,108,15,115,104,105,102,116,79,117,116,99,111,110,116,114,111,108,12,115,112,97,99,101,99,111,110,116,114,111,108,21,115,116,97, +114,116,79,102,72,101,97,100,105,110,103,99,111,110,116,114,111,108,18,115,116,97,114,116,79,102,84,101,120,116,99,111,110,116,114,111,108,17,115,117,98,115,116,105,116,117,116,101,99,111,110,116,114,111,108,24,115,117,98,115,116,105,116,117, +116,101,70,111,114,109,84,119,111,99,111,110,116,114,111,108,22,115,121,110,99,104,114,111,110,111,117,115,73,100,108,101,99,111,110,116,114,111,108,7,117,110,105,50,49,56,66,7,117,110,105,50,49,56,65,20,117,110,105,116,83,101,112,97, +114,97,116,111,114,99,111,110,116,114,111,108,25,118,101,114,116,105,99,97,108,84,97,98,117,108,97,116,105,111,110,99,111,110,116,114,111,108,16,97,109,112,101,114,115,97,110,100,46,115,112,97,99,101,114,10,98,97,114,46,115,112,97,99, +101,114,14,97,109,112,101,114,115,97,110,100,46,115,115,48,51,21,97,109,112,101,114,115,97,110,100,46,98,101,102,111,114,101,46,115,115,48,51,7,97,116,46,115,115,48,53,9,112,108,117,115,46,100,110,111,109,10,109,105,110,117,115,46, +100,110,111,109,10,101,113,117,97,108,46,100,110,111,109,24,97,109,112,101,114,115,97,110,100,95,97,109,112,101,114,115,97,110,100,46,108,105,103,97,19,98,97,114,95,98,114,97,99,101,114,105,103,104,116,46,108,105,103,97,21,98,97,114, +95,98,114,97,99,107,101,116,114,105,103,104,116,46,108,105,103,97,12,98,97,114,95,98,97,114,46,108,105,103,97,16,98,97,114,95,98,97,114,95,98,97,114,46,108,105,103,97,24,98,97,114,95,98,97,114,95,98,97,114,95,103,114,101, +97,116,101,114,46,108,105,103,97,20,98,97,114,95,98,97,114,95,103,114,101,97,116,101,114,46,108,105,103,97,16,98,97,114,95,103,114,101,97,116,101,114,46,108,105,103,97,19,100,111,108,108,97,114,95,103,114,101,97,116,101,114,46,108, +105,103,97,14,112,108,117,115,95,112,108,117,115,46,108,105,103,97,19,112,108,117,115,95,112,108,117,115,95,112,108,117,115,46,108,105,103,97,17,112,108,117,115,95,103,114,101,97,116,101,114,46,108,105,103,97,16,101,113,117,97,108,95,101, +113,117,97,108,46,108,105,103,97,22,101,113,117,97,108,95,101,113,117,97,108,95,101,113,117,97,108,46,108,105,103,97,18,103,114,101,97,116,101,114,95,101,113,117,97,108,46,108,105,103,97,20,103,114,101,97,116,101,114,95,103,114,101,97, +116,101,114,46,108,105,103,97,28,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,46,108,105,103,97,30,108,101,115,115,95,101,120,99,108,97,109,95,104,121,112,104,101,110,95,104,121,112,104,101,110,46, +108,105,103,97,18,108,101,115,115,95,97,115,116,101,114,105,115,107,46,108,105,103,97,26,108,101,115,115,95,97,115,116,101,114,105,115,107,95,103,114,101,97,116,101,114,46,108,105,103,97,13,108,101,115,115,95,98,97,114,46,108,105,103,97, +17,108,101,115,115,95,98,97,114,95,98,97,114,46,108,105,103,97,21,108,101,115,115,95,98,97,114,95,98,97,114,95,98,97,114,46,108,105,103,97,21,108,101,115,115,95,98,97,114,95,103,114,101,97,116,101,114,46,108,105,103,97,16,108, +101,115,115,95,100,111,108,108,97,114,46,108,105,103,97,24,108,101,115,115,95,100,111,108,108,97,114,95,103,114,101,97,116,101,114,46,108,105,103,97,14,108,101,115,115,95,112,108,117,115,46,108,105,103,97,22,108,101,115,115,95,112,108,117, +115,95,103,114,101,97,116,101,114,46,108,105,103,97,15,108,101,115,115,95,101,113,117,97,108,46,108,105,103,97,17,108,101,115,115,95,103,114,101,97,116,101,114,46,108,105,103,97,14,108,101,115,115,95,108,101,115,115,46,108,105,103,97,19, +108,101,115,115,95,108,101,115,115,95,108,101,115,115,46,108,105,103,97,20,108,101,115,115,95,97,115,99,105,105,116,105,108,100,101,46,108,105,103,97,28,108,101,115,115,95,97,115,99,105,105,116,105,108,100,101,95,103,114,101,97,116,101,114, +46,108,105,103,97,31,108,101,115,115,95,97,115,99,105,105,116,105,108,100,101,95,97,115,99,105,105,116,105,108,100,101,46,108,105,103,97,15,108,101,115,115,95,115,108,97,115,104,46,108,105,103,97,23,108,101,115,115,95,115,108,97,115,104, +95,103,114,101,97,116,101,114,46,108,105,103,97,22,97,115,99,105,105,116,105,108,100,101,95,104,121,112,104,101,110,46,108,105,103,97,18,97,115,99,105,105,116,105,108,100,101,95,97,116,46,108,105,103,97,23,97,115,99,105,105,116,105,108, +100,101,95,103,114,101,97,116,101,114,46,108,105,103,97,26,97,115,99,105,105,116,105,108,100,101,95,97,115,99,105,105,116,105,108,100,101,46,108,105,103,97,34,97,115,99,105,105,116,105,108,100,101,95,97,115,99,105,105,116,105,108,100,101, +95,103,114,101,97,116,101,114,46,108,105,103,97,22,97,115,99,105,105,99,105,114,99,117,109,95,101,113,117,97,108,46,108,105,103,97,20,112,101,114,99,101,110,116,95,112,101,114,99,101,110,116,46,108,105,103,97,9,112,108,117,115,46,110, +117,109,114,10,109,105,110,117,115,46,110,117,109,114,10,101,113,117,97,108,46,110,117,109,114,24,98,97,114,95,98,97,114,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,20,98,97,114,95,101,113,117,97,108,95,109,105,100, +100,108,101,46,115,101,113,21,98,97,114,95,98,97,114,95,101,113,117,97,108,95,101,110,100,46,115,101,113,23,98,97,114,95,98,97,114,95,101,113,117,97,108,95,115,116,97,114,116,46,115,101,113,25,98,97,114,95,98,97,114,95,104,121, +112,104,101,110,95,109,105,100,100,108,101,46,115,101,113,21,98,97,114,95,104,121,112,104,101,110,95,109,105,100,100,108,101,46,115,101,113,22,98,97,114,95,98,97,114,95,104,121,112,104,101,110,95,101,110,100,46,115,101,113,24,98,97,114, +95,98,97,114,95,104,121,112,104,101,110,95,115,116,97,114,116,46,115,101,113,17,98,97,114,95,101,113,117,97,108,95,101,110,100,46,115,101,113,19,98,97,114,95,101,113,117,97,108,95,115,116,97,114,116,46,115,101,113,18,98,97,114,95, +104,121,112,104,101,110,95,101,110,100,46,115,101,113,20,98,97,114,95,104,121,112,104,101,110,95,115,116,97,114,116,46,115,101,113,25,98,97,114,95,117,110,100,101,114,115,99,111,114,101,95,109,105,100,100,108,101,46,115,101,113,16,101,113, +117,97,108,95,109,105,100,100,108,101,46,115,101,113,13,101,113,117,97,108,95,101,110,100,46,115,101,113,15,101,113,117,97,108,95,115,116,97,114,116,46,115,101,113,32,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,95,101,113,117, +97,108,95,109,105,100,100,108,101,46,115,101,113,24,103,114,101,97,116,101,114,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,29,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,95,101,113,117,97,108,95,101,110,100, +46,115,101,113,31,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,95,101,113,117,97,108,95,115,116,97,114,116,46,115,101,113,23,103,114,101,97,116,101,114,95,101,113,117,97,108,95,115,116,97,114,116,46,115,101,113,21,103,114,101, +97,116,101,114,95,101,113,117,97,108,95,101,110,100,46,115,101,113,33,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,95,104,121,112,104,101,110,95,109,105,100,100,108,101,46,115,101,113,25,103,114,101,97,116,101,114,95,104,121,112, +104,101,110,95,109,105,100,100,108,101,46,115,101,113,30,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,95,104,121,112,104,101,110,95,101,110,100,46,115,101,113,32,103,114,101,97,116,101,114,95,103,114,101,97,116,101,114,95,104,121, +112,104,101,110,95,115,116,97,114,116,46,115,101,113,24,103,114,101,97,116,101,114,95,104,121,112,104,101,110,95,115,116,97,114,116,46,115,101,113,22,103,114,101,97,116,101,114,95,104,121,112,104,101,110,95,101,110,100,46,115,101,113,26,108, +101,115,115,95,108,101,115,115,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,21,108,101,115,115,95,101,113,117,97,108,95,109,105,100,100,108,101,46,115,101,113,23,108,101,115,115,95,108,101,115,115,95,101,113,117,97,108,95, +101,110,100,46,115,101,113,25,108,101,115,115,95,108,101,115,115,95,101,113,117,97,108,95,115,116,97,114,116,46,115,101,113,18,108,101,115,115,95,101,113,117,97,108,95,101,110,100,46,115,101,113,20,108,101,115,115,95,101,113,117,97,108,95, +115,116,97,114,116,46,115,101,113,27,108,101,115,115,95,108,101,115,115,95,104,121,112,104,101,110,95,109,105,100,100,108,101,46,115,101,113,22,108,101,115,115,95,104,121,112,104,101,110,95,109,105,100,100,108,101,46,115,101,113,24,108,101,115, +115,95,108,101,115,115,95,104,121,112,104,101,110,95,101,110,100,46,115,101,113,26,108,101,115,115,95,108,101,115,115,95,104,121,112,104,101,110,95,115,116,97,114,116,46,115,101,113,19,108,101,115,115,95,104,121,112,104,101,110,95,101,110,100, +46,115,101,113,21,108,101,115,115,95,104,121,112,104,101,110,95,115,116,97,114,116,46,115,101,113,18,103,114,101,97,116,101,114,95,101,113,117,97,108,46,115,115,48,50,15,108,101,115,115,95,101,113,117,97,108,46,115,115,48,50,24,100,111, +108,108,97,114,95,103,114,101,97,116,101,114,46,108,105,103,97,46,115,115,48,52,21,108,101,115,115,95,100,111,108,108,97,114,46,108,105,103,97,46,115,115,48,52,29,108,101,115,115,95,100,111,108,108,97,114,95,103,114,101,97,116,101,114, +46,108,105,103,97,46,115,115,48,52,21,101,113,117,97,108,95,97,115,99,105,105,116,105,108,100,101,46,115,115,48,55,16,101,113,117,97,108,95,101,113,117,97,108,46,115,115,48,56,22,101,113,117,97,108,95,101,113,117,97,108,95,101,113, +117,97,108,46,115,115,48,56,11,109,117,115,105,99,97,108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108,7,117,110,105,48,51,70,54,7,117,110,105,48,51,55,52,7,117,110,105,48,51,55,53,7,117,110,105,48, +50,66,67,7,117,110,105,48,50,66,65,7,117,110,105,48,50,67,57,7,117,110,105,48,50,66,57,7,117,110,105,48,51,48,56,7,117,110,105,48,51,48,55,9,103,114,97,118,101,99,111,109,98,9,97,99,117,116,101,99,111,109,98,7, +117,110,105,48,51,48,66,7,117,110,105,48,51,48,50,7,117,110,105,48,51,48,67,7,117,110,105,48,51,48,54,7,117,110,105,48,51,48,65,9,116,105,108,100,101,99,111,109,98,7,117,110,105,48,51,48,52,7,117,110,105,48,51,48, +53,7,117,110,105,48,51,48,70,7,117,110,105,48,51,49,51,7,117,110,105,48,51,49,52,7,117,110,105,48,51,50,54,7,117,110,105,48,51,50,55,18,115,116,114,111,107,101,115,104,111,114,116,111,118,101,114,108,97,121,17,115,116,114, +111,107,101,108,111,110,103,111,118,101,114,108,97,121,9,99,97,114,111,110,46,97,108,116,12,117,110,105,48,51,50,54,46,99,97,115,101,13,100,105,101,114,101,115,105,115,46,99,97,115,101,14,100,111,116,97,99,99,101,110,116,46,99,97, +115,101,10,103,114,97,118,101,46,99,97,115,101,10,97,99,117,116,101,46,99,97,115,101,17,104,117,110,103,97,114,117,109,108,97,117,116,46,99,97,115,101,15,99,105,114,99,117,109,102,108,101,120,46,99,97,115,101,10,99,97,114,111,110, +46,99,97,115,101,10,98,114,101,118,101,46,99,97,115,101,9,114,105,110,103,46,99,97,115,101,10,116,105,108,100,101,46,99,97,115,101,11,109,97,99,114,111,110,46,99,97,115,101,12,99,101,100,105,108,108,97,46,99,97,115,101,13,97, +99,117,116,101,46,108,111,99,108,80,76,75,18,97,99,117,116,101,46,99,97,115,101,46,108,111,99,108,80,76,75,7,117,110,105,48,51,52,50,7,117,110,105,48,51,52,53,5,116,111,110,111,115,10,116,111,110,111,115,46,99,97,115,101, +13,100,105,101,114,101,115,105,115,116,111,110,111,115,7,117,110,105,49,70,66,70,7,117,110,105,49,70,66,68,7,117,110,105,49,70,70,69,7,117,110,105,49,70,67,68,7,117,110,105,49,70,68,68,7,117,110,105,49,70,67,69,7,117, +110,105,49,70,68,69,7,117,110,105,49,70,67,70,7,117,110,105,49,70,68,70,7,117,110,105,49,70,69,68,7,117,110,105,49,70,69,69,7,117,110,105,49,70,67,49,7,117,110,105,49,70,69,70,12,117,110,105,49,70,69,70,46,99, +97,115,101,7,117,110,105,49,70,70,68,12,117,110,105,49,70,70,68,46,99,97,115,101,7,117,110,105,49,70,67,48,7,117,110,105,69,48,48,48,7,117,110,105,69,48,48,49,7,117,110,105,69,48,48,50,7,117,110,105,69,48,48,51, +7,117,110,105,69,48,65,48,7,117,110,105,69,48,65,49,7,117,110,105,69,48,65,50,7,117,110,105,69,48,66,48,7,117,110,105,69,48,66,49,7,117,110,105,69,48,66,50,7,117,110,105,69,48,66,51,7,98,114,101,118,101,99,121, +12,98,114,101,118,101,99,121,46,99,97,115,101,0,0,0,0,1,0,0,0,10,2,174,5,12,0,6,68,70,76,84,2,110,99,121,114,108,2,110,103,114,101,107,2,110,108,97,116,110,0,38,122,105,110,104,2,110,122,121,121,121,2,110, +2,76,0,10,65,70,75,32,2,20,65,90,69,32,1,224,67,65,84,32,1,172,67,82,84,32,1,120,75,65,90,32,1,68,77,79,76,32,1,16,80,76,75,32,0,220,82,79,77,32,0,168,84,65,84,32,0,116,84,82,75,32,0,64, +0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2, +0,3,0,4,0,13,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,12,0,15,0,16,0,17, +0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,11,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23, +0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,10,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29, +0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,9,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0, +0,1,0,2,0,3,0,4,0,8,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,7,0,15, +0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,6,0,15,0,16,0,17,0,18,0,19,0,20,0,21, +0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,0,255,255,0,23,0,0,0,1,0,2,0,3,0,4,0,5,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27, +0,28,0,29,0,30,0,31,0,4,0,0,0,0,255,255,0,22,0,0,0,1,0,2,0,3,0,4,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +97,97,108,116,2,86,99,97,108,116,1,132,99,97,115,101,1,126,100,110,111,109,1,120,102,114,97,99,1,110,108,111,99,108,1,104,108,111,99,108,1,98,108,111,99,108,1,92,108,111,99,108,1,86,108,111,99,108,1,80,108,111,99,108, +1,74,108,111,99,108,1,68,108,111,99,108,1,62,108,111,99,108,1,56,108,111,99,108,1,50,110,117,109,114,1,44,111,110,117,109,1,38,111,114,100,110,1,30,115,97,108,116,1,24,115,105,110,102,1,18,115,115,48,49,1,12,115,115, +48,50,1,6,115,115,48,51,0,254,115,115,48,52,0,248,115,115,48,53,0,240,115,115,48,54,0,232,115,115,48,55,0,224,115,115,48,56,0,218,115,117,98,115,0,212,115,117,112,115,0,206,116,110,117,109,0,200,122,101,114,111,0,194, +0,0,0,1,0,29,0,0,0,1,0,14,0,0,0,1,0,3,0,0,0,1,0,2,0,0,0,1,1,84,0,0,0,2,1,79,1,81,0,0,0,2,1,75,1,77,0,0,0,2,1,72,1,73,0,0,0,1,1,71,0,0,0,2, +1,68,1,69,0,0,0,1,1,67,0,0,0,1,1,66,0,0,0,1,1,83,0,0,0,1,1,65,0,0,0,2,0,11,0,13,0,0,0,1,0,15,0,0,0,1,0,4,0,0,0,1,0,18,0,0,0,1,0,17,0,0,0,1, +0,20,0,0,0,1,0,22,0,0,0,1,0,19,0,0,0,1,0,21,0,0,0,1,0,27,0,0,0,1,0,24,0,0,0,1,0,23,0,0,0,1,0,28,0,0,0,3,0,6,0,7,0,8,0,0,0,1,0,5,0,0,0,1, +0,16,0,0,0,103,0,30,0,32,0,36,0,40,0,43,0,46,0,48,0,50,0,54,0,58,0,62,0,65,0,68,0,71,0,74,0,77,0,81,0,85,0,88,0,92,0,95,0,98,0,102,0,105,0,107,0,109,0,111,0,113,0,115, +0,117,0,120,0,123,0,127,0,131,0,135,0,139,0,142,0,144,0,147,0,149,0,151,0,153,0,156,0,158,0,160,0,162,0,164,0,166,0,168,0,170,0,173,0,175,0,177,0,180,0,182,0,185,0,187,0,189,0,192,0,194,0,196, +0,198,0,200,0,202,0,204,0,206,0,208,0,210,0,212,0,214,0,216,0,218,0,220,0,222,0,225,0,227,0,229,0,232,0,234,0,236,0,239,0,241,0,243,0,246,0,249,0,251,0,253,1,0,1,3,1,5,1,7,1,12,1,13, +1,24,1,26,1,28,1,33,1,43,1,46,1,49,1,52,1,55,1,59,0,0,0,2,0,0,0,1,1,85,76,42,73,4,72,196,72,124,72,80,72,36,72,16,71,248,71,176,71,162,71,162,71,100,71,66,71,32,71,12,70,214,70,64, +70,44,70,44,70,10,70,10,70,44,69,204,70,44,69,136,69,110,69,84,70,44,69,48,69,22,68,136,68,106,67,216,67,190,67,176,67,176,67,30,67,4,67,176,67,176,66,128,66,110,67,176,65,234,65,216,67,176,65,134,65,116,65,34, +65,16,64,160,64,146,67,176,67,176,63,254,63,240,63,226,63,226,63,94,63,80,63,66,63,66,62,196,62,182,67,176,62,46,62,32,63,226,61,152,61,138,63,66,60,188,60,158,60,144,60,20,59,250,59,236,59,72,59,58,59,44,59,44, +58,106,58,92,58,78,58,78,57,194,57,168,58,78,56,82,56,68,56,54,56,54,55,132,55,106,56,54,54,198,54,172,54,158,54,6,53,248,60,144,60,144,53,136,53,110,59,236,52,254,52,224,52,152,52,122,52,38,52,8,51,180,51,150, +51,32,51,2,50,122,50,92,49,230,49,204,49,190,49,78,49,52,49,190,48,196,48,182,49,190,49,190,48,70,48,56,48,42,48,42,47,186,47,172,47,158,47,158,47,34,47,20,47,6,47,6,46,168,46,154,46,140,46,46,46,20,45,194, +45,180,59,236,45,92,45,66,44,240,44,222,44,140,44,114,43,252,43,238,59,44,43,156,43,130,43,12,42,242,42,130,42,104,42,4,41,234,41,128,41,102,40,252,40,226,40,138,40,112,39,230,39,216,58,78,39,96,39,78,38,252,38,226, +37,226,37,212,56,54,37,70,37,52,36,184,36,170,54,158,36,36,36,10,35,184,35,166,35,48,35,34,60,144,34,208,34,190,34,108,34,82,34,0,33,230,33,92,33,66,32,240,32,222,32,140,32,114,32,32,32,6,31,180,31,154,31,72, +31,46,30,220,30,194,30,112,30,86,30,4,29,234,29,152,29,126,29,44,29,18,28,192,28,166,28,72,28,58,28,44,27,218,27,200,27,118,27,92,27,10,26,252,49,190,26,170,26,144,26,62,26,36,25,210,25,196,48,42,25,72,25,46, +24,220,24,202,24,120,24,106,24,92,23,254,23,240,23,226,23,108,23,90,23,8,22,238,22,120,22,106,47,158,21,242,21,212,21,212,21,96,21,70,20,238,20,220,19,226,19,212,19,198,19,212,19,198,19,158,15,42,15,14,14,232,14,208, +14,184,14,160,14,138,14,116,14,94,14,72,14,58,13,238,13,208,13,88,13,62,12,190,11,226,11,226,11,226,11,226,8,222,8,200,8,178,8,156,8,136,8,116,8,96,8,76,8,116,8,56,7,156,7,142,7,142,7,60,7,46,7,46, +6,220,6,206,6,206,6,124,6,110,6,110,6,34,6,20,6,6,5,248,5,94,5,68,5,54,5,40,5,26,5,26,5,6,5,6,4,236,4,210,4,150,4,120,4,86,4,72,4,20,3,250,3,226,3,212,3,180,3,166,3,84,3,58, +2,232,2,206,72,196,2,172,0,1,0,0,0,1,0,8,0,2,0,14,0,4,4,125,4,126,6,216,6,217,0,1,0,4,4,81,4,82,6,135,6,136,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,248,4,124,0,1,0,2, +3,229,4,201,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,58,142,0,1,57,148,0,1,0,0,1,82,0,3,0,1,58,32,0,1,57,130,0,0,0,1,0,0,1,82,0,3,0,0,0,1,58,106,0,2, +57,112,57,112,0,0,0,3,0,1,58,90,0,1,58,90,0,1,57,96,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,5,0,6,215,0,1,0,2,4,193,4,201,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3, +0,0,0,1,54,230,0,1,57,40,0,1,0,0,1,80,0,3,0,1,53,60,0,1,57,22,0,0,0,1,0,0,1,80,0,3,0,0,0,1,54,194,0,2,57,4,57,4,0,0,0,3,0,1,54,178,0,1,54,178,0,1,56,244, +0,0,0,1,0,0,0,1,0,8,0,1,0,32,0,1,0,6,0,0,0,1,0,8,0,3,0,1,0,18,0,1,0,18,0,0,0,1,0,0,1,78,0,1,0,1,3,254,0,1,0,0,0,1,0,8,0,1,17,214,0,15,0,6, +0,0,0,1,0,8,0,3,0,0,0,1,17,200,0,0,0,1,0,0,1,76,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,201,6,119,0,1,0,2,5,3,6,161,0,6,0,0,0,2,0,28,0,10,0,3,0,1,56,108, +0,1,0,36,0,0,0,1,0,0,1,74,0,3,0,0,0,1,56,48,0,1,0,18,0,1,0,0,1,74,0,1,0,1,6,161,0,1,0,0,0,1,0,8,0,1,41,94,0,77,0,1,0,0,0,1,0,8,0,2,0,14,0,4, +4,151,6,212,6,213,6,214,0,1,0,4,4,141,6,131,6,147,6,148,0,1,0,0,0,1,0,8,0,2,0,12,0,3,6,118,6,118,6,118,0,1,0,3,6,43,6,115,6,117,0,6,0,0,0,2,0,36,0,10,0,3,0,0, +0,1,0,18,0,1,0,18,0,1,0,0,1,70,0,1,0,2,6,43,6,117,0,3,0,0,0,1,42,32,0,1,0,18,0,1,0,0,1,70,0,1,0,1,6,117,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,117,6,117, +0,1,0,2,6,43,6,123,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,210,6,211,0,1,0,2,6,137,6,151,0,1,0,0,0,1,0,8,0,1,0,6,0,53,0,1,0,1,0,223,0,1,0,0,0,1,0,8,0,1, +45,212,0,89,0,1,0,0,0,1,0,8,0,1,45,198,0,87,0,1,0,0,0,1,0,8,0,1,45,184,0,88,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,122,6,182,0,1,0,2,4,34,6,51,0,6,0,0,0,6, +0,126,0,94,0,74,0,56,0,36,0,18,0,3,0,0,0,1,45,134,0,1,45,134,0,1,0,0,1,64,0,3,0,0,0,1,45,116,0,2,63,136,45,116,0,1,0,0,1,63,0,3,0,1,0,60,0,1,45,96,0,0,0,1, +0,0,1,62,0,3,0,1,0,42,0,1,45,78,0,1,45,78,0,1,0,0,1,61,0,3,0,1,0,22,0,1,45,58,0,2,63,78,45,58,0,1,0,0,1,60,0,1,0,3,4,122,4,123,6,182,0,3,0,1,0,20,0,1, +63,46,0,1,45,26,0,1,0,0,1,60,0,1,0,2,4,122,4,123,0,1,0,0,0,1,0,8,0,1,44,252,0,133,0,1,0,0,0,1,0,8,0,1,44,238,0,131,0,1,0,0,0,1,0,8,0,1,44,224,0,132,0,6, +0,0,0,3,0,48,0,30,0,12,0,3,0,0,0,1,44,206,0,1,44,206,0,1,0,0,1,58,0,3,0,1,0,38,0,1,44,188,0,0,0,1,0,0,1,57,0,3,0,1,0,20,0,1,44,170,0,1,44,170,0,1,0,0, +1,56,0,1,0,2,4,113,4,114,0,1,0,0,0,1,0,8,0,1,52,176,0,30,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,52,156,0,1,1,128,0,1,0,0,1,54,0,3,0,1,1,110,0,1, +52,138,0,0,0,1,0,0,1,53,0,3,0,1,1,64,0,1,52,120,0,1,1,92,0,0,0,3,0,1,1,76,0,1,52,104,0,1,1,48,0,0,0,1,0,0,0,1,0,8,0,1,53,16,0,9,0,6,0,0,0,4,0,66, +0,50,0,32,0,14,0,3,0,1,1,4,0,1,52,252,0,0,0,1,0,0,1,51,0,3,0,0,0,1,52,234,0,1,0,242,0,1,0,0,1,50,0,3,0,1,0,224,0,1,52,216,0,1,0,252,0,0,0,3,0,1,0,236, +0,1,52,200,0,1,0,208,0,0,0,1,0,0,0,1,0,8,0,1,44,178,0,65,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,1,0,164,0,1,44,158,0,0,0,1,0,0,1,48,0,3,0,0,0,1,44,140, +0,1,0,146,0,1,0,0,1,47,0,3,0,1,0,128,0,1,44,122,0,1,0,156,0,0,0,3,0,1,0,140,0,1,44,106,0,1,0,112,0,0,0,1,0,0,0,1,0,8,0,1,53,232,0,14,0,6,0,0,0,4,0,66, +0,50,0,32,0,14,0,3,0,1,0,68,0,1,53,212,0,0,0,1,0,0,1,45,0,3,0,0,0,1,53,194,0,1,0,50,0,1,0,0,1,44,0,3,0,1,0,32,0,1,53,176,0,1,0,60,0,0,0,3,0,1,0,44, +0,1,53,160,0,1,0,16,0,0,0,2,0,4,0,134,1,15,0,0,1,22,1,25,0,138,1,170,2,57,0,142,2,207,3,133,1,30,0,2,0,7,0,1,0,133,0,0,1,26,1,169,0,133,2,58,2,206,1,21,3,144,3,153, +1,170,4,3,4,8,1,180,6,51,6,51,1,186,6,111,6,112,1,187,0,1,0,0,0,1,0,8,0,2,60,62,0,3,6,196,6,209,6,181,0,1,0,0,0,1,0,8,0,2,60,42,0,3,6,195,6,207,6,177,0,1,0,0, +0,1,0,8,0,2,60,22,0,3,6,197,6,208,6,180,0,1,0,0,0,1,0,8,0,2,60,2,0,3,5,1,5,2,6,116,0,1,0,0,0,1,0,8,0,2,59,238,0,3,6,194,6,206,6,176,0,1,0,0,0,1,0,8, +0,2,2,214,0,4,4,108,6,193,6,205,6,175,0,1,0,0,0,1,0,8,0,2,2,192,0,4,4,109,5,1,5,2,6,116,0,1,0,0,0,1,0,8,0,2,2,170,0,4,4,107,6,192,6,204,6,174,0,6,0,0,0,33, +2,242,2,226,2,200,2,136,2,118,2,96,2,74,2,52,2,30,2,8,1,242,1,222,1,202,1,182,1,162,1,142,1,122,1,102,1,82,1,62,1,44,1,26,1,8,0,244,0,224,0,204,0,184,0,164,0,144,0,126,0,108,0,90, +0,72,0,3,0,0,0,1,52,88,0,1,2,84,0,1,0,0,1,36,0,3,0,0,0,1,59,210,0,1,52,70,0,1,0,0,1,42,0,3,0,0,0,1,59,186,0,1,52,52,0,1,0,0,1,42,0,3,0,0,0,1,59,180, +0,1,52,34,0,1,0,0,1,42,0,3,0,0,0,1,59,156,0,2,59,156,52,16,0,1,0,0,1,41,0,3,0,1,59,88,0,1,59,136,0,1,51,252,0,1,0,0,1,40,0,3,0,0,0,1,59,110,0,2,59,110,51,232, +0,1,0,0,1,41,0,3,0,1,54,162,0,1,59,90,0,1,51,212,0,1,0,0,1,40,0,3,0,0,0,1,59,82,0,2,59,82,51,192,0,1,0,0,1,41,0,3,0,1,59,2,0,1,59,62,0,1,51,172,0,1,0,0, +1,40,0,3,0,1,1,210,0,1,59,36,0,0,0,1,0,0,1,39,0,3,0,1,1,192,0,1,59,12,0,0,0,1,0,0,1,39,0,3,0,1,1,174,0,1,59,6,0,0,0,1,0,0,1,39,0,3,0,1,1,156,0,1, +58,238,0,1,58,238,0,1,0,0,1,38,0,3,0,2,58,170,1,136,0,1,58,218,0,0,0,1,0,0,1,37,0,3,0,1,1,116,0,1,58,192,0,1,58,192,0,1,0,0,1,38,0,3,0,2,53,244,1,96,0,1,58,172, +0,0,0,1,0,0,1,37,0,3,0,1,1,76,0,1,58,164,0,1,58,164,0,1,0,0,1,38,0,3,0,2,58,84,1,56,0,1,58,144,0,0,0,1,0,0,1,37,0,3,0,1,1,36,0,1,58,118,0,1,50,234,0,1, +0,0,1,36,0,3,0,1,1,16,0,1,58,92,0,1,50,214,0,1,0,0,1,36,0,3,0,1,0,252,0,1,58,84,0,1,50,194,0,1,0,0,1,36,0,3,0,1,0,232,0,1,58,58,0,2,58,58,50,174,0,1,0,0, +1,35,0,3,0,2,57,244,0,210,0,1,58,36,0,1,50,152,0,1,0,0,1,34,0,3,0,1,0,188,0,1,58,8,0,2,58,8,50,130,0,1,0,0,1,35,0,3,0,2,53,58,0,166,0,1,57,242,0,1,50,108,0,1, +0,0,1,34,0,3,0,1,0,144,0,1,57,232,0,2,57,232,50,86,0,1,0,0,1,35,0,3,0,2,57,150,0,122,0,1,57,210,0,1,50,64,0,1,0,0,1,34,0,3,0,1,0,50,0,1,50,42,0,0,0,1,0,0, +1,35,0,3,0,1,0,32,0,1,50,24,0,1,0,20,0,1,0,0,1,34,0,1,0,4,4,26,4,195,4,196,6,51,0,1,0,14,4,107,4,108,6,174,6,175,6,177,6,181,6,192,6,193,6,195,6,196,6,204,6,205,6,207, +6,209,0,3,0,1,0,18,0,1,57,100,0,2,57,100,57,100,0,0,0,1,0,2,4,107,4,108,0,3,0,1,57,74,0,1,57,74,0,1,49,190,0,0,0,3,0,1,57,58,0,1,57,58,0,2,57,58,49,174,0,0,0,1, +0,0,0,1,0,8,0,2,1,68,0,103,2,59,2,63,2,65,2,67,2,73,2,78,2,82,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59, +2,59,2,59,2,63,2,63,2,63,2,63,2,63,2,63,2,63,2,63,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,67,2,67,2,67, +2,67,2,67,2,67,2,67,2,67,2,67,2,67,2,67,2,67,2,73,2,73,2,73,2,73,2,73,2,73,2,73,2,73,2,75,2,78,2,78,2,78,2,78,2,78,2,78,2,78,2,78,2,82,2,82,2,82,2,82,2,82,2,82, +2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,0,6,0,0,0,4,0,78,0,60,0,34,0,14,0,3,0,2,0,40,0,82,0,1,0,98,0,0,0,1,0,0,1,32,0,3,0,0, +0,1,0,78,0,2,0,20,0,62,0,1,0,0,1,31,0,1,0,1,4,133,0,3,0,1,0,36,0,1,0,52,0,0,0,1,0,0,1,30,0,3,0,0,0,1,0,34,0,1,0,18,0,1,0,0,1,29,0,2,0,2,2,59, +2,91,0,0,2,111,2,206,0,33,0,2,0,2,2,83,2,89,0,0,2,111,2,206,0,7,0,1,0,0,0,1,0,8,0,2,0,10,0,2,2,90,2,91,0,1,0,2,2,67,2,78,0,6,0,0,0,2,0,62,0,10,0,3, +0,1,0,24,0,1,0,18,0,0,0,1,0,0,1,27,0,1,0,1,2,78,0,2,0,4,2,83,2,84,0,0,2,87,2,87,0,2,2,111,2,139,0,3,2,171,2,178,0,32,0,3,0,1,0,24,0,1,0,18,0,0,0,1, +0,0,1,27,0,1,0,1,2,67,0,2,0,5,2,83,2,84,0,0,2,87,2,88,0,2,2,111,2,139,0,4,2,171,2,178,0,33,2,180,2,187,0,41,0,1,0,0,0,1,0,8,0,2,0,12,0,3,1,16,1,17,1,18, +0,1,0,3,0,176,0,188,0,194,0,6,0,0,0,2,0,40,0,10,0,3,0,1,0,18,0,1,55,206,0,0,0,1,0,0,1,25,0,1,0,4,0,34,0,43,0,97,1,18,0,3,0,1,0,26,0,1,0,18,0,0,0,1, +0,0,1,25,0,1,0,2,0,176,0,188,0,1,0,3,0,167,1,16,1,17,0,1,0,0,0,1,0,8,0,1,54,194,1,251,0,1,0,0,0,1,0,8,0,2,42,158,0,4,4,117,6,190,6,203,6,179,0,1,0,0,0,1, +0,8,0,2,42,136,0,4,3,252,5,1,5,2,6,116,0,1,0,0,0,1,0,8,0,2,42,114,0,4,4,120,6,189,6,201,6,173,0,1,0,0,0,1,0,8,0,2,42,92,0,4,4,115,6,191,6,202,6,178,0,1,0,0, +0,1,0,8,0,2,0,88,0,5,3,252,6,185,5,1,5,2,6,116,0,1,0,0,0,1,0,8,0,2,0,64,0,5,4,118,6,185,6,188,6,200,6,172,0,1,0,0,0,1,0,8,0,2,0,40,0,5,4,116,6,185,6,187, +6,199,6,171,0,1,0,0,0,1,0,8,0,2,0,16,0,5,3,252,6,184,5,1,5,2,6,116,0,1,0,5,3,238,4,193,4,195,4,196,6,51,0,1,0,0,0,1,0,8,0,2,4,14,0,7,4,110,4,111,4,119,6,183, +6,186,6,198,6,170,0,6,0,0,0,48,4,98,4,82,4,56,3,230,3,212,3,190,3,168,3,146,3,124,3,102,3,80,3,58,3,36,3,16,2,252,2,232,2,212,2,192,2,172,2,152,2,132,2,112,2,92,2,72,2,52,2,32, +2,12,1,250,1,232,1,214,1,196,1,176,1,156,1,136,1,116,1,96,1,76,1,56,1,36,1,14,0,254,0,234,0,206,0,188,0,170,0,152,0,134,0,102,0,3,0,0,0,1,42,184,0,1,0,18,0,1,0,0,1,18,0,1, +0,5,3,226,3,229,4,193,4,195,6,51,0,3,0,0,0,1,56,110,0,1,42,152,0,1,0,0,1,22,0,3,0,0,0,1,53,72,0,1,42,134,0,1,0,0,1,22,0,3,0,0,0,1,53,48,0,1,42,116,0,1,0,0, +1,23,0,3,0,0,0,1,53,42,0,1,42,98,0,1,0,0,1,22,0,3,0,0,0,1,42,80,0,2,56,38,0,20,0,1,0,0,1,17,0,1,0,2,3,238,4,193,0,3,0,0,0,1,42,52,0,2,52,252,17,64,0,1, +0,0,1,16,0,3,0,0,0,1,52,220,0,2,42,32,52,232,0,0,0,3,0,0,0,1,52,204,0,3,42,16,52,216,17,28,0,1,0,0,1,22,0,3,0,0,0,1,55,208,0,2,55,208,41,250,0,1,0,0,1,21,0,3, +0,1,35,10,0,1,55,188,0,1,41,230,0,1,0,0,1,20,0,3,0,0,0,1,52,148,0,2,52,148,41,210,0,1,0,0,1,21,0,3,0,1,52,80,0,1,52,128,0,1,41,190,0,1,0,0,1,20,0,3,0,0,0,1, +52,102,0,2,52,102,41,170,0,1,0,0,1,21,0,3,0,1,47,154,0,1,52,82,0,1,41,150,0,1,0,0,1,20,0,3,0,0,0,1,52,74,0,2,52,74,41,130,0,1,0,0,1,21,0,3,0,1,51,250,0,1,52,54, +0,1,41,110,0,1,0,0,1,20,0,3,0,1,2,134,0,1,55,48,0,0,0,1,0,0,1,19,0,3,0,1,2,116,0,1,52,10,0,0,0,1,0,0,1,19,0,3,0,1,2,98,0,1,51,242,0,0,0,1,0,0,1,19, +0,3,0,1,2,80,0,1,51,236,0,0,0,1,0,0,1,19,0,3,0,1,2,62,0,1,54,232,0,1,54,232,0,1,0,0,1,18,0,3,0,2,34,34,2,42,0,1,54,212,0,0,0,1,0,0,1,17,0,3,0,1,2,22, +0,1,51,172,0,1,51,172,0,1,0,0,1,18,0,3,0,2,51,104,2,2,0,1,51,152,0,0,0,1,0,0,1,17,0,3,0,1,1,238,0,1,51,126,0,1,51,126,0,1,0,0,1,18,0,3,0,2,46,178,1,218,0,1, +51,106,0,0,0,1,0,0,1,17,0,3,0,1,1,198,0,1,51,98,0,1,51,98,0,1,0,0,1,18,0,3,0,2,51,18,1,178,0,1,51,78,0,0,0,1,0,0,1,17,0,3,0,1,1,158,0,1,43,174,0,1,40,114, +0,1,0,0,1,14,0,3,0,1,1,138,0,1,41,60,0,1,40,94,0,1,0,0,1,14,0,3,0,1,1,118,0,1,54,32,0,1,40,74,0,1,0,0,1,16,0,3,0,1,1,98,0,1,50,248,0,1,40,54,0,1,0,0, +1,16,0,3,0,1,1,78,0,1,50,222,0,1,40,34,0,1,0,0,1,16,0,3,0,1,1,58,0,1,50,214,0,1,40,14,0,1,0,0,1,16,0,3,0,1,1,38,0,1,53,208,0,2,53,208,39,250,0,1,0,0,1,15, +0,3,0,2,33,8,1,16,0,1,53,186,0,1,39,228,0,1,0,0,1,14,0,3,0,1,0,250,0,1,50,144,0,2,50,144,39,206,0,1,0,0,1,15,0,3,0,2,50,74,0,228,0,1,50,122,0,1,39,184,0,1,0,0, +1,14,0,3,0,1,0,206,0,1,50,94,0,2,50,94,39,162,0,1,0,0,1,15,0,3,0,2,45,144,0,184,0,1,50,72,0,1,39,140,0,1,0,0,1,14,0,3,0,1,0,162,0,1,50,62,0,2,50,62,39,118,0,1, +0,0,1,15,0,3,0,2,49,236,0,140,0,1,50,40,0,1,39,96,0,1,0,0,1,14,0,3,0,1,0,56,0,1,39,74,0,0,0,1,0,0,1,15,0,3,0,1,0,38,0,1,39,56,0,1,0,20,0,1,0,0,1,14, +0,1,0,7,3,226,3,229,3,238,4,193,4,195,4,196,6,51,0,1,0,20,4,110,4,111,4,116,4,117,4,119,4,120,6,170,6,171,6,173,6,179,6,183,6,185,6,186,6,187,6,189,6,190,6,198,6,199,6,201,6,203,0,3, +0,1,0,18,0,1,49,168,0,2,49,168,49,168,0,0,0,1,0,2,6,183,6,185,0,3,0,1,49,142,0,1,49,142,0,1,38,204,0,0,0,3,0,1,49,126,0,1,49,126,0,2,49,126,38,188,0,0,0,2,0,0,0,1, +0,8,0,1,0,10,0,2,0,24,0,18,0,1,0,2,4,32,4,33,0,2,4,108,4,109,0,3,4,108,4,107,4,109,0,1,0,0,0,1,0,8,0,1,1,0,0,21,0,1,0,0,0,1,0,8,0,1,0,242,0,15,0,6, +0,0,0,4,0,162,0,80,0,44,0,14,0,3,0,1,0,20,0,1,0,222,0,1,0,20,0,1,0,0,1,11,0,2,0,1,3,155,3,166,0,0,0,3,0,1,0,20,0,1,0,192,0,1,0,20,0,1,0,0,1,10,0,2, +0,2,3,144,3,154,0,0,6,111,6,112,0,11,0,3,0,1,0,72,0,1,0,156,0,1,0,20,0,1,0,0,1,9,0,1,0,24,0,1,0,13,0,14,0,20,0,24,0,34,0,134,0,146,0,147,0,153,0,157,0,167,3,155, +3,156,3,157,3,158,3,159,3,160,3,161,3,162,3,163,3,164,3,165,3,166,0,1,0,3,3,155,3,156,3,166,0,3,0,1,0,80,0,1,0,74,0,1,0,20,0,1,0,0,1,8,0,1,0,25,0,1,0,13,0,14,0,20, +0,24,0,34,0,134,0,146,0,147,0,153,0,157,0,167,3,144,3,145,3,146,3,147,3,148,3,149,3,150,3,151,3,152,3,153,3,154,6,111,6,112,0,1,0,1,1,0,0,1,0,2,3,144,3,154,0,1,0,0,0,1,0,8, +0,2,0,116,0,2,4,104,3,253,0,6,0,0,0,4,0,72,0,56,0,32,0,14,0,3,0,0,0,1,0,182,0,1,51,34,0,1,0,0,1,6,0,3,0,1,0,18,0,1,51,16,0,0,0,1,0,0,1,6,0,1,0,1, +3,253,0,3,0,0,0,1,0,140,0,2,50,248,0,146,0,0,0,3,0,1,0,130,0,1,0,124,0,1,50,232,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,252,4,103,0,1,0,2,3,238,3,239,0,6,0,0, +0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,50,176,0,1,0,68,0,1,0,0,1,4,0,3,0,1,29,236,0,1,0,50,0,0,0,1,0,0,1,4,0,3,0,0,0,1,50,140,0,2,0,32,0,38,0,0,0,3, +0,1,0,22,0,1,50,124,0,1,0,16,0,0,0,1,0,1,3,239,0,2,0,4,0,1,4,130,0,0,4,137,7,2,4,130,7,4,7,17,6,252,7,19,7,51,7,10,0,1,0,0,0,1,0,8,0,2,0,12,0,3,3,243, +4,252,4,253,0,1,0,3,3,226,4,195,4,196,0,6,0,0,0,5,0,104,0,76,0,52,0,34,0,16,0,3,0,0,0,1,37,36,0,1,36,228,0,1,0,0,1,2,0,3,0,0,0,1,36,210,0,1,37,18,0,1,0,0, +1,2,0,3,0,1,0,18,0,1,36,192,0,0,0,1,0,0,1,1,0,1,0,1,3,243,0,3,0,1,0,18,0,1,36,232,0,0,0,1,0,0,1,1,0,1,0,3,3,243,4,252,4,253,0,3,0,0,0,1,36,204,0,2, +36,140,40,192,0,0,0,1,0,0,0,1,0,8,0,1,49,172,0,119,0,6,0,0,0,6,0,102,0,86,0,70,0,54,0,36,0,18,0,3,0,0,0,1,49,148,0,1,49,148,0,1,0,0,0,255,0,3,0,1,28,208,0,1, +49,130,0,0,0,1,0,0,0,254,0,3,0,0,0,1,49,112,0,2,49,112,35,154,0,0,0,3,0,1,35,138,0,1,49,96,0,1,49,96,0,0,0,3,0,0,0,1,49,80,0,2,49,80,49,80,0,0,0,3,0,1,49,64, +0,1,49,64,0,1,49,64,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,252,4,100,0,1,0,2,3,238,4,195,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,49,8,0,1,45,238,0,1, +0,0,0,252,0,3,0,1,28,68,0,1,45,220,0,0,0,1,0,0,0,252,0,3,0,0,0,1,48,228,0,2,45,202,45,202,0,0,0,3,0,1,48,212,0,1,48,212,0,1,45,186,0,0,0,1,0,0,0,1,0,8,0,2, +19,162,0,2,4,99,3,252,0,6,0,0,0,6,0,102,0,86,0,70,0,54,0,36,0,18,0,3,0,0,0,1,48,160,0,1,36,104,0,1,0,0,0,250,0,3,0,1,27,220,0,1,36,86,0,0,0,1,0,0,0,250,0,3, +0,1,36,68,0,1,48,124,0,1,36,68,0,0,0,3,0,0,0,1,48,108,0,2,36,52,48,108,0,0,0,3,0,0,0,1,48,92,0,2,36,36,36,36,0,0,0,3,0,1,48,76,0,1,48,76,0,1,36,20,0,0,0,1, +0,0,0,1,0,8,0,1,0,108,0,20,0,1,0,0,0,1,0,8,0,1,0,94,0,107,0,6,0,0,0,4,0,72,0,56,0,32,0,14,0,3,0,0,0,1,0,74,0,1,0,74,0,1,0,0,0,248,0,3,0,1,0,18, +0,1,0,56,0,0,0,1,0,0,0,247,0,1,0,1,3,247,0,3,0,0,0,1,0,32,0,2,0,32,0,32,0,0,0,3,0,1,0,16,0,1,0,16,0,1,0,16,0,0,0,1,0,1,3,227,0,1,0,0,0,1,0,8, +0,1,36,236,0,18,0,1,0,0,0,1,0,8,0,1,36,222,0,109,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,36,202,0,1,36,202,0,1,0,0,0,245,0,3,0,1,0,230,0,1,36,184,0,0, +0,1,0,0,0,244,0,3,0,0,0,1,36,166,0,2,36,166,36,166,0,0,0,3,0,1,36,150,0,1,36,150,0,1,36,150,0,0,0,1,0,0,0,1,0,8,0,2,1,208,0,2,4,83,3,249,0,6,0,0,0,4,0,66, +0,50,0,32,0,14,0,3,0,0,0,1,36,102,0,1,30,122,0,1,0,0,0,242,0,3,0,1,0,130,0,1,30,104,0,0,0,1,0,0,0,242,0,3,0,0,0,1,36,66,0,2,30,86,30,86,0,0,0,3,0,1,36,50, +0,1,36,50,0,1,30,70,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,249,4,85,0,1,0,2,3,231,4,193,0,6,0,0,0,6,0,108,0,92,0,76,0,60,0,36,0,18,0,3,0,0,0,1,35,246,0,1, +32,238,0,1,0,0,0,240,0,3,0,1,0,18,0,1,32,220,0,0,0,1,0,0,0,240,0,1,0,1,3,249,0,3,0,1,43,140,0,1,35,204,0,1,32,196,0,0,0,3,0,1,35,182,0,1,35,188,0,1,32,180,0,0, +0,3,0,0,0,1,35,172,0,2,32,164,32,164,0,0,0,3,0,1,35,156,0,1,35,156,0,1,32,148,0,0,0,1,0,0,0,1,0,8,0,1,26,28,1,199,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0, +0,1,26,8,0,1,26,8,0,1,0,0,0,238,0,3,0,1,26,16,0,1,25,246,0,0,0,1,0,0,0,237,0,3,0,0,0,1,25,228,0,2,25,228,25,228,0,0,0,3,0,1,25,212,0,1,25,212,0,1,25,212,0,0, +0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,255,6,134,0,1,0,2,4,189,4,195,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,25,156,0,1,42,184,0,1,0,0,0,235,0,3,0,1,25,164, +0,1,42,166,0,0,0,1,0,0,0,235,0,3,0,0,0,1,25,120,0,2,42,148,42,148,0,0,0,3,0,1,25,104,0,1,25,104,0,1,42,132,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,245,4,72,0,1, +0,2,3,224,3,231,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,28,172,0,1,34,152,0,1,0,0,0,233,0,3,0,1,23,104,0,1,34,134,0,0,0,1,0,0,0,233,0,3,0,0,0,1,28,136, +0,2,34,116,34,116,0,0,0,3,0,1,28,120,0,1,28,120,0,1,34,100,0,0,0,1,0,0,0,1,0,8,0,1,28,96,0,100,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,28,76,0,1,28,76, +0,1,0,0,0,231,0,3,0,1,23,8,0,1,28,58,0,0,0,1,0,0,0,230,0,3,0,0,0,1,28,40,0,2,28,40,28,40,0,0,0,3,0,1,28,24,0,1,28,24,0,1,28,24,0,0,0,1,0,0,0,1,0,8, +0,2,0,10,0,2,3,245,4,67,0,1,0,2,3,224,4,26,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,27,224,0,1,33,250,0,1,0,0,0,228,0,3,0,1,22,156,0,1,33,232,0,0,0,1, +0,0,0,228,0,3,0,0,0,1,27,188,0,2,33,214,33,214,0,0,0,3,0,1,27,172,0,1,27,172,0,1,33,198,0,0,0,1,0,0,0,1,0,8,0,2,22,14,0,2,3,245,4,73,0,6,0,0,0,4,0,66,0,50, +0,32,0,14,0,3,0,0,0,1,27,124,0,1,30,96,0,1,0,0,0,226,0,3,0,1,22,56,0,1,30,78,0,0,0,1,0,0,0,226,0,3,0,0,0,1,27,88,0,2,30,60,30,60,0,0,0,3,0,1,27,72,0,1, +27,72,0,1,30,44,0,0,0,1,0,0,0,1,0,8,0,1,0,108,0,38,0,1,0,0,0,1,0,8,0,1,0,94,1,199,0,6,0,0,0,4,0,72,0,56,0,32,0,14,0,3,0,0,0,1,0,74,0,1,0,74,0,1, +0,0,0,224,0,3,0,1,0,18,0,1,0,56,0,0,0,1,0,0,0,223,0,1,0,1,5,5,0,3,0,0,0,1,0,32,0,2,0,32,0,32,0,0,0,3,0,1,0,16,0,1,0,16,0,1,0,16,0,0,0,1,0,1, +4,223,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,251,4,97,0,1,0,2,3,237,4,34,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,22,46,0,1,22,40,0,1,0,0,0,221,0,3,0,1, +21,230,0,1,22,22,0,0,0,1,0,0,0,221,0,3,0,0,0,1,22,10,0,2,22,4,22,4,0,0,0,3,0,1,21,250,0,1,21,250,0,1,21,244,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,95,3,251, +0,1,0,2,3,231,3,237,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,21,194,0,1,32,22,0,1,0,0,0,219,0,3,0,1,21,122,0,1,32,4,0,0,0,1,0,0,0,219,0,3,0,0,0,1, +21,158,0,2,31,242,31,242,0,0,0,3,0,1,21,142,0,1,21,142,0,1,31,226,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,251,4,90,0,1,0,2,3,237,4,3,0,6,0,0,0,4,0,66,0,50,0,32, +0,14,0,3,0,0,0,1,21,86,0,1,31,164,0,1,0,0,0,217,0,3,0,1,21,14,0,1,31,146,0,0,0,1,0,0,0,217,0,3,0,0,0,1,21,50,0,2,31,128,31,128,0,0,0,3,0,1,21,34,0,1,21,34, +0,1,31,112,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,94,3,251,0,1,0,2,3,229,3,237,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,20,234,0,1,31,114,0,1,0,0,0,215, +0,3,0,1,20,162,0,1,31,96,0,0,0,1,0,0,0,215,0,3,0,0,0,1,20,198,0,2,31,78,31,78,0,0,0,3,0,1,20,182,0,1,20,182,0,1,31,62,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2, +3,251,4,96,0,1,0,2,3,237,4,193,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,20,126,0,1,27,202,0,1,0,0,0,213,0,3,0,1,20,54,0,1,27,184,0,0,0,1,0,0,0,213,0,3, +0,0,0,1,20,90,0,2,27,166,27,166,0,0,0,3,0,1,20,74,0,1,20,74,0,1,27,150,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,93,3,251,0,1,0,2,3,226,3,237,0,6,0,0,0,4,0,66, +0,50,0,32,0,14,0,3,0,0,0,1,20,18,0,1,28,60,0,1,0,0,0,211,0,3,0,1,19,202,0,1,28,42,0,0,0,1,0,0,0,211,0,3,0,0,0,1,19,238,0,2,28,24,28,24,0,0,0,3,0,1,19,222, +0,1,19,222,0,1,28,8,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,251,4,92,0,1,0,2,3,237,4,7,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,19,166,0,1,25,234,0,1, +0,0,0,209,0,3,0,1,19,94,0,1,25,216,0,0,0,1,0,0,0,209,0,3,0,0,0,1,19,130,0,2,25,198,25,198,0,0,0,3,0,1,19,114,0,1,19,114,0,1,25,182,0,0,0,1,0,0,0,1,0,8,0,2, +0,10,0,2,3,251,4,91,0,1,0,2,3,237,4,5,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,19,58,0,1,11,4,0,1,0,0,0,207,0,3,0,1,18,242,0,1,10,242,0,0,0,1,0,0, +0,207,0,3,0,0,0,1,19,22,0,2,10,224,10,224,0,0,0,3,0,1,19,6,0,1,19,6,0,1,10,208,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,158,5,2,0,1,0,2,3,238,4,196,0,6,0,0, +0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,36,226,0,1,39,240,0,1,0,0,0,205,0,3,0,1,36,148,0,1,39,222,0,0,0,1,0,0,0,205,0,3,0,0,0,1,36,190,0,2,39,204,39,204,0,0,0,3, +0,1,36,174,0,1,36,174,0,1,39,188,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,149,5,2,0,1,0,2,4,189,4,196,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,36,118,0,1, +19,78,0,1,0,0,0,203,0,3,0,1,36,40,0,1,19,60,0,0,0,1,0,0,0,203,0,3,0,0,0,1,36,82,0,2,19,42,19,42,0,0,0,3,0,1,36,66,0,1,36,66,0,1,19,26,0,0,0,1,0,0,0,1, +0,8,0,2,26,0,0,2,6,152,5,2,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,36,18,0,1,36,6,0,1,0,0,0,201,0,3,0,1,35,196,0,1,35,244,0,0,0,1,0,0,0,201,0,3, +0,0,0,1,35,238,0,2,35,226,35,226,0,0,0,3,0,1,35,222,0,1,35,222,0,1,35,210,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,151,5,2,0,1,0,2,4,193,4,196,0,6,0,0,0,7,0,122, +0,106,0,88,0,72,0,56,0,38,0,20,0,3,0,0,0,1,35,160,0,1,24,216,0,1,0,0,0,199,0,3,0,1,35,82,0,1,24,198,0,0,0,1,0,0,0,199,0,3,0,0,0,1,35,124,0,2,24,180,2,214,0,0, +0,3,0,1,24,164,0,1,35,108,0,1,24,164,0,0,0,3,0,2,27,156,27,150,0,1,35,92,0,1,24,148,0,0,0,3,0,0,0,1,35,74,0,2,24,130,24,130,0,0,0,3,0,1,35,58,0,1,35,58,0,1,24,114, +0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,147,5,2,0,1,0,2,4,141,4,196,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,35,2,0,1,18,76,0,1,0,0,0,197,0,3,0,1, +34,180,0,1,18,58,0,0,0,1,0,0,0,197,0,3,0,0,0,1,34,222,0,2,18,40,18,40,0,0,0,3,0,1,34,206,0,1,34,206,0,1,18,24,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,141,5,2, +0,1,0,2,3,235,4,196,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,34,150,0,1,25,108,0,1,0,0,0,195,0,3,0,1,34,72,0,1,25,90,0,0,0,1,0,0,0,195,0,3,0,0,0,1, +34,114,0,2,25,72,25,72,0,0,0,3,0,1,34,98,0,1,34,98,0,1,25,56,0,0,0,1,0,0,0,1,0,8,0,2,18,186,0,2,5,2,6,155,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1, +34,50,0,1,25,172,0,1,0,0,0,193,0,3,0,1,33,228,0,1,25,154,0,0,0,1,0,0,0,193,0,3,0,0,0,1,34,14,0,2,25,136,25,136,0,0,0,3,0,1,33,254,0,1,33,254,0,1,25,120,0,0,0,1, +0,0,0,1,0,8,0,1,26,84,0,35,0,6,0,0,0,6,0,102,0,86,0,70,0,54,0,36,0,18,0,3,0,0,0,1,26,60,0,1,26,60,0,1,0,0,0,191,0,3,0,1,25,218,0,1,26,42,0,0,0,1,0,0, +0,190,0,3,0,0,0,1,26,24,0,2,26,24,33,24,0,0,0,3,0,1,33,8,0,1,26,8,0,1,26,8,0,0,0,3,0,0,0,1,25,248,0,2,25,248,25,248,0,0,0,3,0,1,25,232,0,1,25,232,0,1,25,232, +0,0,0,1,0,0,0,1,0,8,0,2,8,214,0,2,4,41,4,63,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,25,184,0,1,24,196,0,1,0,0,0,188,0,3,0,1,25,86,0,1,24,178,0,0, +0,1,0,0,0,188,0,3,0,0,0,1,25,148,0,2,24,160,24,160,0,0,0,3,0,1,25,132,0,1,25,132,0,1,24,144,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,137,5,1,0,1,0,2,4,193,4,195, +0,6,0,0,0,6,0,118,0,102,0,86,0,54,0,36,0,18,0,3,0,0,0,1,32,206,0,1,22,18,0,1,0,0,0,186,0,3,0,1,28,4,0,1,22,0,0,0,0,1,0,0,0,186,0,3,0,0,0,1,32,170,0,2, +21,238,0,16,0,0,0,1,0,6,3,226,3,229,3,238,4,195,4,196,6,51,0,3,0,1,21,206,0,1,32,138,0,1,21,206,0,0,0,3,0,0,0,1,32,122,0,2,21,190,21,190,0,0,0,3,0,1,32,106,0,1,32,106, +0,1,21,174,0,0,0,1,0,0,0,1,0,8,0,1,24,210,0,106,0,6,0,0,0,6,0,108,0,92,0,74,0,54,0,36,0,18,0,3,0,0,0,1,24,186,0,1,24,186,0,1,0,0,0,184,0,3,0,1,24,76,0,1, +24,168,0,0,0,1,0,0,0,183,0,3,0,3,32,34,24,98,24,92,0,1,24,150,0,1,24,150,0,0,0,3,0,2,24,78,24,72,0,1,24,130,0,1,24,130,0,0,0,3,0,0,0,1,24,112,0,2,24,112,24,112,0,0, +0,3,0,1,24,96,0,1,24,96,0,1,24,96,0,0,0,1,0,0,0,1,0,8,0,2,18,64,0,2,3,248,4,81,0,6,0,0,0,7,0,126,0,110,0,92,0,72,0,56,0,38,0,20,0,3,0,0,0,1,24,42,0,1, +20,238,0,1,0,0,0,181,0,3,0,1,23,188,0,1,20,220,0,0,0,1,0,0,0,181,0,3,0,1,20,202,0,1,24,6,0,1,20,202,0,0,0,3,0,3,31,130,23,194,23,188,0,1,23,246,0,1,20,186,0,0,0,3, +0,2,23,174,23,168,0,1,23,226,0,1,20,166,0,0,0,3,0,0,0,1,23,208,0,2,20,148,20,148,0,0,0,3,0,1,23,192,0,1,23,192,0,1,20,132,0,0,0,1,0,0,0,1,0,8,0,1,20,108,1,198,0,6, +0,0,0,13,0,240,0,224,0,206,0,186,0,168,0,152,0,136,0,118,0,102,0,86,0,68,0,50,0,32,0,3,0,0,0,1,20,70,0,1,20,70,0,1,0,0,0,179,0,3,0,1,18,156,0,1,20,52,0,0,0,1,0,0, +0,178,0,3,0,0,0,1,20,34,0,3,20,34,18,232,20,34,0,0,0,3,0,0,0,1,20,16,0,2,20,16,18,182,0,0,0,3,0,1,18,166,0,1,20,0,0,1,20,0,0,0,0,3,0,2,18,182,19,240,0,1,19,240, +0,1,19,240,0,0,0,3,0,0,0,1,19,222,0,2,19,222,18,190,0,0,0,3,0,1,18,198,0,1,19,206,0,1,19,206,0,0,0,3,0,2,22,198,30,134,0,1,19,190,0,1,19,190,0,0,0,3,0,3,30,116,22,180, +22,174,0,1,19,172,0,1,19,172,0,0,0,3,0,2,22,160,22,154,0,1,19,152,0,1,19,152,0,0,0,3,0,0,0,1,19,134,0,2,19,134,19,134,0,0,0,3,0,1,19,118,0,1,19,118,0,1,19,118,0,0,0,1, +0,0,0,1,0,8,0,2,0,10,0,2,4,150,6,131,0,1,0,2,4,141,4,195,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,13,80,0,1,29,250,0,1,0,0,0,176,0,3,0,1,13,88,0,1, +29,232,0,0,0,1,0,0,0,176,0,3,0,0,0,1,13,44,0,2,29,214,29,214,0,0,0,3,0,1,13,28,0,1,13,28,0,1,29,198,0,0,0,1,0,0,0,1,0,8,0,2,18,100,0,2,3,246,4,77,0,6,0,0, +0,6,0,104,0,88,0,70,0,54,0,36,0,18,0,3,0,0,0,1,19,180,0,1,18,214,0,1,0,0,0,174,0,3,0,1,19,56,0,1,18,196,0,0,0,1,0,0,0,174,0,3,0,1,18,178,0,1,19,144,0,1,18,178, +0,0,0,3,0,2,21,170,21,164,0,1,19,128,0,1,18,162,0,0,0,3,0,0,0,1,19,110,0,2,18,144,18,144,0,0,0,3,0,1,19,94,0,1,19,94,0,1,18,128,0,0,0,1,0,0,0,1,0,8,0,1,19,70, +0,104,0,6,0,0,0,7,0,122,0,106,0,88,0,72,0,56,0,38,0,20,0,3,0,0,0,1,19,44,0,1,19,44,0,1,0,0,0,172,0,3,0,1,18,176,0,1,19,26,0,0,0,1,0,0,0,171,0,3,0,1,18,200, +0,1,19,8,0,1,19,8,0,0,0,3,0,0,0,1,18,248,0,2,18,248,18,184,0,0,0,3,0,2,21,18,21,12,0,1,18,232,0,1,18,232,0,0,0,3,0,0,0,1,18,214,0,2,18,214,18,214,0,0,0,3,0,1, +18,198,0,1,18,198,0,1,18,198,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,66,4,25,0,1,0,2,3,237,4,8,0,6,0,0,0,4,0,72,0,56,0,32,0,14,0,3,0,0,0,1,16,144,0,1,10,100, +0,1,0,0,0,169,0,3,0,1,0,18,0,1,10,82,0,0,0,1,0,0,0,169,0,1,0,1,4,25,0,3,0,0,0,1,16,102,0,2,10,58,10,58,0,0,0,3,0,1,16,86,0,1,16,86,0,1,10,42,0,0,0,1, +0,0,0,1,0,8,0,2,0,10,0,2,4,24,4,65,0,1,0,2,4,7,6,51,0,6,0,0,0,5,0,90,0,74,0,58,0,34,0,16,0,3,0,0,0,1,16,52,0,1,27,254,0,1,0,0,0,167,0,3,0,1,0,18, +0,1,27,236,0,0,0,1,0,0,0,167,0,1,0,1,4,24,0,3,0,0,0,1,16,10,0,2,27,212,15,242,0,0,0,3,0,0,0,1,15,250,0,2,27,196,27,196,0,0,0,3,0,1,15,234,0,1,15,234,0,1,27,180, +0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,23,4,64,0,1,0,2,4,5,6,51,0,6,0,0,0,5,0,90,0,74,0,58,0,34,0,16,0,3,0,0,0,1,1,54,0,1,27,122,0,1,0,0,0,165,0,3, +0,1,0,18,0,1,27,104,0,0,0,1,0,0,0,165,0,1,0,1,4,23,0,3,0,0,0,1,1,12,0,2,27,80,1,50,0,0,0,3,0,0,0,1,0,252,0,2,27,64,27,64,0,0,0,3,0,1,0,236,0,1,0,236, +0,1,27,48,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,125,6,116,0,1,0,2,4,8,6,51,0,6,0,0,0,5,0,84,0,68,0,52,0,34,0,16,0,3,0,0,0,1,26,246,0,1,15,20,0,1,0,0, +0,163,0,3,0,1,26,180,0,1,15,2,0,0,0,1,0,0,0,163,0,3,0,1,15,8,0,1,26,210,0,1,14,240,0,0,0,3,0,0,0,1,26,194,0,2,14,224,14,224,0,0,0,3,0,1,26,178,0,1,26,178,0,1, +14,208,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,124,6,116,0,1,0,2,4,6,6,51,0,6,0,0,0,5,0,90,0,74,0,52,0,34,0,16,0,3,0,0,0,1,26,120,0,1,0,90,0,1,0,0,0,161, +0,3,0,1,26,54,0,1,0,72,0,0,0,1,0,0,0,161,0,3,0,1,0,16,0,1,26,84,0,1,0,54,0,0,0,1,0,1,4,5,0,3,0,0,0,1,26,62,0,2,0,32,0,32,0,0,0,3,0,1,26,46,0,1, +26,46,0,1,0,16,0,0,0,1,0,1,4,6,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,250,4,89,0,1,0,2,3,235,3,238,0,6,0,0,0,6,0,102,0,86,0,70,0,54,0,36,0,18,0,3,0,0,0,1, +16,200,0,1,29,0,0,1,0,0,0,159,0,3,0,1,16,104,0,1,28,238,0,0,0,1,0,0,0,159,0,3,0,0,0,1,16,164,0,2,28,220,16,164,0,0,0,3,0,1,28,204,0,1,16,148,0,1,28,204,0,0,0,3, +0,0,0,1,16,132,0,2,28,188,28,188,0,0,0,3,0,1,16,116,0,1,16,116,0,1,28,172,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,250,4,88,0,1,0,2,3,235,4,195,0,6,0,0,0,4,0,66, +0,50,0,32,0,14,0,3,0,0,0,1,16,60,0,1,25,90,0,1,0,0,0,157,0,3,0,1,15,220,0,1,25,72,0,0,0,1,0,0,0,157,0,3,0,0,0,1,16,24,0,2,25,54,25,54,0,0,0,3,0,1,16,8, +0,1,16,8,0,1,25,38,0,0,0,1,0,0,0,1,0,8,0,1,15,240,0,107,0,6,0,0,0,6,0,102,0,86,0,70,0,54,0,36,0,18,0,3,0,0,0,1,15,216,0,1,15,216,0,1,0,0,0,155,0,3,0,1, +15,120,0,1,15,198,0,0,0,1,0,0,0,154,0,3,0,0,0,1,15,180,0,2,15,180,27,236,0,0,0,3,0,1,27,220,0,1,15,164,0,1,15,164,0,0,0,3,0,0,0,1,15,148,0,2,15,148,15,148,0,0,0,3, +0,1,15,132,0,1,15,132,0,1,15,132,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,160,5,3,0,1,0,2,4,26,4,201,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,15,240,0,1, +16,228,0,1,0,0,0,152,0,3,0,1,15,180,0,1,16,210,0,0,0,1,0,0,0,152,0,3,0,0,0,1,15,204,0,2,16,192,16,192,0,0,0,3,0,1,15,188,0,1,15,188,0,1,16,176,0,0,0,1,0,0,0,1, +0,8,0,2,15,38,0,2,6,162,5,3,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,15,140,0,1,24,6,0,1,0,0,0,150,0,3,0,1,15,80,0,1,23,244,0,0,0,1,0,0,0,150,0,3, +0,0,0,1,15,104,0,2,23,226,23,226,0,0,0,3,0,1,15,88,0,1,15,88,0,1,23,210,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,5,3,6,161,0,1,0,2,4,201,6,42,0,6,0,0,0,4,0,66, +0,50,0,32,0,14,0,3,0,0,0,1,15,32,0,1,0,68,0,1,0,0,0,148,0,3,0,1,14,228,0,1,0,50,0,0,0,1,0,0,0,148,0,3,0,0,0,1,14,252,0,2,0,32,0,32,0,0,0,3,0,1,14,236, +0,1,14,236,0,1,0,16,0,0,0,1,0,1,6,42,0,1,0,0,0,1,0,8,0,1,14,206,1,218,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,14,186,0,1,14,186,0,1,0,0,0,146,0,3, +0,1,14,126,0,1,14,168,0,0,0,1,0,0,0,145,0,3,0,0,0,1,14,150,0,2,14,150,14,150,0,0,0,3,0,1,14,134,0,1,14,134,0,1,14,134,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,165, +5,4,0,1,0,2,4,193,4,203,0,6,0,0,0,4,0,72,0,56,0,32,0,14,0,3,0,0,0,1,0,74,0,1,12,12,0,1,0,0,0,143,0,3,0,1,0,18,0,1,11,250,0,0,0,1,0,0,0,143,0,1,0,1, +5,4,0,3,0,0,0,1,0,32,0,2,11,226,11,226,0,0,0,3,0,1,0,16,0,1,0,16,0,1,11,210,0,0,0,1,0,1,4,203,0,1,0,0,0,1,0,8,0,1,0,108,0,72,0,1,0,0,0,1,0,8,0,1, +0,94,0,80,0,6,0,0,0,4,0,72,0,56,0,32,0,14,0,3,0,0,0,1,0,74,0,1,0,74,0,1,0,0,0,141,0,3,0,1,0,18,0,1,0,56,0,0,0,1,0,0,0,140,0,1,0,1,6,115,0,3,0,0, +0,1,0,32,0,2,0,32,0,32,0,0,0,3,0,1,0,16,0,1,0,16,0,1,0,16,0,0,0,1,0,1,6,43,0,1,0,0,0,1,0,8,0,1,0,138,0,24,0,1,0,0,0,1,0,8,0,1,0,124,0,27,0,6, +0,0,0,5,0,100,0,82,0,56,0,36,0,16,0,3,0,0,0,1,0,102,0,2,0,102,0,102,0,1,0,0,0,138,0,3,0,1,0,40,0,1,0,82,0,1,0,82,0,1,0,0,0,137,0,3,0,2,0,20,0,20,0,1, +0,62,0,0,0,1,0,0,0,136,0,1,0,1,1,19,0,3,0,0,0,1,0,36,0,3,0,36,0,36,0,36,0,0,0,3,0,1,0,18,0,1,0,18,0,2,0,18,0,18,0,0,0,1,0,1,0,251,0,1,0,0,0,1, +0,8,0,1,24,120,0,14,0,1,0,0,0,1,0,8,0,1,24,106,0,120,0,6,0,0,0,5,0,94,0,76,0,56,0,36,0,16,0,3,0,0,0,1,24,84,0,2,24,84,24,84,0,1,0,0,0,134,0,3,0,1,3,142, +0,1,24,64,0,1,24,64,0,1,0,0,0,133,0,3,0,2,3,122,3,122,0,1,24,44,0,0,0,1,0,0,0,132,0,3,0,0,0,1,24,24,0,3,24,24,24,24,24,24,0,0,0,3,0,1,24,6,0,1,24,6,0,2, +24,6,24,6,0,0,0,1,0,0,0,1,0,8,0,1,3,182,0,66,0,1,0,0,0,1,0,8,0,1,3,168,1,200,0,6,0,0,0,5,0,94,0,76,0,56,0,36,0,16,0,3,0,0,0,1,3,146,0,2,3,146,3,146, +0,1,0,0,0,130,0,3,0,1,3,152,0,1,3,126,0,1,3,126,0,1,0,0,0,129,0,3,0,2,3,132,3,132,0,1,3,106,0,0,0,1,0,0,0,128,0,3,0,0,0,1,3,86,0,3,3,86,3,86,3,86,0,0, +0,3,0,1,3,68,0,1,3,68,0,2,3,68,3,68,0,0,0,1,0,0,0,1,0,8,0,1,6,166,0,101,0,6,0,0,0,5,0,94,0,76,0,56,0,36,0,16,0,3,0,0,0,1,6,144,0,2,6,144,6,144,0,1, +0,0,0,126,0,3,0,1,1,74,0,1,6,124,0,1,6,124,0,1,0,0,0,125,0,3,0,2,1,54,1,54,0,1,6,104,0,0,0,1,0,0,0,124,0,3,0,0,0,1,6,84,0,3,6,84,6,84,6,84,0,0,0,3, +0,1,6,66,0,1,6,66,0,2,6,66,6,66,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,245,4,71,0,1,0,2,3,224,4,196,0,6,0,0,0,5,0,94,0,76,0,56,0,36,0,16,0,3,0,0,0,1, +6,6,0,2,6,6,19,178,0,1,0,0,0,122,0,3,0,1,0,192,0,1,5,242,0,1,19,158,0,1,0,0,0,121,0,3,0,2,0,172,0,172,0,1,19,138,0,0,0,1,0,0,0,121,0,3,0,0,0,1,5,202,0,3, +5,202,19,118,19,118,0,0,0,3,0,1,5,184,0,1,5,184,0,2,5,184,19,100,0,0,0,1,0,0,0,1,0,8,0,1,5,158,0,21,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,245,4,70,0,1,0,2,3,224, +4,193,0,6,0,0,0,5,0,100,0,82,0,56,0,36,0,16,0,3,0,0,0,1,5,110,0,2,5,110,8,82,0,1,0,0,0,119,0,3,0,1,0,40,0,1,5,90,0,1,8,62,0,1,0,0,0,118,0,3,0,2,0,20, +0,20,0,1,8,42,0,0,0,1,0,0,0,118,0,1,0,1,3,245,0,3,0,0,0,1,5,44,0,3,5,44,8,16,8,16,0,0,0,3,0,1,5,26,0,1,5,26,0,2,5,26,7,254,0,0,0,1,0,0,0,1,0,8, +0,2,0,12,0,3,3,251,4,98,4,42,0,1,0,3,3,237,4,3,4,34,0,6,0,0,0,5,0,106,0,88,0,56,0,36,0,16,0,3,0,0,0,1,0,114,0,2,0,108,10,192,0,1,0,0,0,116,0,3,0,1,0,40, +0,1,0,88,0,1,10,172,0,1,0,0,0,116,0,3,0,2,0,26,0,20,0,1,10,152,0,0,0,1,0,0,0,116,0,1,0,1,3,251,0,1,0,1,4,42,0,3,0,0,0,1,0,42,0,3,0,36,10,120,10,120,0,0, +0,3,0,1,0,24,0,1,0,24,0,2,0,18,10,102,0,0,0,1,0,1,4,34,0,1,0,1,3,237,0,1,0,0,0,1,0,8,0,2,0,12,0,3,3,252,6,159,5,2,0,1,0,3,3,238,4,195,4,196,0,6,0,0, +0,5,0,100,0,82,0,56,0,36,0,16,0,3,0,0,0,1,17,224,0,2,20,238,17,212,0,1,0,0,0,114,0,3,0,1,17,144,0,1,20,218,0,1,17,192,0,1,0,0,0,114,0,3,0,2,0,20,17,124,0,1,17,172, +0,0,0,1,0,0,0,114,0,1,0,1,3,252,0,3,0,0,0,1,17,158,0,3,20,172,17,146,17,146,0,0,0,3,0,1,17,140,0,1,17,140,0,2,20,154,17,128,0,0,0,1,0,0,0,1,0,8,0,2,0,12,0,3, +4,255,6,150,5,2,0,1,0,3,4,189,4,195,4,196,0,6,0,0,0,3,0,58,0,32,0,12,0,3,0,0,0,1,17,80,0,2,0,40,17,68,0,1,0,0,0,112,0,3,0,1,17,0,0,1,0,20,0,1,17,48,0,1, +0,0,0,112,0,1,0,1,4,189,0,3,0,2,0,20,16,230,0,1,17,22,0,0,0,1,0,0,0,112,0,1,0,1,4,255,0,1,0,0,0,1,0,8,0,2,0,12,0,3,4,150,6,148,5,2,0,1,0,3,4,141,4,195, +4,196,0,6,0,0,0,3,0,58,0,32,0,12,0,3,0,0,0,1,16,222,0,2,0,40,16,210,0,1,0,0,0,110,0,3,0,1,16,142,0,1,0,20,0,1,16,190,0,1,0,0,0,110,0,1,0,1,4,141,0,3,0,2, +0,20,16,116,0,1,16,164,0,0,0,1,0,0,0,110,0,1,0,1,4,150,0,1,0,0,0,1,0,8,0,2,0,12,0,3,3,250,6,142,5,2,0,1,0,3,3,235,4,195,4,196,0,6,0,0,0,3,0,52,0,32,0,12, +0,3,0,0,0,1,16,108,0,2,7,66,16,96,0,1,0,0,0,108,0,3,0,1,16,28,0,1,7,46,0,1,16,76,0,1,0,0,0,108,0,3,0,2,6,204,16,8,0,1,16,56,0,0,0,1,0,0,0,108,0,1,0,0, +0,1,0,8,0,2,0,12,0,3,6,156,5,2,5,3,0,1,0,3,4,195,4,196,4,201,0,6,0,0,0,5,0,94,0,76,0,56,0,36,0,16,0,3,0,0,0,1,16,2,0,2,7,124,15,246,0,1,0,0,0,106,0,3, +0,1,15,178,0,1,7,104,0,1,15,226,0,1,0,0,0,106,0,3,0,2,7,42,15,158,0,1,15,206,0,0,0,1,0,0,0,106,0,3,0,0,0,1,15,198,0,3,7,64,15,186,15,186,0,0,0,3,0,1,15,180,0,1, +15,180,0,2,7,46,15,168,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,5,2,6,157,0,1,0,2,4,196,4,201,0,6,0,0,0,5,0,94,0,76,0,56,0,36,0,16,0,3,0,0,0,1,15,120,0,2,6,242, +6,242,0,1,0,0,0,103,0,3,0,1,15,40,0,1,6,222,0,1,6,222,0,1,0,0,0,104,0,3,0,2,6,160,15,20,0,1,6,202,0,0,0,1,0,0,0,103,0,3,0,0,0,1,15,60,0,3,6,182,6,182,6,182, +0,0,0,3,0,1,15,42,0,1,15,42,0,2,6,164,6,164,0,0,0,1,0,0,0,1,0,8,0,1,7,126,0,36,0,6,0,0,0,7,0,134,0,116,0,98,0,80,0,60,0,40,0,20,0,3,0,0,0,1,7,100,0,2, +7,100,7,100,0,1,0,0,0,101,0,3,0,1,7,0,0,1,7,80,0,1,7,80,0,1,0,0,0,100,0,3,0,2,6,236,6,236,0,1,7,60,0,0,0,1,0,0,0,99,0,3,0,0,0,1,7,40,0,3,7,40,7,40, +14,40,0,0,0,3,0,1,14,22,0,1,7,22,0,2,7,22,7,22,0,0,0,3,0,0,0,1,7,4,0,3,7,4,7,4,7,4,0,0,0,3,0,1,6,242,0,1,6,242,0,2,6,242,6,242,0,0,0,1,0,0,0,1, +0,8,0,1,6,222,0,19,0,1,0,0,0,1,0,8,0,2,0,10,0,2,4,80,3,248,0,1,0,2,3,224,3,229,0,6,0,0,0,7,0,140,0,122,0,102,0,80,0,60,0,40,0,20,0,3,0,0,0,1,6,170,0,2, +6,170,0,138,0,1,0,0,0,97,0,3,0,1,6,58,0,1,6,150,0,1,0,118,0,1,0,0,0,96,0,3,0,2,6,38,6,38,0,1,0,98,0,0,0,1,0,0,0,96,0,3,0,3,13,250,6,58,6,52,0,1,6,110, +0,2,6,110,0,78,0,0,0,3,0,2,6,36,6,30,0,1,6,88,0,2,6,88,0,56,0,0,0,3,0,0,0,1,6,68,0,3,6,68,0,36,0,36,0,0,0,3,0,1,6,50,0,1,6,50,0,2,6,50,0,18,0,0, +0,1,0,1,3,224,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,248,4,82,0,1,0,2,3,229,4,193,0,6,0,0,0,8,0,160,0,142,0,122,0,100,0,82,0,62,0,42,0,22,0,3,0,0,0,1,5,234,0,2, +2,174,2,174,0,1,0,0,0,93,0,3,0,1,5,122,0,1,2,154,0,1,2,154,0,1,0,0,0,94,0,3,0,2,0,238,5,102,0,1,2,134,0,0,0,1,0,0,0,93,0,3,0,1,2,114,0,1,5,174,0,2,2,114, +2,114,0,0,0,3,0,3,13,40,5,104,5,98,0,1,5,156,0,2,2,96,2,96,0,0,0,3,0,2,5,82,5,76,0,1,5,134,0,2,2,74,2,74,0,0,0,3,0,0,0,1,5,114,0,3,2,54,2,54,2,54,0,0, +0,3,0,1,5,96,0,1,5,96,0,2,2,36,2,36,0,0,0,1,0,0,0,1,0,8,0,1,2,10,0,63,0,1,0,0,0,1,0,8,0,1,1,252,1,199,0,6,0,0,0,14,1,68,1,50,1,30,1,8,0,244,0,220, +0,196,0,168,0,138,0,120,0,100,0,74,0,54,0,34,0,3,0,0,0,1,1,212,0,2,1,212,1,212,0,1,0,0,0,91,0,3,0,1,0,40,0,1,1,192,0,1,1,192,0,1,0,0,0,90,0,3,0,2,0,20,0,20, +0,1,1,172,0,0,0,1,0,0,0,89,0,1,0,1,5,0,0,3,0,0,0,1,1,146,0,4,1,146,1,146,0,88,1,146,0,0,0,3,0,0,0,1,1,126,0,3,1,126,1,126,0,36,0,0,0,3,0,1,0,18,0,1, +1,108,0,2,1,108,1,108,0,0,0,1,0,4,3,238,4,195,4,196,6,51,0,3,0,2,0,20,1,78,0,1,1,78,0,2,1,78,1,78,0,0,0,1,0,2,3,226,3,229,0,3,0,0,0,1,1,50,0,3,1,50,1,50, +0,18,0,0,0,1,0,1,4,8,0,3,0,1,0,18,0,1,1,26,0,2,1,26,1,26,0,0,0,1,0,1,4,7,0,3,0,2,4,10,11,202,0,1,1,2,0,2,1,2,1,2,0,0,0,3,0,3,11,182,3,246,3,240, +0,1,0,238,0,2,0,238,0,238,0,0,0,3,0,2,3,224,3,218,0,1,0,216,0,2,0,216,0,216,0,0,0,3,0,0,0,1,0,196,0,3,0,196,0,196,0,196,0,0,0,3,0,1,0,178,0,1,0,178,0,2,0,178, +0,178,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,3,246,4,76,0,1,0,2,3,226,4,193,0,6,0,0,0,6,0,116,0,98,0,78,0,58,0,38,0,18,0,3,0,0,0,1,1,82,0,2,1,82,0,116,0,1, +0,0,0,87,0,3,0,1,0,212,0,1,1,62,0,1,0,96,0,1,0,0,0,86,0,3,0,2,0,192,0,192,0,1,0,76,0,0,0,1,0,0,0,86,0,3,0,2,3,64,3,58,0,1,1,22,0,2,1,22,0,56,0,0, +0,3,0,0,0,1,1,2,0,3,1,2,0,36,0,36,0,0,0,3,0,1,0,240,0,1,0,240,0,2,0,240,0,18,0,0,0,1,0,1,4,193,0,1,0,0,0,1,0,8,0,1,0,208,0,20,0,1,0,0,0,1,0,8, +0,1,0,194,0,105,0,6,0,0,0,8,0,170,0,152,0,132,0,106,0,88,0,62,0,42,0,22,0,3,0,0,0,1,0,166,0,2,0,166,0,166,0,1,0,0,0,84,0,3,0,1,0,40,0,1,0,146,0,1,0,146,0,1, +0,0,0,83,0,3,0,2,0,20,0,20,0,1,0,126,0,0,0,1,0,0,0,82,0,1,0,1,3,246,0,3,0,1,0,36,0,1,0,100,0,2,0,100,0,100,0,0,0,3,0,0,0,1,0,82,0,3,0,82,0,82,0,18, +0,0,0,1,0,2,4,195,4,196,0,3,0,2,2,98,2,92,0,1,0,56,0,2,0,56,0,56,0,0,0,3,0,0,0,1,0,36,0,3,0,36,0,36,0,36,0,0,0,3,0,1,0,18,0,1,0,18,0,2,0,18,0,18, +0,0,0,1,0,1,3,226,0,1,0,0,0,1,0,8,0,1,0,178,0,15,0,1,0,0,0,1,0,8,0,1,0,164,0,108,0,6,0,0,0,7,0,140,0,122,0,104,0,86,0,60,0,40,0,20,0,3,0,0,0,1,0,138, +0,2,0,138,0,138,0,1,0,0,0,80,0,3,0,1,0,40,0,1,0,118,0,1,0,118,0,1,0,0,0,79,0,3,0,2,0,20,0,20,0,1,0,98,0,0,0,1,0,0,0,78,0,1,0,1,3,250,0,3,0,0,0,1, +0,72,0,3,0,72,0,72,12,128,0,0,0,3,0,1,12,110,0,1,0,54,0,2,0,54,0,54,0,0,0,3,0,0,0,1,0,36,0,3,0,36,0,36,0,36,0,0,0,3,0,1,0,18,0,1,0,18,0,2,0,18,0,18, +0,0,0,1,0,1,3,235,0,1,0,0,0,1,0,8,0,1,0,150,0,58,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,164,5,3,0,1,0,2,4,195,4,201,0,6,0,0,0,5,0,100,0,82,0,56,0,36,0,16, +0,3,0,0,0,1,0,102,0,2,0,102,8,224,0,1,0,0,0,76,0,3,0,1,0,40,0,1,0,82,0,1,8,204,0,1,0,0,0,75,0,3,0,2,0,20,0,20,0,1,8,184,0,0,0,1,0,0,0,75,0,1,0,1, +5,3,0,3,0,0,0,1,0,36,0,3,0,36,8,158,8,158,0,0,0,3,0,1,0,18,0,1,0,18,0,2,0,18,8,140,0,0,0,1,0,1,4,201,0,1,0,0,0,1,0,8,0,1,0,230,0,15,0,1,0,0,0,1, +0,8,0,2,0,12,0,3,3,248,6,140,5,2,0,1,0,3,3,229,4,26,4,196,0,6,0,0,0,7,0,174,0,154,0,120,0,86,0,64,0,42,0,20,0,3,0,0,0,1,8,64,0,3,0,180,0,174,0,174,0,1,0,0, +0,72,0,3,0,1,7,238,0,1,0,158,0,2,0,152,0,152,0,1,0,0,0,72,0,3,0,2,0,44,7,216,0,1,0,130,0,1,0,130,0,1,0,0,0,73,0,3,0,3,0,28,0,22,7,194,0,1,0,108,0,0,0,1, +0,0,0,72,0,1,0,1,3,248,0,1,0,1,4,41,0,3,0,2,0,28,0,22,0,1,7,220,0,3,0,80,0,74,0,74,0,0,0,1,0,1,4,3,0,1,0,1,3,231,0,3,0,0,0,1,7,186,0,4,0,46,0,40, +0,40,0,40,0,0,0,3,0,1,7,166,0,1,7,166,0,3,0,26,0,20,0,20,0,0,0,1,0,1,4,26,0,1,0,1,3,229,0,1,0,0,0,1,0,8,0,1,7,126,1,213,0,6,0,0,0,7,0,120,0,104,0,88, +0,72,0,56,0,38,0,20,0,3,0,0,0,1,7,100,0,1,7,100,0,1,0,0,0,70,0,3,0,1,7,22,0,1,7,82,0,0,0,1,0,0,0,69,0,3,0,0,0,1,7,64,0,2,7,64,1,74,0,0,0,3,0,1, +1,58,0,1,7,48,0,1,7,48,0,0,0,3,0,0,0,1,7,32,0,2,7,32,2,116,0,0,0,3,0,0,0,1,7,16,0,2,7,16,7,16,0,0,0,3,0,1,7,0,0,1,7,0,0,1,7,0,0,0,0,1,0,0, +0,1,0,8,0,1,6,220,1,199,0,6,0,0,0,7,0,120,0,104,0,88,0,72,0,56,0,38,0,20,0,3,0,0,0,1,6,194,0,1,6,194,0,1,0,0,0,67,0,3,0,1,1,248,0,1,6,176,0,0,0,1,0,0, +0,66,0,3,0,0,0,1,6,158,0,2,6,158,0,180,0,0,0,3,0,1,0,164,0,1,6,142,0,1,6,142,0,0,0,3,0,1,1,222,0,1,6,126,0,1,6,126,0,0,0,3,0,0,0,1,6,110,0,2,6,110,6,110, +0,0,0,3,0,1,6,94,0,1,6,94,0,1,6,94,0,0,0,1,0,0,0,1,0,8,0,1,6,76,0,75,0,6,0,0,0,6,0,110,0,94,0,70,0,54,0,36,0,18,0,3,0,0,0,1,6,52,0,1,6,52,0,1, +0,0,0,64,0,3,0,1,5,242,0,1,6,34,0,0,0,1,0,0,0,63,0,3,0,0,0,1,6,16,0,2,6,16,0,32,0,0,0,3,0,1,0,16,0,1,6,0,0,1,6,0,0,0,0,1,0,2,4,26,4,193,0,3, +0,0,0,1,5,232,0,2,5,232,5,232,0,0,0,3,0,1,5,216,0,1,5,216,0,1,5,216,0,0,0,1,0,0,0,1,0,8,0,1,5,198,0,62,0,1,0,0,0,1,0,8,0,1,5,184,1,214,0,6,0,0,0,6, +0,114,0,96,0,78,0,58,0,38,0,18,0,3,0,0,0,1,5,160,0,2,5,160,5,160,0,1,0,0,0,61,0,3,0,1,5,80,0,1,5,140,0,1,5,140,0,1,0,0,0,60,0,3,0,2,5,60,5,60,0,1,5,120, +0,0,0,1,0,0,0,59,0,3,0,0,0,1,5,100,0,3,5,100,5,100,0,184,0,0,0,3,0,0,0,1,5,82,0,3,5,82,5,82,5,82,0,0,0,3,0,1,5,64,0,1,5,64,0,2,5,64,5,64,0,0,0,1, +0,0,0,1,0,8,0,1,5,26,0,62,0,1,0,0,0,1,0,8,0,1,5,12,1,200,0,6,0,0,0,6,0,130,0,112,0,84,0,58,0,38,0,18,0,3,0,0,0,1,4,244,0,2,4,244,4,244,0,1,0,0,0,57, +0,3,0,1,0,40,0,1,4,224,0,1,4,224,0,1,0,0,0,56,0,3,0,2,0,20,0,20,0,1,4,204,0,0,0,1,0,0,0,55,0,1,0,1,5,1,0,3,0,1,0,18,0,1,4,178,0,2,4,178,4,178,0,0, +0,1,0,3,3,235,4,141,4,189,0,3,0,0,0,1,4,150,0,3,4,150,4,150,4,150,0,0,0,3,0,1,4,132,0,1,4,132,0,2,4,132,4,132,0,0,0,1,0,0,0,1,0,8,0,1,4,112,0,76,0,6,0,0, +0,5,0,94,0,76,0,56,0,36,0,16,0,3,0,0,0,1,4,90,0,2,4,90,4,90,0,1,0,0,0,53,0,3,0,1,4,22,0,1,4,70,0,1,4,70,0,1,0,0,0,52,0,3,0,2,4,2,4,2,0,1,4,50, +0,0,0,1,0,0,0,51,0,3,0,0,0,1,4,30,0,3,4,30,4,30,4,30,0,0,0,3,0,1,4,12,0,1,4,12,0,2,4,12,4,12,0,0,0,1,0,0,0,1,0,8,0,2,1,254,0,2,5,2,6,143,0,6, +0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,3,224,0,1,3,218,0,1,0,0,0,49,0,3,0,1,3,146,0,1,3,200,0,0,0,1,0,0,0,49,0,3,0,0,0,1,3,188,0,2,3,182,3,182,0,0, +0,3,0,1,3,172,0,1,3,172,0,1,3,166,0,0,0,1,0,0,0,1,0,8,0,2,2,84,0,2,6,130,6,116,0,6,0,0,0,4,0,66,0,50,0,32,0,14,0,3,0,0,0,1,3,118,0,1,3,112,0,1,0,0, +0,47,0,3,0,1,3,52,0,1,3,94,0,0,0,1,0,0,0,47,0,3,0,0,0,1,3,82,0,2,3,76,3,76,0,0,0,3,0,1,3,66,0,1,3,66,0,1,3,60,0,0,0,1,0,0,0,1,0,8,0,2,1,54, +0,2,5,2,6,144,0,6,0,0,0,6,0,114,0,96,0,78,0,58,0,38,0,18,0,3,0,0,0,1,3,20,0,2,3,14,3,14,0,1,0,0,0,44,0,3,0,1,2,196,0,1,2,250,0,1,2,250,0,1,0,0,0,45, +0,3,0,2,2,182,2,176,0,1,2,230,0,0,0,1,0,0,0,44,0,3,0,0,0,1,2,216,0,3,2,210,2,210,2,204,0,0,0,3,0,0,0,1,2,198,0,3,2,192,2,192,2,192,0,0,0,3,0,1,2,180,0,1, +2,180,0,2,2,174,2,174,0,0,0,1,0,0,0,1,0,8,0,2,1,90,0,2,6,129,6,116,0,6,0,0,0,6,0,114,0,96,0,78,0,58,0,38,0,18,0,3,0,0,0,1,2,120,0,2,2,120,2,114,0,1,0,0, +0,42,0,3,0,1,2,52,0,1,2,100,0,1,2,94,0,1,0,0,0,41,0,3,0,2,2,32,2,32,0,1,2,74,0,0,0,1,0,0,0,41,0,3,0,1,2,66,0,1,2,60,0,2,2,60,2,54,0,0,0,3,0,0, +0,1,2,42,0,3,2,42,2,36,2,36,0,0,0,3,0,1,2,24,0,1,2,24,0,2,2,24,2,18,0,0,0,1,0,0,0,1,0,8,0,2,0,10,0,2,5,2,6,145,0,1,0,2,4,196,6,51,0,6,0,0,0,6, +0,126,0,106,0,84,0,62,0,40,0,18,0,3,0,0,0,1,1,224,0,3,1,218,1,218,1,218,0,1,0,0,0,37,0,3,0,1,1,142,0,1,1,196,0,2,1,196,1,196,0,1,0,0,0,39,0,3,0,2,1,126,1,120, +0,1,1,174,0,1,1,174,0,1,0,0,0,38,0,3,0,3,1,104,1,104,1,98,0,1,1,152,0,0,0,1,0,0,0,37,0,3,0,0,0,1,1,136,0,4,1,130,1,130,1,130,1,130,0,0,0,3,0,1,1,116,0,1, +1,116,0,3,1,110,1,110,1,110,0,0,0,1,0,0,0,1,0,8,0,1,1,82,0,65,0,1,0,0,0,1,0,8,0,2,0,10,0,2,6,128,6,116,0,1,0,2,4,195,6,51,0,6,0,0,0,6,0,126,0,106,0,84, +0,62,0,40,0,18,0,3,0,0,0,1,1,32,0,3,1,32,1,32,1,26,0,1,0,0,0,35,0,3,0,1,0,218,0,1,1,10,0,2,1,10,1,4,0,1,0,0,0,34,0,3,0,2,0,196,0,196,0,1,0,244,0,1, +0,238,0,1,0,0,0,33,0,3,0,3,0,174,0,174,0,174,0,1,0,216,0,0,0,1,0,0,0,33,0,3,0,0,0,1,0,200,0,4,0,200,0,200,0,194,0,194,0,0,0,3,0,1,0,180,0,1,0,180,0,3,0,180, +0,180,0,174,0,0,0,1,0,0,0,1,0,8,0,2,0,12,0,3,6,146,5,2,6,116,0,1,0,3,4,195,4,196,6,51,0,6,0,0,0,5,0,106,0,88,0,56,0,36,0,16,0,3,0,0,0,1,0,120,0,2,0,114, +0,108,0,1,0,0,0,31,0,3,0,1,0,40,0,1,0,94,0,1,0,88,0,1,0,0,0,31,0,3,0,2,0,26,0,20,0,1,0,68,0,0,0,1,0,0,0,31,0,1,0,1,5,2,0,1,0,1,6,116,0,3,0,0, +0,1,0,48,0,3,0,42,0,36,0,36,0,0,0,3,0,1,0,30,0,1,0,30,0,2,0,24,0,18,0,0,0,1,0,1,4,195,0,1,0,1,6,51,0,1,0,1,4,196,0,1,0,0,0,1,0,8,0,2,0,10,0,2, +3,154,3,166,0,1,0,2,3,144,3,155,0,4,0,0,0,1,0,8,0,1,0,20,0,2,0,10,0,10,0,1,0,4,0,203,0,2,0,201,0,1,0,2,4,48,4,54,0,4,0,0,0,1,0,8,0,1,0,74,0,1,0,8, +0,1,0,4,0,62,0,2,3,233,0,4,0,0,0,1,0,8,0,1,0,80,0,1,0,8,0,1,0,4,0,198,0,2,3,233,0,6,0,0,0,2,0,36,0,10,0,3,0,0,0,2,0,20,0,46,0,1,0,20,0,1,0,0, +0,26,0,1,0,1,0,58,0,3,0,0,0,2,0,26,0,20,0,1,0,26,0,1,0,0,0,25,0,1,0,1,3,233,0,1,0,1,0,194,0,1,0,0,0,1,0,8,0,2,0,28,0,11,0,129,0,130,0,131,0,132,0,133, +1,10,1,11,1,12,1,13,1,14,7,17,0,1,0,11,0,15,0,66,0,72,0,91,0,126,0,148,0,202,0,209,0,228,1,7,6,249,0,1,0,0,0,1,0,8,0,2,0,14,0,4,0,95,0,101,0,232,0,238,0,1,0,4, +0,93,0,100,0,230,0,237,0,1,0,0,0,1,0,8,0,1,0,6,0,6,0,1,0,1,0,176,0,1,0,0,0,1,0,8,0,2,0,72,0,33,3,241,3,242,4,15,4,16,4,17,4,18,4,19,4,20,4,36,4,37,4,38, +4,39,4,55,4,56,4,57,4,58,4,251,7,4,7,5,7,6,7,7,7,8,7,9,7,10,7,11,7,12,7,13,7,14,7,15,7,16,7,22,7,37,7,39,0,1,0,33,3,230,3,232,4,3,4,4,4,5,4,6,4,7,4,8, +4,26,4,27,4,28,4,29,4,49,4,50,4,51,4,52,4,204,6,242,6,246,6,247,6,248,6,249,6,250,6,251,6,252,6,253,6,254,6,255,7,0,7,1,7,21,7,36,7,38,0,1,0,0,0,1,0,8,0,2,0,30,0,12, +1,21,3,155,3,157,3,158,3,159,3,160,3,161,3,162,3,163,3,164,3,165,3,156,0,2,0,2,1,15,1,15,0,0,3,144,3,154,0,1,0,1,0,0,0,1,0,8,0,1,0,6,0,5,0,1,0,1,4,131,0,4,0,0, +0,1,0,8,0,1,0,20,0,1,0,8,0,1,0,4,6,57,0,3,0,208,3,224,0,1,0,1,0,65,0,1,0,0,0,1,0,8,0,2,0,14,0,4,1,23,1,24,1,23,1,24,0,1,0,4,0,1,0,71,0,134,0,208, +0,6,0,0,0,2,0,36,0,10,0,3,0,1,0,152,0,1,0,18,0,0,0,1,0,0,0,12,0,1,0,2,0,71,0,208,0,3,0,1,0,126,0,1,0,18,0,0,0,1,0,0,0,12,0,1,0,2,0,1,0,134,0,1, +0,0,0,1,0,8,0,1,0,62,255,246,0,6,0,0,0,2,0,38,0,10,0,3,0,1,0,18,0,1,0,46,0,0,0,1,0,0,0,10,0,2,0,1,3,177,3,186,0,0,0,3,0,1,0,28,0,1,0,18,0,0,0,1, +0,0,0,9,0,2,0,1,3,187,3,196,0,0,0,1,0,1,3,207,0,1,0,0,0,1,0,8,0,1,0,6,0,43,0,2,0,1,3,144,3,153,0,0,0,1,0,0,0,1,0,8,0,1,0,6,255,225,0,1,0,1,3,238, +0,1,0,0,0,1,0,8,0,2,0,124,0,15,3,177,3,178,3,179,3,180,3,181,3,182,3,183,3,184,3,185,3,186,4,59,4,60,6,120,6,121,6,122,0,1,0,0,0,1,0,8,0,2,0,80,0,15,3,187,3,188,3,189, +3,190,3,191,3,192,3,193,3,194,3,195,3,196,4,105,4,106,6,167,6,168,6,169,0,1,0,0,0,1,0,8,0,2,0,36,0,15,3,197,3,198,3,199,3,200,3,201,3,202,3,203,3,204,3,205,3,206,4,13,4,14,4,226, +4,178,4,164,0,2,0,4,3,144,3,153,0,0,4,3,4,4,0,10,4,189,4,190,0,12,4,193,4,193,0,14,0,1,0,0,0,1,0,8,0,2,0,34,0,14,3,167,3,168,3,169,3,170,3,171,3,172,3,173,3,174,3,175, +3,176,4,1,4,2,4,225,4,177,0,2,0,3,3,144,3,153,0,0,4,3,4,4,0,10,4,189,4,190,0,12,0,3,0,0,0,1,0,8,0,1,0,90,0,42,3,24,3,18,3,12,2,254,2,242,2,230,2,218,2,206,2,194, +2,182,2,170,2,158,2,146,2,134,2,118,2,112,2,102,2,92,2,78,2,66,2,38,2,30,2,14,2,2,1,250,1,244,1,236,1,228,1,204,1,192,1,184,1,164,1,154,1,112,1,46,1,10,0,250,0,244,0,238,0,228,0,184, +0,178,0,1,0,42,0,176,0,251,1,0,3,144,3,145,3,146,3,147,3,148,3,149,3,150,3,151,3,152,3,153,3,224,3,226,3,227,3,229,3,231,3,235,3,237,3,238,3,239,4,3,4,4,4,5,4,6,4,7,4,8,4,26, +4,34,4,141,4,189,4,190,4,193,4,195,4,196,4,201,4,223,6,42,6,43,6,51,6,249,0,2,7,8,7,17,0,21,4,64,4,65,6,116,6,126,6,127,6,143,6,144,6,145,6,170,6,171,6,172,6,173,6,174,6,175,6,176, +6,177,6,178,6,179,6,180,6,181,6,182,0,4,6,115,6,117,6,118,6,123,0,2,6,119,6,161,0,2,5,5,6,166,0,7,4,63,4,124,5,3,6,155,6,157,6,163,6,215,0,17,4,71,4,253,5,2,6,153,6,154,6,198, +6,199,6,200,6,201,6,202,6,203,6,204,6,205,6,206,6,207,6,208,6,209,0,32,4,88,4,100,4,252,5,1,6,128,6,129,6,130,6,131,6,134,6,138,6,139,6,142,6,146,6,148,6,150,6,152,6,156,6,159,6,162,6,164, +6,186,6,187,6,188,6,189,6,190,6,191,6,192,6,193,6,194,6,195,6,196,6,197,0,20,4,70,4,73,4,76,4,77,4,81,4,82,4,85,4,96,4,164,5,0,6,122,6,135,6,136,6,137,6,151,6,165,6,169,6,183,6,184, +6,185,0,4,4,177,4,178,6,121,6,168,0,9,4,225,4,226,4,254,4,255,6,120,6,132,6,133,6,149,6,167,0,3,4,150,4,151,6,147,0,5,4,42,4,97,4,121,4,122,4,123,0,11,4,36,4,40,4,41,4,61,4,62, +4,67,4,107,4,108,4,109,6,140,6,160,0,3,4,20,4,25,6,125,0,3,4,19,4,24,4,92,0,2,4,18,6,124,0,3,4,17,4,23,4,91,0,5,4,2,4,14,4,16,4,60,4,106,0,7,4,1,4,13,4,15,4,59, +4,90,4,98,4,105,0,3,3,253,3,254,4,103,0,13,3,207,3,252,4,89,4,101,4,102,4,104,4,115,4,116,4,117,4,118,4,119,4,120,6,158,0,5,3,251,4,66,4,112,4,113,4,114,0,6,3,244,3,250,4,86,4,87, +4,99,6,141,0,4,3,249,4,72,4,84,4,95,0,4,3,248,4,79,4,94,4,111,0,2,3,247,4,78,0,7,3,243,3,246,4,0,4,74,4,75,4,93,4,110,0,5,3,245,4,68,4,69,4,80,4,83,0,5,3,165,3,176, +3,186,3,196,3,206,0,5,3,164,3,175,3,185,3,195,3,205,0,5,3,163,3,174,3,184,3,194,3,204,0,5,3,162,3,173,3,183,3,193,3,203,0,5,3,161,3,172,3,182,3,192,3,202,0,5,3,160,3,171,3,181,3,191, +3,201,0,5,3,159,3,170,3,180,3,190,3,200,0,5,3,158,3,169,3,179,3,189,3,199,0,5,3,157,3,168,3,178,3,188,3,198,0,6,3,154,3,155,3,167,3,177,3,187,3,197,0,2,1,15,1,21,0,2,1,19,1,22, +0,2,0,182,1,16,0,1,0,0,0,1,0,8,0,2,1,104,0,177,1,23,0,129,0,130,1,24,0,131,0,132,0,95,0,101,0,133,1,23,1,10,1,17,1,18,1,11,1,24,1,12,1,20,1,13,0,232,0,238,1,14,1,21, +2,90,2,91,2,59,2,63,2,65,2,67,2,73,2,78,2,82,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,59,2,63,2,63, +2,63,2,63,2,63,2,63,2,63,2,63,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,65,2,67,2,67,2,67,2,67,2,67,2,67,2,67, +2,67,2,67,2,67,2,67,2,67,2,73,2,73,2,73,2,73,2,73,2,73,2,73,2,73,2,75,2,78,2,78,2,78,2,78,2,78,2,78,2,78,2,78,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82, +2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,2,82,3,156,3,166,3,177,3,178,3,179,3,180,3,181,3,182,3,183,3,184,3,185,3,186,3,241,3,242,3,255,4,37,4,38,4,39,4,55,4,56,4,57,4,58,4,136, +5,4,4,251,4,201,6,118,6,118,6,117,6,212,6,210,6,213,6,214,6,211,6,119,7,4,7,5,7,6,7,7,7,9,7,10,7,11,7,12,7,13,7,14,7,15,7,16,7,22,7,37,7,39,0,2,0,48,0,1,0,1,0,0, +0,15,0,15,0,1,0,66,0,66,0,2,0,71,0,72,0,3,0,91,0,91,0,5,0,93,0,93,0,6,0,100,0,100,0,7,0,126,0,126,0,8,0,134,0,134,0,9,0,148,0,148,0,10,0,188,0,188,0,11,0,194,0,194, +0,12,0,202,0,202,0,13,0,208,0,209,0,14,0,223,0,223,0,16,0,228,0,228,0,17,0,230,0,230,0,18,0,237,0,237,0,19,1,7,1,7,0,20,1,15,1,15,0,21,2,67,2,67,0,22,2,78,2,78,0,23,2,83, +2,89,0,24,2,111,2,206,0,31,3,154,3,155,0,127,3,187,3,196,0,129,3,230,3,230,0,139,3,232,3,232,0,140,3,254,3,254,0,141,4,27,4,29,0,142,4,49,4,52,0,145,4,131,4,131,0,149,4,203,4,204,0,150, +5,3,5,3,0,152,6,115,6,115,0,153,6,117,6,117,0,154,6,123,6,123,0,155,6,131,6,131,0,156,6,137,6,137,0,157,6,147,6,148,0,158,6,151,6,151,0,160,6,161,6,161,0,161,6,242,6,242,0,162,6,246,6,248, +0,163,6,250,7,1,0,166,7,21,7,21,0,174,7,36,7,36,0,175,7,38,7,38,0,176,0,0,0,4,0,80,255,152,4,96,5,198,0,3,0,7,0,40,0,52,0,0,83,33,17,33,37,17,33,17,1,20,6,35,34,38,53,53, +54,54,53,52,38,35,34,6,7,6,35,34,38,53,52,54,54,51,50,22,22,21,20,6,7,3,52,54,51,50,22,21,20,6,35,34,38,80,4,16,251,240,3,164,252,202,1,168,32,18,19,31,108,74,47,75,31,47,26,15,11,22,26,61, +86,39,86,97,39,89,101,120,40,30,30,40,40,30,30,40,5,198,249,210,104,5,94,250,162,2,4,22,26,26,22,168,6,69,79,59,79,11,11,6,27,19,27,35,16,65,105,60,105,116,15,254,246,30,40,40,30,31,43,43,0,2,0,41, +0,0,4,135,5,97,0,7,0,10,0,0,65,33,3,35,1,51,1,35,1,33,3,3,99,253,223,110,171,1,192,222,1,192,182,253,158,1,199,226,1,95,254,161,5,97,250,159,1,239,2,224,255,255,0,41,0,0,4,135,7,20,6,38, +0,1,0,0,0,6,7,8,5,0,255,255,0,41,0,0,4,135,6,245,6,38,0,1,0,0,0,6,7,12,254,0,255,255,0,41,0,0,4,135,7,29,6,38,0,1,0,0,0,6,7,10,0,0,255,255,0,41,0,0,4,135,6,214, +6,38,0,1,0,0,0,6,7,5,1,0,255,255,0,41,0,0,4,135,7,27,6,38,0,1,0,0,0,6,7,7,1,0,255,255,0,41,0,0,4,135,6,183,6,38,0,1,0,0,0,6,7,15,1,0,255,255,0,41,254,53,4,135, +5,97,6,38,0,1,0,0,0,7,7,2,1,18,0,0,255,255,0,41,0,0,4,135,7,94,6,38,0,1,0,0,0,6,7,13,1,0,255,255,0,41,0,0,4,135,6,247,6,38,0,1,0,0,0,6,7,14,1,0,0,2,255,232, +0,0,4,191,5,97,0,15,0,18,0,0,65,33,3,35,1,33,7,33,19,33,21,33,19,33,21,33,1,33,3,2,147,254,105,99,177,1,148,2,240,21,254,41,102,1,116,254,167,103,1,87,254,29,254,77,1,75,147,1,95,254,161,5, +97,141,254,45,141,254,25,141,1,241,2,231,255,255,255,232,0,0,4,191,7,20,6,38,0,11,0,0,0,7,7,8,0,128,0,0,0,3,0,193,0,0,4,55,5,97,0,11,0,20,0,41,0,0,65,52,38,38,35,35,17,51,50,62, +2,3,52,38,35,35,17,51,50,54,19,20,14,2,35,33,17,33,50,30,2,21,20,6,6,7,30,2,3,128,81,134,80,235,227,51,106,91,55,55,145,125,205,222,122,131,238,89,149,183,95,254,142,1,83,91,173,139,84,73,117,66,77,145, +94,1,131,104,113,44,254,7,20,52,95,2,199,117,99,254,66,109,254,5,112,152,90,39,5,97,33,79,134,101,89,123,74,15,12,69,139,0,0,1,0,127,255,233,4,111,5,119,0,29,0,0,65,50,22,23,7,38,38,35,34,6,6,21, +20,22,22,51,50,54,55,23,6,6,35,34,36,2,53,52,18,36,2,204,135,182,82,97,65,145,79,113,192,117,111,190,117,116,149,55,90,63,202,147,167,254,241,158,161,1,13,5,119,68,66,113,55,47,107,247,211,205,248,110,70,45,114,61, +89,164,1,61,231,232,1,60,162,0,255,255,0,127,255,233,4,111,7,20,6,38,0,14,0,0,0,7,7,8,0,137,0,0,255,255,0,127,255,233,4,111,7,17,6,38,0,14,0,0,0,7,7,11,0,131,0,0,255,255,0,127,254,35, +4,111,5,119,6,38,0,14,0,0,0,6,7,16,99,0,255,255,0,127,255,233,4,111,7,29,6,38,0,14,0,0,0,7,7,10,0,131,0,0,255,255,0,127,255,233,4,111,6,250,6,38,0,14,0,0,0,7,7,6,0,132,0,0, +0,2,0,167,0,0,4,81,5,97,0,12,0,26,0,0,65,52,46,2,35,35,17,51,50,62,2,55,20,14,3,35,33,17,33,50,22,22,18,3,152,76,124,147,71,162,164,74,147,122,73,185,73,126,161,177,85,254,196,1,38,121,229,185, +109,2,183,180,216,108,36,251,184,47,121,217,171,172,243,158,87,35,5,97,54,145,254,244,0,3,0,41,0,0,4,100,5,97,0,3,0,16,0,30,0,0,65,21,33,53,5,52,46,2,35,35,17,51,50,62,2,55,20,14,3,35,33,17, +33,50,22,22,18,2,163,253,134,3,130,76,124,147,71,162,164,75,146,122,73,185,73,126,161,177,85,254,196,1,38,121,229,185,109,3,5,134,134,78,180,216,108,36,251,184,47,121,217,171,172,243,158,87,35,5,97,54,145,254,244,0,255,255, +0,167,0,0,4,81,7,17,6,38,0,20,0,0,0,6,7,11,223,0,255,255,0,41,0,0,4,100,5,97,6,6,0,21,0,0,0,1,0,251,0,0,4,27,5,97,0,11,0,0,65,17,33,21,33,17,33,21,33,17,33,7,1,169, +1,254,254,2,2,114,252,224,3,14,20,4,211,254,48,143,254,23,139,5,97,142,255,255,0,251,0,0,4,27,7,20,6,38,0,24,0,0,0,6,7,8,48,0,255,255,0,251,0,0,4,27,6,245,6,38,0,24,0,0,0,6,7,12, +40,0,255,255,0,251,0,0,4,27,7,17,6,38,0,24,0,0,0,6,7,11,42,0,255,255,0,251,0,0,4,27,7,29,6,38,0,24,0,0,0,6,7,10,42,0,255,255,0,251,0,0,4,27,6,214,6,38,0,24,0,0,0,6, +7,5,43,0,255,255,0,251,0,0,4,27,6,250,6,38,0,24,0,0,0,6,7,6,43,0,255,255,0,251,0,0,4,27,7,27,6,38,0,24,0,0,0,6,7,7,43,0,255,255,0,251,0,0,4,27,6,183,6,38,0,24,0,0, +0,6,7,15,43,0,255,255,0,251,254,53,4,27,5,97,6,38,0,24,0,0,0,7,7,2,0,133,0,0,0,1,1,21,0,0,4,64,5,97,0,9,0,0,65,17,33,21,33,17,35,17,33,7,1,193,2,28,253,228,172,3,43,21, +4,211,254,30,140,253,155,5,97,142,0,1,0,91,255,233,4,53,5,119,0,35,0,0,69,34,38,2,53,52,18,54,54,51,50,22,23,7,38,38,35,34,14,2,21,20,22,22,51,50,54,55,17,33,39,33,17,6,6,2,115,163,241,132, +95,163,207,111,135,178,81,105,63,139,86,75,140,111,65,83,163,120,72,129,61,254,241,21,1,208,93,210,23,158,1,60,238,178,1,10,178,88,77,74,109,59,56,58,131,216,160,199,250,117,34,32,1,164,144,253,112,50,70,0,255,255,0,91, +255,233,4,53,6,245,6,38,0,35,0,0,0,6,7,12,58,0,255,255,0,91,255,233,4,53,7,29,6,38,0,35,0,0,0,6,7,10,60,0,255,255,0,91,253,196,4,53,5,119,6,38,0,35,0,0,0,6,6,242,61,0,255,255, +0,91,255,233,4,53,6,250,6,38,0,35,0,0,0,6,7,6,61,0,0,1,0,167,0,0,4,9,5,97,0,11,0,0,97,17,33,17,35,17,51,17,33,17,51,17,3,92,253,248,173,173,2,8,173,2,141,253,115,5,97,253,186,2, +70,250,159,0,0,2,0,4,0,0,4,172,5,97,0,11,0,15,0,0,65,17,35,17,33,17,35,17,51,17,33,17,5,21,33,53,4,11,174,253,246,174,174,2,10,1,79,251,88,5,97,250,159,2,141,253,115,5,97,253,188,2,68,226, +133,133,255,255,0,167,0,0,4,9,7,29,6,38,0,40,0,0,0,6,7,10,0,0,0,1,0,206,0,0,3,226,5,97,0,11,0,0,65,21,33,17,33,21,33,53,33,17,33,53,3,226,254,206,1,50,252,236,1,50,254,206,5,97, +139,251,181,139,139,4,75,139,0,1,0,23,254,240,4,41,5,97,0,22,0,0,69,62,2,53,17,33,17,51,21,33,53,51,17,35,53,33,17,20,6,6,4,7,1,133,203,217,81,254,23,160,253,230,200,200,4,18,57,143,255,0,200,142, +20,136,224,149,3,78,251,190,143,143,4,66,144,252,23,117,216,178,119,18,255,255,0,206,0,0,3,226,7,20,6,38,0,43,0,0,0,6,7,8,5,0,255,255,0,206,0,0,3,226,6,245,6,38,0,43,0,0,0,6,7,12,254,0, +255,255,0,206,0,0,3,226,7,29,6,38,0,43,0,0,0,6,7,10,0,0,255,255,0,206,0,0,3,226,6,214,6,38,0,43,0,0,0,6,7,5,1,0,255,255,0,206,0,0,3,226,6,250,6,38,0,43,0,0,0,6,7,6, +1,0,255,255,0,206,0,0,3,226,7,27,6,38,0,43,0,0,0,6,7,7,1,0,255,255,0,206,0,0,3,226,6,183,6,38,0,43,0,0,0,6,7,15,1,0,255,255,0,206,254,53,3,226,5,97,6,38,0,43,0,0,0,7, +7,2,255,141,0,0,255,255,0,206,0,0,3,226,6,247,6,38,0,43,0,0,0,6,7,14,1,0,0,1,0,145,255,233,3,225,5,97,0,19,0,0,65,17,20,14,2,35,34,38,39,55,22,22,51,50,54,53,17,33,53,3,225,45, +107,182,136,101,195,82,77,90,148,61,144,155,254,104,5,97,252,104,86,171,139,84,64,61,115,56,39,184,161,3,0,142,255,255,0,145,255,233,4,2,7,29,6,38,0,54,0,0,0,6,7,10,99,0,0,2,0,210,0,0,4,149,5,97, +0,3,0,9,0,0,97,35,17,51,19,1,51,1,1,35,1,127,173,173,10,2,30,200,253,230,2,64,216,5,97,253,126,2,130,253,137,253,22,0,255,255,0,210,253,196,4,149,5,97,6,38,0,56,0,0,0,6,7,4,45,0,0,1, +1,15,0,0,4,49,5,97,0,5,0,0,97,17,51,17,33,7,1,15,174,2,116,20,5,97,251,58,155,0,255,255,0,127,0,0,4,49,7,20,6,38,0,58,0,0,0,7,7,8,255,21,0,0,255,255,1,15,0,0,4,49,5,114, +6,38,0,58,0,0,0,6,7,3,57,255,255,255,1,15,253,196,4,49,5,97,6,38,0,58,0,0,0,6,7,4,63,0,255,255,1,15,0,0,4,49,5,97,6,38,0,58,0,0,0,7,6,247,1,89,253,96,0,2,0,81,0,0, +4,46,5,97,0,3,0,9,0,0,83,39,1,23,1,17,51,17,33,7,153,72,2,176,75,253,191,174,2,117,20,1,209,113,1,171,112,252,131,5,97,251,58,155,0,1,0,61,0,0,4,115,5,97,0,22,0,0,65,19,35,3,46,2, +52,53,3,35,3,30,2,6,7,3,35,19,51,19,19,4,37,78,167,43,3,6,2,232,174,249,1,2,1,3,3,37,163,78,242,223,213,5,97,250,159,2,207,73,150,138,108,30,252,53,3,203,29,113,142,149,64,253,47,5,97,252,81,3, +175,0,0,1,0,167,0,0,4,9,5,97,0,18,0,0,97,1,30,3,21,17,35,17,51,1,46,2,53,17,51,17,3,22,254,27,1,7,9,6,161,235,1,237,1,12,10,161,4,187,23,107,147,164,80,253,78,5,97,251,64,29,155,220, +123,2,177,250,159,0,255,255,0,167,0,0,4,9,7,20,6,38,0,65,0,0,0,6,7,8,3,0,255,255,0,167,0,0,4,9,7,17,6,38,0,65,0,0,0,6,7,11,253,0,255,255,0,167,253,196,4,9,5,97,6,38,0,65, +0,0,0,6,7,4,0,0,0,2,0,167,254,87,4,9,5,97,0,15,0,34,0,0,65,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,3,1,30,3,21,17,35,17,51,1,46,2,53,17,51,17,2,231,78,111,36,66,35,66, +51,59,65,173,159,84,254,27,1,7,9,6,161,235,1,237,1,12,10,161,254,87,47,27,115,21,26,73,77,133,123,152,150,1,169,4,187,23,107,147,164,80,253,78,5,97,251,64,29,155,220,123,2,177,250,159,255,255,0,167,0,0,4,9, +6,247,6,38,0,65,0,0,0,6,7,14,254,0,0,2,0,93,255,233,4,83,5,119,0,15,0,27,0,0,65,20,2,6,35,34,38,2,53,52,18,54,51,50,22,18,7,16,2,35,34,2,17,16,18,51,50,18,4,83,113,226,168,167, +227,113,113,227,167,168,226,113,182,151,174,174,151,156,169,174,151,2,175,208,254,191,181,177,1,62,213,209,1,66,183,178,254,192,214,1,19,1,36,254,218,254,237,254,237,254,225,1,33,0,255,255,0,93,255,233,4,83,7,20,6,38,0,71, +0,0,0,6,7,8,5,0,255,255,0,93,255,233,4,83,6,245,6,38,0,71,0,0,0,6,7,12,254,0,255,255,0,93,255,233,4,83,7,29,6,38,0,71,0,0,0,6,7,10,0,0,255,255,0,93,255,233,4,83,6,214,6,38, +0,71,0,0,0,6,7,5,1,0,255,255,0,93,255,233,4,83,7,27,6,38,0,71,0,0,0,6,7,7,1,0,255,255,0,93,255,233,4,83,7,118,6,38,0,71,0,0,0,6,7,9,91,0,255,255,0,93,255,233,4,83,6,183, +6,38,0,71,0,0,0,6,7,15,1,0,0,3,0,93,255,36,4,83,6,70,0,15,0,27,0,41,0,0,65,50,22,18,21,20,2,6,35,34,38,2,53,52,18,54,37,23,7,7,1,7,7,39,55,55,1,55,7,34,2,17,20,22, +22,51,50,18,17,52,38,38,2,88,167,225,115,113,226,168,167,225,115,113,227,1,104,151,79,49,254,189,14,70,150,79,49,1,62,22,127,173,151,68,144,112,174,150,66,142,5,119,178,254,192,214,208,254,191,181,177,1,62,213,209,1,66,183, +207,39,254,90,251,160,93,230,39,251,97,4,76,110,124,254,218,254,238,205,247,109,1,32,1,19,206,248,112,0,255,255,0,93,255,36,4,83,7,20,6,38,0,79,0,0,0,6,7,8,5,0,255,255,0,93,255,233,4,83,6,247,6,38, +0,71,0,0,0,6,7,14,1,0,0,2,255,253,255,233,4,211,5,119,0,27,0,40,0,0,65,50,22,23,33,7,33,22,22,23,33,21,33,6,6,7,33,21,33,6,6,35,34,2,17,52,18,54,23,34,2,17,16,18,51,50,18,17, +52,38,38,1,167,37,70,36,2,139,21,254,25,55,67,7,1,51,254,205,4,72,61,2,22,253,93,33,67,37,215,211,95,190,141,122,118,123,117,126,118,51,107,5,119,10,12,141,66,229,172,141,178,238,71,141,10,13,1,101,1,95,231,1, +62,165,142,254,247,254,205,254,205,254,253,1,6,1,50,204,251,115,0,2,0,231,0,0,4,90,5,97,0,10,0,22,0,0,65,52,38,38,35,35,17,51,50,54,54,55,20,6,6,35,35,17,35,17,33,50,4,3,160,84,146,94,199,192, +97,148,86,186,137,240,156,176,174,1,96,246,1,29,3,184,107,125,55,253,180,53,131,119,161,194,88,254,1,5,97,207,0,2,0,215,0,0,4,87,5,97,0,13,0,23,0,0,65,21,51,50,4,21,20,6,6,35,35,17,35,17,1,35, +17,51,50,54,54,53,52,38,1,131,198,249,1,21,135,237,155,197,172,1,135,219,220,95,145,82,179,5,97,233,211,223,160,200,93,254,255,5,97,254,142,253,157,54,136,120,161,140,0,2,0,91,254,166,4,161,5,119,0,24,0,36,0,0, +65,20,6,6,7,30,2,23,7,46,2,35,34,38,2,53,52,18,54,51,50,22,18,7,16,2,35,34,2,17,16,18,51,50,18,4,83,54,125,106,97,137,95,34,183,41,105,157,119,158,219,112,115,226,167,168,226,114,180,153,175,174,154,159, +169,174,154,2,175,146,244,186,58,19,76,131,101,72,106,146,75,175,1,60,213,209,1,66,183,178,254,192,214,1,20,1,35,254,219,254,236,254,237,254,225,1,33,0,0,2,0,203,0,0,4,123,5,97,0,14,0,23,0,0,65,20,6,6, +7,1,35,1,35,17,35,17,33,50,4,7,52,38,35,35,17,51,50,54,4,51,89,152,95,1,152,208,254,136,186,174,1,98,255,1,7,186,152,160,200,200,148,164,3,223,103,154,100,23,253,157,2,79,253,177,5,97,195,191,133,115,254,0, +121,0,255,255,0,203,0,0,4,123,7,20,6,38,0,86,0,0,0,6,7,8,5,0,255,255,0,203,0,0,4,123,7,17,6,38,0,86,0,0,0,6,7,11,0,0,255,255,0,203,253,196,4,123,5,97,6,38,0,86,0,0,0,6, +7,4,253,0,0,1,0,87,255,233,4,49,5,119,0,45,0,0,65,20,6,6,35,34,38,39,55,22,22,51,50,54,54,53,52,38,38,39,46,2,53,52,54,54,51,50,22,23,7,38,38,35,34,6,6,21,20,22,22,23,30,2,4,49, +118,224,161,151,245,87,103,72,186,125,84,146,90,52,132,118,136,199,109,114,201,131,143,211,86,102,74,170,88,75,125,75,64,152,131,107,183,112,1,125,118,183,103,92,84,116,67,79,55,113,87,67,94,73,35,40,101,148,109,103,160,91,81,76, +113,66,59,45,89,69,59,86,71,39,31,93,159,0,255,255,0,87,255,233,4,49,7,20,6,38,0,90,0,0,0,6,7,8,16,0,255,255,0,87,255,233,4,49,7,17,6,38,0,90,0,0,0,6,7,11,11,0,255,255,0,87,254,35, +4,49,5,119,6,38,0,90,0,0,0,6,7,16,249,0,255,255,0,87,255,233,4,49,7,29,6,38,0,90,0,0,0,6,7,10,11,0,255,255,0,87,253,196,4,49,5,119,6,38,0,90,0,0,0,6,7,4,249,0,0,1,0,147, +255,244,4,135,5,131,0,38,0,0,65,50,22,23,21,1,22,22,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,39,53,1,38,38,35,34,6,21,17,35,17,52,54,2,69,142,241,108,254,153,217,229,109,194,128,75,120,42, +53,33,81,56,124,146,213,214,1,103,73,162,94,130,143,167,226,5,131,79,59,97,254,122,25,194,178,127,179,95,26,21,118,13,17,134,133,145,138,12,116,1,143,33,44,137,148,252,44,3,213,199,219,0,0,1,0,80,0,0,4,95,5,97, +0,7,0,0,65,17,35,17,33,53,33,7,2,171,173,254,82,4,15,18,4,204,251,52,4,204,149,149,0,2,0,80,0,0,4,95,5,97,0,3,0,11,0,0,83,53,33,21,1,17,35,17,33,53,33,7,249,2,186,254,248,173,254,82, +4,15,18,2,188,135,135,2,16,251,52,4,204,149,149,0,255,255,0,80,0,0,4,95,7,17,6,38,0,97,0,0,0,6,7,11,254,0,255,255,0,80,254,35,4,95,5,97,6,38,0,97,0,0,0,6,7,16,16,0,255,255,0,80, +253,196,4,95,5,97,6,38,0,97,0,0,0,6,7,4,254,0,0,1,0,145,255,233,4,31,5,97,0,19,0,0,65,17,20,6,6,35,34,38,38,53,17,51,17,20,22,51,50,54,53,17,4,31,113,205,139,142,203,108,172,147,134,135, +147,5,97,252,93,139,212,118,119,212,138,3,163,252,87,157,156,156,157,3,169,0,255,255,0,145,255,233,4,31,7,20,6,38,0,102,0,0,0,6,7,8,5,0,255,255,0,145,255,233,4,31,6,245,6,38,0,102,0,0,0,6,7,12, +254,0,255,255,0,145,255,233,4,31,7,29,6,38,0,102,0,0,0,6,7,10,0,0,255,255,0,145,255,233,4,31,6,214,6,38,0,102,0,0,0,6,7,5,1,0,255,255,0,145,255,233,4,31,7,27,6,38,0,102,0,0,0,6, +7,7,1,0,255,255,0,145,255,233,4,31,7,118,6,38,0,102,0,0,0,6,7,9,91,0,255,255,0,145,255,233,4,31,6,183,6,38,0,102,0,0,0,6,7,15,1,0,255,255,0,145,254,53,4,31,5,97,6,38,0,102,0,0, +0,6,7,2,204,0,255,255,0,145,255,233,4,31,7,94,6,38,0,102,0,0,0,6,7,13,1,0,255,255,0,145,255,233,4,31,6,247,6,38,0,102,0,0,0,6,7,14,1,0,0,1,0,49,0,0,4,127,5,97,0,6,0,0, +101,1,51,1,35,1,51,2,92,1,116,175,254,51,180,254,51,187,197,4,156,250,159,5,97,0,0,1,0,9,0,0,4,167,5,97,0,12,0,0,65,3,35,3,3,35,3,51,19,19,51,19,19,4,167,210,228,158,159,233,194,174,147,165, +213,157,165,5,97,250,159,4,15,251,241,5,97,251,94,4,2,251,254,4,162,0,255,255,0,9,0,0,4,167,7,20,6,38,0,114,0,0,0,6,7,8,5,0,255,255,0,9,0,0,4,167,7,29,6,38,0,114,0,0,0,6,7,10, +0,0,255,255,0,9,0,0,4,167,6,214,6,38,0,114,0,0,0,6,7,5,1,0,255,255,0,9,0,0,4,167,7,27,6,38,0,114,0,0,0,6,7,7,1,0,0,1,0,62,0,0,4,114,5,97,0,11,0,0,83,51,1,1, +51,1,1,35,1,1,35,1,99,199,1,46,1,47,188,254,121,1,182,199,254,169,254,165,187,1,176,5,97,253,239,2,17,253,134,253,25,2,110,253,146,2,222,0,0,1,0,47,0,0,4,129,5,97,0,8,0,0,65,17,35,17,1,51, +1,1,51,2,176,176,254,47,192,1,109,1,113,180,2,19,253,237,2,17,3,80,253,78,2,178,255,255,0,47,0,0,4,129,7,20,6,38,0,120,0,0,0,6,7,8,12,0,255,255,0,47,0,0,4,129,7,29,6,38,0,120,0,0, +0,6,7,10,7,0,255,255,0,47,0,0,4,129,6,214,6,38,0,120,0,0,0,6,7,5,8,0,255,255,0,47,0,0,4,129,7,27,6,38,0,120,0,0,0,6,7,7,8,0,0,1,0,143,0,0,4,33,5,97,0,9,0,0, +101,33,7,33,53,1,33,53,33,21,1,78,2,209,21,252,133,2,216,253,112,3,74,150,150,141,4,64,148,142,255,255,0,143,0,0,4,33,7,20,6,38,0,125,0,0,0,6,7,8,42,0,255,255,0,143,0,0,4,33,7,17,6,38, +0,125,0,0,0,6,7,11,37,0,255,255,0,143,0,0,4,33,6,250,6,38,0,125,0,0,0,6,7,6,38,0,255,255,0,127,255,233,4,111,7,37,6,38,0,14,0,0,0,7,7,18,0,200,0,0,255,255,0,167,0,0,4,9, +7,37,6,38,0,65,0,0,0,6,7,18,66,0,255,255,0,93,255,233,4,83,7,37,6,38,0,71,0,0,0,6,7,18,69,0,255,255,0,87,255,233,4,49,7,37,6,38,0,90,0,0,0,6,7,18,80,0,255,255,0,143,0,0, +4,33,7,37,6,38,0,125,0,0,0,6,7,18,106,0,0,2,0,137,255,233,4,17,4,51,0,31,0,42,0,0,101,20,22,23,7,38,38,39,6,6,35,34,38,53,52,54,51,51,53,52,38,35,34,6,7,39,54,54,51,50,22,21, +1,50,54,55,17,35,34,6,21,20,22,3,187,42,44,41,68,102,23,57,170,103,158,182,254,240,155,133,118,52,140,82,44,97,170,77,197,197,254,77,78,142,46,152,174,143,101,230,63,58,14,118,9,69,70,73,75,178,147,163,174,88,114,95, +25,29,127,36,30,183,157,253,138,79,70,1,15,120,101,98,101,0,255,255,0,137,255,233,4,17,6,58,6,38,0,134,0,0,0,6,6,249,240,0,255,255,0,137,255,233,4,17,6,21,6,38,0,134,0,0,0,6,6,253,240,0,255,255, +0,137,255,233,4,17,6,43,6,38,0,134,0,0,0,6,6,251,240,0,255,255,0,137,255,233,4,17,5,231,6,38,0,134,0,0,0,6,6,246,240,0,255,255,0,137,255,233,4,17,6,37,6,38,0,134,0,0,0,6,6,248,240,0, +255,255,0,137,255,233,4,17,5,200,6,38,0,134,0,0,0,6,7,0,240,0,255,255,0,137,254,30,4,17,4,51,6,38,0,134,0,0,0,7,7,2,0,197,255,233,255,255,0,137,255,233,4,17,6,111,6,38,0,134,0,0,0,6, +6,254,240,0,255,255,0,137,255,233,4,17,6,7,6,38,0,134,0,0,0,6,6,255,240,0,0,3,255,244,255,233,4,189,4,51,0,45,0,58,0,65,0,0,65,50,18,21,20,7,33,22,22,51,50,54,55,23,6,6,35,34,38,39, +6,6,35,34,38,53,52,54,51,51,53,52,38,35,34,6,7,39,54,54,51,50,22,23,54,54,1,35,34,6,21,20,22,51,50,54,55,38,38,1,34,6,7,33,38,38,3,101,180,164,4,253,230,14,106,106,59,89,50,78,60,132,86,106, +147,55,63,131,100,139,166,218,211,90,95,87,53,90,65,46,67,139,64,115,122,29,31,133,254,248,84,144,110,81,67,67,99,49,11,14,1,101,89,91,13,1,122,3,79,4,51,254,236,240,55,39,179,168,41,38,115,47,58,94,98,105,87,178, +147,164,175,86,111,97,25,29,127,31,36,95,80,81,94,253,218,117,97,100,104,95,92,53,116,1,217,151,188,166,173,0,255,255,255,244,255,233,4,189,6,58,6,38,0,144,0,0,0,6,6,249,17,0,0,2,0,201,255,233,4,40,5,218, +0,17,0,31,0,0,65,54,54,51,50,22,22,21,20,6,6,35,34,39,7,35,17,55,19,50,54,53,52,38,38,35,34,6,7,17,22,22,1,113,58,151,91,141,174,80,96,185,136,183,104,12,147,168,238,132,142,56,111,81,88,133,43,41, +125,3,148,76,83,136,247,165,159,249,142,132,109,5,197,21,250,151,204,211,138,183,91,105,64,253,246,62,74,0,0,1,0,183,255,233,4,9,4,51,0,28,0,0,101,50,54,55,23,6,6,35,34,38,38,53,52,54,54,51,50,22,23,7, +38,38,35,34,6,21,20,22,22,2,165,79,137,58,82,69,194,93,157,221,116,117,221,158,101,177,74,82,67,135,70,136,176,81,141,122,52,40,110,59,68,135,245,165,158,251,144,61,61,112,47,47,204,209,140,177,83,0,255,255,0,183,255,233, +4,9,6,41,6,38,0,147,0,0,0,6,6,249,88,239,255,255,0,183,255,233,4,9,6,26,6,38,0,147,0,0,0,6,6,252,88,239,255,255,0,183,254,35,4,9,4,51,6,38,0,147,0,0,0,6,7,1,78,0,255,255,0,183, +255,233,4,9,6,26,6,38,0,147,0,0,0,6,6,251,88,239,255,255,0,183,255,233,4,9,5,250,6,38,0,147,0,0,0,6,6,247,88,239,0,2,0,136,255,233,3,231,5,218,0,18,0,32,0,0,65,23,17,35,39,6,6,35, +34,38,38,53,52,54,54,51,50,22,23,7,34,6,21,20,22,22,51,50,54,55,17,38,38,3,63,168,147,16,59,153,87,137,178,86,98,185,130,91,138,53,238,132,142,58,113,82,90,127,42,43,122,5,218,21,250,59,139,84,78,138,247,163, +158,249,143,63,61,11,206,209,136,184,92,102,64,2,14,64,71,0,0,2,0,134,255,233,4,41,6,11,0,33,0,49,0,0,65,55,38,38,39,55,22,22,23,55,23,7,22,18,17,20,6,6,35,34,38,38,53,52,54,54,51,50,22,23, +38,38,39,7,1,52,38,39,38,38,35,34,6,6,21,20,22,51,50,54,1,83,162,50,115,69,37,88,150,61,139,101,124,178,168,118,213,144,126,207,123,117,195,113,102,157,57,28,136,96,156,1,180,3,3,51,160,97,72,126,78,159,123,141, +167,4,100,169,24,35,14,132,19,47,33,148,88,128,123,254,118,254,225,168,248,134,115,221,157,148,221,123,72,66,127,204,70,162,253,240,35,64,31,79,83,74,153,121,179,187,214,0,255,255,0,79,255,233,4,203,5,218,4,38,0,153,198,0, +0,7,7,3,2,5,0,99,0,3,0,141,255,233,4,137,5,218,0,5,0,24,0,38,0,0,65,51,21,33,33,53,37,23,17,35,39,6,6,35,34,38,38,53,52,54,54,51,50,22,23,7,34,6,21,20,22,22,51,50,54,55,17,38, +38,3,236,157,254,187,254,169,1,87,168,148,16,58,153,87,138,177,86,98,185,130,90,139,53,239,131,142,58,112,83,89,127,43,43,123,5,49,134,134,169,21,250,59,139,84,78,138,247,163,158,249,143,63,61,11,206,209,136,184,92,102,64,2, +14,64,71,0,0,2,0,157,255,233,4,21,4,51,0,26,0,33,0,0,65,30,2,51,50,54,55,23,6,6,35,34,38,38,53,52,54,54,51,50,22,22,21,20,6,7,1,34,6,7,33,38,38,1,77,5,84,138,81,81,131,69,79,74, +189,99,153,216,113,114,206,140,133,192,103,2,2,254,90,117,157,11,2,37,3,142,1,211,122,155,73,48,47,111,58,66,138,247,163,160,248,142,125,231,160,27,47,18,1,214,166,174,169,171,255,255,0,157,255,233,4,21,6,58,6,38,0,157, +0,0,0,6,6,249,21,0,255,255,0,157,255,233,4,21,6,21,6,38,0,157,0,0,0,6,6,253,21,0,255,255,0,157,255,233,4,21,6,43,6,38,0,157,0,0,0,6,6,252,21,0,255,255,0,157,255,233,4,21,6,43,6,38, +0,157,0,0,0,6,6,251,21,0,255,255,0,157,255,233,4,21,5,231,6,38,0,157,0,0,0,6,6,246,21,0,255,255,0,157,255,233,4,21,6,10,6,38,0,157,0,0,0,6,6,247,21,0,255,255,0,157,255,233,4,21,6,37, +6,38,0,157,0,0,0,6,6,248,21,0,255,255,0,157,255,233,4,21,5,200,6,38,0,157,0,0,0,6,7,0,21,0,0,3,0,157,254,53,4,21,4,51,0,21,0,48,0,55,0,0,101,21,14,2,21,20,22,51,50,54,55,7, +6,6,35,34,38,53,52,54,54,1,30,2,51,50,54,55,23,6,6,35,34,38,38,53,52,54,54,51,50,22,22,21,20,6,7,1,34,6,7,33,38,38,3,30,103,106,38,49,62,32,55,37,18,30,57,39,114,130,90,178,254,179,5,84, +138,81,81,131,69,79,74,189,99,153,216,113,114,206,140,133,192,103,2,2,254,90,117,157,11,2,37,3,142,31,31,45,78,71,35,45,51,7,7,134,6,8,114,83,72,118,83,1,200,122,155,73,48,47,111,58,66,138,247,163,160,248,142,125, +231,160,27,47,18,1,214,166,174,169,171,0,0,1,0,188,0,0,4,84,5,218,0,24,0,0,65,50,22,23,7,38,38,35,34,6,21,21,33,7,33,17,35,17,35,53,51,53,52,54,54,3,55,85,138,62,54,51,114,61,110,111,1,101, +18,254,173,168,251,251,101,174,5,218,30,27,125,22,22,86,89,214,132,252,185,3,71,132,210,98,142,77,0,2,0,131,254,88,4,85,4,141,0,61,0,73,0,0,65,23,6,6,35,22,22,21,20,6,6,35,34,38,39,6,6,21,20,22, +51,51,50,22,22,21,20,4,35,34,38,38,53,51,20,22,22,51,50,54,54,53,52,38,35,35,34,38,53,52,54,55,38,38,53,52,54,54,51,62,2,5,34,6,21,20,22,51,50,54,53,52,38,4,33,52,67,152,89,91,92,94,177,125, +53,71,33,24,31,60,81,190,106,169,97,254,249,240,168,194,83,152,48,126,118,116,147,71,136,102,188,136,129,59,57,91,86,106,190,124,133,166,119,254,94,127,121,124,128,112,117,117,4,141,158,21,10,42,133,90,104,162,92,10,10,16,56,30, +38,50,76,128,82,155,166,69,141,107,61,80,39,39,77,57,75,76,120,78,51,96,37,48,142,101,107,165,94,1,21,40,185,137,106,107,138,130,116,119,123,0,255,255,0,131,254,88,4,85,6,21,6,38,0,168,0,0,0,6,6,253,243,0, +255,255,0,131,254,88,4,85,6,43,6,38,0,168,0,0,0,6,6,251,243,0,255,255,0,131,254,88,4,85,6,89,6,38,0,168,0,0,0,15,6,242,4,162,4,29,192,0,255,255,0,131,254,88,4,85,6,10,6,38,0,168,0,0, +0,6,6,247,243,0,0,1,0,201,0,0,3,233,5,213,0,20,0,0,65,17,54,54,51,50,22,21,17,35,17,52,38,35,34,6,6,7,17,35,17,1,113,62,181,93,154,142,168,88,94,60,108,86,28,168,5,213,253,184,83,83,164,146, +253,3,2,249,95,87,54,80,42,253,1,5,195,0,0,2,0,39,0,0,3,233,5,213,0,5,0,26,0,0,65,21,33,33,53,51,55,17,54,54,51,50,22,21,17,35,17,52,38,35,34,6,6,7,17,35,17,2,195,254,174,254,182,162, +168,62,181,93,154,142,168,88,94,60,108,86,28,168,5,49,134,134,164,253,184,83,83,164,146,253,3,2,249,95,87,54,80,42,253,1,5,195,255,255,0,201,0,0,3,233,7,130,6,38,0,173,0,0,0,6,7,10,0,100,0,2,0,241, +0,0,4,7,6,10,0,9,0,21,0,0,65,17,33,21,33,53,33,17,33,53,1,50,22,21,20,6,35,34,38,53,52,54,2,222,1,41,252,234,1,69,254,197,1,93,56,67,67,56,53,68,68,4,29,252,104,133,133,3,19,133,1,237, +68,49,51,69,69,51,49,68,0,1,0,241,0,0,4,7,4,29,0,9,0,0,65,17,33,21,33,53,33,17,33,53,2,222,1,41,252,234,1,69,254,197,4,29,252,104,133,133,3,19,133,0,255,255,0,241,0,0,4,7,6,58,6,38, +0,177,0,0,0,6,6,249,3,0,255,255,0,241,0,0,4,7,6,21,6,38,0,177,0,0,0,6,6,253,3,0,255,255,0,241,0,0,4,7,6,43,6,38,0,177,0,0,0,6,6,251,3,0,255,255,0,241,0,0,4,7,5,231, +6,38,0,177,0,0,0,6,6,246,3,0,255,255,0,241,0,0,4,7,6,10,6,38,0,177,0,0,0,6,6,247,3,0,255,255,0,241,0,0,4,7,6,37,6,38,0,177,0,0,0,6,6,248,3,0,0,3,0,97,254,88,3,251, +6,10,0,22,0,34,0,46,0,0,65,17,20,6,6,7,39,62,3,53,17,33,17,51,21,33,53,51,17,35,53,1,50,22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,3,233,138,232,141,50,72,140,116, +69,254,121,191,253,228,187,177,1,6,53,69,69,53,55,67,67,2,71,54,68,68,54,55,67,67,4,29,252,80,145,204,138,46,131,27,68,91,123,83,3,57,252,233,133,133,3,23,129,1,237,68,49,51,69,69,51,49,68,68,49,51,69,69, +51,49,68,0,255,255,0,241,0,0,4,7,5,200,6,38,0,177,0,0,0,6,7,0,3,0,255,255,0,241,254,53,4,7,6,10,6,38,0,177,0,0,0,38,6,247,3,0,0,6,7,2,187,0,255,255,0,241,0,0,4,7,6,7, +6,38,0,177,0,0,0,6,6,255,3,0,0,2,0,191,254,88,3,122,6,10,0,13,0,25,0,0,65,17,20,6,4,7,39,62,2,53,17,33,53,1,50,22,21,20,6,35,34,38,53,52,54,3,122,158,254,212,213,28,156,240,135,254, +74,1,193,56,68,68,56,54,66,66,4,29,252,140,176,237,144,36,130,26,104,181,141,2,250,133,1,237,68,49,51,69,69,51,49,68,0,1,0,191,254,88,3,122,4,29,0,13,0,0,65,17,20,6,4,7,39,62,2,53,17,33,53,3, +122,158,254,212,213,28,156,240,135,254,74,4,29,252,140,176,237,144,36,130,26,104,181,141,2,250,133,0,255,255,0,191,254,88,4,38,6,43,6,38,0,189,0,0,0,7,6,251,0,135,0,0,0,2,0,212,0,0,4,114,5,218,0,5, +0,9,0,0,73,2,35,9,2,17,35,17,4,59,254,38,2,17,221,253,250,1,210,254,27,168,4,29,254,38,253,189,2,63,1,222,1,189,250,38,5,197,255,255,0,212,253,196,4,114,5,218,6,38,0,191,0,0,0,6,6,242,11,0, +0,2,0,201,0,0,4,103,4,29,0,5,0,9,0,0,73,2,35,1,1,33,17,35,17,4,48,254,34,2,21,222,253,250,1,211,254,27,168,4,29,254,35,253,192,2,53,1,232,251,227,4,29,0,0,1,0,120,255,233,3,239,5,197, +0,17,0,0,65,17,20,22,51,50,54,55,23,6,6,35,34,38,53,17,33,53,2,99,97,77,48,86,43,45,43,127,80,140,174,254,189,5,197,251,63,78,65,20,17,123,21,33,155,137,4,51,133,0,255,255,0,120,255,233,3,239,7,226, +6,38,0,194,0,0,0,7,6,249,255,186,1,168,255,255,0,120,255,233,3,239,5,214,6,38,0,194,0,0,0,7,7,3,0,206,0,99,255,255,0,120,253,196,3,239,5,197,6,38,0,194,0,0,0,6,6,242,121,0,255,255,0,120, +255,233,4,220,5,197,6,38,0,194,0,0,0,7,6,247,2,11,253,103,0,2,0,120,255,233,3,239,5,197,0,5,0,23,0,0,65,37,23,7,5,39,1,17,20,22,51,50,54,55,23,6,6,35,34,38,53,17,33,53,1,187,1,92, +71,251,254,209,71,1,118,97,77,48,86,43,45,43,127,80,140,174,254,189,2,250,216,109,154,186,109,3,71,251,63,78,65,20,17,123,21,33,155,137,4,51,133,0,0,1,0,101,0,0,4,75,4,51,0,35,0,0,65,50,22,22,21,17, +35,17,52,38,35,34,6,7,17,35,17,52,38,35,34,6,7,17,35,17,51,23,54,54,51,50,22,23,54,54,3,127,51,93,60,156,24,57,47,93,44,157,24,57,49,91,44,155,132,10,43,107,79,60,106,25,43,108,4,51,44,126,121,252, +240,2,245,99,88,59,67,252,206,2,245,99,88,59,67,252,206,4,29,122,61,83,57,82,62,77,0,1,0,201,0,0,3,233,4,51,0,21,0,0,115,17,51,23,54,54,51,50,22,21,17,35,17,52,38,38,35,34,6,6,7,17,201,143, +13,64,193,91,155,141,168,24,76,80,62,109,85,28,4,29,146,81,87,164,146,253,3,2,129,108,133,61,54,81,41,253,1,0,255,255,0,201,0,0,3,233,6,58,6,38,0,201,0,0,0,6,6,249,0,0,0,2,0,1,0,0,3,251, +5,223,0,14,0,36,0,0,83,50,22,21,20,6,7,7,35,55,38,38,53,52,54,19,17,51,23,54,54,51,50,22,21,17,35,17,52,38,38,35,34,6,6,7,17,127,46,63,20,33,82,100,60,20,26,67,136,144,12,65,192,91,155,142, +168,24,77,80,61,110,85,28,5,223,61,46,24,62,69,173,237,18,46,27,47,60,250,33,4,29,146,81,87,164,146,253,3,2,129,108,133,61,54,81,41,253,1,0,255,255,0,201,0,0,3,233,6,43,6,38,0,201,0,0,0,6,6,252, +0,0,255,255,0,201,253,196,3,233,4,51,6,38,0,201,0,0,0,6,6,242,2,0,0,1,0,201,254,91,3,233,4,51,0,29,0,0,101,20,6,6,7,39,62,2,53,17,52,38,38,35,34,6,6,7,17,35,17,51,23,54,54,51, +50,22,21,3,233,68,137,104,63,69,91,44,23,77,82,60,108,86,28,168,143,13,64,191,93,154,142,57,149,176,107,46,122,32,71,127,115,2,83,108,133,61,54,80,42,253,1,4,29,146,81,87,164,146,255,255,0,201,0,0,3,233,6,7, +6,38,0,201,0,0,0,6,6,255,0,0,0,2,0,147,255,233,4,29,4,51,0,15,0,27,0,0,65,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,23,34,6,21,20,22,51,50,54,53,52,38,2,90,149,201,101,104,201,148, +148,202,103,104,203,148,136,139,137,136,136,137,136,4,51,135,246,167,161,248,141,136,247,165,163,248,139,137,201,212,208,202,202,210,210,201,255,255,0,147,255,233,4,29,6,58,6,38,0,208,0,0,0,6,6,249,0,0,255,255,0,147,255,233, +4,29,6,21,6,38,0,208,0,0,0,6,6,253,0,0,255,255,0,147,255,233,4,29,6,43,6,38,0,208,0,0,0,6,6,251,0,0,255,255,0,147,255,233,4,29,5,231,6,38,0,208,0,0,0,6,6,246,0,0,255,255,0,147, +255,233,4,29,6,37,6,38,0,208,0,0,0,6,6,248,0,0,255,255,0,147,255,233,4,29,6,135,6,38,0,208,0,0,0,6,6,250,79,0,255,255,0,147,255,233,4,29,5,200,6,38,0,208,0,0,0,6,7,0,0,0,0,3, +0,147,254,251,4,29,5,28,0,15,0,27,0,41,0,0,65,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,37,23,3,7,3,7,3,39,19,55,19,55,7,34,6,21,20,22,22,51,50,54,53,52,38,38,2,90,144,200,107,104, +201,148,143,202,108,104,203,1,66,141,89,45,252,27,78,140,92,49,253,16,94,135,139,61,122,89,136,136,61,120,4,51,135,246,167,161,248,141,136,247,165,163,248,139,233,41,254,245,73,252,208,110,254,250,42,1,24,94,3,48,84,118,201,211, +148,181,80,201,210,150,180,80,255,255,0,147,254,251,4,29,6,58,6,38,0,216,0,0,0,6,6,249,0,0,255,255,0,147,255,233,4,29,6,7,6,38,0,208,0,0,0,6,6,255,0,0,0,3,255,251,255,233,4,206,4,51,0,36, +0,48,0,55,0,0,65,50,18,21,20,6,7,33,22,22,51,50,54,55,23,6,6,35,34,38,39,6,6,35,34,38,38,53,52,54,54,51,50,22,23,54,54,5,34,6,21,20,22,51,50,54,53,52,38,5,34,6,7,33,38,38,3,131, +174,157,3,1,253,242,14,102,103,57,86,50,77,60,128,84,110,150,40,37,128,118,117,150,72,70,151,118,124,127,34,36,131,254,81,98,83,83,98,98,78,79,1,185,90,90,13,1,110,4,71,4,51,254,236,240,27,48,19,179,168,41,38,115, +47,58,106,97,90,113,136,247,165,163,248,139,112,94,89,117,135,205,210,216,194,187,225,210,203,4,151,188,166,173,0,2,0,201,254,88,4,29,4,51,0,17,0,31,0,0,65,50,22,22,21,20,6,6,35,34,39,17,7,17,51,23,54,54, +23,34,6,7,17,22,22,51,50,54,53,52,38,38,2,160,140,167,74,89,180,137,173,105,168,143,14,58,161,55,87,133,43,41,125,75,131,132,52,106,4,51,136,247,165,159,249,142,122,254,10,21,5,197,147,81,88,135,105,64,253,246,61,71, +200,211,138,183,91,0,0,2,0,201,254,88,4,29,5,218,0,17,0,31,0,0,65,17,54,54,51,50,22,22,21,20,6,6,35,34,39,17,7,17,1,34,6,7,17,22,22,51,50,54,53,52,38,38,1,113,58,155,90,140,167,74,89,180, +137,173,105,168,1,175,87,133,43,41,125,75,131,132,52,106,5,218,253,193,74,78,136,247,165,159,249,142,122,254,10,21,7,109,253,231,105,64,253,246,61,71,200,211,138,183,91,0,0,2,0,147,254,88,3,231,4,51,0,18,0,32,0,0, +65,50,22,23,55,51,17,39,17,6,6,35,34,38,38,53,52,54,54,23,34,6,21,20,22,22,51,50,54,55,17,38,38,2,36,95,145,54,14,143,168,57,153,86,141,171,76,91,180,172,131,132,54,107,82,88,130,43,41,125,4,51,70,67, +115,250,59,21,2,24,81,75,136,247,165,158,249,143,135,206,209,136,182,90,98,64,2,14,64,71,0,2,0,211,0,0,4,37,4,52,0,23,0,28,0,0,115,53,51,17,35,53,33,23,54,54,51,50,22,23,7,38,38,35,34,6,7,17, +51,21,19,53,55,51,3,211,164,164,1,36,31,61,174,143,44,69,36,49,33,54,35,121,174,52,214,142,17,145,24,129,3,27,129,249,130,142,13,10,150,9,9,172,174,254,66,129,2,185,229,127,254,156,255,255,0,211,0,0,4,37,6,58, +6,38,0,223,0,0,0,6,6,249,61,0,255,255,0,211,0,0,4,37,6,43,6,38,0,223,0,0,0,6,6,252,61,0,255,255,0,211,253,196,4,37,4,52,6,38,0,223,0,0,0,7,6,242,255,115,0,0,0,1,0,147,255,233, +3,235,4,51,0,43,0,0,101,50,54,53,52,38,38,39,46,2,53,52,54,54,51,50,22,23,7,38,38,35,34,6,21,20,22,22,23,30,2,21,20,6,6,35,34,38,39,55,22,22,2,47,121,141,35,108,112,109,161,89,101,180,119,127, +189,66,74,60,144,102,124,104,51,122,107,103,153,86,128,203,113,143,201,68,96,62,161,116,91,76,48,70,56,28,27,71,114,91,89,129,69,67,49,114,41,53,77,61,46,61,49,29,27,76,124,98,112,139,63,83,59,111,51,63,255,255,0,147, +255,233,3,235,6,58,6,38,0,227,0,0,0,6,6,249,15,0,255,255,0,147,255,233,3,235,6,43,6,38,0,227,0,0,0,6,6,252,15,0,255,255,0,147,254,35,3,235,4,51,6,38,0,227,0,0,0,6,7,1,249,0,255,255, +0,147,255,233,3,235,6,43,6,38,0,227,0,0,0,6,6,251,15,0,255,255,0,147,253,196,3,235,4,51,6,38,0,227,0,0,0,6,6,242,249,0,0,1,0,192,255,233,4,92,5,218,0,55,0,0,65,50,22,22,21,20,14,3, +21,20,30,3,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,46,4,53,52,62,3,53,52,38,38,35,34,6,21,17,35,17,52,54,2,81,104,156,88,46,68,67,46,81,119,121,81,103,170,100,79,126,53,68,37,93,44,101,117, +58,90,101,91,57,47,70,69,47,34,83,72,112,120,168,214,5,218,73,130,84,59,84,62,54,57,38,52,75,71,90,134,101,116,159,82,35,34,115,21,27,105,107,64,90,69,61,70,93,65,58,78,60,53,64,44,37,78,54,130,155,251,202,4, +43,212,219,0,0,1,0,159,255,233,4,13,5,32,0,23,0,0,101,6,6,35,34,38,53,17,35,53,51,53,55,17,33,7,33,17,20,22,51,50,54,55,4,13,54,154,74,170,184,242,242,168,1,108,20,254,168,93,108,59,100,43,53,36, +40,178,140,2,116,130,239,20,254,253,130,253,142,88,92,28,22,0,0,2,0,159,255,233,4,13,5,32,0,5,0,29,0,0,65,21,33,33,53,51,1,6,6,35,34,38,53,17,35,53,51,53,55,17,33,7,33,17,20,22,51,50,54,55, +3,147,254,166,254,124,220,2,124,54,154,74,170,184,242,242,168,1,108,20,254,168,93,108,59,100,43,2,192,129,129,253,117,36,40,178,140,2,116,130,239,20,254,253,130,253,142,88,92,28,22,0,255,255,0,159,255,233,4,13,5,242,6,38, +0,234,0,0,0,7,7,3,0,169,0,127,255,255,0,159,254,35,4,13,5,32,6,38,0,234,0,0,0,7,7,1,0,143,0,0,255,255,0,159,253,196,4,13,5,32,6,38,0,234,0,0,0,7,6,242,0,143,0,0,0,1,0,201, +255,233,3,231,4,29,0,19,0,0,65,17,20,22,51,50,54,55,17,51,17,35,39,6,6,35,34,38,53,17,1,113,86,91,87,155,43,168,143,14,62,182,93,153,151,4,29,253,22,104,92,99,68,3,7,251,227,142,80,85,163,147,2,254, +255,255,0,201,255,233,3,231,6,58,6,38,0,239,0,0,0,6,6,249,0,0,255,255,0,201,255,233,3,231,6,21,6,38,0,239,0,0,0,6,6,253,0,0,255,255,0,201,255,233,3,231,6,43,6,38,0,239,0,0,0,6,6,251, +0,0,255,255,0,201,255,233,3,231,5,231,6,38,0,239,0,0,0,6,6,246,0,0,255,255,0,201,255,233,3,231,6,37,6,38,0,239,0,0,0,6,6,248,0,0,255,255,0,201,255,233,3,236,6,135,6,38,0,239,0,0,0,6, +6,250,79,0,255,255,0,201,255,233,3,231,5,200,6,38,0,239,0,0,0,6,7,0,0,0,255,255,0,201,254,53,3,231,4,29,6,38,0,239,0,0,0,7,7,2,0,196,0,0,255,255,0,201,255,233,3,231,6,111,6,38,0,239, +0,0,0,6,6,254,0,0,255,255,0,201,255,233,3,231,6,7,6,38,0,239,0,0,0,6,6,255,0,0,0,1,0,121,0,0,4,55,4,29,0,6,0,0,65,1,35,1,51,1,1,4,55,254,129,195,254,132,178,1,49,1,45,4, +29,251,227,4,29,252,124,3,132,0,0,1,0,35,0,0,4,141,4,29,0,12,0,0,97,35,3,3,35,3,51,19,19,51,19,19,51,3,213,238,136,148,232,192,172,134,168,199,159,134,164,3,5,252,251,4,29,252,75,3,47,252,209,3, +181,0,255,255,0,35,0,0,4,141,6,58,6,38,0,251,0,0,0,6,6,249,0,0,255,255,0,35,0,0,4,141,6,43,6,38,0,251,0,0,0,6,6,251,0,0,255,255,0,35,0,0,4,141,5,231,6,38,0,251,0,0,0,6, +6,246,0,0,255,255,0,35,0,0,4,141,6,37,6,38,0,251,0,0,0,6,6,248,0,0,0,1,0,111,0,0,4,65,4,29,0,11,0,0,97,35,1,1,51,19,19,51,1,1,35,1,1,47,192,1,133,254,171,199,244,247,192,254, +172,1,132,206,254,224,2,44,1,241,254,120,1,136,254,22,253,205,1,196,0,1,0,123,254,89,4,53,4,29,0,15,0,0,65,1,14,2,7,39,62,2,55,35,1,51,1,1,4,53,254,142,37,113,181,139,26,109,126,73,28,56,254,144, +180,1,46,1,42,4,29,251,220,107,178,117,14,134,18,74,116,81,4,29,252,99,3,157,255,255,0,123,254,89,4,53,6,58,6,38,1,1,0,0,0,6,6,249,0,0,255,255,0,123,254,89,4,53,6,43,6,38,1,1,0,0,0,6, +6,251,0,0,255,255,0,123,254,89,4,53,5,231,6,38,1,1,0,0,0,6,6,246,0,0,255,255,0,123,254,89,4,53,6,37,6,38,1,1,0,0,0,6,6,248,0,0,0,1,0,205,0,0,3,229,4,29,0,9,0,0,101,33, +7,33,53,1,33,53,33,21,1,155,2,74,22,252,254,2,72,253,230,2,228,143,143,127,3,12,146,130,255,255,0,205,0,0,3,229,6,58,6,38,1,6,0,0,0,6,6,249,21,0,255,255,0,205,0,0,3,229,6,43,6,38,1,6, +0,0,0,6,6,252,21,0,255,255,0,205,0,0,3,229,6,10,6,38,1,6,0,0,0,6,6,247,21,0,255,255,0,183,255,233,4,9,5,246,6,38,0,147,0,0,0,7,7,17,0,157,255,239,255,255,0,201,0,0,3,233,6,7, +6,38,0,201,0,0,0,6,7,17,69,0,255,255,0,147,255,233,4,29,6,7,6,38,0,208,0,0,0,6,7,17,69,0,255,255,0,147,255,233,3,235,6,7,6,38,0,227,0,0,0,6,7,17,84,0,255,255,0,205,0,0,3,229, +6,7,6,38,1,6,0,0,0,6,7,17,90,0,0,1,0,193,0,243,3,234,4,28,0,11,0,0,65,23,1,1,7,1,1,39,1,1,55,1,3,127,107,254,217,1,39,107,254,217,254,212,107,1,44,254,212,107,1,44,4,28,107,254, +217,254,212,107,1,44,254,212,107,1,44,1,39,107,254,217,0,2,0,241,0,0,4,7,5,193,0,9,0,21,0,0,65,17,33,21,33,53,33,17,33,53,1,50,22,21,20,6,35,34,38,53,52,54,2,222,1,41,252,234,1,69,254,197, +1,93,56,67,67,56,53,68,68,3,203,252,186,133,133,2,194,132,1,246,68,49,51,69,69,51,49,68,0,2,0,191,254,88,3,122,5,193,0,13,0,25,0,0,65,17,20,6,4,7,39,62,2,53,17,33,53,1,50,22,21,20,6,35, +34,38,53,52,54,3,122,158,254,212,213,28,156,240,135,254,74,1,193,56,68,68,56,54,66,66,3,203,252,222,176,237,144,36,130,26,104,181,141,2,169,132,1,246,68,49,51,69,69,51,49,68,0,1,0,120,255,233,3,239,5,97,0,17, +0,0,65,17,20,22,51,50,54,55,23,6,6,35,34,38,53,17,33,53,2,99,97,77,48,86,43,45,43,127,80,140,174,254,189,5,97,251,163,78,65,20,17,123,21,33,155,137,3,191,149,0,0,1,0,211,0,0,4,37,4,52,0,23, +0,0,115,53,51,17,35,53,33,23,54,54,51,50,22,23,7,38,38,35,34,6,7,17,51,21,211,164,164,1,36,31,61,174,143,44,69,36,49,33,54,35,121,174,52,214,129,3,27,129,249,130,142,13,10,150,9,9,172,174,254,66,129,0, +255,255,0,193,0,159,3,234,3,200,6,6,1,15,0,172,0,1,247,100,0,0,3,235,4,29,0,36,0,0,65,51,3,35,3,3,35,3,3,35,3,3,35,3,3,35,3,3,35,3,51,19,19,51,19,19,51,19,19,51,19,19,51,19, +19,51,19,3,73,162,182,239,136,166,241,124,128,248,133,143,242,135,139,248,133,147,232,191,171,135,168,199,156,162,204,154,164,200,154,154,204,140,189,199,157,4,29,251,227,3,5,252,251,3,5,252,251,3,5,252,251,3,5,252,251,3,5,252, +251,4,29,252,75,3,47,252,209,3,47,252,209,3,47,252,209,3,47,252,209,3,47,252,209,0,0,3,0,204,0,0,3,229,5,218,0,31,0,35,0,46,0,0,65,50,22,21,17,20,22,23,7,38,38,39,6,6,35,34,38,53,52,54, +51,51,53,52,38,35,34,6,7,39,54,54,1,21,33,53,1,35,34,6,21,20,22,51,50,54,55,2,68,168,165,33,33,38,62,81,22,49,143,76,137,167,231,203,117,104,94,41,129,72,46,88,155,1,229,252,238,2,32,116,140,126,91,81, +60,112,38,5,218,149,130,254,116,45,44,11,109,8,55,56,57,61,145,119,134,140,60,84,72,22,26,117,34,26,250,189,151,151,3,122,80,74,76,78,61,51,0,3,0,192,0,0,3,238,5,218,0,15,0,19,0,31,0,0,65,50,22,22, +21,20,6,6,35,34,38,38,53,52,54,54,1,21,33,53,1,34,6,21,20,22,51,50,54,53,52,38,2,88,125,182,99,100,182,124,125,183,100,101,184,2,5,252,239,1,135,110,130,130,110,110,128,128,5,218,108,198,135,130,200,112,110,198, +134,131,198,112,250,189,151,151,4,194,151,161,161,153,153,161,161,151,0,1,1,79,2,244,3,99,5,166,0,19,0,0,65,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,51,23,54,54,2,152,106,97,143,33,60,45,82,26,143,128, +6,41,107,5,166,109,97,254,28,1,151,90,79,60,35,254,31,2,165,82,50,45,255,255,0,41,0,0,4,135,5,97,6,6,0,1,0,0,0,2,0,201,0,0,4,61,5,97,0,13,0,24,0,0,65,7,33,17,51,50,4,21,20,6, +6,35,33,17,1,35,17,51,50,54,54,53,52,38,38,3,203,17,253,189,174,249,1,31,137,241,156,254,162,1,116,198,198,96,148,86,85,148,5,97,144,254,120,194,218,157,188,84,5,97,253,94,253,206,46,124,116,102,121,53,255,255,0,193, +0,0,4,55,5,97,6,6,0,13,0,0,0,1,1,16,0,0,4,65,5,97,0,5,0,0,65,7,33,17,35,17,4,65,18,253,142,173,5,97,152,251,55,5,97,0,255,255,1,16,0,0,4,65,7,20,6,38,1,29,0,0,0,6, +7,8,103,0,0,2,1,16,0,0,4,65,6,133,0,3,0,9,0,0,65,17,7,17,19,7,33,17,35,17,4,65,170,170,18,253,142,173,6,133,254,220,20,1,56,254,220,152,251,55,5,97,0,4,0,0,254,218,4,105,5,97,0,10, +0,19,0,25,0,31,0,0,65,17,7,33,39,62,2,18,55,19,5,33,3,6,2,6,6,7,33,33,17,35,3,35,55,33,51,23,35,3,35,4,3,69,252,237,86,42,51,38,39,30,52,2,2,254,150,30,24,37,41,58,46,2,86,1, +22,138,29,43,12,252,93,198,13,44,29,138,5,97,251,48,145,145,41,108,178,1,33,220,1,140,147,254,251,208,254,232,181,113,42,254,73,1,38,145,145,254,218,0,255,255,0,251,0,0,4,27,5,97,6,6,0,24,0,0,255,255,0,251, +0,0,4,27,7,27,6,38,1,33,0,0,0,6,7,7,43,0,255,255,0,251,0,0,4,27,6,214,6,38,0,24,0,0,0,6,7,5,43,0,0,1,0,24,0,0,4,152,5,97,0,21,0,0,65,35,3,35,19,3,51,19,51,17, +51,17,51,19,51,3,19,35,3,35,17,35,2,11,124,207,168,245,216,167,181,122,154,122,183,165,216,245,172,205,122,154,2,141,253,115,2,217,2,136,253,186,2,70,253,186,2,70,253,120,253,39,2,141,253,115,0,1,0,70,255,233,4,57, +5,119,0,47,0,0,65,50,22,22,21,20,6,6,7,30,2,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,38,35,35,55,51,50,54,54,53,52,38,38,35,34,6,7,39,54,54,2,49,147,212,115,78,129,78,86,151,94, +127,235,164,146,249,90,107,81,188,111,161,177,85,145,92,244,20,210,77,136,85,79,134,85,115,172,77,98,102,229,5,119,90,162,106,85,123,73,11,7,81,145,107,123,196,113,102,94,96,70,76,151,129,93,115,54,147,47,100,79,74,98,48,71, +62,104,85,85,0,1,0,167,0,0,4,9,5,97,0,16,0,0,115,17,51,17,20,6,6,7,1,51,17,35,17,52,18,55,1,167,172,6,14,9,1,244,223,172,19,11,254,14,5,97,253,72,122,180,149,77,4,200,250,159,2,185,158,1, +8,94,251,67,255,255,0,167,0,0,4,9,7,4,6,38,1,38,0,0,0,6,7,53,0,0,255,255,0,167,0,0,4,9,7,27,6,38,1,38,0,0,0,6,7,7,1,0,0,3,0,167,254,218,4,189,7,4,0,5,0,22,0,38, +0,0,101,3,35,19,35,55,5,17,51,17,20,6,6,7,1,51,17,35,17,52,18,55,1,19,34,38,38,39,55,22,22,51,50,54,55,23,14,2,4,189,155,135,68,37,1,252,236,172,6,14,9,1,244,223,172,19,11,254,14,202,76,128, +83,8,117,22,86,70,71,93,22,115,8,84,130,138,254,80,1,38,138,138,5,97,253,72,122,180,149,77,4,200,250,159,2,185,158,1,8,94,251,67,6,9,52,100,74,25,65,55,55,65,25,74,100,52,0,1,0,189,0,0,4,149,5,97, +0,12,0,0,65,35,17,35,17,51,17,51,1,51,1,1,35,2,10,159,174,174,162,1,166,188,254,48,1,246,210,2,139,253,117,5,97,253,188,2,68,253,120,253,39,0,255,255,0,189,0,0,4,149,7,20,6,38,1,42,0,0,0,6, +7,8,44,0,0,1,0,30,255,234,4,9,5,97,0,18,0,0,65,17,35,17,33,3,6,2,14,2,7,39,62,3,55,19,4,9,173,254,141,48,24,48,56,68,85,54,76,34,60,56,54,26,78,5,97,250,159,4,204,254,104,191,254,251, +169,109,75,37,129,28,68,129,240,199,2,94,255,255,0,61,0,0,4,115,5,97,6,6,0,64,0,0,255,255,0,167,0,0,4,9,5,97,6,6,0,40,0,0,255,255,0,93,255,233,4,83,5,119,6,6,0,71,0,0,0,1,0,167, +0,0,4,9,5,97,0,7,0,0,97,17,33,17,35,17,33,17,3,92,253,248,173,3,98,4,202,251,54,5,97,250,159,0,255,255,0,231,0,0,4,90,5,97,6,6,0,83,0,0,255,255,0,127,255,233,4,111,5,119,6,6,0,14, +0,0,255,255,0,80,0,0,4,95,5,97,6,6,0,97,0,0,0,1,0,53,255,233,4,136,5,97,0,16,0,0,65,1,14,3,7,39,62,2,55,35,1,51,1,1,4,136,254,91,36,83,112,156,109,26,104,130,86,39,69,254,58,180, +1,138,1,102,5,97,252,7,86,131,93,59,14,139,15,56,105,87,3,230,252,138,3,118,255,255,0,53,255,233,4,136,6,245,6,38,1,52,0,0,0,6,7,12,18,0,0,3,0,26,255,198,4,150,5,155,0,17,0,25,0,33,0,0, +65,21,22,18,17,16,2,7,21,35,53,38,2,17,16,18,55,53,23,14,2,21,20,22,23,19,17,54,54,53,52,38,38,2,173,249,240,254,235,170,236,253,240,249,2,107,140,68,149,166,166,166,149,68,140,5,155,116,18,254,200,254,216,254, +207,254,199,12,121,121,9,1,58,1,51,1,40,1,56,18,116,245,3,99,215,180,253,235,14,3,231,252,25,14,235,253,180,215,99,0,255,255,0,62,0,0,4,114,5,97,6,6,0,119,0,0,0,2,0,101,0,0,4,9,5,97,0,17, +0,21,0,0,65,17,20,22,51,50,54,55,23,14,2,35,34,38,38,53,17,33,17,35,17,1,19,141,129,120,161,52,21,68,120,127,81,121,181,100,3,164,173,5,97,253,251,138,131,83,56,137,54,68,32,101,182,123,2,20,250,159,5,97, +0,2,0,167,254,218,4,132,5,97,0,7,0,13,0,0,115,17,51,17,33,17,51,17,55,17,35,3,35,55,167,173,2,8,173,123,138,29,43,12,5,97,251,47,4,209,250,159,145,254,73,1,38,145,0,1,0,93,0,0,4,83,5,97, +0,11,0,0,65,17,33,17,51,17,33,17,51,17,33,17,4,83,252,10,163,1,10,156,1,10,5,97,250,159,5,97,251,48,4,208,251,48,4,208,0,2,0,93,254,218,4,207,5,97,0,5,0,17,0,0,101,17,35,3,35,55,19,17, +33,17,51,17,33,17,51,17,33,17,4,207,138,29,44,13,74,252,10,163,1,10,156,1,10,145,254,73,1,38,145,4,208,250,159,5,97,251,48,4,208,251,48,4,208,0,0,2,0,167,254,218,4,9,5,97,0,3,0,11,0,0,101,51, +3,35,1,17,51,17,33,17,51,17,2,0,176,22,132,254,145,173,2,8,173,83,254,135,1,38,5,97,251,47,4,209,250,159,0,2,0,189,0,0,4,79,5,97,0,11,0,22,0,0,65,17,51,50,4,21,20,6,6,35,33,17,1,35, +17,51,50,54,54,53,52,38,38,1,106,207,249,1,29,137,240,155,254,130,1,148,231,230,92,147,86,85,145,5,97,254,2,201,223,160,195,88,5,97,253,120,253,180,49,130,121,107,126,55,0,2,0,1,0,0,4,139,5,97,0,13,0,24, +0,0,65,17,51,50,4,21,20,6,6,35,33,17,35,53,1,35,17,51,50,54,54,53,52,38,38,1,162,212,248,1,29,136,241,155,254,124,242,2,145,240,243,92,144,84,84,146,5,97,254,2,201,223,160,195,88,4,201,152,253,119,253,182, +48,130,121,107,125,55,0,3,0,62,0,0,4,114,5,97,0,10,0,18,0,22,0,0,83,17,51,50,22,21,20,4,35,33,17,1,35,17,51,50,54,53,16,1,17,35,17,238,126,251,246,254,254,235,254,206,1,65,145,147,141,151,1,205, +176,5,97,254,0,218,204,224,219,5,97,253,124,253,174,137,165,1,36,2,132,250,159,5,97,0,0,2,0,3,255,234,4,176,5,97,0,23,0,33,0,0,65,17,50,22,21,20,6,35,35,17,35,3,14,3,7,39,62,3,55,19,1,35, +17,51,50,54,54,53,52,38,2,198,245,245,255,220,186,188,46,15,37,50,66,44,90,23,39,33,28,12,60,2,31,31,30,89,125,65,141,5,97,254,2,204,220,238,205,4,210,253,155,183,225,127,74,34,114,25,65,111,186,147,2,239,253,123, +253,176,50,130,121,160,131,0,0,2,0,83,0,0,4,176,5,97,0,18,0,28,0,0,65,17,54,22,21,20,6,6,35,35,17,33,17,35,17,51,17,33,17,19,35,17,51,22,54,54,53,52,38,2,197,247,244,116,212,145,189,254,227,170, +170,1,29,203,32,32,88,124,66,141,5,97,253,218,1,193,210,156,187,82,2,186,253,70,5,97,253,218,2,38,253,88,253,208,1,44,124,119,155,119,255,255,0,87,255,233,4,49,5,119,6,6,0,90,0,0,0,1,0,115,255,233,4,100, +5,119,0,32,0,0,65,50,22,23,7,38,38,35,34,6,6,7,33,21,33,30,2,51,50,54,55,23,6,6,35,34,36,2,53,52,18,36,2,193,133,186,80,89,70,150,80,104,180,119,13,2,96,253,156,8,115,184,113,115,152,50,92,63, +205,148,172,254,244,153,162,1,13,5,119,69,64,107,51,48,93,208,177,145,182,226,105,74,45,113,58,93,164,1,61,231,232,1,60,162,0,1,0,84,255,233,4,53,5,119,0,29,0,0,65,50,0,17,20,2,6,35,34,38,39,55,22,22, +51,50,54,19,33,53,33,2,38,35,34,6,7,39,54,54,2,26,249,1,34,136,249,170,136,224,78,105,71,155,96,181,194,12,253,162,2,94,14,190,164,116,155,63,96,78,214,5,119,254,168,254,164,240,254,186,164,97,79,100,64,67,248,1, +9,146,1,5,216,80,51,103,68,101,255,255,0,206,0,0,3,226,5,97,6,6,0,43,0,0,255,255,0,206,0,0,3,226,6,214,6,38,0,43,0,0,0,6,7,5,1,0,255,255,0,145,255,233,3,225,5,97,6,6,0,54,0,0, +0,1,255,247,0,0,4,109,5,97,0,23,0,0,65,7,33,17,54,54,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,33,53,3,58,18,254,191,55,141,94,181,175,174,100,121,93,119,39,174,254,190,5,97,144,254,59,53,66, +207,199,254,19,1,225,143,125,71,36,253,126,4,209,144,0,0,2,0,93,255,233,4,134,5,119,0,20,0,36,0,0,65,50,22,18,21,16,2,35,34,38,2,39,35,17,35,17,51,17,51,18,18,23,34,6,6,21,20,22,22,51,50,54, +54,53,52,38,38,3,9,144,166,71,177,204,143,165,71,3,134,168,168,136,12,172,196,74,90,40,41,89,74,70,89,44,43,90,5,119,161,254,196,235,254,169,254,145,167,1,43,199,253,126,5,97,253,176,1,41,1,61,142,106,249,213,213,250, +107,106,249,213,214,249,107,0,0,2,0,67,0,0,4,9,5,97,0,13,0,22,0,0,65,17,35,17,33,1,35,1,38,38,53,52,36,51,23,35,34,6,21,20,22,51,51,4,9,173,254,205,254,220,194,1,68,120,121,1,10,255,189,210, +159,155,142,135,247,5,97,250,159,2,41,253,215,2,81,55,195,126,193,215,138,130,140,140,134,0,0,1,255,247,254,241,4,109,5,97,0,31,0,0,65,17,54,54,51,50,22,21,17,20,6,6,7,39,62,2,53,17,52,38,35,34,6,7, +17,35,17,33,53,33,7,1,231,55,145,90,181,175,82,155,109,44,88,93,35,100,121,93,119,39,174,254,190,3,67,18,4,209,254,59,49,70,207,199,254,210,139,177,109,37,140,35,80,117,90,1,34,143,125,71,36,253,126,4,209,144,144,0, +0,1,0,33,255,234,4,145,5,97,0,50,0,0,65,22,22,18,21,20,2,6,35,34,38,39,6,6,35,34,46,2,53,52,18,54,55,51,6,6,2,21,20,22,22,51,50,54,53,17,51,17,20,22,51,50,62,2,53,52,2,38,39,4, +2,25,68,50,82,144,96,96,118,30,32,112,100,59,116,94,57,51,68,25,168,43,64,35,48,84,54,51,76,170,84,57,35,62,48,27,37,64,40,5,97,69,217,254,213,195,228,254,240,119,107,101,100,108,63,143,238,175,195,1,43,217,69,112, +232,254,245,163,182,210,90,94,123,1,202,254,56,119,100,37,101,189,151,165,1,13,233,111,0,2,0,20,0,0,4,112,5,97,0,22,0,27,0,0,97,17,51,17,51,50,54,54,53,52,38,35,35,53,51,50,22,22,21,20,6,6,35,1, +53,33,33,21,1,52,173,140,95,148,86,174,147,180,176,154,230,127,138,241,157,253,188,1,32,1,224,5,97,251,44,52,129,116,156,125,138,91,184,140,156,195,91,4,37,129,129,0,0,2,0,80,255,233,4,165,5,119,0,7,0,40,0,0, +83,17,51,21,35,17,35,17,1,6,6,35,34,38,2,53,52,18,54,51,50,22,23,7,38,38,35,34,6,6,7,33,21,33,30,2,51,50,54,55,255,223,223,175,4,85,53,135,108,152,224,122,127,229,152,95,121,57,85,44,80,60,88,139, +89,14,1,201,254,50,9,85,141,91,76,95,39,5,97,253,176,150,253,133,5,97,250,233,41,56,164,1,61,231,232,1,60,162,41,40,114,27,26,92,208,176,146,181,225,104,41,24,0,3,0,41,0,0,4,135,5,97,0,6,0,10,0,14, +0,0,115,1,51,1,35,1,1,33,17,51,17,1,55,33,23,41,1,192,222,1,192,186,254,135,254,135,1,38,164,254,130,44,2,3,45,5,97,250,159,4,199,251,57,2,111,253,145,2,68,147,147,0,0,4,0,74,0,0,4,175,5,97, +0,7,0,14,0,18,0,22,0,0,65,35,17,35,17,51,17,51,3,1,51,1,35,1,1,51,17,51,17,1,55,33,23,1,211,222,171,171,216,146,1,76,220,1,76,172,254,238,254,238,201,146,254,138,45,2,2,45,2,70,253,187,5,96, +253,112,253,47,5,97,250,159,4,219,251,37,2,108,253,148,2,70,139,139,0,3,0,75,0,0,4,101,5,97,0,11,0,20,0,24,0,0,115,19,33,19,35,3,35,17,35,17,35,3,1,1,53,51,1,1,51,21,1,1,39,33,21,75, +224,2,106,208,162,163,114,169,114,166,1,6,254,198,119,1,47,1,50,112,254,186,254,63,5,2,220,2,245,253,11,2,110,253,146,2,110,253,146,2,137,2,101,115,253,148,2,108,115,253,155,2,90,126,126,0,0,4,0,37,0,0,4,231, +5,97,0,7,0,19,0,28,0,32,0,0,119,17,51,17,33,23,33,17,23,19,33,19,35,3,35,17,35,17,35,3,19,1,53,51,1,1,51,21,1,1,39,33,21,37,171,2,35,6,253,215,55,216,2,65,199,163,153,92,173,93,154,232, +254,234,119,1,10,1,13,113,254,222,254,99,5,2,149,1,5,96,253,148,135,253,147,1,2,245,253,11,2,110,253,146,2,110,253,146,2,137,2,100,116,253,148,2,108,116,253,156,2,89,127,127,0,4,0,165,254,85,4,11,7,17,0,24, +0,34,0,42,0,49,0,0,65,38,38,53,52,54,54,55,62,2,53,55,20,14,2,7,14,2,21,20,22,23,1,7,52,38,35,35,55,51,54,22,37,53,1,33,53,33,21,1,1,23,5,35,37,55,23,1,191,126,128,72,147,114,104,146, +78,181,65,116,152,87,100,109,42,75,70,2,14,181,154,151,212,150,95,223,230,253,70,1,166,253,174,3,35,254,11,1,96,74,254,243,113,254,241,76,250,254,85,53,133,85,66,93,56,10,11,65,119,89,1,94,148,106,62,9,10,26,39,30, +39,71,35,2,157,1,146,122,130,2,215,83,128,1,227,145,144,253,218,4,102,85,215,215,85,161,255,255,0,27,0,0,4,149,5,97,6,6,2,81,0,0,255,255,0,93,255,233,4,83,5,119,6,6,1,134,0,0,0,1,0,56,0,0, +4,163,5,119,0,18,0,0,65,38,38,35,34,6,7,1,35,1,51,1,19,54,54,51,50,22,23,4,107,17,31,20,38,45,17,254,204,190,254,103,187,1,59,251,30,112,93,44,68,31,4,228,6,9,53,57,251,123,5,97,251,104,3,213, +114,103,19,17,255,255,0,56,0,0,4,163,7,203,6,38,1,86,0,0,0,7,6,239,255,135,1,68,0,3,0,18,254,89,4,164,5,119,0,15,0,27,0,42,0,0,69,34,38,2,53,52,18,54,51,50,22,18,21,20,2,6,39,50, +18,17,16,2,35,34,2,17,16,18,1,39,54,54,55,35,3,51,19,19,51,3,14,2,1,73,115,136,60,60,136,115,114,136,60,60,136,114,89,59,59,89,90,60,65,1,199,24,87,103,21,71,166,150,122,113,154,165,19,86,132,23,168,1, +60,224,220,1,65,173,169,254,193,224,225,254,194,167,133,1,20,1,45,1,46,1,22,254,232,254,210,254,210,254,239,253,235,128,26,134,135,4,29,252,99,3,157,251,220,120,167,103,0,2,0,132,0,0,4,126,5,97,0,5,0,11,0,0, +65,21,33,33,53,51,1,7,33,17,35,17,3,53,254,198,254,137,201,3,49,19,253,143,173,3,98,133,133,1,255,152,251,55,5,97,0,4,0,170,254,89,4,75,5,97,0,3,0,19,0,35,0,39,0,0,65,7,33,39,1,34,38,39, +55,22,22,51,50,54,53,53,51,21,20,6,3,50,22,21,17,35,17,52,38,35,34,6,7,55,54,54,3,17,35,17,3,171,22,253,194,138,2,92,78,111,36,65,36,66,51,59,65,173,159,234,179,214,173,125,124,120,163,72,1,72,184,236, +173,5,97,144,144,248,248,47,27,115,21,26,73,77,133,123,152,150,5,42,227,201,254,41,1,213,134,144,97,87,162,83,91,1,222,250,159,5,97,0,0,2,0,24,254,218,4,195,5,97,0,5,0,27,0,0,101,17,35,3,35,55,1,35, +3,35,19,3,51,19,51,17,51,17,51,19,51,3,19,35,3,35,17,35,4,195,130,27,41,9,254,5,124,207,168,245,216,167,181,122,154,122,183,165,216,245,172,205,122,154,145,254,73,1,38,145,1,252,253,115,2,217,2,136,253,186,2,70, +253,186,2,70,253,120,253,39,2,141,253,115,255,255,0,70,254,35,4,57,5,119,6,38,1,37,0,0,0,6,7,16,243,0,0,2,0,189,254,218,4,150,5,97,0,5,0,18,0,0,101,17,35,3,35,55,1,35,17,35,17,51,17,51, +1,51,1,1,35,4,150,138,29,43,12,254,58,159,174,174,162,1,166,188,254,48,1,246,210,145,254,73,1,38,145,1,250,253,117,5,97,253,188,2,68,253,120,253,39,0,0,1,0,189,0,0,4,151,5,97,0,20,0,0,65,17,35,17, +35,17,51,17,51,17,51,17,51,1,51,1,1,35,1,35,17,1,201,98,170,170,98,107,52,1,83,182,254,128,1,166,194,254,146,51,1,45,1,94,253,117,5,97,253,188,1,86,254,170,2,68,253,120,253,39,2,139,254,162,0,2,0,74, +0,0,4,144,5,97,0,4,0,17,0,0,83,53,51,33,21,3,35,17,35,17,51,17,51,1,51,1,1,35,74,152,1,143,68,160,174,174,162,1,127,188,254,88,1,206,210,4,31,131,131,254,108,253,117,5,97,253,188,2,68,253,120,253, +39,0,0,1,0,23,0,0,4,175,5,97,0,14,0,0,65,35,17,35,17,35,53,33,17,51,1,51,1,1,35,2,67,138,177,241,1,162,140,1,135,189,254,81,1,213,212,2,139,253,117,4,201,152,253,189,2,67,253,120,253,39,0,2, +0,170,254,218,4,133,5,97,0,5,0,17,0,0,101,17,35,3,35,55,7,17,33,17,35,17,51,17,33,17,51,17,4,133,138,29,44,13,96,253,248,173,173,2,8,173,145,254,73,1,38,145,145,2,141,253,115,5,97,253,186,2,70,250, +159,0,0,2,0,135,0,0,4,185,5,97,0,3,0,15,0,0,65,33,7,33,3,17,33,17,35,17,51,17,33,17,51,17,3,70,1,115,18,254,243,171,254,70,174,174,1,186,173,5,97,144,251,47,2,142,253,114,5,97,253,186,2,70, +250,159,0,3,0,55,254,89,4,162,5,97,0,7,0,23,0,39,0,0,97,17,33,17,35,17,33,17,19,50,22,21,17,35,17,52,38,35,34,6,7,55,54,54,19,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,2,9,254,220, +174,2,128,203,134,154,173,76,66,66,119,70,7,53,128,92,78,111,36,67,35,65,51,59,65,173,166,4,198,251,58,5,97,250,159,3,134,172,142,253,180,2,79,82,76,73,82,142,76,90,250,211,47,27,116,21,26,73,77,132,119,153,153,0, +0,2,0,167,254,218,4,132,5,97,0,5,0,13,0,0,101,17,35,3,35,55,7,17,33,17,35,17,33,17,4,132,138,29,43,12,98,253,248,173,3,98,145,254,73,1,38,145,145,4,202,251,54,5,97,250,159,0,0,2,0,71,255,19, +4,140,5,119,0,25,0,58,0,0,69,34,38,2,53,52,18,54,54,51,50,22,23,7,38,38,35,34,14,2,21,20,22,22,51,1,46,3,53,52,54,54,51,50,22,22,21,20,14,2,35,55,50,54,53,52,35,34,6,21,20,30,2,23, +2,115,167,251,138,89,152,193,106,123,164,81,92,66,132,74,67,127,103,59,94,170,112,1,52,78,152,122,74,83,147,94,105,144,74,69,135,201,132,8,171,179,143,76,76,61,106,132,69,22,163,1,62,231,174,1,10,178,91,67,65,116,53,49, +57,131,216,159,200,248,113,254,146,102,187,180,180,96,100,160,94,88,155,100,97,192,158,94,151,207,184,201,114,98,96,161,149,159,95,0,0,2,0,127,254,34,4,111,5,119,0,19,0,49,0,0,101,22,22,21,20,6,35,34,38,39,55,22, +22,51,50,54,53,52,38,39,19,50,22,23,7,38,38,35,34,6,6,21,20,22,22,51,50,54,55,23,6,6,35,34,36,2,53,52,18,36,2,129,132,164,135,115,68,94,32,44,24,64,51,57,58,90,92,107,135,182,82,97,65,145,79,113, +192,117,111,190,117,116,149,55,90,63,202,147,167,254,241,158,161,1,13,49,44,156,106,98,123,32,18,102,12,25,62,52,67,131,51,5,119,68,66,113,55,47,107,247,211,205,248,110,70,45,114,61,89,164,1,61,231,232,1,60,162,0,0,2, +0,80,254,218,4,95,5,97,0,5,0,13,0,0,101,17,35,3,35,55,19,17,35,17,33,53,33,7,3,39,138,29,44,13,74,173,254,82,4,15,18,145,254,73,1,38,145,4,59,251,52,4,204,149,149,0,255,255,0,47,0,0,4,129, +5,97,6,6,0,120,0,0,0,2,0,47,0,0,4,129,5,97,0,5,0,14,0,0,65,21,33,33,53,51,23,17,35,17,1,51,1,1,51,3,177,254,255,254,79,196,237,176,254,47,192,1,109,1,113,180,2,125,134,134,106,253,237,2, +17,3,80,253,78,2,178,0,0,2,0,62,254,218,4,126,5,97,0,5,0,17,0,0,101,17,35,3,35,55,1,51,1,1,51,1,1,35,1,1,35,1,4,126,138,29,44,13,252,171,199,1,46,1,47,188,254,121,1,182,199,254,169,254, +165,187,1,176,145,254,73,1,38,145,4,208,253,239,2,17,253,134,253,25,2,110,253,146,2,222,0,3,0,0,254,218,4,103,5,97,0,5,0,11,0,19,0,0,65,7,35,35,33,53,1,17,35,3,35,55,5,17,51,17,33,17,51,17, +2,180,19,240,177,255,0,4,103,142,29,43,14,253,97,178,1,159,178,5,97,142,142,251,48,254,73,1,38,145,145,5,37,251,107,4,209,250,159,0,0,3,0,101,254,218,4,132,5,97,0,5,0,23,0,27,0,0,101,17,35,3,35,55, +1,17,20,22,51,50,54,55,23,14,2,35,34,38,38,53,17,33,17,35,17,4,132,138,29,43,12,253,85,141,129,120,161,52,21,68,120,127,81,121,181,100,3,164,173,145,254,73,1,38,145,4,208,253,251,138,131,83,56,137,54,68,32,101, +182,123,2,20,250,159,5,97,0,3,0,101,0,0,4,9,5,97,0,4,0,22,0,26,0,0,65,17,35,17,17,3,17,20,22,51,50,54,55,23,14,2,35,34,38,38,53,17,33,17,35,17,2,125,117,245,141,129,120,161,52,21,68,120, +127,81,121,181,100,3,164,173,4,53,252,186,1,98,1,228,1,44,253,251,138,131,83,56,137,54,68,32,101,182,123,2,20,250,159,5,97,0,0,2,0,167,0,0,4,72,5,97,0,15,0,19,0,0,65,50,22,21,17,35,17,52,38,35, +34,6,7,55,54,54,3,17,35,17,2,191,180,213,173,124,124,120,163,72,1,71,184,236,173,3,131,227,201,254,41,1,213,134,144,97,87,162,83,91,1,222,250,159,5,97,0,3,0,167,254,218,4,177,5,97,0,15,0,19,0,25,0,0, +65,50,22,21,17,35,17,52,38,35,34,6,7,55,54,54,3,17,35,17,1,17,35,3,35,55,2,169,190,212,174,128,138,109,153,61,1,62,174,217,173,4,10,138,29,43,12,3,131,227,201,254,41,1,213,134,144,97,87,172,76,88,1,222, +250,159,5,97,251,48,254,73,1,38,145,0,0,3,0,1,255,233,4,110,5,119,0,26,0,35,0,50,0,0,65,20,6,7,33,30,2,51,50,54,55,23,6,6,35,34,38,2,53,52,18,54,51,50,22,18,1,34,6,6,7,33,46,2, +1,52,54,55,23,6,6,21,20,51,51,21,35,34,38,4,110,2,3,253,80,3,82,133,80,93,114,47,83,55,161,119,142,216,118,114,206,136,124,186,103,254,97,78,119,72,9,2,18,7,65,107,252,233,50,28,114,17,24,103,148,132,134,136, +2,202,17,53,27,180,219,99,57,33,104,47,81,153,1,53,232,227,1,70,175,152,254,207,1,62,106,222,175,183,220,100,254,97,66,102,40,52,37,67,38,102,141,135,255,255,0,1,254,53,4,110,5,119,6,38,1,112,0,0,0,6,7,2, +90,0,255,255,0,206,0,0,3,226,5,97,6,6,0,43,0,0,255,255,0,24,0,0,4,152,7,4,6,38,1,36,0,0,0,6,7,53,0,0,0,3,0,167,254,89,4,44,5,97,0,10,0,20,0,36,0,0,115,17,51,17,51,1, +51,1,7,33,17,33,17,52,38,35,55,50,22,21,17,1,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,167,173,197,1,90,185,254,109,47,254,234,2,39,141,174,17,248,223,254,222,77,111,36,65,36,65,51,59,65,173,158,5,97, +253,162,2,94,253,96,80,253,143,1,83,146,140,146,224,206,254,171,254,89,47,27,115,21,26,73,77,133,123,152,150,0,0,2,0,39,254,218,4,137,5,97,0,18,0,24,0,0,65,17,35,17,33,3,6,2,14,2,7,39,62,3,55,19, +1,3,35,19,35,55,3,213,172,254,201,49,23,49,55,69,84,54,76,33,61,56,53,27,78,3,46,154,136,69,37,1,5,97,250,159,4,204,254,104,191,254,251,169,109,75,37,129,28,68,129,240,199,2,94,251,41,254,80,1,38,138,0,2, +0,167,254,89,4,9,5,97,0,15,0,27,0,0,65,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,3,17,33,17,35,17,51,17,33,17,51,17,2,231,78,111,36,66,35,66,51,59,65,173,159,14,253,248,173,173,2,8,173,254, +89,47,27,115,21,26,73,77,133,123,152,150,1,167,2,141,253,115,5,97,253,186,2,70,250,159,0,2,0,145,254,218,4,129,5,97,0,11,0,17,0,0,97,17,33,17,35,17,51,17,33,17,51,17,55,3,35,19,35,55,3,32,254,29, +172,172,1,227,173,180,155,136,69,37,1,2,142,253,114,5,97,253,186,2,70,250,159,138,254,80,1,38,138,0,0,3,0,101,254,218,4,9,5,97,0,17,0,21,0,27,0,0,65,17,20,22,51,50,54,55,23,14,2,35,34,38,38,53, +17,33,17,35,17,3,51,23,35,3,35,1,19,141,129,120,161,52,21,68,120,127,81,121,181,100,3,164,173,139,198,13,44,29,138,5,97,253,251,138,131,83,56,137,54,68,32,101,182,123,2,20,250,159,5,97,251,48,145,254,218,0,0,2, +0,37,254,218,4,185,5,97,0,22,0,28,0,0,65,19,35,3,46,3,53,3,35,3,20,20,6,6,7,3,35,19,51,19,19,1,3,35,19,35,53,3,212,78,167,42,4,5,2,1,203,174,215,1,3,4,36,164,78,242,195,185,1,216, +156,140,69,37,5,97,250,159,2,207,73,152,138,102,21,252,66,3,190,23,108,140,149,64,253,47,5,97,252,81,3,175,251,41,254,80,1,38,138,0,255,255,0,41,0,0,4,135,7,4,6,38,0,1,0,0,0,6,7,53,0,0,255,255, +0,41,0,0,4,135,6,214,6,38,0,1,0,0,0,6,7,5,1,0,255,255,255,232,0,0,4,191,5,97,6,6,0,11,0,0,255,255,0,251,0,0,4,27,7,4,6,38,1,33,0,0,0,6,7,53,42,0,0,2,0,89,255,233, +4,79,5,119,0,24,0,31,0,0,83,52,54,55,33,2,38,35,34,6,7,39,54,54,51,50,0,17,20,2,6,35,34,38,2,1,50,54,19,33,18,22,89,3,3,3,62,9,180,155,101,146,69,89,79,199,132,252,1,9,123,228,158,155, +227,123,1,252,145,168,15,253,101,12,166,2,151,18,54,26,1,14,229,66,51,103,67,86,254,165,254,167,229,254,185,174,153,1,49,254,196,240,1,2,254,242,228,0,255,255,0,89,255,233,4,79,6,214,6,38,1,126,0,0,0,6,7,5, +243,0,255,255,0,24,0,0,4,152,6,214,6,38,1,36,0,0,0,6,7,5,1,0,255,255,0,70,255,233,4,57,6,214,6,38,1,37,0,0,0,6,7,5,253,0,0,2,0,141,255,234,4,35,5,97,0,24,0,32,0,0,69,34, +38,38,39,55,22,22,51,50,54,53,52,38,35,35,55,51,50,22,22,21,20,6,6,1,1,33,53,33,21,1,7,2,52,99,150,119,55,88,73,147,117,154,159,149,133,242,135,101,169,206,93,121,222,254,151,1,188,253,162,3,40,253,245,123, +22,35,67,47,108,49,62,156,133,129,119,138,98,175,115,129,195,109,3,45,1,185,145,144,254,2,62,0,255,255,0,167,0,0,4,9,6,183,6,38,1,38,0,0,0,6,7,15,1,0,255,255,0,167,0,0,4,9,6,214,6,38,1,38, +0,0,0,6,7,5,1,0,255,255,0,93,255,233,4,83,6,214,6,38,1,47,0,0,0,6,7,5,1,0,0,3,0,93,255,233,4,83,5,119,0,15,0,22,0,29,0,0,65,20,2,6,35,34,38,2,53,52,18,54,51,50,22,18, +1,50,18,55,33,22,18,19,34,6,7,33,38,38,4,83,113,226,168,167,227,113,113,227,167,168,226,113,254,5,166,151,5,253,121,6,156,163,158,152,12,2,130,11,150,2,175,208,254,191,181,177,1,62,213,209,1,66,183,178,254,192,252,246, +1,7,249,248,254,248,4,107,247,239,239,247,255,255,0,93,255,233,4,83,6,214,6,38,1,134,0,0,0,6,7,5,1,0,255,255,0,84,255,233,4,53,6,215,6,38,1,68,0,0,0,6,7,5,235,1,255,255,0,53,255,233,4,136, +6,183,6,38,1,52,0,0,0,6,7,15,21,0,255,255,0,53,255,233,4,136,6,214,6,38,1,52,0,0,0,6,7,5,21,0,255,255,0,53,255,233,4,136,7,118,6,38,1,52,0,0,0,6,7,9,111,0,255,255,0,101,0,0, +4,9,6,214,6,38,1,56,0,0,0,6,7,5,236,0,0,2,1,16,254,218,4,65,5,97,0,5,0,11,0,0,101,17,35,3,35,55,1,7,33,17,35,17,2,52,138,29,43,12,2,211,18,253,142,173,145,254,73,1,38,145,4,208, +152,251,55,5,97,0,255,255,0,62,0,0,4,114,6,214,6,38,1,63,0,0,0,6,7,5,1,0,0,4,0,127,254,89,4,142,5,97,0,3,0,19,0,25,0,31,0,0,101,51,21,35,3,34,38,39,55,22,22,51,50,54,53,53, +51,21,20,6,1,7,33,17,35,17,1,21,33,33,53,51,1,194,191,191,99,77,111,36,65,36,65,51,60,64,173,158,2,171,18,253,142,173,1,233,254,197,254,138,200,145,145,254,89,47,27,115,21,26,73,77,133,123,152,150,7,8,152,251, +55,5,97,254,1,133,133,0,0,3,0,29,254,89,4,129,5,97,0,3,0,19,0,31,0,0,97,53,51,21,1,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,1,51,1,1,51,1,1,35,1,1,35,1,3,215,170,254,222,77, +111,37,66,35,66,51,59,65,173,158,252,95,199,1,46,1,48,187,254,121,1,182,199,254,169,254,165,187,1,176,145,145,254,89,47,27,115,21,26,73,77,133,123,152,150,7,8,253,239,2,17,253,134,253,25,2,110,253,146,2,222,0,255,255, +0,62,0,0,4,114,5,97,6,38,0,119,0,0,0,71,4,26,255,76,0,165,83,51,60,108,0,2,0,97,0,0,3,243,5,97,0,11,0,21,0,0,97,34,38,38,53,52,36,51,51,17,51,17,37,51,17,35,34,6,21,20,22,22, +2,95,145,231,134,1,26,238,221,173,254,109,230,225,154,176,86,147,91,186,142,206,228,2,12,250,159,141,2,62,141,155,104,121,53,0,0,3,0,18,255,228,4,147,5,97,0,23,0,27,0,51,0,0,69,34,38,38,53,52,54,54,51,51, +21,35,34,6,21,20,22,51,50,54,55,23,6,6,19,17,51,17,19,34,38,39,17,51,17,20,22,51,50,54,54,53,52,38,39,51,22,22,21,20,6,6,1,73,82,142,87,99,198,149,115,119,123,146,98,70,72,92,44,58,48,147,125,174, +110,118,151,15,174,58,56,41,70,43,5,5,174,4,6,89,150,28,91,181,136,148,212,113,135,164,175,146,120,99,97,110,113,114,3,242,1,139,254,117,252,15,158,144,3,6,253,28,96,100,68,168,148,73,120,63,58,123,71,186,233,109,0,2, +0,50,255,233,4,126,5,97,0,23,0,42,0,0,69,34,38,39,3,55,19,22,22,51,50,54,54,53,52,38,39,51,22,22,21,20,6,6,1,53,51,50,54,53,52,38,35,35,53,51,50,4,21,20,6,7,7,3,25,129,165,65,172,181, +149,46,89,66,53,83,50,5,5,172,4,5,92,161,252,237,143,148,164,159,176,180,183,255,1,7,213,216,29,23,137,141,1,108,18,254,176,101,87,71,172,154,67,120,63,58,125,67,189,235,109,2,102,136,122,142,132,116,138,197,189,174,189,33, +4,0,0,2,0,145,254,218,4,85,5,97,0,21,0,27,0,0,83,33,50,4,21,20,6,6,7,1,35,1,33,53,33,50,54,53,52,38,35,33,1,17,35,3,35,55,145,1,87,255,1,7,89,152,95,1,153,208,254,135,254,221,1,50, +148,164,153,160,254,149,3,196,137,29,44,13,5,97,195,191,103,154,100,23,253,157,2,79,136,121,143,133,115,251,186,254,73,1,38,145,0,2,0,10,255,229,4,149,5,97,0,23,0,42,0,0,69,34,38,53,17,51,17,20,22,51,50,54, +54,53,52,38,39,51,22,22,21,20,6,6,37,39,62,3,55,19,33,17,35,17,35,3,14,4,3,75,119,165,174,57,56,41,70,43,5,5,174,4,5,88,150,252,200,101,26,42,35,32,16,48,2,12,174,189,36,12,31,37,48,59,27,168, +175,2,221,253,28,96,100,68,168,148,73,120,63,58,123,71,186,233,109,5,121,28,70,134,243,202,2,89,253,58,2,54,254,19,169,232,153,100,72,0,0,2,0,98,255,229,4,155,5,97,0,11,0,36,0,0,65,53,33,17,35,17,51,17, +33,17,51,17,19,34,38,38,53,17,51,17,20,22,51,50,54,54,53,52,38,39,51,22,22,21,20,6,6,2,57,254,213,172,172,1,43,172,109,79,128,74,172,57,55,42,70,42,5,5,173,4,5,88,149,2,59,83,253,114,5,97,253,190, +2,66,252,218,253,170,74,153,116,2,221,253,28,96,100,68,168,148,73,120,63,58,123,71,186,233,109,0,255,255,0,91,255,233,4,53,5,119,6,6,0,35,0,0,0,2,0,31,255,233,4,111,5,97,0,7,0,33,0,0,65,17,33,53, +33,7,33,17,19,34,38,38,53,53,51,21,20,22,51,50,54,54,53,52,38,39,51,22,22,21,20,14,2,1,132,254,155,3,171,19,254,122,154,88,150,90,174,85,77,61,111,70,5,5,170,5,5,75,124,148,2,73,2,128,152,152,253,128, +253,160,82,163,120,243,216,134,120,69,174,155,64,118,63,58,122,66,142,204,128,61,0,1,0,119,255,233,4,106,5,119,0,47,0,0,65,50,22,23,7,38,38,35,34,6,6,21,20,22,22,51,51,7,35,34,6,6,21,20,22,51,50,54, +55,23,6,4,35,34,38,38,53,52,54,54,55,46,2,53,52,54,54,2,127,136,226,102,98,77,170,115,84,136,80,84,135,79,232,20,226,91,146,85,177,163,110,189,83,103,89,254,255,147,160,232,126,94,152,85,77,131,77,121,213,5,119,85, +85,104,62,71,49,98,75,78,99,47,147,54,116,94,128,150,76,70,96,94,102,109,192,122,108,148,83,10,12,73,120,80,110,164,91,0,0,2,0,30,254,89,4,9,5,97,0,15,0,34,0,0,65,34,38,39,55,22,22,51,50,54,53,53, +51,21,20,6,19,17,35,17,33,3,6,2,14,2,7,39,62,3,55,19,2,231,78,111,36,66,35,66,51,59,65,173,159,159,173,254,141,48,24,48,56,68,85,54,76,34,60,56,54,26,78,254,89,47,27,115,21,26,73,77,133,123,152,150, +7,8,250,159,4,204,254,104,191,254,251,169,109,75,37,129,28,68,129,240,199,2,94,0,0,2,0,9,255,234,4,193,5,97,0,11,0,28,0,0,65,51,19,19,51,1,1,35,3,3,35,1,1,33,7,35,3,14,4,7,39,62,3,55, +1,161,176,212,207,167,254,236,1,58,178,247,236,169,1,54,254,23,1,101,5,192,35,12,31,37,49,59,36,100,26,42,35,32,16,5,97,253,244,2,12,253,128,253,31,2,101,253,155,2,224,2,129,154,254,29,169,232,153,100,72,36,121,28, +70,134,243,202,0,2,0,109,0,0,4,154,5,97,0,23,0,30,0,0,115,17,51,50,22,22,21,20,14,2,35,35,53,51,50,54,54,53,52,38,35,35,17,33,1,55,1,51,1,1,109,242,136,192,102,66,118,156,90,107,100,75,124,74, +143,119,79,2,201,254,182,41,1,47,172,254,161,1,98,5,97,107,190,126,101,163,116,63,141,55,131,114,145,141,251,42,2,143,106,2,104,253,98,253,61,0,0,3,0,16,0,0,4,172,5,97,0,14,0,23,0,35,0,0,115,1,38,38, +53,52,54,54,51,51,17,35,17,35,3,19,51,17,35,34,6,21,20,22,19,17,33,7,33,17,33,21,33,17,33,21,16,1,9,123,121,115,217,154,244,178,141,233,254,120,86,129,147,134,228,2,77,21,254,122,1,55,254,201,1,173,2,81, +54,192,128,125,183,102,250,159,2,41,253,215,2,183,2,31,137,134,141,131,253,73,5,97,143,254,49,143,254,25,141,0,255,255,0,91,254,166,4,161,5,119,6,6,0,85,0,0,255,255,0,9,0,0,4,167,5,97,6,6,0,114,0,0, +0,2,0,178,0,0,4,138,5,97,0,3,0,16,0,0,65,55,1,7,5,35,17,35,17,51,17,51,1,51,1,1,35,1,199,76,2,78,76,253,235,160,174,174,162,1,166,188,254,48,1,246,210,4,177,112,254,128,112,166,253,117,5,97, +253,188,2,68,253,120,253,39,0,3,255,243,254,89,4,143,5,97,0,18,0,35,0,51,0,0,87,39,62,3,55,19,33,17,35,17,35,3,14,4,1,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,6,19,17,52,38,35,34,6, +7,55,54,54,51,50,22,21,17,87,100,26,42,35,31,16,48,2,12,174,188,36,13,30,38,48,59,2,239,78,113,35,68,35,65,51,59,65,176,77,132,33,63,59,61,110,66,7,53,117,89,126,143,22,121,28,70,134,243,202,2,89,250,159, +4,209,254,19,169,232,153,100,72,254,75,47,27,116,20,26,73,77,131,119,102,136,68,1,167,2,79,82,76,73,82,142,76,90,166,125,253,157,0,3,0,53,254,89,4,163,5,97,0,15,0,31,0,43,0,0,65,50,22,21,17,35,17,52, +38,35,34,6,7,55,54,54,19,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,1,17,33,17,35,17,51,17,33,17,51,17,3,130,134,155,174,76,66,66,119,70,7,53,128,92,78,111,36,67,35,65,51,59,65,174,166,254,14,254, +214,172,172,1,42,172,3,134,172,142,253,180,2,79,82,76,73,82,142,76,90,250,211,47,27,116,21,26,73,77,132,119,153,153,1,167,2,142,253,114,5,97,253,190,2,66,250,159,0,2,0,60,0,0,4,114,5,97,0,22,0,27,0,0, +115,17,51,17,51,50,54,54,53,52,38,35,35,53,51,50,22,22,21,20,6,6,35,1,53,51,33,21,251,173,199,95,149,86,174,148,239,235,155,230,126,137,241,158,253,226,191,1,180,5,97,251,44,52,129,116,156,125,138,91,184,140,156,195, +91,4,38,126,126,0,0,3,0,231,0,0,4,90,5,97,0,3,0,13,0,25,0,0,65,51,1,35,3,52,38,38,35,35,17,51,50,54,55,20,6,6,35,35,17,35,17,33,50,4,2,61,158,1,124,158,27,85,146,93,197,190,166,165, +188,136,240,157,176,174,1,96,246,1,29,3,190,253,146,2,99,110,127,55,253,180,133,165,143,195,100,254,1,5,97,207,0,2,255,82,254,87,4,9,5,97,0,15,0,27,0,0,83,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6, +1,17,33,17,35,17,51,17,33,17,51,17,50,77,111,36,65,35,66,51,59,65,173,158,2,166,253,248,173,173,2,8,173,254,87,47,27,115,22,25,72,77,134,124,151,150,1,169,2,141,253,115,5,97,253,186,2,70,250,159,0,6,255,231, +254,218,4,199,5,97,0,5,0,11,0,15,0,25,0,34,0,51,0,0,67,17,51,7,35,3,33,3,35,39,51,17,3,39,51,21,33,55,62,3,55,19,33,17,37,33,17,35,3,14,3,1,53,51,17,51,17,51,19,51,3,19,35,3, +35,17,35,17,25,210,7,47,30,1,248,30,47,4,211,150,20,215,253,27,2,18,36,34,30,13,33,1,142,254,88,1,23,111,20,9,25,36,47,1,105,135,146,55,131,145,154,194,166,153,52,146,254,218,1,167,129,254,218,1,38,129,254,89, +1,38,129,129,129,49,110,160,242,179,1,252,250,159,129,4,90,254,131,166,235,166,118,1,214,144,2,74,253,182,2,74,253,116,253,43,2,135,253,121,2,135,0,5,0,106,254,218,4,101,5,97,0,8,0,17,0,31,0,37,0,43,0,0, +115,55,54,54,18,55,19,33,17,37,33,17,35,3,6,2,6,6,1,51,21,20,22,22,51,33,21,5,34,38,38,39,3,51,23,35,3,35,1,17,35,3,35,55,177,2,45,99,91,32,51,2,44,253,69,2,14,225,30,23,61,71,77,254, +240,180,54,131,115,1,53,254,193,158,208,103,1,15,197,13,43,30,137,3,251,137,30,43,13,146,47,196,1,78,253,1,145,250,159,145,4,60,254,252,205,254,233,183,116,4,167,254,108,137,64,142,1,89,196,161,252,52,145,254,218,1,183,254, +73,1,38,145,0,2,0,7,254,218,4,71,5,97,0,18,0,24,0,0,65,17,35,17,33,3,6,2,14,2,7,39,62,3,55,19,1,17,35,3,35,55,3,204,173,254,179,49,23,49,55,69,84,54,76,33,61,56,53,27,78,3,12,137, +30,43,13,5,97,250,159,4,204,254,104,191,254,251,169,109,75,37,129,28,68,129,240,199,2,94,251,48,254,73,1,38,145,0,255,255,0,137,255,233,4,17,4,51,6,6,0,134,0,0,0,1,0,151,255,233,4,23,5,220,0,49,0,0, +65,23,14,2,7,14,3,7,23,21,20,22,51,50,54,54,53,52,38,35,34,6,6,7,39,54,54,51,50,22,22,21,20,6,6,35,34,38,2,53,52,18,54,55,62,2,3,97,74,35,90,117,78,64,99,73,45,10,7,142,121,73,119,73, +125,101,68,132,109,35,2,44,193,136,115,172,96,114,203,132,127,202,118,65,168,153,77,111,92,5,220,131,21,49,52,29,23,60,98,160,122,9,235,190,205,63,165,153,192,156,61,137,115,173,124,155,115,215,151,169,235,122,125,1,10,209,220,1, +47,194,53,27,44,49,0,2,0,223,0,0,4,41,4,51,0,18,0,39,0,0,65,50,22,22,21,20,6,7,22,22,21,20,6,6,35,33,17,54,54,23,34,6,7,17,51,50,54,53,52,38,38,35,33,53,51,50,54,53,52,38,2,69, +131,192,105,90,122,136,132,122,201,121,254,114,83,179,98,60,84,48,226,134,134,80,122,64,254,252,249,104,124,126,4,51,64,121,89,82,117,31,13,127,120,110,137,64,4,15,15,21,134,6,6,252,231,84,90,77,77,27,132,69,93,86,70,0, +0,1,1,60,0,0,4,25,4,29,0,5,0,0,97,35,17,33,7,33,1,228,168,2,221,20,253,223,4,29,141,0,255,255,1,60,0,0,4,25,6,58,6,38,1,173,0,0,0,6,6,249,81,0,0,2,1,60,0,0,4,25,5,39, +0,3,0,9,0,0,65,17,51,17,1,35,17,33,7,33,3,109,172,253,203,168,2,221,20,253,223,4,7,1,32,254,246,251,227,4,29,141,0,4,0,52,254,218,4,46,4,29,0,9,0,18,0,24,0,30,0,0,65,17,7,33,39,62, +2,55,19,5,33,7,14,3,7,33,33,51,23,35,3,35,1,17,35,3,35,55,3,225,86,253,75,91,48,63,42,13,24,1,253,254,155,12,9,27,41,63,46,2,43,252,254,234,6,71,29,140,3,250,139,30,70,5,4,29,252,108,137,137, +42,122,222,190,1,84,137,191,145,197,129,83,34,137,254,218,1,175,254,81,1,38,137,0,255,255,0,157,255,233,4,21,4,51,6,6,0,157,0,0,255,255,0,157,255,233,4,21,6,37,6,38,1,177,0,0,0,6,6,248,21,0,255,255, +0,157,255,233,4,21,5,231,6,38,0,157,0,0,0,6,6,246,21,0,0,1,0,39,0,0,4,137,4,29,0,21,0,0,97,17,35,3,35,19,3,51,19,51,17,51,17,51,19,51,3,19,35,3,35,17,2,13,112,208,166,244,224,170, +184,112,150,112,189,165,224,244,171,207,108,1,237,254,19,2,53,1,232,254,84,1,172,254,84,1,172,254,24,253,203,1,237,254,19,0,0,1,0,108,255,233,4,10,4,51,0,43,0,0,65,51,50,54,53,52,38,35,34,6,7,39,54,54, +51,50,22,22,21,20,6,7,30,2,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,35,1,127,190,106,122,130,120,79,173,72,80,80,220,110,117,189,112,121,92,72,124,76,125,215,138,155,219,74,80,74,180,119,145,145,136, +132,212,2,107,88,70,84,80,48,46,101,59,68,63,127,96,89,111,27,7,60,104,76,111,151,76,87,60,108,53,63,106,89,87,84,0,0,1,0,201,0,0,3,231,4,29,0,15,0,0,65,17,35,17,52,54,55,1,35,17,51,17,20,6, +7,1,3,231,168,12,10,254,64,204,168,12,9,1,187,4,29,251,227,1,237,103,191,72,252,165,4,29,254,20,102,199,62,3,87,0,255,255,0,201,0,0,3,231,6,8,6,38,1,182,0,0,0,6,7,52,254,0,255,255,0,201,0,0, +3,231,6,37,6,38,1,182,0,0,0,6,6,248,0,0,0,3,0,186,254,218,4,98,6,8,0,16,0,22,0,38,0,0,65,17,35,17,52,54,55,1,35,17,51,17,20,6,6,7,1,1,3,35,19,35,55,1,34,38,38,39,55,22, +22,51,50,54,55,23,14,2,3,199,163,12,7,254,78,203,163,7,12,7,1,183,1,104,132,138,69,71,6,254,228,76,128,83,8,117,22,86,70,71,93,22,115,8,84,131,4,29,251,227,1,237,140,213,52,252,126,4,29,254,20,82,157,127, +36,3,126,252,103,254,86,1,38,132,4,137,52,100,74,25,65,55,55,65,25,74,100,52,0,1,0,211,0,0,4,114,4,29,0,12,0,0,115,17,51,17,51,1,51,1,1,35,1,35,17,211,168,211,1,48,189,254,158,1,153,203,254,164, +208,4,29,254,86,1,170,254,24,253,203,1,235,254,21,0,255,255,0,211,0,0,4,114,6,58,6,38,1,186,0,0,0,6,6,249,40,0,0,1,0,84,255,234,3,252,4,29,0,17,0,0,65,17,35,17,33,3,14,3,7,39,62,3, +55,19,3,252,168,254,118,24,13,39,62,95,70,71,37,58,47,35,12,33,4,29,251,227,3,145,254,234,176,221,136,85,39,108,23,57,108,194,159,1,170,0,0,1,0,85,0,0,4,91,4,29,0,20,0,0,65,19,35,3,38,38,55,35, +3,35,3,35,22,6,7,3,35,19,51,19,19,4,15,76,161,41,6,5,2,8,209,168,232,8,4,4,5,30,159,74,221,226,209,4,29,251,227,2,3,85,180,106,253,59,2,197,86,197,85,253,250,4,29,253,49,2,207,0,0,1,0,201, +0,0,3,231,4,29,0,11,0,0,97,17,33,17,35,17,51,17,33,17,51,17,3,63,254,50,168,168,1,206,168,1,213,254,43,4,29,254,66,1,190,251,227,0,255,255,0,147,255,233,4,29,4,51,6,6,0,208,0,0,0,1,0,201, +0,0,3,231,4,29,0,7,0,0,97,17,33,17,35,17,33,17,3,63,254,50,168,3,30,3,147,252,109,4,29,251,227,0,255,255,0,201,254,88,4,29,4,51,6,6,0,220,0,0,255,255,0,183,255,233,4,9,4,51,6,6,0,147, +0,0,0,1,0,131,0,0,4,57,4,29,0,7,0,0,65,7,33,17,35,17,33,53,4,57,20,254,135,168,254,127,4,29,140,252,111,3,145,140,255,255,0,123,254,89,4,53,4,29,6,6,1,1,0,0,255,255,0,123,254,89,4,53, +6,8,6,38,1,1,0,0,0,6,7,52,254,0,0,3,0,57,254,88,4,119,5,218,0,33,0,46,0,59,0,0,65,23,17,54,54,51,50,22,22,21,20,6,6,35,34,38,39,17,7,17,6,6,35,34,38,38,53,52,54,54,51,50, +22,23,7,34,6,21,20,22,51,50,54,55,17,38,38,33,34,6,7,17,22,22,51,50,54,53,52,38,2,12,152,44,99,53,105,117,49,66,129,93,47,92,40,152,40,97,46,93,127,64,53,122,105,52,92,43,149,71,72,72,71,44,64,41, +40,62,1,157,49,70,40,36,64,44,73,78,64,5,218,21,254,4,55,51,136,246,165,166,247,138,55,57,254,20,21,2,1,57,55,138,247,166,165,246,136,47,55,30,191,224,224,193,52,50,2,124,46,48,48,48,253,134,49,53,194,223,224,191, +255,255,0,111,0,0,4,65,4,29,6,6,1,0,0,0,0,1,0,170,0,0,3,210,4,29,0,19,0,0,65,17,35,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,3,210,168,60,172,99,153,156,168,89,94,76,165,48, +4,29,251,227,1,190,54,65,163,147,1,160,254,116,105,91,64,56,1,216,0,2,0,189,254,218,4,125,4,29,0,7,0,13,0,0,65,51,17,33,17,51,17,33,5,17,35,3,35,55,3,51,168,252,226,168,1,206,1,74,139,29,71,5, +4,29,251,227,4,29,252,111,3,254,81,1,38,137,0,1,0,97,0,0,4,79,4,29,0,11,0,0,65,17,33,17,51,17,33,17,51,17,33,17,4,79,252,18,158,1,11,156,1,11,4,29,251,227,4,29,252,111,3,145,252,111,3,145, +0,2,0,97,254,218,4,222,4,29,0,5,0,17,0,0,101,17,35,3,35,55,19,17,33,17,51,17,33,17,51,17,33,17,4,222,139,29,71,5,91,252,18,158,1,11,156,1,11,137,254,81,1,38,137,3,148,251,227,4,29,252,111,3, +145,252,111,3,145,0,0,2,0,201,254,218,3,231,4,29,0,3,0,11,0,0,101,51,3,35,1,51,17,33,17,51,17,33,2,0,176,22,132,1,41,168,252,226,168,1,206,83,254,135,5,67,251,227,4,29,252,111,0,2,0,252,0,0, +4,43,4,29,0,12,0,21,0,0,65,17,51,50,22,22,21,20,6,6,35,33,17,1,35,17,51,50,54,53,52,38,1,164,207,164,193,83,116,184,103,254,100,1,116,204,225,106,136,111,4,29,254,180,89,161,108,126,161,76,4,29,254,48, +254,58,97,130,113,114,0,2,0,66,0,0,4,67,4,29,0,14,0,24,0,0,65,17,51,50,22,22,21,20,6,6,35,33,17,35,53,1,35,17,51,50,54,54,53,52,38,1,229,124,149,215,118,125,217,140,254,220,251,2,51,144,143,80, +128,74,149,4,29,254,181,71,156,128,137,161,69,3,155,130,254,49,254,57,37,100,95,123,100,0,0,3,0,124,0,0,4,52,4,29,0,11,0,21,0,25,0,0,65,17,51,50,22,21,20,6,6,35,35,17,19,35,17,51,50,54,54,53, +52,38,1,17,35,17,1,28,71,209,239,111,201,135,232,239,79,77,84,120,64,129,2,64,162,4,29,254,170,163,183,128,161,76,4,29,254,45,254,57,41,101,92,120,101,1,211,251,227,4,29,0,0,2,0,7,255,234,4,160,4,29,0,24, +0,33,0,0,65,17,51,50,22,21,20,6,35,35,17,35,3,14,3,7,39,62,3,55,19,1,35,17,51,50,54,53,52,38,2,214,27,203,228,232,197,191,212,13,7,37,65,96,65,62,28,53,44,33,8,23,2,54,36,40,117,126,118,4, +29,254,171,165,181,186,180,3,151,254,235,172,223,139,91,39,113,24,60,110,191,155,1,166,254,46,254,56,97,137,120,102,0,2,0,145,0,0,4,166,4,29,0,20,0,30,0,0,65,17,51,50,22,22,21,20,6,6,35,35,17,33,17,35, +17,51,17,33,17,19,35,17,51,50,54,54,53,52,38,2,220,27,133,193,105,107,191,127,194,254,252,166,166,1,4,196,35,37,75,110,60,120,4,29,254,116,65,142,119,122,145,64,2,21,253,235,4,29,254,116,1,140,253,246,254,112,25,86, +88,117,84,0,255,255,0,147,255,233,3,235,4,51,6,6,0,227,0,0,0,1,0,183,255,233,4,9,4,51,0,30,0,0,65,50,22,23,7,38,38,35,34,6,7,33,21,33,22,22,51,50,54,55,23,6,6,35,34,38,38,53,52,54, +54,2,167,100,178,76,80,70,131,75,122,175,21,1,225,254,29,12,179,129,78,131,69,78,73,193,85,159,223,117,116,222,4,51,56,60,108,47,42,167,167,133,187,169,45,47,108,62,62,135,245,165,158,251,144,0,0,1,0,183,255,233,4,9, +4,51,0,30,0,0,65,50,22,22,21,20,6,6,35,34,38,39,55,22,22,51,50,54,55,33,53,33,38,38,35,34,6,7,39,54,54,2,44,162,211,104,111,216,160,98,192,73,82,65,138,77,134,168,12,254,14,1,240,15,158,129,75,142, +65,80,72,194,4,51,134,243,165,165,251,140,64,61,111,48,48,169,187,133,171,163,45,50,110,59,61,0,255,255,0,241,0,0,4,7,6,10,6,6,0,176,0,0,255,255,0,241,0,0,4,7,5,231,6,38,0,177,0,0,0,6,6,246, +3,0,255,255,0,191,254,88,3,122,6,10,6,6,0,188,0,0,255,255,0,39,0,0,3,233,5,213,6,6,0,174,0,0,0,2,0,111,255,233,4,112,4,51,0,22,0,36,0,0,65,50,22,22,21,20,6,6,35,34,38,38,39,35, +17,35,17,51,17,51,62,2,23,34,6,21,20,22,22,51,50,54,54,53,52,38,3,1,125,163,79,77,162,128,120,154,78,6,134,166,166,134,7,82,154,115,108,76,30,80,74,76,83,30,83,4,51,131,246,171,164,248,138,129,222,140,254,44, +4,29,254,67,144,210,113,138,202,210,127,184,99,99,185,128,208,202,0,2,0,105,0,0,3,203,4,29,0,20,0,24,0,0,97,17,35,34,6,21,20,22,51,33,21,33,39,38,38,53,52,54,51,33,17,33,1,23,3,3,35,222,113,121, +108,121,1,3,254,166,101,111,108,223,193,1,130,252,158,1,11,165,242,3,150,87,98,101,91,133,25,42,153,107,158,160,251,227,1,219,39,254,76,0,0,1,0,39,254,91,3,233,5,213,0,37,0,0,65,21,33,21,33,17,54,54,51,50, +22,21,17,20,14,2,7,39,62,2,53,17,52,38,35,34,6,6,7,17,35,17,35,53,51,53,1,113,1,82,254,174,63,180,93,154,142,39,78,115,77,63,70,90,44,87,95,60,108,86,28,168,162,162,5,213,164,134,254,233,76,83,164,146, +253,55,110,151,103,75,34,122,32,72,127,116,2,195,98,90,54,80,42,253,1,4,171,134,146,0,255,255,0,53,255,233,4,123,4,29,6,6,2,231,0,0,0,2,0,117,0,0,4,55,5,30,0,20,0,30,0,0,65,21,33,7,35,21, +51,50,22,22,21,20,6,6,35,33,17,35,53,51,53,1,35,17,51,50,54,54,53,52,38,1,202,1,10,21,245,141,147,215,118,126,217,139,254,205,173,173,1,72,160,159,80,127,75,149,5,30,239,134,226,71,153,126,135,159,67,3,169,134, +218,253,58,254,68,35,98,92,120,99,0,2,0,151,255,233,4,144,4,51,0,7,0,38,0,0,65,17,51,21,35,17,35,17,37,50,22,23,7,38,38,35,34,6,7,33,21,33,22,22,51,50,54,55,23,6,6,35,34,38,38,53,52,54, +54,1,65,191,191,170,2,215,84,140,66,85,49,98,62,119,121,17,1,139,254,115,6,142,108,62,94,44,90,62,155,72,131,191,103,97,193,4,29,254,67,140,254,44,4,29,22,56,57,105,39,41,175,156,133,185,167,42,40,102,62,62,133,245, +167,158,251,144,0,3,0,72,0,0,4,106,4,29,0,6,0,10,0,14,0,0,65,1,35,1,1,35,1,1,21,33,53,23,51,17,35,2,187,1,175,179,254,160,254,157,172,1,177,1,92,254,9,174,143,143,4,29,251,227,3,147,252,109, +4,29,254,2,134,134,40,254,9,0,0,3,0,104,0,0,4,164,4,29,0,3,0,11,0,18,0,0,97,17,51,17,33,17,51,17,33,21,33,17,51,1,51,1,35,1,1,2,184,136,253,40,165,2,241,253,15,84,1,60,206,1,57,163, +254,254,254,253,1,243,254,13,4,29,254,7,139,254,103,4,29,251,227,3,152,252,104,0,0,3,0,43,0,0,4,132,4,29,0,11,0,20,0,24,0,0,115,19,33,19,35,3,35,17,35,17,35,3,1,1,53,51,1,1,51,21,1,1, +39,33,7,43,220,2,164,217,154,169,150,166,148,167,1,51,254,205,105,1,35,1,33,101,254,202,254,131,15,2,113,4,2,85,253,171,1,209,254,47,1,209,254,47,1,243,1,206,92,254,56,1,200,92,254,50,1,170,128,128,0,4,0,70, +0,0,4,199,4,29,0,7,0,16,0,20,0,32,0,0,115,17,51,17,33,21,33,17,1,1,53,51,19,19,51,21,1,1,39,33,7,1,19,33,19,35,3,35,17,35,17,35,3,70,165,1,68,254,188,1,187,254,240,109,252,246,102,254, +242,254,179,7,2,27,9,253,40,209,1,249,202,159,147,73,156,73,148,4,29,254,56,139,254,54,1,243,1,206,92,254,56,1,200,92,254,50,1,173,125,125,252,96,2,85,253,171,1,202,254,54,1,202,254,54,0,2,0,161,254,85,4,12, +6,43,0,36,0,43,0,0,65,38,38,53,52,54,55,62,2,53,52,38,35,33,53,1,33,53,33,21,1,51,50,22,21,20,6,6,7,14,2,21,20,22,23,1,23,5,35,37,55,23,1,177,132,130,168,186,112,147,71,94,80,254,167,1, +161,253,176,3,49,254,63,148,163,196,108,192,125,109,115,44,82,74,1,66,76,254,244,113,254,241,80,248,254,85,56,136,85,101,109,18,12,38,76,66,91,75,128,1,90,143,130,254,152,141,153,103,135,74,14,11,27,40,29,41,72,38,7,102, +84,237,237,84,182,0,255,255,0,83,254,88,4,113,4,29,6,6,2,230,0,0,255,255,0,147,255,233,4,29,4,51,6,6,2,22,0,0,0,1,0,114,0,0,4,169,4,123,0,18,0,0,97,1,51,1,19,54,54,51,50,22,23,7, +38,38,35,34,6,7,1,1,225,254,145,183,1,30,249,34,95,95,34,68,35,54,16,32,16,34,38,16,254,210,4,29,252,126,3,12,113,99,19,18,112,7,6,42,48,252,103,0,255,255,0,114,0,0,4,169,6,135,6,38,1,230,0,0, +0,6,6,239,156,0,0,3,255,255,254,89,4,187,4,51,0,15,0,31,0,43,0,0,65,39,62,2,55,35,3,51,19,19,51,3,14,2,1,34,38,38,53,52,54,54,51,50,22,22,21,20,6,6,39,50,54,53,52,38,35,34,6,21, +20,22,2,29,24,103,136,84,22,75,190,178,134,130,172,186,24,123,199,254,140,111,136,61,62,138,110,110,134,61,64,135,108,81,55,55,79,81,59,57,254,89,125,21,67,117,93,4,29,252,99,3,157,251,240,134,185,104,1,131,136,247,165,163, +248,139,135,246,167,161,248,141,135,202,213,214,202,202,216,211,202,0,0,2,0,189,0,0,4,87,4,29,0,4,0,10,0,0,65,21,33,53,51,19,35,17,33,7,33,3,27,253,162,188,168,168,2,222,21,253,223,2,92,133,133,253,164,4, +29,141,0,4,0,205,254,89,3,225,4,29,0,16,0,20,0,24,0,40,0,0,97,17,52,38,35,34,6,7,39,54,54,51,50,22,22,21,17,33,17,51,17,17,39,33,7,3,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,3, +57,93,76,95,132,56,34,53,178,121,86,137,79,252,236,168,168,2,132,22,126,77,111,36,65,36,66,50,60,71,168,161,1,113,107,89,98,69,102,81,118,74,140,100,254,127,4,29,251,227,3,151,134,134,250,194,47,27,109,20,25,70,80,137, +123,150,152,0,0,2,0,48,254,218,4,179,4,29,0,21,0,27,0,0,97,17,35,3,35,19,3,51,19,51,17,51,17,51,19,51,3,19,35,3,35,17,37,17,35,3,35,55,2,13,112,200,165,235,216,172,174,112,150,112,180,166,216,234, +170,198,108,2,16,122,29,71,5,1,237,254,19,2,53,1,232,254,84,1,172,254,84,1,172,254,24,253,203,1,237,254,19,137,254,81,1,38,137,0,255,255,0,108,254,35,4,10,4,51,6,38,1,181,0,0,0,6,7,1,1,0,0,2, +0,211,254,218,4,150,4,29,0,5,0,18,0,0,101,17,35,3,35,55,5,17,51,17,51,1,51,1,1,35,1,35,17,4,150,139,30,70,5,253,39,168,211,1,48,189,254,158,1,153,203,254,164,208,137,254,81,1,38,137,137,4,29,254, +86,1,170,254,24,253,203,1,235,254,21,0,0,1,0,211,0,0,4,114,4,29,0,20,0,0,115,17,51,17,51,53,51,21,51,1,51,1,1,35,1,35,21,35,53,35,17,211,170,90,94,56,1,30,176,254,186,1,125,184,254,179,56,94, +90,4,29,254,88,230,230,1,168,254,27,253,200,1,232,247,247,254,24,0,0,2,0,77,0,0,4,99,5,218,0,12,0,18,0,0,65,1,35,1,35,17,35,17,55,17,51,1,51,37,33,21,33,33,53,2,201,1,154,204,254,164,168,168, +168,172,1,48,189,252,191,1,210,254,214,254,186,2,53,253,203,1,235,254,21,5,197,21,252,153,1,170,216,134,134,0,0,2,0,15,0,0,4,151,4,29,0,12,0,16,0,0,97,17,55,17,51,1,51,1,1,35,1,35,17,3,35,53, +33,1,10,168,191,1,50,190,254,154,1,156,204,254,162,187,168,251,1,163,4,9,20,254,86,1,170,254,24,253,203,1,235,254,21,3,155,130,0,2,0,172,254,218,4,109,4,29,0,5,0,17,0,0,101,17,35,3,35,55,7,17,33,17, +35,17,51,17,33,17,51,17,4,109,139,29,71,5,97,254,50,168,168,1,206,168,137,254,81,1,38,137,137,1,213,254,43,4,29,254,66,1,190,251,227,0,0,2,0,178,0,0,4,181,4,29,0,3,0,15,0,0,65,39,33,7,1,17, +33,17,35,17,51,17,33,17,51,17,3,149,168,1,200,17,254,73,254,109,168,168,1,147,168,3,147,138,138,252,109,1,213,254,43,4,29,254,66,1,190,251,227,0,0,2,0,188,254,218,4,125,4,29,0,5,0,13,0,0,101,17,35,3, +35,55,7,17,33,17,35,17,33,17,4,125,139,30,70,5,97,254,50,168,3,30,137,254,81,1,38,137,137,3,147,252,109,4,29,251,227,0,0,3,0,56,254,89,4,168,4,29,0,7,0,23,0,39,0,0,115,17,33,17,35,17,33,17, +1,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,3,17,52,38,35,34,6,7,39,54,54,51,50,22,21,17,56,2,145,174,254,202,2,155,79,111,36,67,36,65,49,63,71,171,162,9,66,63,80,108,55,8,51,134,107,114,145,4, +29,251,227,3,146,252,110,254,89,47,27,111,20,25,70,82,133,121,151,153,1,167,1,153,75,79,79,70,109,82,94,153,123,254,89,0,0,2,0,115,255,19,4,77,4,51,0,31,0,54,0,0,69,46,2,53,52,54,54,51,50,22,21,20, +14,2,35,55,50,54,54,53,52,38,35,34,6,21,20,22,22,23,1,38,38,35,34,6,21,20,22,22,51,7,34,38,38,53,52,54,54,51,50,22,23,3,151,145,176,80,69,132,94,132,156,73,136,191,119,7,122,153,71,63,59,63,65,65, +152,131,254,218,37,81,50,127,147,68,131,93,7,144,210,113,108,202,139,69,120,55,237,155,233,190,88,81,137,84,161,133,89,165,130,76,138,86,147,89,74,86,92,76,78,159,202,143,4,24,19,21,204,209,140,180,87,138,128,242,170,168,252,138, +26,32,0,2,0,183,254,34,4,9,4,51,0,19,0,48,0,0,101,22,22,21,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,39,55,50,54,55,23,6,6,35,34,38,38,53,52,54,54,51,50,22,23,7,38,38,35,34,6,21, +20,22,22,2,108,131,165,135,115,68,95,31,44,24,64,51,57,57,89,92,89,79,137,58,82,69,194,93,157,221,116,117,221,158,101,177,74,82,67,135,70,136,176,81,141,49,44,156,106,98,123,32,18,102,12,25,62,52,67,131,51,122,52,40, +110,59,68,135,245,165,158,251,144,61,61,112,47,47,204,209,140,177,83,0,0,2,0,131,254,218,4,57,4,29,0,5,0,13,0,0,101,17,35,3,35,55,1,7,33,17,35,17,33,53,3,79,140,29,70,5,1,212,20,254,135,168,254,127, +137,254,81,1,38,137,3,148,140,252,111,3,145,140,0,1,0,115,254,88,4,61,4,29,0,8,0,0,65,17,1,51,1,1,51,1,17,2,6,254,109,178,1,55,1,51,174,254,109,254,88,1,201,3,252,252,164,3,92,252,4,254,76,0, +0,2,0,115,254,88,4,61,4,29,0,4,0,13,0,0,101,21,35,33,53,19,17,1,51,1,1,51,1,17,3,124,210,254,137,211,254,109,178,1,55,1,51,174,254,109,144,135,135,253,200,1,201,3,252,252,164,3,92,252,4,254,76,0, +0,2,0,111,254,218,4,98,4,29,0,5,0,17,0,0,101,17,35,3,35,55,5,35,1,1,51,19,19,51,1,1,35,1,4,98,139,29,71,5,253,183,192,1,133,254,171,199,244,247,192,254,172,1,132,206,254,224,137,254,81,1,38,137, +137,2,44,1,241,254,120,1,136,254,22,253,205,1,196,0,0,3,0,0,254,218,4,85,4,29,0,5,0,13,0,19,0,0,65,7,43,2,53,33,51,17,33,17,51,17,33,5,17,35,3,35,55,2,165,18,238,170,251,3,51,170,253,30, +170,1,142,1,34,140,29,71,2,4,29,132,132,251,227,4,29,252,111,3,254,81,1,38,137,0,0,2,0,150,254,218,4,97,4,29,0,5,0,25,0,0,101,17,35,3,35,55,19,17,35,17,6,6,35,34,38,53,17,51,17,20,22,51, +50,54,55,17,4,97,139,29,71,5,71,168,60,172,99,153,156,168,89,94,76,165,48,137,254,81,1,38,137,3,148,251,227,1,190,54,65,163,147,1,160,254,116,105,91,64,56,1,216,0,0,2,0,170,0,0,3,210,4,29,0,3,0,23, +0,0,65,17,35,17,1,17,35,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,2,98,109,1,221,168,60,172,99,153,156,168,89,94,76,165,48,3,9,253,173,2,83,1,20,251,227,1,190,54,65,163,147,1,160,254,116,105, +91,64,56,1,216,0,0,2,0,203,0,0,3,232,5,213,0,15,0,19,0,0,97,17,52,38,35,34,6,7,39,54,54,51,50,22,21,17,33,17,55,17,3,64,97,82,98,132,54,34,54,175,123,144,169,252,227,168,2,95,119,95,104,84, +102,98,121,173,148,253,135,5,195,18,250,43,0,3,0,193,254,218,4,129,5,213,0,5,0,21,0,25,0,0,101,17,35,3,35,55,7,17,52,38,35,34,6,7,39,54,54,51,50,22,21,17,33,17,55,17,4,129,139,29,71,5,97,97, +81,98,133,53,35,55,175,123,144,168,252,227,168,137,254,81,1,38,137,137,2,95,119,95,104,84,102,98,121,173,148,253,135,5,195,18,250,43,0,3,0,21,255,233,4,85,4,51,0,15,0,41,0,48,0,0,83,52,54,55,23,6,6,21, +20,22,51,51,21,35,34,38,5,30,2,51,50,54,55,23,6,6,35,34,38,38,53,52,54,54,51,50,18,21,20,6,7,1,34,6,7,33,38,38,21,49,29,108,18,24,52,51,151,126,136,136,1,176,3,79,128,78,76,104,56,82,58,166, +95,143,204,109,104,190,131,190,210,2,1,254,117,107,139,11,1,239,3,119,2,180,62,97,44,52,37,67,38,50,54,127,124,127,120,154,74,44,34,106,47,67,138,247,163,157,248,145,254,236,240,27,47,18,1,216,168,174,169,173,255,255,0,21, +254,53,4,85,4,51,6,38,2,0,0,0,0,6,7,2,85,0,255,255,0,120,255,233,3,239,5,197,6,6,0,194,0,0,255,255,0,39,0,0,4,137,6,8,6,38,1,180,0,0,0,6,7,52,254,0,0,3,0,214,254,89,3,213, +4,29,0,10,0,20,0,36,0,0,115,17,51,17,51,1,51,1,7,35,17,33,53,52,38,35,55,50,22,21,17,1,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,214,168,135,1,27,181,254,176,48,215,1,170,100,117,34,166,185, +254,221,77,112,36,66,35,66,51,59,71,168,161,4,29,254,60,1,196,253,255,75,254,47,250,121,94,138,163,168,254,240,254,89,47,27,109,20,25,70,80,137,123,150,152,0,0,2,0,83,254,218,4,90,4,29,0,17,0,23,0,0,65,17, +35,17,33,3,14,3,7,39,62,3,55,19,1,3,35,19,35,55,3,191,168,254,178,24,14,39,62,94,69,72,37,59,46,35,13,32,3,41,132,138,69,71,6,4,29,251,227,3,145,254,234,176,221,136,85,39,108,23,57,108,194,159,1,170, +252,103,254,86,1,38,132,0,0,2,0,201,254,89,3,231,4,29,0,15,0,27,0,0,65,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,3,17,33,17,35,17,51,17,33,17,51,17,2,196,77,112,36,66,35,66,51,59,71,168, +160,8,254,50,168,168,1,206,168,254,89,47,27,109,20,25,70,80,137,123,150,152,1,167,1,213,254,43,4,29,254,66,1,190,251,227,0,2,0,204,254,218,4,96,4,29,0,11,0,17,0,0,97,17,33,17,35,17,51,17,33,17,51,17, +55,3,35,19,35,55,3,29,254,87,168,168,1,169,168,155,133,137,69,71,5,1,213,254,43,4,29,254,66,1,190,251,227,132,254,86,1,38,132,0,0,2,0,170,254,218,3,210,4,29,0,19,0,25,0,0,65,17,35,17,6,6,35,34, +38,53,17,51,17,20,22,51,50,54,55,17,3,51,23,35,3,35,3,210,168,59,174,98,153,156,168,89,94,76,165,48,141,234,5,71,29,139,4,29,251,227,1,205,54,64,163,147,1,144,254,132,106,91,64,55,1,202,252,108,137,254,218,0, +0,2,0,105,254,218,4,170,4,29,0,18,0,24,0,0,65,19,35,3,38,38,55,3,35,3,22,6,7,3,35,19,51,19,19,1,3,35,19,35,39,3,215,76,162,41,7,4,4,180,167,203,5,4,5,30,160,74,222,188,170,1,179,133, +135,69,74,2,4,29,251,227,2,3,85,184,121,253,40,2,216,100,202,85,253,250,4,29,253,49,2,207,252,103,254,86,1,38,132,0,255,255,0,137,255,233,4,17,6,8,6,38,0,134,0,0,0,6,7,52,237,0,255,255,0,137,255,233, +4,17,5,231,6,38,0,134,0,0,0,6,6,246,240,0,255,255,255,244,255,233,4,189,4,51,6,6,0,144,0,0,255,255,0,157,255,233,4,21,6,8,6,38,1,177,0,0,0,6,7,52,19,0,0,1,0,147,255,233,4,27,4,51, +0,36,0,0,65,50,22,22,21,20,6,6,35,34,2,53,52,54,55,33,21,33,20,20,21,22,22,51,50,54,39,53,38,38,35,34,6,7,39,54,54,2,72,165,205,97,112,208,144,204,236,2,3,2,237,253,180,1,143,130,140,145,1,4, +142,144,79,133,68,78,71,178,4,51,134,247,167,171,246,133,1,18,243,26,45,21,129,5,8,5,156,169,174,217,30,212,188,43,56,115,58,66,255,255,0,147,255,233,4,27,5,231,6,38,2,14,0,0,0,6,6,246,255,0,255,255,0,39, +0,0,4,137,5,231,6,38,1,180,0,0,0,6,6,246,0,0,255,255,0,108,255,233,4,10,5,232,6,38,1,181,0,0,0,6,6,246,243,1,0,2,0,123,254,88,4,10,4,29,0,24,0,32,0,0,65,34,38,38,39,55,22,22, +51,50,54,53,52,38,35,35,55,51,50,22,22,21,20,6,6,1,1,33,53,33,21,1,7,2,46,100,158,125,52,104,69,151,108,140,157,163,157,174,133,70,146,212,115,122,215,254,173,1,181,253,158,3,35,254,1,119,254,88,41,80,60,91, +69,63,154,148,142,121,129,89,178,132,131,196,108,3,65,1,246,142,131,253,187,60,255,255,0,201,0,0,3,231,5,200,6,38,1,182,0,0,0,6,7,0,0,0,255,255,0,201,0,0,3,231,5,231,6,38,1,182,0,0,0,6,6,246, +0,0,255,255,0,147,255,233,4,29,5,231,6,38,1,191,0,0,0,6,6,246,0,0,0,3,0,147,255,233,4,29,4,51,0,15,0,22,0,29,0,0,65,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,1,33,22,22,51,50, +54,3,34,6,7,33,38,38,2,90,149,201,101,104,201,148,148,202,103,104,203,1,159,253,230,12,134,123,123,134,255,125,137,9,2,26,8,135,4,51,135,246,167,161,248,141,136,247,165,163,248,139,253,162,184,170,170,2,140,168,166,166,168,0, +255,255,0,147,255,233,4,29,5,231,6,38,2,22,0,0,0,6,6,246,2,0,255,255,0,183,255,233,4,9,5,231,6,38,1,212,0,0,0,6,6,246,245,0,255,255,0,123,254,89,4,53,5,200,6,38,1,1,0,0,0,6,7,0, +0,0,255,255,0,123,254,89,4,53,5,231,6,38,1,196,0,0,0,6,6,246,0,0,255,255,0,123,254,89,4,53,6,135,6,38,1,196,0,0,0,6,6,250,79,0,255,255,0,170,0,0,3,210,5,231,6,38,1,200,0,0,0,6, +6,246,230,0,0,2,1,60,254,218,4,25,4,29,0,5,0,11,0,0,101,17,35,3,35,55,23,35,17,33,7,33,2,134,139,29,71,5,72,168,2,221,20,253,223,137,254,81,1,38,137,137,4,29,141,0,255,255,0,124,0,0,4,52, +5,231,6,38,1,207,0,0,0,6,6,246,0,0,0,4,0,143,254,89,4,87,4,29,0,3,0,19,0,25,0,30,0,0,101,51,21,35,3,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,19,35,17,33,7,33,19,21,33,53, +51,1,224,179,179,112,77,111,37,66,35,66,51,59,71,168,160,46,168,2,222,21,253,223,250,253,162,188,137,137,254,89,47,27,109,20,25,70,80,137,123,150,152,1,167,4,29,141,254,204,133,133,0,3,0,91,254,89,4,77,4,29,0,3, +0,19,0,31,0,0,101,51,21,35,3,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,1,35,1,1,51,19,19,51,1,1,35,1,3,95,238,238,54,77,112,36,66,35,66,51,59,71,168,160,253,111,192,1,133,254,171,199,244,247, +192,254,172,1,132,206,254,224,137,137,254,89,47,27,109,20,25,70,80,137,123,150,152,1,167,2,44,1,241,254,120,1,136,254,22,253,205,1,196,0,0,2,0,111,0,0,4,65,4,29,0,11,0,15,0,0,97,35,1,1,51,19,19,51, +1,1,35,1,37,53,33,21,1,47,192,1,133,254,171,200,242,248,192,254,172,1,132,206,254,230,254,73,3,104,2,44,1,241,254,101,1,155,254,22,253,205,1,216,34,115,115,0,255,255,0,136,255,233,3,231,5,218,6,6,0,153,0,0, +0,3,0,18,255,229,4,155,5,219,0,24,0,54,0,58,0,0,69,34,38,38,39,17,51,17,20,22,51,50,54,54,53,52,38,39,51,22,22,21,20,6,6,37,34,38,38,53,52,54,54,51,50,22,23,7,38,38,35,34,6,21,20,22, +22,51,50,54,55,23,14,2,19,17,23,17,3,79,78,127,79,8,169,67,56,48,73,41,5,5,170,5,5,85,150,253,167,106,145,74,80,151,103,91,106,40,18,37,85,66,85,99,38,72,50,64,109,59,45,44,97,100,160,169,27,70,153,121, +2,220,253,41,100,109,69,169,150,70,119,63,58,122,68,189,234,109,4,136,246,162,161,250,143,91,63,134,58,92,205,207,139,181,90,112,136,92,113,129,52,1,10,4,232,22,251,76,0,1,0,21,255,229,4,129,4,29,0,40,0,0,65,22, +22,21,20,6,6,35,34,38,39,39,35,53,51,50,54,53,52,38,35,35,53,51,50,22,21,20,6,7,23,22,22,51,50,54,54,53,52,38,39,4,119,5,5,100,170,104,133,167,72,96,212,198,107,123,129,131,246,249,209,224,119,117,102,50, +101,61,55,91,54,5,5,2,241,58,122,68,189,234,109,132,131,175,130,88,106,99,89,130,162,157,110,144,37,183,89,60,69,170,151,70,119,63,0,3,0,153,254,218,4,45,4,29,0,17,0,21,0,27,0,0,83,53,33,50,54,53,52,38, +35,33,53,33,50,22,21,20,6,7,19,1,55,1,55,17,35,3,35,55,229,1,45,107,124,130,130,254,164,1,94,209,225,200,182,254,254,220,161,1,65,70,139,29,71,5,1,153,132,88,106,99,89,130,162,157,145,155,25,254,103,1,203,21, +254,32,137,254,81,1,38,137,0,2,0,11,255,229,4,155,4,29,0,17,0,42,0,0,87,39,62,3,55,19,33,17,35,17,35,3,14,3,5,34,38,38,53,17,23,17,20,22,51,50,54,54,53,52,38,39,51,22,22,21,20,6,6,82, +71,32,46,34,26,12,32,2,14,171,199,23,15,38,54,80,2,184,76,131,80,171,58,60,46,76,46,5,5,174,5,5,93,155,22,111,26,62,112,193,157,1,158,254,8,1,107,254,249,178,226,139,88,45,69,145,113,1,74,10,254,172,69,98, +69,169,150,70,119,63,58,122,68,189,234,109,0,2,0,91,255,229,4,163,4,29,0,11,0,36,0,0,65,53,33,17,35,17,51,17,33,17,51,17,19,34,38,38,53,53,23,17,20,22,51,50,54,54,53,52,38,39,51,22,22,21,20,6, +6,2,43,254,218,170,170,1,38,172,118,76,133,81,172,58,62,44,76,47,5,4,173,4,5,92,155,1,137,76,254,43,4,29,254,64,1,192,253,108,254,92,69,145,113,253,10,254,249,69,98,69,169,150,70,119,63,58,122,68,189,234,109,0, +0,1,0,147,255,235,3,226,4,51,0,31,0,0,65,50,22,23,7,38,38,35,34,6,6,21,20,22,51,50,54,55,17,35,39,33,17,6,6,35,34,2,17,52,54,54,2,123,120,164,75,97,61,121,80,78,141,89,151,133,60,106,50,202, +18,1,130,71,195,118,215,247,135,222,4,51,67,59,108,47,45,82,176,142,228,190,23,23,1,40,134,254,5,41,64,1,23,1,19,169,242,131,0,2,0,7,255,229,4,70,4,29,0,25,0,33,0,0,69,34,38,38,53,17,23,17,20,22, +51,50,54,54,53,52,38,39,51,22,22,21,20,14,2,1,17,33,53,33,7,33,17,2,169,96,153,89,168,97,77,60,109,68,4,3,172,2,5,71,119,147,254,98,254,176,3,80,20,254,188,27,83,157,111,2,39,10,253,238,115,109,69,168, +147,75,114,59,56,119,78,136,196,125,60,2,6,1,166,140,140,254,90,0,0,1,0,166,255,233,4,68,4,51,0,43,0,0,65,7,35,34,6,21,20,22,51,50,54,55,23,6,6,35,34,38,38,53,52,54,54,55,38,38,53,52,54,54, +51,50,22,23,7,38,38,35,34,6,21,20,22,51,3,65,11,205,132,136,144,146,116,183,74,80,74,226,153,137,213,123,85,126,61,92,121,111,189,116,111,221,80,80,72,173,80,119,130,122,106,2,107,137,84,87,89,106,63,53,108,59,88,77, +150,109,80,109,57,3,28,110,87,93,128,67,68,59,101,46,48,80,84,70,88,0,0,2,0,84,254,89,3,252,4,29,0,15,0,33,0,0,65,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,19,17,35,17,33,3,14,3,7,39, +62,3,55,19,2,217,77,112,36,66,35,66,51,59,71,168,160,160,168,254,118,24,13,39,62,95,70,71,37,58,47,35,12,33,254,89,47,27,109,20,25,70,80,137,123,150,152,5,196,251,227,3,145,254,234,176,221,136,85,39,108,23,57,108, +194,159,1,170,0,2,0,34,255,234,4,172,4,29,0,11,0,27,0,0,97,1,3,51,19,19,51,3,1,35,3,3,5,39,62,3,55,19,33,21,35,3,14,3,1,183,1,26,247,175,172,178,161,249,1,29,178,207,208,254,14,71,27,44, +37,30,12,31,1,138,237,23,14,38,55,80,2,44,1,241,254,120,1,136,254,22,253,205,1,196,254,60,22,111,23,57,109,197,164,1,158,135,254,243,178,226,139,88,0,3,0,88,254,88,4,168,4,51,0,6,0,25,0,40,0,0,65,3, +1,35,3,53,19,37,50,22,22,21,20,6,6,35,34,38,39,17,7,17,51,23,54,54,23,34,6,7,17,22,22,51,50,54,54,53,52,38,38,4,141,242,1,13,185,217,202,254,13,111,133,58,86,143,89,78,97,39,175,151,14,42,113,57, +61,97,44,43,88,51,47,82,51,32,70,4,29,254,1,253,226,1,217,128,1,196,22,137,246,165,169,247,134,62,53,254,17,21,5,197,127,66,83,136,82,70,253,236,64,72,78,180,151,148,181,82,0,4,0,11,255,233,4,165,4,51,0,19, +0,23,0,48,0,55,0,0,65,35,34,6,21,20,22,51,51,21,35,39,38,38,53,52,54,54,51,33,1,19,23,3,1,22,22,51,50,54,55,23,6,6,35,34,38,38,53,52,54,54,51,50,18,21,20,6,7,1,34,6,7,33,38,38, +2,149,228,108,118,109,108,101,178,106,97,105,101,181,118,1,166,252,174,230,148,212,1,205,7,126,96,77,103,66,76,51,171,109,123,176,92,91,169,117,172,171,2,2,254,176,90,108,10,1,134,3,89,3,162,100,107,91,94,130,25,40,143,107, +100,148,82,251,227,1,219,39,254,76,1,211,187,168,43,45,98,41,84,143,248,158,160,247,142,254,236,240,27,47,18,1,218,168,176,170,174,0,255,255,0,147,254,88,3,231,4,51,6,6,0,222,0,0,255,255,0,35,0,0,4,141,4,29, +6,6,0,251,0,0,0,2,0,206,0,0,4,109,4,29,0,3,0,16,0,0,65,55,1,7,1,17,51,17,51,1,51,1,1,35,1,35,17,1,255,72,1,222,72,252,241,168,211,1,48,189,254,158,1,153,203,254,164,208,3,115,108,254, +201,107,253,195,4,29,254,86,1,170,254,24,253,203,1,235,254,21,0,3,255,237,254,89,4,168,4,29,0,17,0,33,0,49,0,0,87,39,62,3,55,19,33,17,35,17,35,3,14,3,1,34,38,39,55,22,22,51,50,54,53,53,51,21, +20,6,3,17,52,38,35,34,6,7,39,54,54,51,50,22,21,17,52,71,26,45,36,31,12,32,2,37,173,220,22,14,38,55,81,3,18,78,112,35,67,35,66,49,62,72,171,162,9,67,62,81,107,55,8,50,135,106,114,146,22,111,23,57, +109,197,164,1,158,251,227,3,144,254,249,178,226,139,88,254,71,47,27,111,20,25,70,82,133,121,151,153,1,167,1,153,75,79,79,70,109,82,94,153,123,254,89,0,0,3,0,56,254,89,4,168,4,29,0,11,0,27,0,43,0,0,97,17, +33,17,35,17,51,17,33,17,51,17,19,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,3,17,52,38,35,34,6,7,39,54,54,51,50,22,21,17,2,29,254,198,171,171,1,58,172,183,79,111,36,67,36,65,49,63,71,171,162,9, +66,63,80,108,55,8,51,134,107,114,145,1,213,254,43,4,29,254,64,1,192,251,227,254,89,47,27,111,20,25,70,82,133,121,151,153,1,167,1,153,75,79,79,70,109,82,94,153,123,254,89,0,0,2,0,139,0,0,4,39,4,29,0,20, +0,25,0,0,97,17,51,17,51,50,54,54,53,52,35,35,53,51,50,22,21,20,6,6,35,1,53,51,33,7,1,57,168,126,76,126,74,250,184,186,210,218,113,213,152,254,66,174,1,170,22,4,29,252,106,34,92,86,192,131,172,151,114,155, +78,3,23,138,138,0,0,3,0,205,254,88,4,34,4,51,0,3,0,21,0,36,0,0,65,51,1,35,3,50,22,22,21,20,6,6,35,34,39,17,7,17,51,23,54,54,23,34,6,7,17,22,22,51,50,54,54,53,52,38,38,1,245,158, +1,124,158,204,140,167,74,89,180,137,173,106,168,144,14,58,161,55,87,133,44,42,125,72,99,115,49,52,104,1,182,253,146,4,235,136,247,165,159,249,142,122,254,10,21,5,197,147,81,88,135,105,64,253,246,61,71,72,179,160,138,183,91,0, +0,2,255,108,254,87,3,231,4,29,0,15,0,27,0,0,83,34,38,39,55,22,22,51,50,54,53,53,51,21,20,6,1,17,33,17,35,17,51,17,33,17,51,17,77,78,111,36,66,35,66,51,59,71,168,161,2,112,254,50,168,168,1,206, +168,254,87,47,27,109,20,25,70,80,137,123,150,152,1,169,1,213,254,43,4,29,254,66,1,190,251,227,0,5,255,235,254,218,4,195,4,29,0,5,0,11,0,20,0,30,0,47,0,0,67,17,51,23,35,3,33,3,35,55,51,17,1,51, +17,35,7,14,3,7,53,62,3,55,19,33,17,3,53,51,17,51,17,51,19,51,3,19,35,3,35,17,35,17,21,225,3,67,28,1,209,26,68,4,222,253,227,249,102,16,9,21,29,41,173,23,35,28,22,9,26,1,146,114,211,156,50,155, +152,180,218,167,180,48,156,254,218,1,181,143,254,218,1,38,143,254,75,1,181,2,254,228,146,183,110,69,173,143,23,62,106,180,141,1,142,251,227,1,233,140,1,168,254,88,1,168,254,24,253,203,1,233,254,23,1,233,0,5,0,103,254,218, +4,101,4,29,0,8,0,21,0,31,0,37,0,43,0,0,101,33,17,35,7,14,3,19,34,38,38,53,53,51,21,20,22,51,33,21,1,33,17,33,53,62,3,55,1,17,51,23,35,3,33,3,35,55,51,17,1,103,1,202,242,16,9,37, +53,65,98,135,171,80,168,117,111,1,106,254,64,2,64,252,210,29,66,60,45,10,254,226,234,8,72,28,2,226,29,71,6,236,140,3,3,230,126,180,125,82,1,88,80,161,122,178,173,133,94,141,2,29,251,227,140,18,62,112,184,139,252,75, +1,178,140,254,218,1,38,140,254,78,0,2,0,73,254,218,4,107,4,29,0,17,0,23,0,0,65,17,35,17,33,3,14,3,7,39,62,3,55,19,1,17,35,3,35,55,3,201,168,254,158,24,15,39,61,94,69,72,37,58,47,34,13,33, +3,68,139,29,71,5,4,29,251,227,3,145,254,234,176,221,136,85,39,108,23,57,108,194,159,1,170,252,108,254,81,1,38,137,255,255,0,145,255,233,3,225,5,97,6,6,0,54,0,0,255,255,0,41,0,0,4,135,5,97,6,6,0,1, +0,0,255,255,0,193,0,0,4,55,5,97,6,6,0,13,0,0,255,255,1,16,0,0,4,65,5,97,6,6,1,29,0,0,0,2,0,41,0,0,4,135,5,97,0,3,0,6,0,0,65,1,33,1,23,1,33,2,199,1,192,251,162,1, +192,107,254,175,2,161,5,97,250,159,5,97,151,251,197,0,255,255,0,251,0,0,4,27,5,97,6,6,0,24,0,0,255,255,0,143,0,0,4,33,5,97,6,6,0,125,0,0,255,255,0,167,0,0,4,9,5,97,6,6,0,40,0,0, +0,3,0,93,255,233,4,83,5,119,0,3,0,19,0,31,0,0,65,33,53,33,5,20,2,6,35,34,38,2,53,52,18,54,51,50,22,18,7,16,2,35,34,2,17,16,18,51,50,18,3,36,254,102,1,154,1,47,113,226,168,167,227,113, +113,227,167,168,226,113,183,150,174,174,150,155,169,174,150,2,120,144,89,208,254,191,181,177,1,62,213,209,1,66,183,178,254,192,214,1,19,1,36,254,218,254,237,254,238,254,224,1,34,0,255,255,0,206,0,0,3,226,5,97,6,6,0,43, +0,0,255,255,0,210,0,0,4,149,5,97,6,6,0,56,0,0,0,1,0,49,0,0,4,125,5,97,0,6,0,0,65,1,35,1,1,35,1,2,199,1,182,182,254,141,254,138,173,1,184,5,97,250,159,4,192,251,64,5,97,0,255,255, +0,61,0,0,4,115,5,97,6,6,0,64,0,0,255,255,0,167,0,0,4,9,5,97,6,6,0,65,0,0,0,3,0,153,0,0,4,23,5,97,0,3,0,7,0,11,0,0,101,21,33,53,1,21,33,53,1,7,33,53,4,23,252,130, +3,6,253,94,3,6,25,252,175,163,163,163,2,104,161,161,2,86,159,159,255,255,0,93,255,233,4,83,5,119,6,6,0,71,0,0,255,255,0,167,0,0,4,9,5,97,6,6,1,48,0,0,255,255,0,231,0,0,4,90,5,97,6,6, +0,83,0,0,0,1,0,146,0,0,4,30,5,97,0,12,0,0,65,1,33,21,33,53,1,1,53,33,21,33,1,3,40,254,53,2,193,252,116,1,253,254,3,3,140,253,61,1,205,2,119,254,26,145,146,2,31,2,28,148,146,254,35,0, +255,255,0,80,0,0,4,95,5,97,6,6,0,97,0,0,255,255,0,47,0,0,4,129,5,97,6,6,0,120,0,0,0,3,0,21,0,0,4,155,5,97,0,17,0,25,0,33,0,0,65,21,22,18,21,16,2,7,21,35,53,38,0,17, +52,18,55,53,19,14,2,21,20,22,23,19,17,54,54,53,52,38,38,2,173,252,242,255,239,170,237,254,255,241,253,2,107,143,70,152,168,166,168,152,71,142,5,97,158,12,254,247,249,255,0,254,245,8,162,162,8,1,11,1,0,246,1,12, +12,158,254,225,1,76,172,148,206,187,9,3,31,252,225,9,189,204,149,173,74,0,255,255,0,62,0,0,4,114,5,97,6,6,0,119,0,0,0,1,0,27,0,0,4,149,5,97,0,24,0,0,97,17,46,2,53,17,51,17,20,22,23,17, +51,17,54,54,53,17,51,17,20,2,7,17,2,0,167,216,102,176,137,174,174,170,139,176,236,247,1,128,13,129,205,128,2,6,254,4,148,174,16,3,78,252,180,16,172,148,1,252,253,250,193,254,253,21,254,126,0,1,0,93,0,0,4,83, +5,119,0,35,0,0,65,34,6,6,21,20,18,23,21,33,53,51,38,2,53,52,18,54,51,50,22,18,21,20,2,7,51,21,33,53,54,18,53,52,38,38,2,88,106,146,73,134,124,254,94,239,127,134,125,228,154,155,227,125,138,125,241,254, +96,124,132,74,146,4,230,112,244,200,238,254,242,61,129,140,66,1,15,221,225,1,57,163,163,254,199,225,221,254,243,68,140,129,62,1,13,238,200,244,112,0,255,255,0,41,0,0,4,135,5,130,6,38,0,1,0,0,0,7,7,22,254,152, +0,0,255,255,255,195,0,0,4,27,5,130,6,38,0,24,0,0,0,7,7,22,253,243,0,0,255,255,255,111,0,0,4,9,5,130,6,38,0,40,0,0,0,7,7,22,253,160,0,0,255,255,255,150,0,0,3,226,5,130,6,38,0,43, +0,0,0,7,7,22,253,199,0,0,255,255,255,175,255,233,4,83,5,130,6,38,0,71,0,0,0,7,7,22,253,223,0,0,255,255,255,11,0,0,4,129,5,130,6,38,0,120,0,0,0,7,7,22,253,60,0,0,255,255,255,174,0,0, +4,83,5,130,6,38,2,82,0,0,0,7,7,22,253,222,0,0,255,255,0,206,0,0,3,226,6,214,6,38,0,43,0,0,0,6,7,5,1,0,255,255,0,47,0,0,4,129,6,214,6,38,0,120,0,0,0,6,7,5,8,0,0,1, +0,228,0,0,3,204,5,97,0,7,0,0,65,33,17,35,17,51,17,33,3,204,253,197,173,173,2,59,2,141,253,115,5,97,253,187,0,3,0,72,0,0,4,106,5,97,0,7,0,11,0,15,0,0,97,17,33,53,33,21,33,17,1,17, +51,17,37,17,51,17,2,3,254,69,4,34,254,70,253,152,153,2,240,153,4,201,152,152,251,55,3,77,1,174,254,82,2,1,176,254,80,0,255,255,0,167,0,0,4,9,5,97,6,6,1,38,0,0,0,3,0,93,254,110,4,83,5,119, +0,3,0,19,0,31,0,0,65,17,51,17,1,20,2,6,35,34,38,2,53,52,18,54,51,50,22,18,7,16,2,35,34,2,17,16,18,51,50,18,2,4,171,1,164,113,226,168,167,227,113,113,227,167,168,226,113,182,151,174,174,151,156,169, +174,151,254,110,1,146,254,110,4,65,208,254,191,181,177,1,62,213,209,1,66,183,178,254,192,214,1,19,1,36,254,218,254,237,254,237,254,225,1,33,0,1,0,149,254,84,4,77,5,97,0,34,0,0,65,39,54,54,53,52,38,38,39,46, +2,53,52,62,2,51,33,7,33,34,6,6,21,20,22,22,23,30,2,21,20,6,2,207,71,87,112,47,120,107,146,188,90,70,153,252,182,1,39,28,254,236,159,206,99,68,156,130,116,151,74,148,254,84,116,38,94,78,44,61,61,43,60,163, +235,166,125,232,182,107,148,125,223,147,142,185,125,52,45,89,112,79,108,153,0,2,0,253,0,0,4,46,5,97,0,9,0,15,0,0,65,38,38,35,33,53,33,50,22,23,19,7,33,17,35,17,3,118,34,79,64,254,164,1,107,73,90,46, +137,18,253,142,173,2,82,12,15,146,20,22,2,140,152,251,55,5,97,0,0,3,0,141,0,0,4,37,5,97,0,3,0,7,0,11,0,0,97,1,23,1,1,39,33,23,37,39,1,51,1,155,1,246,148,254,60,254,79,35,3,118,34,252, +253,149,1,195,198,2,173,66,253,149,2,107,151,151,86,65,2,95,0,3,0,51,0,0,4,125,5,97,0,4,0,8,0,12,0,0,97,1,3,51,1,33,1,23,1,55,1,23,3,3,203,254,114,122,167,2,19,251,182,1,238,135,254,62, +185,1,34,126,250,4,56,1,41,250,159,4,213,29,251,72,4,3,59,40,252,233,0,4,0,201,254,89,4,125,5,97,0,3,0,7,0,13,0,29,0,0,101,51,21,35,33,35,17,51,19,1,51,1,1,35,3,34,38,39,55,22,22,51, +50,54,53,53,51,21,20,6,3,161,220,220,253,213,173,173,10,1,241,206,254,14,2,24,217,49,78,111,36,65,36,66,50,60,65,173,159,145,145,5,97,253,126,2,130,253,137,253,22,254,89,47,27,115,21,26,73,77,133,123,152,150,0,1, +0,75,0,0,4,167,5,119,0,21,0,0,65,38,38,35,34,6,7,1,17,35,17,1,51,1,19,62,2,51,50,22,23,4,128,12,29,19,40,58,29,254,224,176,254,86,192,1,72,213,39,76,93,63,34,54,24,4,226,3,5,50,62,253, +153,253,237,2,17,3,80,253,76,1,232,89,98,39,11,11,255,255,255,29,0,0,4,167,5,130,6,38,2,101,0,0,0,7,7,39,253,77,0,0,255,255,0,75,0,0,4,167,6,214,6,38,2,101,0,0,0,6,7,5,7,0,0,3, +0,93,255,233,4,83,5,119,0,3,0,19,0,31,0,0,65,33,53,33,23,20,2,6,35,34,38,2,53,52,18,54,51,50,22,18,7,16,2,35,34,2,17,16,18,51,50,18,4,15,252,169,3,87,68,113,226,168,167,227,113,113,227,167, +168,226,113,183,150,174,174,150,155,169,174,150,2,120,144,89,208,254,191,181,177,1,62,213,209,1,66,183,178,254,192,214,1,19,1,36,254,218,254,237,254,238,254,224,1,34,255,255,0,215,0,0,4,87,5,97,6,6,0,84,0,0,0,1, +0,127,255,233,4,111,5,119,0,29,0,0,65,50,22,23,7,38,38,35,34,6,6,21,20,22,22,51,50,54,55,23,6,6,35,34,36,2,53,52,18,36,2,204,135,182,82,97,65,145,79,113,192,117,111,190,117,116,149,55,90,63,202,147, +167,254,241,158,161,1,13,5,119,68,66,113,55,47,107,247,211,205,248,110,70,45,114,61,89,164,1,61,231,232,1,60,162,0,255,255,0,61,0,0,4,115,5,97,6,6,0,64,0,0,0,1,0,65,255,233,4,49,5,119,0,29,0,0, +65,50,22,18,21,20,2,4,35,34,38,39,55,22,22,51,50,54,54,53,52,38,38,35,34,6,7,39,54,54,1,248,176,254,139,158,254,242,168,147,202,63,90,55,150,115,117,190,111,99,180,124,78,162,83,82,90,194,5,119,162,254,196,232, +231,254,195,164,89,61,114,45,70,110,248,205,211,247,107,47,55,113,65,69,255,255,0,127,255,233,4,111,5,119,6,38,2,106,0,0,0,15,6,228,0,120,253,131,65,207,255,255,0,65,255,233,4,49,5,119,6,38,2,108,0,0,0,15, +6,228,255,122,253,131,65,207,255,255,0,41,0,0,4,135,5,131,6,38,2,59,0,0,0,7,7,24,254,142,255,56,255,255,0,41,0,0,4,135,5,132,6,38,2,59,0,0,0,7,7,26,254,112,255,57,255,255,255,31,0,0,4,135, +5,105,6,38,2,59,0,0,0,7,7,27,253,224,255,45,255,255,255,28,0,0,4,135,5,105,6,38,2,59,0,0,0,7,7,28,253,216,255,45,255,255,255,81,0,0,4,135,5,105,6,38,2,59,0,0,0,7,7,29,254,18,255,45, +255,255,255,96,0,0,4,135,5,107,6,38,2,59,0,0,0,7,7,30,254,31,255,45,255,255,255,12,0,0,4,135,5,113,6,38,2,59,0,0,0,7,7,31,253,250,254,187,255,255,255,13,0,0,4,135,5,115,6,38,2,59,0,0, +0,7,7,32,254,0,254,187,255,255,0,27,0,0,4,135,5,130,6,38,0,1,0,0,0,7,7,37,254,73,0,0,255,255,0,41,0,0,4,135,5,130,6,38,0,1,0,0,0,7,7,39,254,113,0,0,255,255,0,41,0,0,4,135, +6,245,6,38,2,59,0,0,0,6,7,12,254,0,255,255,0,41,0,0,4,135,6,183,6,38,2,59,0,0,0,6,7,15,1,0,255,255,0,41,254,135,4,135,5,97,6,38,2,59,0,0,0,6,7,20,126,0,255,255,0,41,254,135, +4,135,5,131,6,38,2,111,0,0,0,6,7,20,126,0,255,255,0,41,254,135,4,135,5,132,6,38,2,112,0,0,0,6,7,20,126,0,255,255,255,31,254,135,4,135,5,105,6,38,2,113,0,0,0,6,7,20,126,0,255,255,255,28, +254,135,4,135,5,105,6,38,2,114,0,0,0,6,7,20,126,0,255,255,255,81,254,135,4,135,5,105,6,38,2,115,0,0,0,6,7,20,126,0,255,255,255,96,254,135,4,135,5,107,6,38,2,116,0,0,0,6,7,20,126,0,255,255, +255,12,254,135,4,135,5,113,6,38,2,117,0,0,0,6,7,20,126,0,255,255,255,13,254,135,4,135,5,115,6,38,2,118,0,0,0,6,7,20,126,0,255,255,255,204,0,0,4,27,5,131,6,38,2,63,0,0,0,7,7,24,253,233, +255,56,255,255,255,173,0,0,4,27,5,131,6,38,2,63,0,0,0,7,7,26,253,200,255,56,255,255,254,136,0,0,4,27,5,105,6,38,2,63,0,0,0,7,7,27,253,73,255,45,255,255,254,141,0,0,4,27,5,105,6,38,2,63, +0,0,0,7,7,28,253,73,255,45,255,255,254,167,0,0,4,27,5,105,6,38,2,63,0,0,0,7,7,29,253,104,255,45,255,255,254,183,0,0,4,27,5,107,6,38,2,63,0,0,0,7,7,30,253,118,255,45,255,255,255,176,0,0, +4,27,5,130,6,38,0,24,0,0,0,7,7,37,253,222,0,0,255,255,255,195,0,0,4,27,5,130,6,38,0,24,0,0,0,7,7,39,253,243,0,0,255,255,255,120,0,0,4,9,5,131,6,38,2,65,0,0,0,7,7,24,253,149, +255,56,255,255,255,90,0,0,4,9,5,131,6,38,2,65,0,0,0,7,7,26,253,117,255,56,255,255,254,53,0,0,4,9,5,105,6,38,2,65,0,0,0,7,7,27,252,246,255,45,255,255,254,57,0,0,4,9,5,105,6,38,2,65, +0,0,0,7,7,28,252,246,255,45,255,255,254,83,0,0,4,9,5,105,6,38,2,65,0,0,0,7,7,29,253,20,255,45,255,255,254,99,0,0,4,9,5,107,6,38,2,65,0,0,0,7,7,30,253,34,255,45,255,255,254,1,0,0, +4,9,5,114,6,38,2,65,0,0,0,7,7,31,252,239,254,187,255,255,254,0,0,0,4,9,5,116,6,38,2,65,0,0,0,7,7,32,252,242,254,187,255,255,255,92,0,0,4,9,5,130,6,38,0,40,0,0,0,7,7,37,253,138, +0,0,255,255,255,111,0,0,4,9,5,130,6,38,0,40,0,0,0,7,7,39,253,160,0,0,255,255,0,167,254,135,4,9,5,97,6,38,2,65,0,0,0,7,7,20,0,130,0,0,255,255,255,120,254,135,4,9,5,131,6,38,2,140, +0,0,0,7,7,20,0,130,0,0,255,255,255,90,254,135,4,9,5,131,6,38,2,141,0,0,0,7,7,20,0,130,0,0,255,255,254,53,254,135,4,9,5,105,6,38,2,142,0,0,0,7,7,20,0,130,0,0,255,255,254,57,254,135, +4,9,5,105,6,38,2,143,0,0,0,7,7,20,0,130,0,0,255,255,254,83,254,135,4,9,5,105,6,38,2,144,0,0,0,7,7,20,0,130,0,0,255,255,254,99,254,135,4,9,5,107,6,38,2,145,0,0,0,7,7,20,0,130, +0,0,255,255,254,1,254,135,4,9,5,114,6,38,2,146,0,0,0,7,7,20,0,130,0,0,255,255,254,0,254,135,4,9,5,116,6,38,2,147,0,0,0,7,7,20,0,130,0,0,255,255,255,159,0,0,3,226,5,131,6,38,2,67, +0,0,0,7,7,24,253,189,255,56,255,255,255,169,0,0,3,226,5,132,6,38,2,67,0,0,0,7,7,26,253,196,255,57,255,255,254,188,0,0,3,226,5,105,6,38,2,67,0,0,0,7,7,27,253,125,255,45,255,255,254,179,0,0, +3,226,5,105,6,38,2,67,0,0,0,7,7,28,253,112,255,45,255,255,254,122,0,0,3,226,5,105,6,38,2,67,0,0,0,7,7,29,253,59,255,45,255,255,254,138,0,0,3,226,5,107,6,38,2,67,0,0,0,7,7,30,253,73, +255,45,255,255,254,40,0,0,3,226,5,114,6,38,2,67,0,0,0,7,7,31,253,22,254,187,255,255,254,39,0,0,3,226,5,116,6,38,2,67,0,0,0,7,7,32,253,25,254,187,255,255,255,173,0,0,3,226,5,130,6,38,0,43, +0,0,0,7,7,37,253,219,0,0,255,255,255,150,0,0,3,226,5,130,6,38,0,43,0,0,0,7,7,39,253,199,0,0,255,255,0,206,0,0,3,226,6,245,6,38,2,67,0,0,0,6,7,12,254,0,255,255,0,206,0,0,3,226, +6,183,6,38,2,67,0,0,0,6,7,15,1,0,255,255,255,184,255,233,4,83,5,131,6,38,2,73,0,0,0,7,7,24,253,213,255,56,255,255,255,113,255,233,4,83,5,132,6,38,2,73,0,0,0,7,7,26,253,140,255,57,255,255, +254,50,255,233,4,83,5,119,6,38,2,73,0,0,0,7,7,27,252,243,255,45,255,255,254,54,255,233,4,83,5,119,6,38,2,73,0,0,0,7,7,28,252,243,255,45,255,255,254,106,255,233,4,83,5,119,6,38,2,73,0,0,0,7, +7,29,253,43,255,45,255,255,254,122,255,233,4,83,5,119,6,38,2,73,0,0,0,7,7,30,253,57,255,45,255,255,255,77,255,233,4,83,5,130,6,38,0,71,0,0,0,7,7,37,253,123,0,0,255,255,255,135,255,233,4,83,5,130, +6,38,0,71,0,0,0,7,7,39,253,183,0,0,255,255,255,154,0,0,4,90,5,131,6,38,2,75,0,0,0,7,7,26,253,181,255,56,255,255,255,61,0,0,4,129,5,132,6,38,2,78,0,0,0,7,7,26,253,88,255,57,255,255, +254,39,0,0,4,129,5,105,6,38,2,78,0,0,0,7,7,28,252,228,255,45,255,255,253,250,0,0,4,129,5,107,6,38,2,78,0,0,0,7,7,30,252,185,255,45,255,255,253,152,0,0,4,129,5,115,6,38,2,78,0,0,0,7, +7,32,252,139,254,187,255,255,255,49,0,0,4,129,5,130,6,38,0,120,0,0,0,7,7,37,253,95,0,0,255,255,255,11,0,0,4,129,5,130,6,38,0,120,0,0,0,7,7,39,253,60,0,0,255,255,0,47,0,0,4,129,6,245, +6,38,2,78,0,0,0,6,7,12,5,0,255,255,0,47,0,0,4,129,6,183,6,38,2,78,0,0,0,6,7,15,8,0,255,255,255,182,0,0,4,83,5,131,6,38,2,82,0,0,0,7,7,24,253,212,255,56,255,255,255,116,0,0, +4,84,5,132,4,38,2,82,1,0,0,7,7,26,253,143,255,57,255,255,254,51,0,0,4,83,5,119,6,38,2,82,0,0,0,7,7,27,252,244,255,45,255,255,254,56,0,0,4,83,5,119,6,38,2,82,0,0,0,7,7,28,252,244, +255,45,255,255,254,106,0,0,4,83,5,119,6,38,2,82,0,0,0,7,7,29,253,43,255,45,255,255,254,122,0,0,4,83,5,119,6,38,2,82,0,0,0,7,7,30,253,57,255,45,255,255,254,63,0,0,4,83,5,119,6,38,2,82, +0,0,0,7,7,31,253,45,254,187,255,255,254,62,0,0,4,83,5,119,6,38,2,82,0,0,0,7,7,32,253,49,254,187,255,255,255,77,0,0,4,83,5,130,6,38,2,82,0,0,0,7,7,37,253,123,0,0,255,255,255,134,0,0, +4,83,5,130,6,38,2,82,0,0,0,7,7,39,253,183,0,0,255,255,0,93,254,135,4,83,5,119,6,38,2,82,0,0,0,7,7,20,0,132,0,0,255,255,255,182,254,135,4,83,5,131,6,38,2,188,0,0,0,7,7,20,0,132, +0,0,255,255,255,116,254,135,4,84,5,132,6,38,2,189,0,0,0,7,7,20,0,133,0,0,255,255,254,51,254,135,4,83,5,119,6,38,2,190,0,0,0,7,7,20,0,132,0,0,255,255,254,56,254,135,4,83,5,119,6,38,2,191, +0,0,0,7,7,20,0,132,0,0,255,255,254,106,254,135,4,83,5,119,6,38,2,192,0,0,0,7,7,20,0,132,0,0,255,255,254,122,254,135,4,83,5,119,6,38,2,193,0,0,0,7,7,20,0,132,0,0,255,255,254,63,254,135, +4,83,5,119,6,38,2,194,0,0,0,7,7,20,0,132,0,0,255,255,254,62,254,135,4,83,5,119,6,38,2,195,0,0,0,7,7,20,0,132,0,0,0,2,0,117,255,231,4,64,4,51,0,26,0,41,0,0,65,50,22,22,23,19, +51,3,19,22,22,23,7,38,38,39,39,14,2,35,34,2,17,52,54,54,23,34,6,21,20,22,51,50,62,2,55,46,2,1,254,89,132,89,21,55,154,103,52,9,41,39,59,75,96,13,18,27,85,126,90,179,203,88,174,144,108,117,110,107, +37,78,75,68,25,27,79,103,4,51,61,144,125,1,52,253,207,254,239,42,45,15,142,12,92,86,113,81,137,83,1,12,1,16,163,252,143,135,217,206,209,195,33,89,166,133,162,176,68,0,0,1,0,182,254,87,4,70,5,217,0,50,0,0, +65,50,22,22,21,20,6,6,7,30,3,21,20,6,6,35,34,38,39,55,22,22,51,50,54,54,53,52,38,35,35,55,51,50,54,54,53,52,38,35,34,6,21,17,7,17,52,54,54,2,71,109,183,110,82,137,82,71,146,120,73,126,202,116, +93,176,74,27,55,146,99,79,131,79,185,175,109,20,105,69,114,67,139,104,116,120,168,97,179,5,217,84,159,111,105,141,78,12,7,44,89,149,113,132,192,103,71,70,116,63,57,65,130,94,162,166,129,55,117,94,123,113,140,145,250,56,23,5, +225,131,186,100,0,1,0,86,254,87,4,90,4,53,0,20,0,0,65,23,1,6,6,23,7,38,38,54,55,38,2,2,38,39,55,22,18,18,23,3,175,171,254,79,43,12,31,135,32,24,18,29,33,95,115,123,61,171,69,131,112,40,4,53, +38,252,19,99,203,135,22,64,159,165,76,140,1,38,1,14,213,57,61,80,254,252,254,182,189,0,0,2,0,135,255,233,4,53,5,218,0,37,0,50,0,0,65,50,22,23,7,38,38,35,34,6,21,20,22,22,23,30,2,21,20,14,2,35, +34,38,38,53,52,54,54,55,38,38,53,52,54,54,19,6,6,21,20,22,51,50,54,53,52,38,38,2,124,106,155,69,85,68,119,69,87,103,47,104,87,136,180,88,63,121,175,111,149,211,112,86,145,89,108,86,99,170,51,142,121,153,136,137, +151,58,136,5,218,62,57,100,52,37,73,66,47,60,52,35,56,139,201,152,101,183,144,82,138,232,139,122,188,133,34,56,121,81,89,123,65,253,178,65,208,150,172,198,190,182,119,149,103,0,0,1,0,166,255,233,4,68,4,51,0,42,0,0, +65,35,34,6,21,20,22,51,50,54,55,23,6,6,35,34,38,38,53,52,54,55,38,38,53,52,54,54,51,50,22,23,7,38,38,35,34,6,21,20,22,51,51,3,14,180,134,119,150,132,115,182,73,91,76,242,153,129,206,120,137,127,110,111, +115,192,116,100,220,81,85,68,162,79,121,135,124,106,190,1,226,82,89,88,107,64,51,112,58,84,76,146,106,120,122,17,23,122,86,93,124,63,50,57,105,42,36,80,84,72,86,0,0,1,0,221,254,67,4,37,5,197,0,38,0,0,65,23, +6,0,6,21,20,22,22,23,30,2,21,20,6,7,39,54,54,53,52,38,38,39,46,2,53,52,18,0,55,14,2,35,33,55,4,13,24,215,254,220,148,64,138,111,104,146,78,155,160,69,87,114,43,98,84,138,186,94,144,1,43,233,26,108, +118,40,254,212,21,5,197,114,185,254,224,251,130,98,118,76,38,32,64,93,79,113,172,71,120,44,98,76,38,46,41,29,47,109,167,134,139,1,7,1,31,172,10,12,4,138,0,1,0,146,254,88,3,232,4,53,0,27,0,0,65,50,22,21, +17,7,17,52,38,38,35,34,6,6,7,17,35,17,52,38,39,55,30,2,23,54,54,2,192,154,142,168,23,78,82,59,109,86,28,168,34,19,157,10,20,16,2,68,192,4,51,164,146,251,112,21,4,41,108,133,61,54,80,42,253,1,2,196, +106,177,64,22,18,64,69,26,86,89,0,3,0,147,255,233,4,29,5,218,0,15,0,24,0,33,0,0,65,50,22,18,21,20,2,6,35,34,38,2,53,52,18,54,1,33,30,2,51,50,54,54,1,34,6,6,7,33,46,2,2,90,149,201, +101,104,201,148,148,202,103,104,203,1,165,253,216,5,63,120,89,90,118,62,254,244,91,121,63,4,2,42,3,62,119,5,218,180,254,174,236,231,254,166,190,186,1,87,236,232,1,83,185,252,203,197,248,117,117,248,3,109,113,240,193,193,240,113, +0,1,0,125,255,233,4,20,4,29,0,17,0,0,65,33,55,33,17,20,22,51,50,54,55,23,6,6,35,34,38,53,1,225,254,156,20,1,248,98,76,42,91,43,45,35,143,72,142,171,3,143,142,252,231,77,66,20,17,123,19,35,159,143, +0,2,0,173,255,233,4,97,4,52,0,12,0,22,0,0,65,23,1,1,22,22,23,7,46,2,39,1,3,22,22,21,17,35,17,52,38,39,3,145,142,254,62,1,38,65,96,61,58,58,90,79,40,254,116,61,34,19,168,27,24,4,52,98, +254,103,254,202,67,62,15,138,9,41,66,42,1,174,1,232,96,218,90,253,119,2,169,103,180,89,0,1,0,97,255,231,4,93,5,223,0,22,0,0,65,51,46,2,39,55,30,3,23,22,18,18,23,7,38,2,2,39,1,39,1,229,68,28, +80,134,110,28,116,169,119,82,28,58,108,127,81,173,73,125,106,45,254,176,162,4,29,94,128,77,17,134,18,71,119,176,122,236,254,141,254,245,82,64,92,1,12,1,103,227,252,76,36,0,255,255,0,177,254,88,3,255,4,29,6,6,4,215, +0,0,0,1,0,63,0,0,4,70,4,51,0,13,0,0,97,38,2,2,38,39,55,22,18,18,23,1,23,1,1,217,33,90,106,118,63,170,78,130,107,41,1,80,169,254,97,141,1,51,1,29,222,56,62,89,254,220,254,157,188,3,158,38, +251,243,0,1,0,197,254,67,4,79,5,218,0,57,0,0,65,50,22,23,7,38,38,35,34,6,21,20,22,51,51,7,35,34,6,6,21,20,22,22,23,30,2,21,20,6,7,39,62,2,53,52,38,38,39,46,3,53,52,62,2,55,46,2, +53,52,54,54,2,201,110,197,83,82,69,160,77,128,140,129,111,242,20,240,89,130,71,79,168,134,119,146,68,157,157,70,64,90,48,32,81,75,112,192,143,79,63,99,110,45,61,111,69,121,200,5,218,57,60,101,45,43,103,100,101,106,152,74, +122,73,107,121,76,42,38,70,96,76,113,172,71,120,31,65,78,49,35,44,37,23,36,80,108,157,113,89,128,85,47,8,23,67,105,77,107,151,80,0,255,255,0,147,255,233,4,29,4,51,6,6,0,208,0,0,0,3,0,13,255,233,4,92, +4,29,0,3,0,13,0,25,0,0,65,17,35,17,5,17,20,22,23,7,38,38,53,17,37,21,33,34,6,6,7,39,62,2,51,1,141,169,2,209,45,54,61,114,93,1,80,252,149,52,59,46,33,38,27,59,94,80,3,177,252,79,3,177, +1,253,97,79,66,13,138,29,126,121,2,180,108,140,4,9,11,129,13,15,7,0,0,2,0,187,254,88,4,25,4,51,0,15,0,29,0,0,65,50,18,17,20,6,6,35,34,38,39,17,7,17,16,18,23,34,6,21,17,22,22,51,50,54, +53,52,38,38,2,101,229,207,90,183,139,87,141,54,168,217,205,142,112,42,127,75,130,137,55,114,4,51,254,226,254,250,148,250,152,61,60,254,11,21,3,197,1,7,1,15,133,223,205,254,247,63,69,212,199,139,184,91,0,1,0,203,254,85, +4,31,4,51,0,37,0,0,65,50,22,23,7,38,38,35,34,6,6,21,20,22,22,23,30,2,21,20,6,7,39,54,54,53,52,38,38,39,46,2,53,52,54,54,2,184,112,162,85,85,63,117,88,85,145,89,51,137,128,100,144,76,151,159, +74,88,113,39,107,103,127,171,86,129,223,4,51,50,61,112,43,40,89,174,129,99,119,83,47,37,73,100,79,110,154,69,120,35,86,75,41,50,48,36,47,119,178,135,170,237,125,0,0,1,0,147,255,233,4,94,4,41,0,35,0,0,65,50, +4,23,21,37,39,38,14,2,21,20,22,51,50,54,53,52,38,39,23,22,22,21,20,6,6,35,34,38,38,53,52,54,54,2,135,114,1,3,98,254,225,80,93,155,114,62,139,134,133,136,88,67,133,84,118,105,200,144,145,203,105,118,223,4, +41,7,4,141,20,2,2,29,86,164,132,209,202,203,210,170,197,50,2,41,205,166,170,249,135,137,247,165,162,242,135,0,0,2,0,78,255,233,3,249,4,29,0,10,0,26,0,0,65,21,33,34,6,6,7,39,54,54,51,23,17,20,22,51, +50,54,55,23,6,6,35,34,38,53,17,3,245,253,120,49,76,79,56,27,70,151,90,234,96,76,42,91,43,46,36,143,71,143,169,4,29,140,5,15,16,134,24,18,108,253,83,77,66,20,17,123,19,35,159,143,2,154,0,1,0,206,255,233, +4,27,4,29,0,24,0,0,65,22,18,21,20,6,6,35,34,38,53,17,51,17,20,22,51,50,62,2,53,52,2,39,3,231,24,28,139,217,120,160,209,168,110,97,54,105,87,53,23,28,4,29,132,254,255,154,187,235,111,172,173,2,219,253, +52,112,110,38,92,160,120,111,1,10,151,0,0,2,0,67,254,88,4,109,4,51,0,28,0,39,0,0,65,50,18,17,20,6,6,7,17,7,17,38,38,53,52,18,55,51,6,2,21,20,22,22,23,17,52,54,54,23,34,6,6,21,17,54, +54,53,52,38,3,37,171,157,116,210,144,159,225,212,71,40,168,56,55,47,117,105,56,132,111,69,58,13,170,129,67,4,51,254,242,254,242,185,236,121,12,254,129,22,1,149,19,254,224,184,1,27,108,166,255,0,112,121,172,101,13,2,13,138, +196,104,132,94,155,91,254,18,20,207,200,215,192,0,0,2,0,108,254,91,4,71,4,49,0,14,0,22,0,0,65,30,2,23,23,1,7,1,39,46,3,39,37,23,1,7,1,39,1,55,1,17,63,109,109,61,100,1,124,165,254,196,101,65, +102,91,92,55,3,17,168,254,166,101,254,188,165,1,132,102,4,49,63,156,218,159,102,253,7,35,2,156,119,144,198,139,110,56,59,27,253,98,128,253,105,27,2,243,111,0,0,1,0,83,254,88,4,113,4,29,0,30,0,0,65,17,62,2, +53,52,2,39,51,22,18,21,20,6,6,7,17,7,17,46,2,53,17,51,17,20,22,23,17,2,169,121,123,43,26,27,171,24,27,95,201,160,158,155,194,91,168,119,153,4,29,252,97,14,98,168,119,110,1,16,146,131,254,253,156,148,224,134, +14,254,122,21,1,155,12,113,174,100,2,155,253,116,125,133,17,3,159,0,0,1,0,53,255,233,4,123,4,29,0,46,0,0,65,22,18,21,20,2,35,34,38,39,6,6,35,34,2,53,52,18,55,51,14,2,21,20,22,22,51,50,54,54, +53,53,55,17,20,22,22,51,50,54,54,53,52,38,38,39,4,22,37,64,154,152,103,125,15,23,124,98,153,147,60,39,149,35,36,11,25,67,60,60,64,24,161,25,64,60,60,66,26,14,38,37,4,29,100,254,224,188,232,254,244,117,116,111, +122,1,3,241,188,1,33,99,114,190,176,96,106,164,92,98,158,90,252,22,254,237,101,156,88,92,164,106,95,177,191,113,255,255,0,125,255,233,4,20,6,79,6,38,2,215,0,0,0,6,7,21,34,0,255,255,0,125,255,233,4,20,5,231, +6,38,2,215,0,0,0,6,6,246,225,0,255,255,0,125,255,233,4,20,7,35,6,38,2,215,0,0,0,6,7,23,225,0,255,255,0,206,255,233,4,27,6,79,6,38,2,227,0,0,0,6,7,21,65,0,255,255,0,206,255,233,4,27, +5,231,6,38,2,227,0,0,0,6,6,246,0,0,255,255,0,206,255,233,4,27,7,35,6,38,2,227,0,0,0,6,7,23,0,0,255,255,0,147,255,233,4,29,6,79,6,38,0,208,0,0,0,6,7,21,65,0,255,255,0,53,255,233, +4,123,6,79,6,38,2,231,0,0,0,6,7,21,65,0,255,255,0,117,255,231,4,64,6,79,6,38,2,207,0,0,0,6,7,21,18,0,255,255,0,166,255,233,4,68,6,79,6,38,2,211,0,0,0,6,7,21,97,0,255,255,0,146, +254,88,3,232,6,79,6,38,2,213,0,0,0,6,7,21,63,0,0,2,0,219,0,0,4,22,4,53,0,3,0,13,0,0,65,33,53,33,1,22,22,21,17,35,17,52,38,39,4,22,253,111,2,145,253,93,26,42,168,31,21,1,213,146, +1,206,54,178,168,253,91,2,196,120,159,68,0,2,0,37,254,88,4,112,4,29,0,3,0,15,0,0,65,17,7,17,5,39,62,2,51,33,21,5,34,6,6,2,173,168,254,63,31,34,56,69,53,3,119,252,131,38,51,50,3,197,250,168, +21,5,109,76,135,12,12,5,140,2,3,9,0,2,0,191,255,233,4,53,4,29,0,10,0,24,0,0,115,17,51,17,20,6,7,1,51,7,1,5,38,38,53,52,62,2,55,55,17,20,22,23,191,167,10,10,1,193,198,139,254,61,2,112, +117,93,6,10,14,7,139,43,49,4,29,254,20,101,189,73,3,87,200,252,171,23,32,149,130,45,130,153,161,76,200,252,244,79,67,23,0,1,0,183,255,233,3,251,4,51,0,28,0,0,69,34,38,39,55,22,22,51,50,54,54,53,52,38, +35,34,6,7,39,54,54,51,50,22,22,21,20,6,6,2,13,104,162,76,77,65,111,83,96,143,79,154,144,90,121,63,82,88,161,104,152,216,115,122,222,23,57,57,108,38,39,83,177,140,213,200,39,39,107,61,50,136,251,171,170,242,128,0, +255,255,0,183,255,233,4,9,4,51,6,38,3,5,0,0,0,15,6,228,0,89,252,219,67,157,255,255,0,183,255,233,3,251,4,51,6,38,2,246,0,0,0,15,6,228,255,146,252,219,67,157,0,3,0,147,254,88,4,29,4,51,0,3, +0,19,0,31,0,0,69,17,7,17,19,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,23,34,6,21,20,22,51,50,54,53,52,38,2,173,170,87,149,201,101,104,201,148,148,202,103,104,203,148,136,139,137,136,136,137,136,1,254,110, +21,1,167,4,52,135,246,167,161,248,141,136,247,165,163,248,139,137,201,212,208,202,202,210,210,201,0,1,0,139,254,84,3,229,4,130,0,41,0,0,65,23,20,6,6,7,14,2,21,20,22,22,23,30,2,21,20,6,7,39,54,54,53,52, +38,38,39,46,3,53,52,54,54,55,62,3,3,59,169,94,159,102,102,143,75,63,153,135,96,146,83,151,159,72,95,105,62,115,82,82,150,117,68,96,173,116,88,117,68,30,4,130,13,112,128,67,23,23,59,111,102,98,116,78,43,31,66,101, +82,107,152,70,116,41,87,68,51,55,38,24,25,66,102,156,114,123,166,104,26,22,35,43,67,0,0,2,0,251,254,86,4,29,4,29,0,12,0,22,0,0,65,33,7,33,34,6,21,17,7,17,52,54,54,1,38,38,35,33,53,33,50,22, +23,2,73,1,212,23,254,73,91,81,168,76,149,1,195,33,78,66,254,69,1,203,73,88,43,4,29,139,80,92,251,136,24,4,129,112,144,70,253,14,12,15,136,21,22,0,0,3,0,174,255,233,4,2,5,225,0,11,0,15,0,27,0,0, +69,39,62,2,55,19,23,3,14,2,1,39,37,23,5,39,19,62,2,55,23,14,2,7,2,157,148,8,31,59,48,232,127,205,52,61,31,254,56,47,3,33,50,253,32,115,193,54,60,31,7,148,8,31,59,48,23,28,69,126,139,87,1,171, +55,254,103,106,144,109,2,25,140,229,138,170,79,1,130,106,143,109,54,28,70,125,138,89,0,3,0,63,254,90,4,2,5,221,0,3,0,7,0,24,0,0,115,1,23,1,51,1,23,1,1,4,0,18,17,20,6,6,7,39,54,18,53,16, +2,0,39,63,2,46,106,254,22,235,1,77,102,254,232,254,80,1,24,1,112,183,23,37,21,156,27,35,150,254,196,250,4,117,125,252,8,3,3,107,253,104,5,221,138,254,151,254,29,254,190,106,226,207,80,21,122,1,46,174,1,27,1,171, +1,78,142,0,0,4,0,124,254,89,4,52,4,51,0,15,0,21,0,36,0,51,0,0,65,34,38,39,55,22,22,51,50,54,53,53,23,21,20,6,1,39,55,1,23,7,19,38,38,53,52,62,3,55,55,17,20,22,23,1,22,22,21,20, +14,3,7,7,17,52,38,39,3,17,78,109,37,68,35,63,48,59,70,172,160,254,12,199,135,1,177,198,134,169,117,93,7,12,12,9,1,134,44,49,252,131,117,92,7,11,12,9,1,135,43,50,254,89,48,28,107,20,25,70,82,241,6,221, +150,154,1,152,59,147,3,108,58,148,252,158,32,130,132,36,125,147,140,106,18,148,253,32,80,69,23,3,206,31,148,133,35,124,148,141,105,19,147,2,224,79,67,23,0,2,0,157,255,233,4,18,5,218,0,27,0,55,0,0,65,50,22,22, +21,20,6,6,7,54,51,50,22,22,21,20,14,2,35,34,38,2,53,52,18,54,54,23,34,6,2,21,20,22,22,51,50,54,54,53,52,38,38,35,34,6,7,7,55,55,54,54,53,52,38,2,169,107,125,55,95,153,88,53,31,95,147,84, +57,112,165,107,163,194,87,90,151,186,87,82,152,98,55,115,89,85,117,62,36,98,93,60,106,68,100,4,102,198,186,64,5,218,78,118,61,91,152,108,27,12,84,188,156,88,168,135,79,169,1,65,223,202,1,47,202,101,130,140,254,217,234,221, +255,108,84,146,94,99,151,83,32,33,50,148,43,83,178,134,63,62,0,1,0,153,255,233,4,49,5,218,0,40,0,0,69,34,38,38,53,17,51,17,20,22,51,50,54,18,53,52,38,38,35,34,6,21,20,22,51,33,21,33,34,38,53,52, +54,54,51,50,22,18,21,16,2,2,20,88,154,95,169,93,82,89,122,63,63,127,95,92,111,148,114,1,230,254,26,217,217,97,167,106,166,211,100,230,23,79,154,112,1,119,254,157,114,113,135,1,47,252,187,246,121,116,89,111,96,138,195,147, +96,158,93,175,254,199,206,254,107,254,90,0,0,3,0,89,254,88,4,87,5,213,0,15,0,31,0,43,0,0,65,30,2,21,20,6,6,7,39,54,54,53,52,38,39,39,23,6,6,21,20,22,23,7,46,2,53,52,54,54,1,17,7,17, +23,17,7,17,55,17,39,17,2,142,148,204,105,115,205,134,5,144,139,141,140,115,4,142,136,137,141,1,146,202,105,115,204,1,17,4,4,162,4,4,4,23,3,131,230,154,166,233,123,1,129,7,200,187,180,204,2,132,128,4,202,187,182,204, +2,132,4,130,231,155,165,233,123,1,190,254,24,68,252,194,70,254,72,21,1,205,70,3,62,68,1,214,0,2,0,17,255,233,4,159,4,29,0,10,0,57,0,0,83,39,62,2,51,33,21,5,34,6,37,22,18,21,20,2,35,34,38,39, +6,6,35,34,2,53,52,18,55,51,14,2,21,20,22,22,51,50,54,54,53,53,55,21,20,22,22,51,50,54,54,53,52,38,38,39,47,30,34,74,119,98,3,73,252,65,63,65,3,147,56,76,150,147,97,124,15,23,123,92,146,143,72,56, +110,31,31,9,25,62,55,55,60,24,162,24,60,54,57,62,26,13,33,32,3,132,125,12,11,5,129,2,8,103,98,254,242,170,234,254,244,117,116,111,122,1,4,242,169,1,12,98,104,177,166,90,106,164,92,98,158,90,212,23,236,101,156,88, +92,164,106,91,167,178,104,0,0,3,0,123,255,233,4,52,4,51,0,5,0,20,0,35,0,0,69,39,55,1,23,7,19,38,38,53,52,62,3,55,55,17,20,22,23,1,22,22,21,20,14,3,7,7,17,52,38,39,1,159,199,135,1,178, +198,135,170,117,93,7,11,12,9,1,135,44,49,252,130,117,93,8,10,12,9,2,135,43,50,15,59,147,3,108,58,148,252,140,32,148,132,36,125,147,140,106,18,148,253,32,79,67,22,3,202,31,148,133,35,124,148,141,105,19,147,2,224,79, +67,23,0,2,0,187,254,81,4,25,4,51,0,16,0,47,0,0,65,46,2,39,46,2,53,55,20,22,22,23,22,22,23,1,55,22,22,51,50,54,53,52,38,35,34,6,21,17,7,17,16,18,51,50,22,22,21,20,14,2,35,34,38,3, +1,14,41,94,93,114,152,74,168,45,122,113,141,129,22,253,174,5,38,137,84,132,138,128,124,147,113,168,217,207,145,195,98,52,105,155,102,96,156,254,81,28,32,23,15,18,76,143,116,5,82,88,43,19,20,78,62,2,75,152,90,100,214,183, +175,188,224,207,254,26,5,2,9,1,9,1,13,124,223,150,102,191,152,89,84,0,0,1,0,183,255,233,4,9,4,51,0,28,0,0,101,50,54,55,23,6,6,35,34,38,38,53,52,54,54,51,50,22,23,7,38,38,35,34,6,21,20,22, +22,2,165,79,137,58,82,69,194,93,157,221,116,117,221,158,101,177,74,82,67,135,70,136,176,81,141,122,52,40,110,59,68,135,245,165,158,251,144,61,61,112,47,47,204,209,140,177,83,0,255,255,0,191,254,88,3,122,6,10,6,6,0,188, +0,0,255,255,0,183,255,233,4,9,4,51,6,6,1,211,0,0,255,255,0,201,254,88,4,29,5,218,6,6,0,221,0,0,0,1,0,40,254,88,4,94,4,29,0,20,0,0,83,19,51,19,19,51,19,35,3,46,2,39,3,35,3,20, +6,6,7,3,40,127,224,196,218,228,85,165,42,4,5,4,1,230,164,214,2,6,5,74,254,88,5,197,252,250,3,6,251,227,2,11,53,107,130,84,252,241,3,9,67,122,116,59,252,96,0,3,0,89,254,88,4,89,4,51,0,4,0,20, +0,34,0,0,87,33,21,33,35,1,50,18,17,20,6,6,35,34,38,39,17,7,17,16,18,23,34,6,21,17,22,22,51,50,54,53,52,38,38,89,2,140,254,22,162,2,75,230,207,90,183,139,88,140,54,168,217,204,141,112,41,128,74,131, +137,55,114,131,134,5,60,254,226,254,250,148,250,152,61,60,254,11,21,3,197,1,7,1,15,133,223,205,254,247,63,69,212,199,139,184,91,0,255,255,0,117,255,231,4,64,6,75,6,38,2,207,0,0,0,6,7,24,16,0,255,255,0,117, +255,231,4,64,6,75,6,38,2,207,0,0,0,6,7,26,136,0,255,255,0,117,255,231,4,64,6,60,6,38,2,207,0,0,0,6,7,27,196,0,255,255,0,117,255,231,4,64,6,60,6,38,2,207,0,0,0,6,7,28,158,0,255,255, +0,117,255,231,4,64,6,60,6,38,2,207,0,0,0,6,7,29,28,0,255,255,0,117,255,231,4,64,6,62,6,38,2,207,0,0,0,6,7,30,239,0,255,255,0,117,255,231,4,64,6,182,6,38,2,207,0,0,0,6,7,31,238,0, +255,255,0,117,255,231,4,64,6,184,6,38,2,207,0,0,0,6,7,32,217,0,255,255,0,117,255,231,4,64,6,37,6,38,2,207,0,0,0,6,6,248,209,0,255,255,0,117,255,231,4,64,6,58,6,38,2,207,0,0,0,6,6,249, +209,0,255,255,0,117,255,231,4,64,6,7,6,38,2,207,0,0,0,6,7,40,209,0,255,255,0,117,255,231,4,64,6,21,6,38,2,207,0,0,0,6,6,253,209,0,255,255,0,117,255,231,4,64,5,200,6,38,2,207,0,0,0,6, +7,0,209,0,255,255,0,117,254,135,4,64,4,51,6,38,2,207,0,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,58,6,38,2,207,0,0,0,38,7,36,209,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,58, +6,38,2,207,0,0,0,38,7,38,209,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,75,6,38,2,207,0,0,0,38,7,24,16,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,75,6,38,2,207,0,0,0,38, +7,26,136,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,60,6,38,2,207,0,0,0,38,7,27,196,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,60,6,38,2,207,0,0,0,38,7,28,158,0,0,6,7,20, +123,0,255,255,0,117,254,135,4,64,6,60,6,38,2,207,0,0,0,38,7,29,28,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,62,6,38,2,207,0,0,0,38,7,30,239,0,0,6,7,20,123,0,255,255,0,117,254,135, +4,64,6,182,6,38,2,207,0,0,0,38,7,31,238,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,184,6,38,2,207,0,0,0,38,7,32,217,0,0,6,7,20,123,0,255,255,0,117,254,135,4,64,6,7,6,38,2,207, +0,0,0,38,7,19,209,0,0,6,7,20,123,0,255,255,0,166,255,233,4,68,6,75,6,38,2,211,0,0,0,6,7,24,96,0,255,255,0,166,255,233,4,68,6,75,6,38,2,211,0,0,0,6,7,26,215,0,255,255,0,166,255,233, +4,68,6,60,6,38,2,211,0,0,0,6,7,27,20,0,255,255,0,166,255,233,4,68,6,60,6,38,2,211,0,0,0,6,7,28,237,0,255,255,0,166,255,233,4,68,6,60,6,38,2,211,0,0,0,6,7,29,108,0,255,255,0,166, +255,233,4,68,6,62,6,38,2,211,0,0,0,6,7,30,62,0,255,255,0,166,255,233,4,68,6,37,6,38,2,211,0,0,0,6,6,248,32,0,255,255,0,166,255,233,4,68,6,58,6,38,2,211,0,0,0,6,6,249,32,0,255,255, +0,146,254,88,3,232,6,75,6,38,2,213,0,0,0,6,7,24,61,0,255,255,0,146,254,88,3,232,6,75,6,38,2,213,0,0,0,6,7,26,180,0,255,255,0,146,254,88,3,232,6,60,6,38,2,213,0,0,0,6,7,27,241,0, +255,255,0,146,254,88,3,232,6,60,6,38,2,213,0,0,0,6,7,28,202,0,255,255,0,146,254,88,3,232,6,60,6,38,2,213,0,0,0,6,7,29,73,0,255,255,0,146,254,88,3,232,6,62,6,38,2,213,0,0,0,6,7,30, +27,0,255,255,0,146,254,88,3,232,6,182,6,38,2,213,0,0,0,6,7,31,27,0,255,255,0,146,254,88,3,232,6,184,6,38,2,213,0,0,0,6,7,32,6,0,255,255,0,146,254,88,3,232,6,37,6,38,2,213,0,0,0,6, +6,248,253,0,255,255,0,146,254,88,3,232,6,58,6,38,2,213,0,0,0,6,6,249,253,0,255,255,0,146,254,88,3,232,6,7,6,38,2,213,0,0,0,6,7,40,253,0,255,255,0,146,254,88,3,232,4,53,6,38,2,213,0,0, +0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232,6,58,6,38,2,213,0,0,0,38,7,36,253,0,0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232,6,58,6,38,2,213,0,0,0,38,7,38,253,0,0,7,7,20, +255,61,0,0,255,255,0,146,254,88,3,232,6,75,6,38,2,213,0,0,0,38,7,24,61,0,0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232,6,75,6,38,2,213,0,0,0,38,7,26,180,0,0,7,7,20,255,61,0,0, +255,255,0,146,254,88,3,232,6,60,6,38,2,213,0,0,0,38,7,27,241,0,0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232,6,60,6,38,2,213,0,0,0,38,7,28,202,0,0,7,7,20,255,61,0,0,255,255,0,146, +254,88,3,232,6,60,6,38,2,213,0,0,0,38,7,29,73,0,0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232,6,62,6,38,2,213,0,0,0,38,7,30,27,0,0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232, +6,182,6,38,2,213,0,0,0,38,7,31,27,0,0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232,6,184,6,38,2,213,0,0,0,38,7,32,6,0,0,7,7,20,255,61,0,0,255,255,0,146,254,88,3,232,6,7,6,38, +2,213,0,0,0,38,7,19,253,0,0,7,7,20,255,61,0,0,255,255,0,125,255,233,4,20,6,75,6,38,2,215,0,0,0,6,7,24,33,0,255,255,0,125,255,233,4,20,6,75,6,38,2,215,0,0,0,6,7,26,152,0,255,255, +0,125,255,233,4,20,6,60,6,38,2,215,0,0,0,6,7,27,213,0,255,255,0,125,255,233,4,20,6,60,6,38,2,215,0,0,0,6,7,28,174,0,255,255,0,125,255,233,4,20,6,60,6,38,2,215,0,0,0,6,7,29,45,0, +255,255,0,125,255,233,4,20,6,62,6,38,2,215,0,0,0,6,7,30,255,0,255,255,0,125,255,233,4,20,6,182,6,38,2,215,0,0,0,6,7,31,254,0,255,255,0,125,255,233,4,20,6,184,6,38,2,215,0,0,0,6,7,32, +234,0,255,255,0,125,255,233,4,20,6,37,6,38,2,215,0,0,0,6,6,248,225,0,255,255,0,125,255,233,4,20,6,58,6,38,2,215,0,0,0,6,6,249,225,0,255,255,0,125,255,233,4,20,6,7,6,38,2,215,0,0,0,6, +7,40,225,0,255,255,0,125,255,233,4,20,6,21,6,38,2,215,0,0,0,6,6,253,225,0,255,255,0,125,255,233,4,20,5,200,6,38,2,215,0,0,0,6,7,0,225,0,0,4,0,125,255,233,4,20,6,237,0,11,0,23,0,27, +0,45,0,0,65,50,22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,19,19,7,37,19,33,55,33,17,20,22,51,50,54,55,23,6,6,35,34,38,53,3,5,48,63,63,48,46,62,62,254,149,45,63,63, +45,47,64,64,89,233,70,254,245,179,254,156,20,1,248,98,76,42,91,43,45,35,143,72,142,171,5,191,63,46,45,64,64,45,46,63,63,46,45,64,64,45,46,63,1,46,254,228,66,248,253,8,142,252,231,77,66,20,17,123,19,35,159,143, +0,4,0,125,255,233,4,20,6,237,0,11,0,23,0,27,0,45,0,0,65,50,22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,19,23,5,39,3,33,55,33,17,20,22,51,50,54,55,23,6,6,35,34, +38,53,1,108,45,63,63,45,47,64,64,1,200,47,64,64,47,45,63,63,8,105,254,245,71,22,254,156,20,1,248,98,76,42,91,43,45,35,143,72,142,171,5,191,63,46,45,64,64,45,46,63,63,46,45,64,64,45,46,63,1,46,102,248, +66,253,190,142,252,231,77,66,20,17,123,19,35,159,143,0,0,4,0,125,255,233,4,20,6,243,0,11,0,23,0,45,0,63,0,0,65,34,38,53,52,54,51,50,22,21,20,6,33,34,38,53,52,54,51,50,22,21,20,6,3,34,38,38, +35,34,6,7,39,54,54,51,50,22,22,51,50,54,55,23,6,6,1,33,55,33,17,20,22,51,50,54,55,23,6,6,35,34,38,53,1,115,47,63,63,47,46,62,62,1,110,45,62,62,45,48,63,63,139,53,77,66,37,34,48,24,106,34, +106,73,56,75,64,37,30,49,27,106,39,108,254,236,254,156,20,1,248,98,76,42,91,43,45,35,143,72,142,171,4,215,61,45,47,61,61,47,45,61,61,45,47,61,61,47,45,61,1,57,48,49,47,46,54,71,98,48,49,43,45,53,84,81, +253,127,142,252,231,77,66,20,17,123,19,35,159,143,255,255,0,147,255,233,4,29,6,75,6,38,2,221,0,0,0,6,7,24,63,0,255,255,0,147,255,233,4,29,6,75,6,38,2,221,0,0,0,6,7,26,183,0,255,255,0,147,255,233, +4,29,6,60,6,38,2,221,0,0,0,6,7,27,243,0,255,255,0,147,255,233,4,29,6,60,6,38,2,221,0,0,0,6,7,28,205,0,255,255,0,147,255,233,4,29,6,60,6,38,2,221,0,0,0,6,7,29,75,0,255,255,0,147, +255,233,4,29,6,62,6,38,2,221,0,0,0,6,7,30,30,0,255,255,0,147,255,233,4,29,6,37,6,38,2,221,0,0,0,6,6,248,0,0,255,255,0,147,255,233,4,29,6,58,6,38,2,221,0,0,0,6,6,249,0,0,255,255, +0,187,254,88,4,25,6,75,6,38,2,223,0,0,0,6,7,24,76,0,255,255,0,187,254,88,4,25,6,75,6,38,2,223,0,0,0,6,7,26,196,0,255,255,0,206,255,233,4,27,6,75,6,38,2,227,0,0,0,6,7,24,63,0, +255,255,0,206,255,233,4,27,6,75,6,38,2,227,0,0,0,6,7,26,183,0,255,255,0,206,255,233,4,27,6,60,6,38,2,227,0,0,0,6,7,27,243,0,255,255,0,206,255,233,4,27,6,60,6,38,2,227,0,0,0,6,7,28, +205,0,255,255,0,206,255,233,4,27,6,60,6,38,2,227,0,0,0,6,7,29,75,0,255,255,0,206,255,233,4,27,6,62,6,38,2,227,0,0,0,6,7,30,30,0,255,255,0,206,255,233,4,27,6,182,6,38,2,227,0,0,0,6, +7,31,29,0,255,255,0,206,255,233,4,27,6,184,6,38,2,227,0,0,0,6,7,32,8,0,255,255,0,206,255,233,4,27,6,37,6,38,2,227,0,0,0,6,6,248,0,0,255,255,0,206,255,233,4,27,6,58,6,38,2,227,0,0, +0,6,6,249,0,0,255,255,0,206,255,233,4,27,6,7,6,38,2,227,0,0,0,6,7,40,0,0,255,255,0,206,255,233,4,27,6,21,6,38,2,227,0,0,0,6,6,253,0,0,255,255,0,206,255,233,4,27,5,200,6,38,2,227, +0,0,0,6,7,0,0,0,0,4,0,206,255,233,4,27,6,237,0,11,0,23,0,27,0,52,0,0,65,50,22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,19,19,7,37,1,22,18,21,20,6,6,35, +34,38,53,17,51,17,20,22,51,50,62,2,53,52,2,39,3,36,48,63,63,48,46,63,63,254,148,46,63,63,46,47,63,63,90,233,71,254,246,2,154,24,28,139,217,120,160,209,168,110,97,54,105,87,53,23,28,5,191,63,46,45,64,64, +45,46,63,63,46,45,64,64,45,46,63,1,46,254,228,66,248,253,150,132,254,255,154,187,235,111,172,173,2,219,253,52,112,110,38,92,160,120,111,1,10,151,0,4,0,206,255,233,4,27,6,237,0,11,0,23,0,27,0,52,0,0,65,50, +22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,19,23,5,39,1,22,18,21,20,6,6,35,34,38,53,17,51,17,20,22,51,50,62,2,53,52,2,39,1,138,46,63,63,46,47,63,63,1,201,47,64,64, +47,46,63,63,9,104,254,246,71,1,209,24,28,139,217,120,160,209,168,110,97,54,105,87,53,23,28,5,191,63,46,45,64,64,45,46,63,63,46,45,64,64,45,46,63,1,46,102,248,66,254,76,132,254,255,154,187,235,111,172,173,2,219,253, +52,112,110,38,92,160,120,111,1,10,151,0,0,4,0,206,255,233,4,27,6,243,0,11,0,23,0,45,0,70,0,0,65,34,38,53,52,54,51,50,22,21,20,6,33,34,38,53,52,54,51,50,22,21,20,6,3,34,38,38,35,34,6,7, +39,54,54,51,50,22,22,51,50,54,55,23,6,6,19,22,18,21,20,6,6,35,34,38,53,17,51,17,20,22,51,50,62,2,53,52,2,39,1,146,47,63,63,47,45,63,63,1,111,45,63,63,45,48,62,62,139,53,77,66,37,34,48,24, +107,35,106,73,56,75,64,37,30,49,27,106,39,108,211,24,28,139,217,120,160,209,168,110,97,54,105,87,53,23,28,4,215,61,45,47,61,61,47,45,61,61,45,47,61,61,47,45,61,1,57,48,49,47,46,54,71,98,48,49,43,45,53,84, +81,254,13,132,254,255,154,187,235,111,172,173,2,219,253,52,112,110,38,92,160,120,111,1,10,151,255,255,0,53,255,233,4,123,6,75,6,38,2,231,0,0,0,6,7,24,63,0,255,255,0,53,255,233,4,123,6,75,6,38,2,231,0,0, +0,6,7,26,183,0,255,255,0,53,255,233,4,123,6,60,6,38,2,231,0,0,0,6,7,27,243,0,255,255,0,53,255,233,4,123,6,60,6,38,2,231,0,0,0,6,7,28,205,0,255,255,0,53,255,233,4,123,6,60,6,38,2,231, +0,0,0,6,7,29,75,0,255,255,0,53,255,233,4,123,6,62,6,38,2,231,0,0,0,6,7,30,30,0,255,255,0,53,255,233,4,123,6,182,6,38,2,231,0,0,0,6,7,31,29,0,255,255,0,53,255,233,4,123,6,184,6,38, +2,231,0,0,0,6,7,32,8,0,255,255,0,53,255,233,4,123,6,37,6,38,2,231,0,0,0,6,6,248,0,0,255,255,0,53,255,233,4,123,6,58,6,38,2,231,0,0,0,6,6,249,0,0,255,255,0,53,255,233,4,123,6,7, +6,38,2,231,0,0,0,6,7,40,0,0,255,255,0,53,254,135,4,123,4,29,6,38,2,231,0,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,58,6,38,2,231,0,0,0,38,7,36,0,0,0,7,7,20,0,128, +0,0,255,255,0,53,254,135,4,123,6,58,6,38,2,231,0,0,0,38,7,38,0,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,75,6,38,2,231,0,0,0,38,7,24,63,0,0,7,7,20,0,128,0,0,255,255, +0,53,254,135,4,123,6,75,6,38,2,231,0,0,0,38,7,26,183,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,60,6,38,2,231,0,0,0,38,7,27,243,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135, +4,123,6,60,6,38,2,231,0,0,0,38,7,28,205,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,60,6,38,2,231,0,0,0,38,7,29,75,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,62, +6,38,2,231,0,0,0,38,7,30,30,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,182,6,38,2,231,0,0,0,38,7,31,29,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,184,6,38,2,231, +0,0,0,38,7,32,8,0,0,7,7,20,0,128,0,0,255,255,0,53,254,135,4,123,6,7,6,38,2,231,0,0,0,38,7,19,0,0,0,7,7,20,0,128,0,0,255,255,1,138,254,135,3,40,255,179,4,6,7,20,0,0,255,255, +1,138,254,135,3,40,255,179,4,6,7,20,0,0,0,2,0,60,0,65,4,116,5,32,0,2,0,5,0,0,83,1,1,19,17,1,60,4,56,251,200,141,2,144,5,32,253,146,253,143,3,234,253,11,1,124,255,255,0,60,0,65,4,116, +5,32,4,71,3,134,4,176,0,0,192,0,64,0,0,4,0,122,0,0,4,119,5,97,0,11,0,20,0,41,0,45,0,0,65,52,38,38,35,33,17,33,50,62,2,3,52,38,35,33,17,33,50,54,19,20,14,2,35,33,17,33,50,30, +2,21,20,6,6,7,30,2,1,51,17,35,3,206,81,134,79,254,115,1,133,50,106,91,55,54,146,125,254,146,1,127,123,131,223,87,145,179,91,253,249,1,232,88,169,135,81,68,111,62,73,138,90,253,29,161,161,1,131,104,113,44,254,7, +20,52,95,2,199,117,99,254,66,109,254,5,112,152,90,39,5,97,33,79,134,101,89,123,75,14,12,69,139,3,52,251,12,0,0,2,0,127,255,233,4,111,5,119,0,3,0,33,0,0,65,51,17,35,1,50,22,23,7,38,38,35,34,6, +6,21,20,22,22,51,50,54,55,23,6,6,35,34,36,2,53,52,18,36,1,181,163,163,1,23,135,182,82,97,65,145,79,113,192,117,111,190,117,116,149,55,90,63,202,147,167,254,241,158,161,1,13,4,244,251,73,5,58,68,66,113,55,47, +107,247,211,205,248,110,70,45,114,61,89,164,1,61,231,232,1,60,162,0,0,3,0,51,0,0,4,125,5,97,0,11,0,15,0,19,0,0,65,33,17,33,17,33,17,33,17,33,17,33,1,17,35,17,33,17,35,17,2,228,1,153,254,103, +254,232,254,103,1,153,1,24,254,86,117,3,38,117,5,97,250,159,2,142,253,114,5,97,253,186,253,113,4,72,251,184,4,72,251,184,0,2,0,167,0,0,4,9,5,97,0,11,0,15,0,0,97,1,19,17,35,17,33,1,3,17,51,17, +39,1,35,1,2,124,254,180,24,161,1,121,1,98,26,161,146,254,62,128,1,186,3,63,254,33,254,160,5,97,252,178,1,228,1,106,250,159,137,4,79,251,177,0,0,4,0,121,0,0,4,99,5,97,0,12,0,16,0,27,0,31,0,0, +65,20,6,6,35,35,19,33,17,33,50,22,22,37,17,51,17,1,52,38,38,35,35,17,51,50,54,54,3,51,17,35,4,99,137,233,146,64,1,254,89,1,214,163,238,131,252,173,121,2,66,82,146,95,109,99,100,149,84,254,144,144,3,184, +159,194,88,254,1,5,97,95,188,143,251,183,4,73,254,225,104,126,59,253,180,56,130,1,212,253,71,0,0,4,0,91,254,166,4,161,5,119,0,3,0,7,0,32,0,44,0,0,65,51,17,35,1,51,17,35,1,20,6,6,7,30,2,23, +7,46,2,35,34,38,2,53,52,18,54,51,50,22,18,7,16,2,35,34,2,17,16,18,51,50,18,1,94,128,128,1,120,128,128,1,125,54,125,106,97,137,95,34,183,41,105,157,119,158,219,112,115,226,167,168,226,114,180,153,175,174,154,159, +169,174,154,4,254,251,100,4,156,251,100,2,77,146,244,186,58,19,76,131,101,72,106,146,75,175,1,60,213,209,1,66,183,178,254,192,214,1,20,1,35,254,219,254,236,254,237,254,225,1,33,0,0,5,0,121,0,0,4,164,5,97,0,3, +0,16,0,20,0,31,0,35,0,0,65,55,1,35,19,20,6,6,35,35,19,33,17,33,50,22,22,37,17,51,17,1,52,38,38,35,35,17,51,50,54,54,3,51,17,35,2,92,176,1,152,208,143,137,233,146,64,1,254,89,1,214,163,238, +131,252,173,121,2,66,82,146,95,109,99,100,149,84,254,144,144,2,79,20,253,157,3,184,159,194,88,254,1,5,97,95,188,143,251,183,4,73,254,225,104,126,59,253,180,56,130,1,212,253,71,0,0,2,0,143,0,0,4,33,5,97,0,9, +0,13,0,0,83,33,21,1,33,7,33,53,1,33,33,1,51,1,215,3,74,254,34,1,220,21,252,133,1,223,254,105,2,45,254,36,131,1,221,5,97,142,251,195,150,141,4,64,251,201,4,54,0,3,0,149,255,233,4,27,5,119,0,11, +0,27,0,31,0,0,65,50,18,17,16,2,35,34,2,17,16,18,23,34,2,17,20,30,2,51,50,54,54,53,52,38,38,23,23,1,39,2,88,223,228,228,223,222,229,229,222,127,146,32,67,103,71,86,123,65,57,121,107,44,254,74,62,5, +119,254,144,254,170,254,169,254,143,1,113,1,87,1,86,1,112,135,254,243,254,206,155,220,137,64,118,255,203,206,254,115,49,147,252,137,117,0,0,2,0,190,0,0,4,11,5,97,0,6,0,10,0,0,65,17,35,17,5,39,37,1,21,33, +53,2,235,168,254,196,73,1,154,1,179,252,229,5,97,250,199,4,131,192,120,254,251,40,137,137,0,1,0,118,0,0,3,218,5,119,0,28,0,0,65,50,22,22,21,20,14,2,7,33,7,33,53,62,4,53,52,38,35,34,6,7,39,54, +54,2,27,130,185,100,66,145,235,171,2,137,21,252,205,156,219,143,81,32,131,115,102,130,65,116,82,200,5,119,100,174,110,95,181,199,242,155,143,137,149,224,169,138,125,67,116,134,70,77,90,100,97,0,0,1,0,103,255,233,3,236,5,119, +0,46,0,0,65,50,22,22,21,20,6,6,7,30,2,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,38,35,35,55,51,50,54,54,53,52,38,35,34,6,7,39,54,54,2,25,130,189,104,74,122,73,81,142,90,120,215,143, +115,229,79,113,59,163,84,144,162,75,128,82,116,21,81,67,119,76,152,108,90,134,68,93,88,198,5,119,93,157,94,83,136,88,14,6,79,145,107,119,191,110,88,96,92,69,68,151,130,98,114,49,133,51,108,81,114,120,63,64,103,83,75,0, +0,2,0,144,0,0,4,33,5,119,0,6,0,11,0,0,65,23,1,33,21,33,53,1,17,35,3,19,2,36,140,254,146,2,223,252,111,2,223,162,1,23,5,119,59,252,153,134,122,1,147,252,164,1,181,1,167,0,0,1,0,154,255,233, +3,251,5,97,0,33,0,0,65,7,33,17,54,54,51,50,22,22,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,38,35,34,6,7,35,17,3,206,25,253,224,63,113,62,112,170,94,115,208,143,124,195,80,104,63,145,89,136, +152,66,113,69,61,94,60,135,5,97,134,254,78,34,25,101,194,137,137,208,114,88,78,100,64,63,165,160,111,128,55,23,23,2,176,0,0,1,0,159,255,233,4,25,5,119,0,45,0,0,65,50,22,23,7,38,38,35,34,6,2,23,23,20, +22,51,50,54,53,52,38,38,35,34,6,7,39,54,54,51,50,22,22,21,20,6,6,35,34,46,2,53,52,18,54,2,159,80,134,58,66,47,105,57,110,154,78,1,2,134,152,131,131,61,110,73,107,164,51,4,68,174,110,107,176,107,116,198, +119,126,174,108,49,121,229,5,119,41,39,114,29,29,147,254,245,180,65,254,237,186,160,113,131,56,128,100,148,116,102,94,193,147,152,217,117,95,177,249,153,228,1,80,184,0,0,1,0,195,255,237,3,242,5,97,0,6,0,0,69,39,1,33, +53,33,21,1,205,157,2,25,253,122,3,47,19,48,4,184,140,129,0,3,0,131,255,233,4,45,5,119,0,29,0,43,0,56,0,0,65,20,6,7,22,22,21,20,6,6,35,34,38,38,53,52,54,55,38,38,53,52,62,2,51,50,30,2, +3,52,38,38,39,14,2,21,20,22,51,50,54,1,20,22,22,23,54,54,53,52,38,35,34,6,3,245,124,115,135,160,116,211,146,147,209,109,151,125,109,111,77,123,145,68,75,147,120,71,121,94,166,109,57,98,60,145,142,144,153,253,229,73, +136,93,96,96,129,118,117,130,4,25,100,147,63,56,186,128,112,178,102,103,176,110,127,175,57,52,148,115,95,135,88,41,41,85,132,252,250,93,108,72,37,26,80,119,87,117,135,145,3,12,79,90,57,31,55,113,94,104,122,122,0,1,0,133, +255,214,4,4,5,117,0,39,0,0,65,50,22,22,21,20,2,6,4,7,39,54,36,54,55,55,54,38,38,35,34,6,21,20,22,51,50,54,55,7,6,6,35,34,38,38,53,52,54,54,2,67,150,200,99,85,178,254,234,193,39,196,1,4, +134,5,3,1,59,121,95,134,138,133,118,103,150,67,1,61,172,117,115,178,101,120,202,5,117,138,252,173,208,254,223,194,132,53,128,55,151,231,172,96,172,207,91,164,158,157,143,116,98,146,88,114,106,196,138,147,202,103,0,3,0,149,255,233, +4,27,5,119,0,11,0,26,0,38,0,0,65,50,18,17,16,2,35,34,2,17,16,18,23,34,2,17,20,22,22,51,50,54,54,53,52,38,38,3,50,22,21,20,6,35,34,38,53,52,54,2,88,223,228,228,223,222,229,229,222,127,148,66, +124,85,87,123,65,65,123,87,57,75,75,57,55,75,75,5,119,254,144,254,170,254,169,254,143,1,113,1,87,1,86,1,112,135,254,243,254,206,203,254,119,118,255,203,204,253,118,254,68,76,54,55,77,77,55,54,76,0,0,3,0,103,255,233, +4,73,4,122,0,15,0,31,0,35,0,0,65,50,22,18,21,20,2,6,35,34,38,2,53,52,18,54,23,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,55,23,1,39,2,88,148,224,125,126,224,147,147,224,126,127,223,147,84,148, +91,83,146,94,85,147,91,83,145,73,89,254,84,84,4,122,140,254,250,181,186,254,249,137,142,1,7,181,188,1,4,135,137,86,196,164,173,196,80,88,198,163,174,194,78,42,64,252,152,77,0,3,0,103,255,233,4,73,4,122,0,15,0,27, +0,43,0,0,65,50,22,18,21,20,2,6,35,34,38,2,53,52,18,54,19,50,22,21,20,6,35,34,38,53,52,54,19,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,2,88,147,223,127,126,224,147,147,224,126,127,223,143,56,72, +72,56,54,72,72,58,85,148,92,92,148,85,85,148,92,92,148,4,122,135,254,252,188,186,254,249,137,137,1,7,186,188,1,4,135,254,56,73,53,54,74,74,54,53,73,1,63,86,196,164,163,198,88,88,198,163,164,196,86,0,0,2,0,211, +0,0,4,33,4,102,0,6,0,10,0,0,65,17,35,17,5,39,37,1,21,33,53,3,3,170,254,196,74,1,156,1,178,252,228,4,102,251,242,3,89,194,120,255,252,35,137,137,0,1,0,153,0,0,3,245,4,122,0,29,0,0,65,50, +22,22,21,20,14,3,7,33,7,33,53,62,4,53,52,38,35,34,6,7,39,54,54,2,60,130,189,103,20,64,129,217,165,2,102,20,252,210,172,231,140,70,23,135,109,88,147,73,110,83,201,4,122,92,159,101,54,102,109,127,157,101,144,137, +120,172,126,98,88,49,99,118,72,88,90,102,107,0,0,1,0,125,255,23,3,225,4,122,0,43,0,0,65,50,22,22,21,20,6,7,30,2,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,35,55,51,50,54,53,52,38, +35,34,6,7,39,54,54,2,41,131,177,90,148,110,89,134,77,113,208,145,122,203,77,105,63,142,88,142,152,151,137,106,20,74,114,152,128,116,87,130,69,88,84,187,4,122,93,152,88,117,158,25,10,79,143,106,116,184,108,87,91,97,71,64, +150,126,132,122,134,120,115,93,109,57,64,104,78,77,0,2,0,125,255,43,4,69,4,122,0,6,0,11,0,0,65,23,1,33,21,33,53,1,17,35,3,19,2,17,141,254,146,3,21,252,56,3,0,157,1,23,4,122,59,252,151,131,118,1, +126,252,228,1,139,1,145,0,0,1,0,170,255,23,4,11,4,102,0,33,0,0,65,7,33,17,54,54,51,50,22,22,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,38,35,34,6,7,35,17,3,221,24,253,222,54,107,65, +117,176,97,117,209,140,131,190,78,103,62,140,95,133,156,70,118,74,63,91,50,135,4,102,134,254,105,29,24,100,189,133,133,202,114,88,78,102,65,63,162,152,106,125,53,24,22,2,155,0,0,1,0,159,255,233,4,25,5,119,0,45,0,0, +65,50,22,23,7,38,38,35,34,6,2,23,23,20,22,51,50,54,53,52,38,38,35,34,6,7,39,54,54,51,50,22,22,21,20,6,6,35,34,46,2,53,52,18,54,2,159,80,134,58,66,47,105,57,110,154,78,1,2,134,152,131,131,61, +110,73,107,164,51,4,68,174,110,107,176,107,116,198,119,126,174,108,49,121,229,5,119,41,39,114,29,29,147,254,245,180,65,254,237,186,160,113,131,56,128,100,148,116,102,94,193,147,152,217,117,95,177,249,153,228,1,80,184,0,0,1,0,183, +255,21,3,233,4,102,0,6,0,0,65,21,1,39,1,33,53,3,233,254,12,153,1,227,253,120,4,102,129,251,48,52,4,146,139,0,0,3,0,131,255,233,4,45,5,119,0,29,0,43,0,56,0,0,65,20,6,7,22,22,21,20,6,6, +35,34,38,38,53,52,54,55,38,38,53,52,62,2,51,50,30,2,3,52,38,38,39,14,2,21,20,22,51,50,54,1,20,22,22,23,54,54,53,52,38,35,34,6,3,245,124,115,135,160,116,211,146,147,209,109,151,125,106,114,77,123,145,68, +75,147,120,71,121,94,166,109,57,98,60,145,142,144,153,253,229,73,136,93,96,96,129,118,117,130,4,25,104,147,59,56,186,128,112,178,102,103,176,110,127,175,57,54,146,115,94,136,87,42,41,87,131,252,251,93,108,72,37,26,80,119,87,117, +135,145,3,12,79,90,57,31,55,113,94,104,122,122,0,1,0,133,255,16,4,4,4,122,0,37,0,0,65,50,22,22,21,20,2,4,5,39,36,0,55,53,54,38,38,35,34,6,21,20,22,51,50,54,55,7,6,6,35,34,38,38,53,52, +54,54,2,67,148,199,102,151,254,188,254,253,39,1,30,1,51,4,1,54,119,101,134,138,134,119,101,151,62,1,56,172,116,115,179,102,120,202,4,122,134,250,171,235,254,195,208,71,128,77,1,28,244,47,172,206,92,167,136,141,149,96,108,150, +91,97,110,194,126,132,194,107,0,3,0,103,255,233,4,73,4,122,0,15,0,27,0,43,0,0,65,50,22,18,21,20,2,6,35,34,38,2,53,52,18,54,19,50,22,21,20,6,35,34,38,53,52,54,19,34,6,6,21,20,22,22,51,50, +54,54,53,52,38,38,2,88,147,223,127,126,224,147,147,224,126,127,223,143,56,72,72,56,54,72,72,58,85,148,92,92,148,85,85,148,92,92,148,4,122,135,254,252,188,186,254,249,137,137,1,7,186,188,1,4,135,254,56,73,53,54,74,74, +54,53,73,1,63,86,196,164,163,198,88,88,198,163,164,196,86,0,255,255,1,35,254,114,3,139,1,12,6,7,3,177,0,0,254,126,255,255,1,143,254,126,3,33,1,0,6,7,3,178,0,0,254,126,255,255,1,52,254,126,3,122,1,12, +6,7,3,179,0,0,254,126,255,255,1,39,254,114,3,136,1,12,6,7,3,180,0,0,254,126,255,255,1,37,254,126,3,137,1,20,6,7,3,181,0,0,254,126,255,255,1,55,254,114,3,121,1,0,6,7,3,182,0,0,254,126,255,255, +1,40,254,114,3,136,1,12,6,7,3,183,0,0,254,126,255,255,1,63,254,111,3,113,1,0,6,7,3,184,0,0,254,126,255,255,1,27,254,114,3,149,1,12,6,7,3,185,0,0,254,126,255,255,1,38,254,115,3,143,1,12,6,7, +3,186,0,0,254,126,0,2,1,35,255,244,3,139,2,142,0,11,0,27,0,0,65,52,38,35,34,6,21,20,22,51,50,54,55,20,6,6,35,34,38,38,53,52,54,54,51,50,22,22,2,244,82,74,74,84,82,76,74,82,151,69,137,101, +102,137,70,70,137,102,101,137,69,1,66,116,96,102,110,105,112,103,114,90,152,92,92,152,90,92,150,90,89,151,0,1,1,143,0,0,3,33,2,130,0,6,0,0,97,17,7,39,37,51,17,2,149,192,70,1,33,113,1,222,105,100,169,253, +126,0,0,1,1,52,0,0,3,122,2,142,0,23,0,0,65,20,6,6,7,33,7,33,53,62,2,53,52,38,35,34,6,7,39,54,51,50,22,3,103,65,147,126,1,101,17,253,214,159,173,66,61,57,48,97,45,101,122,174,129,138,1,185, +63,98,96,63,121,105,97,112,78,44,45,52,43,54,77,141,118,0,0,1,1,39,255,244,3,136,2,142,0,39,0,0,65,50,22,21,20,6,7,22,22,21,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,35,55,51,50,54,53, +52,35,34,6,7,39,54,54,2,105,122,138,64,79,86,84,161,146,80,161,61,92,46,112,57,77,74,71,71,93,15,68,61,67,122,55,104,51,78,69,150,2,142,96,82,53,67,13,13,67,72,90,113,54,63,76,41,39,52,42,50,44,84,37, +45,88,36,40,83,57,47,0,0,1,1,37,0,0,3,137,2,150,0,14,0,0,101,21,35,53,33,53,1,23,3,51,55,51,21,51,21,3,27,145,254,155,1,14,124,230,192,12,134,110,112,112,112,96,1,198,51,254,132,171,171,119,0,1, +1,55,255,244,3,121,2,130,0,30,0,0,101,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,34,6,7,35,17,33,7,33,21,54,54,51,50,22,3,121,165,125,80,148,60,90,40,99,55,72,72,66,60,27,73,32,109,1,229, +12,254,182,30,76,34,103,131,219,115,116,49,62,78,37,37,60,56,53,51,18,16,1,97,118,127,14,17,106,0,0,2,1,40,255,244,3,136,2,142,0,28,0,40,0,0,65,38,38,35,34,6,7,54,54,51,50,22,22,21,20,6,6,35, +34,38,38,53,52,54,54,51,50,22,23,3,34,7,30,2,51,50,54,53,52,38,3,15,34,74,46,92,93,4,44,105,74,63,109,69,79,131,79,106,141,72,73,148,112,56,117,51,218,97,94,12,38,66,55,69,73,66,1,247,17,16,96,101, +39,45,42,89,71,71,105,57,89,153,95,89,150,90,27,30,254,241,82,34,63,41,64,48,56,52,0,1,1,63,255,241,3,113,2,130,0,6,0,0,69,39,1,33,53,33,21,2,41,141,1,55,254,108,2,50,15,58,1,224,119,98,0,3, +1,27,255,244,3,149,2,142,0,23,0,34,0,46,0,0,65,20,6,7,22,22,21,20,6,35,34,38,53,52,54,55,38,38,53,52,54,51,50,22,3,52,38,39,6,21,20,22,51,50,54,1,20,22,23,54,54,53,52,38,35,34,6,3, +115,82,60,85,91,172,146,150,166,85,77,61,64,158,122,132,151,116,118,96,120,82,83,80,89,254,208,75,91,55,55,66,73,71,66,1,232,67,63,6,26,75,63,90,110,109,87,57,77,17,17,70,62,74,96,98,254,146,43,42,16,36,66,39, +44,50,1,71,32,38,17,17,36,32,25,39,37,0,0,2,1,38,255,245,3,143,2,142,0,20,0,32,0,0,101,54,54,55,6,6,35,34,38,38,53,52,54,54,51,50,22,21,20,6,5,19,50,54,55,38,38,35,34,6,21,20,22,1, +111,173,185,38,51,98,69,66,115,70,84,138,81,149,165,251,254,255,180,49,92,38,1,85,80,70,83,77,103,21,81,89,27,38,43,89,68,72,101,52,147,128,184,177,29,1,92,26,20,76,77,54,49,51,45,0,255,255,1,35,2,216,3,139, +5,114,6,7,3,177,0,0,2,228,255,255,1,143,2,224,3,33,5,98,6,7,3,178,0,0,2,224,255,255,1,52,2,224,3,122,5,110,6,7,3,179,0,0,2,224,255,255,1,39,2,212,3,136,5,110,6,7,3,180,0,0,2,224, +255,255,1,37,2,224,3,137,5,118,6,7,3,181,0,0,2,224,255,255,1,55,2,212,3,121,5,98,6,7,3,182,0,0,2,224,255,255,1,40,2,212,3,136,5,110,6,7,3,183,0,0,2,224,255,255,1,63,2,207,3,113,5,97, +6,7,3,184,0,0,2,223,255,255,1,27,2,212,3,149,5,110,6,7,3,185,0,0,2,224,255,255,1,38,2,213,3,143,5,110,6,7,3,186,0,0,2,224,255,255,1,35,2,106,3,139,5,4,6,7,3,177,0,0,2,118,255,255, +1,143,2,118,3,33,4,248,6,7,3,178,0,0,2,118,255,255,1,52,2,118,3,122,5,4,6,7,3,179,0,0,2,118,255,255,1,39,2,106,3,136,5,4,6,7,3,180,0,0,2,118,255,255,1,37,2,118,3,137,5,12,6,7, +3,181,0,0,2,118,255,255,1,55,2,106,3,121,4,248,6,7,3,182,0,0,2,118,255,255,1,40,2,106,3,136,5,4,6,7,3,183,0,0,2,118,255,255,1,63,2,103,3,113,4,248,6,7,3,184,0,0,2,118,255,255,1,27, +2,106,3,149,5,4,6,7,3,185,0,0,2,118,255,255,1,38,2,107,3,143,5,4,6,7,3,186,0,0,2,118,0,1,253,203,1,112,2,53,3,219,0,3,0,0,65,39,1,23,254,9,62,4,46,60,1,112,107,2,0,107,0,2, +0,34,1,112,4,144,5,98,0,3,0,10,0,0,83,39,1,23,5,17,7,39,37,51,17,100,63,4,46,61,252,152,192,70,1,33,113,1,112,107,2,0,107,144,1,222,105,100,169,253,126,0,0,3,255,248,0,0,4,185,5,98,0,3, +0,10,0,34,0,0,83,39,1,23,5,17,7,39,37,51,17,1,20,6,6,7,33,7,33,53,62,2,53,52,38,35,34,6,7,39,54,51,50,22,82,62,4,46,60,252,128,192,70,1,33,114,3,27,64,148,126,1,101,17,253,214,160,172, +67,62,56,49,97,44,102,122,175,128,138,1,112,107,2,0,107,144,1,222,105,100,169,253,126,254,217,63,98,96,63,121,105,97,112,78,44,45,52,43,54,77,141,118,0,3,255,234,255,244,4,199,5,98,0,3,0,10,0,50,0,0,83,39, +1,23,5,17,7,39,37,51,17,5,50,22,21,20,6,7,22,22,21,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,35,55,51,50,54,53,52,35,34,6,7,39,54,54,66,62,4,46,60,252,130,192,70,1,33,113,2,44,121, +138,63,79,86,84,161,146,80,161,61,92,46,112,57,77,74,72,70,93,15,68,60,68,123,54,104,51,78,69,150,1,112,107,2,0,107,144,1,222,105,100,169,253,126,82,96,82,53,67,13,13,67,72,90,113,54,63,76,41,39,52,42,50,44, +84,37,45,88,36,40,83,57,47,0,0,3,255,174,255,244,5,2,5,110,0,3,0,27,0,67,0,0,83,39,1,23,1,20,6,6,7,33,7,33,53,62,2,53,52,38,35,34,6,7,39,54,51,50,22,1,50,22,21,20,6,7,22,22, +21,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,35,55,51,50,54,53,52,35,34,6,7,39,54,54,127,62,4,46,60,253,54,65,147,126,1,101,17,253,214,159,173,66,61,57,48,97,45,101,122,174,129,138,2,2,122,138,64, +79,86,84,161,146,80,161,61,92,46,112,57,77,74,71,71,93,15,68,61,67,122,55,104,51,78,69,150,1,112,107,2,0,107,1,41,63,98,96,63,121,105,97,112,78,44,45,52,43,54,77,141,118,253,150,96,82,53,67,13,13,67,72,90, +113,54,63,76,41,39,52,42,50,44,84,37,45,88,36,40,83,57,47,0,0,3,255,254,0,0,4,179,5,98,0,3,0,10,0,25,0,0,83,39,1,23,5,17,7,39,37,51,17,1,21,35,53,33,53,1,23,3,51,55,51,21,51,21, +90,62,4,46,60,252,126,192,70,1,33,114,2,179,145,254,155,1,15,123,230,192,13,133,111,1,112,107,2,0,107,144,1,222,105,100,169,253,126,253,144,112,112,96,1,198,51,254,132,171,171,119,0,3,255,251,0,0,4,181,5,110,0,3, +0,43,0,58,0,0,83,39,1,23,1,50,22,21,20,6,7,22,22,21,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,35,55,51,50,54,53,52,35,34,6,7,39,54,54,1,21,35,53,33,53,1,23,3,51,55,51,21,51, +21,109,63,4,46,61,252,163,122,138,63,80,86,85,161,147,80,160,61,92,46,111,57,78,74,72,70,93,15,68,60,68,123,54,104,52,77,69,149,3,89,145,254,155,1,15,123,229,192,12,133,111,1,112,107,2,0,107,1,254,96,82,54,66, +13,13,67,73,89,113,54,63,76,41,39,52,41,51,43,85,37,45,88,36,40,83,57,47,251,2,112,112,96,1,198,51,254,132,171,171,119,0,0,3,255,220,255,244,4,214,5,98,0,3,0,10,0,41,0,0,83,39,1,23,5,17,7,39, +37,51,17,1,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,34,6,7,35,17,33,7,33,21,54,54,51,50,22,30,62,4,46,60,252,152,192,70,1,33,113,3,104,165,125,80,148,60,90,40,99,55,72,72,66,60,27,73,32, +109,1,229,12,254,182,30,76,34,103,131,1,112,107,2,0,107,144,1,222,105,100,169,253,126,253,251,115,116,49,62,78,37,37,60,56,53,51,18,16,1,97,118,127,14,17,106,0,0,3,255,162,255,244,5,13,5,110,0,3,0,27,0,58, +0,0,83,39,1,23,1,20,6,6,7,33,7,33,53,62,2,53,52,38,35,34,6,7,39,54,51,50,22,1,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,34,6,7,35,17,33,7,33,21,54,54,51,50,22,92,63,4,46, +61,253,77,64,148,125,1,100,16,253,213,160,172,67,62,56,49,97,44,102,123,174,128,138,3,56,165,124,80,148,60,89,41,98,56,72,72,66,60,27,74,31,110,1,230,12,254,182,30,76,34,103,130,1,112,107,2,0,107,1,41,63,98,96, +63,121,105,97,112,78,44,45,52,43,54,77,141,118,251,227,115,116,49,62,78,37,37,60,56,53,51,18,16,1,97,118,127,14,17,106,0,3,255,201,255,244,4,229,5,110,0,3,0,43,0,74,0,0,83,39,1,23,1,50,22,21,20,6, +7,22,22,21,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,35,55,51,50,54,53,52,35,34,6,7,39,54,54,1,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,34,6,7,35,17,33,7,33,21,54,54,51,50, +22,51,62,4,46,60,252,172,122,138,64,79,86,84,161,146,80,161,61,92,46,112,57,77,74,71,71,93,15,68,61,67,122,55,104,51,78,69,150,4,41,165,125,80,148,60,90,40,99,55,72,72,66,60,27,73,32,109,1,229,12,254,182,30, +76,34,103,131,1,112,107,2,0,107,1,254,96,82,54,66,13,13,67,73,89,113,54,63,76,41,39,52,41,51,43,85,37,45,88,36,40,83,57,47,251,109,115,116,49,62,78,37,37,60,56,53,51,18,16,1,97,118,127,14,17,106,0,3, +255,185,255,244,4,247,5,118,0,3,0,18,0,49,0,0,83,39,1,23,5,21,35,53,33,53,1,23,3,51,55,51,21,51,21,1,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,34,6,7,35,17,33,7,33,21,54,54,51, +50,22,80,63,4,46,61,253,51,145,254,155,1,15,123,229,191,13,133,111,2,217,165,124,81,147,60,89,41,98,56,71,72,65,61,27,73,32,109,1,229,12,254,183,29,76,35,102,131,1,112,107,2,0,107,32,112,112,96,1,198,51,254,132, +171,171,119,253,139,115,116,49,62,78,37,37,60,56,53,51,18,16,1,97,118,127,14,17,106,0,0,4,0,20,255,244,4,155,5,98,0,3,0,10,0,39,0,51,0,0,83,39,1,23,5,17,7,39,37,51,17,5,38,38,35,34,6,7, +54,54,51,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,51,50,22,23,3,34,7,30,2,51,50,54,53,52,38,82,62,4,46,60,252,158,192,70,1,33,113,2,122,34,74,46,92,93,4,44,105,74,62,110,69,79,131,79,106,141, +72,73,148,112,56,117,51,218,97,94,12,38,66,55,69,73,66,1,112,107,2,0,107,144,1,222,105,100,169,253,126,233,17,16,96,101,39,45,42,89,71,71,105,57,89,153,95,89,150,90,27,30,254,241,82,34,63,41,64,48,56,52,0,4, +0,13,255,244,4,163,5,98,0,3,0,34,0,63,0,75,0,0,83,39,1,23,37,20,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,34,6,7,35,17,33,7,33,21,54,54,51,50,22,1,38,38,35,34,6,7,54,54,51,50, +22,22,21,20,6,6,35,34,38,38,53,52,54,54,51,50,22,23,3,34,7,30,2,51,50,54,53,52,38,87,63,4,46,61,253,203,165,124,81,147,60,89,41,98,56,71,72,65,61,27,73,32,109,1,229,12,254,183,29,76,35,102,131,1, +220,34,73,47,91,94,4,45,105,74,62,109,69,78,131,80,105,142,71,72,149,111,56,118,50,217,97,95,12,38,67,54,69,73,66,1,112,107,2,0,107,74,114,116,49,61,79,37,37,60,55,54,51,18,16,1,97,118,127,14,17,106,253,213, +17,16,96,101,39,45,42,89,71,71,105,57,89,153,95,89,150,90,27,30,254,241,82,34,63,41,64,48,56,52,0,5,255,234,255,244,4,201,5,98,0,3,0,10,0,34,0,45,0,57,0,0,83,39,1,23,5,17,7,39,37,51,17,5, +20,6,7,22,22,21,20,6,35,34,38,53,52,54,55,38,38,53,52,54,51,50,22,3,52,38,39,6,21,20,22,51,50,54,1,20,22,23,54,54,53,52,38,35,34,6,58,63,4,46,61,252,138,192,70,1,33,113,3,43,82,59,84,91, +172,146,150,165,85,76,60,65,158,123,132,150,116,117,97,120,82,83,80,89,254,208,75,92,54,56,67,72,72,66,1,112,107,2,0,107,144,1,222,105,100,169,253,126,248,67,63,6,26,75,63,90,110,109,87,57,77,17,17,70,62,74,96,98, +254,146,43,42,16,36,66,39,44,50,1,71,32,38,17,17,36,32,25,39,37,0,0,5,255,228,255,244,4,206,5,110,0,3,0,43,0,67,0,78,0,90,0,0,83,39,1,23,1,50,22,21,20,6,7,22,22,21,20,6,35,34,38,39, +55,22,22,51,50,54,53,52,38,35,35,55,51,50,54,53,52,35,34,6,7,39,54,54,1,20,6,7,22,22,21,20,6,35,34,38,53,52,54,55,38,38,53,52,54,51,50,22,3,52,38,39,6,21,20,22,51,50,54,1,20,22,23,54, +54,53,52,38,35,34,6,69,63,4,46,61,252,181,122,138,64,79,86,85,161,147,80,160,62,92,47,111,57,78,73,71,71,93,16,68,60,67,122,55,103,52,77,69,149,3,213,82,60,85,91,172,146,150,166,85,77,61,64,158,122,133,150,116, +118,96,120,82,83,80,89,254,208,75,92,54,56,67,73,71,66,1,112,107,2,0,107,1,254,96,82,54,66,13,13,67,73,89,113,54,63,76,41,39,52,41,51,43,85,37,45,88,36,40,83,57,47,252,122,67,63,6,26,75,63,90,110,109, +87,57,77,17,17,70,62,74,96,98,254,146,43,42,16,36,66,39,44,50,1,71,32,38,17,17,36,32,25,39,37,0,0,5,255,244,255,244,4,186,5,98,0,3,0,34,0,58,0,69,0,81,0,0,83,39,1,23,37,20,6,35,34,38, +39,55,22,22,51,50,54,53,52,38,35,34,6,7,35,17,33,7,33,21,54,54,51,50,22,1,20,6,7,22,22,21,20,6,35,34,38,53,52,54,55,38,38,53,52,54,51,50,22,3,52,38,39,6,21,20,22,51,50,54,1,20,22,23, +54,54,53,52,38,35,34,6,51,63,4,46,61,253,223,165,124,81,147,60,89,41,98,56,71,72,65,61,27,73,32,109,1,229,12,254,183,29,76,35,102,131,2,90,82,60,85,91,172,146,150,166,85,77,61,64,158,122,133,150,116,118,96,120, +82,83,80,89,254,208,75,92,54,56,67,73,71,66,1,112,107,2,0,107,74,114,116,49,61,79,37,37,60,55,54,51,18,16,1,97,118,127,14,17,106,253,198,67,63,6,26,75,63,90,110,109,87,57,77,17,17,70,62,74,96,98,254,146, +43,42,16,36,66,39,44,50,1,71,32,38,17,17,36,32,25,39,37,0,0,5,255,245,255,244,4,187,5,97,0,3,0,10,0,34,0,45,0,57,0,0,83,39,1,23,5,39,1,33,53,33,21,1,20,6,7,22,22,21,20,6,35,34, +38,53,52,54,55,38,38,53,52,54,51,50,22,3,52,38,39,6,21,20,22,51,50,54,1,20,22,23,54,54,53,52,38,35,34,6,51,62,4,46,60,252,238,141,1,55,254,108,2,50,2,4,82,60,85,91,172,146,150,166,85,77,61,64, +158,122,132,151,116,118,96,120,82,83,80,89,254,208,75,91,55,55,66,73,71,66,1,112,107,2,0,107,161,59,1,224,119,99,252,234,67,63,6,26,75,63,90,110,109,87,57,77,17,17,70,62,74,96,98,254,146,43,42,16,36,66,39,44, +50,1,71,32,38,17,17,36,32,25,39,37,0,1,1,167,255,233,3,7,1,73,0,15,0,0,101,52,54,54,51,50,22,22,21,20,6,6,35,34,38,38,1,167,46,79,50,51,80,46,46,80,51,50,79,46,154,49,79,47,47,79,49,49, +81,47,47,81,0,1,1,153,254,153,2,250,1,73,0,14,0,0,65,50,22,21,20,6,7,3,35,19,38,38,53,52,54,2,88,69,93,17,22,162,152,96,30,35,92,1,73,94,66,36,74,47,254,141,1,139,22,71,40,67,93,0,0,2, +1,181,255,233,2,249,3,254,0,11,0,24,0,0,101,52,54,51,50,22,21,20,6,35,34,38,17,52,54,54,51,50,22,21,20,6,35,34,38,1,181,93,68,70,93,93,70,68,93,42,74,45,70,93,93,70,68,93,140,65,96,96,65,68, +95,95,3,21,46,72,43,94,67,66,97,97,0,2,1,151,254,152,2,249,3,254,0,13,0,26,0,0,65,50,22,21,20,6,7,3,35,19,38,53,52,54,19,50,22,21,20,6,35,34,38,53,52,54,54,2,86,70,93,17,23,162,152,96, +66,93,68,70,93,93,70,68,93,42,74,1,75,95,65,37,74,48,254,140,1,141,46,87,67,94,2,179,94,67,66,97,97,66,46,72,43,0,0,3,0,64,255,234,4,112,0,248,0,11,0,23,0,35,0,0,119,52,54,51,50,22,21,20, +6,35,34,38,37,52,54,51,50,22,21,20,6,35,34,38,37,52,54,51,50,22,21,20,6,35,34,38,64,77,57,59,77,77,59,57,77,1,144,79,57,57,77,77,57,57,79,1,146,77,57,59,77,77,59,57,77,114,56,78,78,56,57,79, +79,57,56,78,78,56,57,79,79,57,56,78,78,56,57,79,79,0,0,2,1,209,255,233,2,221,5,97,0,3,0,15,0,0,65,3,35,3,19,50,22,21,20,6,35,34,38,53,52,54,2,177,17,151,20,97,58,77,77,58,57,76,76,5, +97,252,101,3,155,251,148,78,55,56,79,79,56,55,78,0,0,2,1,209,254,117,2,221,3,229,0,3,0,15,0,0,65,19,35,19,19,50,22,21,20,6,35,34,38,53,52,54,2,158,26,195,24,73,56,79,79,56,57,76,76,2,9,252, +108,3,148,1,220,78,56,55,79,79,55,56,78,0,0,2,0,179,255,233,3,225,5,119,0,28,0,40,0,0,65,50,22,22,21,20,14,3,21,21,35,53,52,62,3,53,52,38,35,34,6,7,39,54,54,19,50,22,21,20,6,35,34,38, +53,52,54,2,87,123,177,94,72,107,108,73,169,71,106,106,72,136,101,71,150,62,120,88,211,75,58,78,78,58,56,76,76,5,119,88,141,79,96,121,83,79,106,83,69,79,97,128,90,77,90,66,85,93,69,77,88,103,95,251,126,78,55,56, +79,79,56,55,78,0,0,2,0,210,254,84,4,0,3,229,0,11,0,40,0,0,65,50,22,21,20,6,35,34,38,53,52,54,19,21,20,14,3,21,20,22,51,50,54,55,23,6,6,35,34,38,38,53,52,62,3,53,53,2,135,57,79,79, +57,56,76,76,148,71,106,106,71,135,101,71,150,62,120,87,212,121,122,177,95,73,107,108,72,3,229,78,56,55,79,79,55,56,78,254,36,83,97,127,91,76,90,66,86,92,69,76,88,102,96,89,141,79,96,120,84,80,106,84,70,0,255,255, +1,167,1,250,3,7,3,90,6,7,3,224,0,0,2,18,0,1,1,101,1,185,3,75,3,157,0,15,0,0,65,34,38,38,53,52,54,54,51,50,22,22,21,20,6,6,2,88,69,110,64,64,110,69,70,110,63,63,110,1,185,63,111,69, +70,109,62,63,110,70,69,110,62,0,0,1,0,97,0,197,4,79,4,133,0,14,0,0,65,19,37,7,5,3,23,19,19,55,3,37,39,5,19,2,3,13,254,132,51,1,131,247,134,229,229,134,247,1,131,51,254,132,13,4,133,254,107,135, +158,114,254,192,98,1,78,254,178,98,1,64,114,158,135,1,149,0,255,255,1,96,253,168,3,80,7,8,4,39,6,51,255,83,0,0,0,7,6,51,0,173,0,0,0,2,0,106,0,0,4,70,5,97,0,27,0,31,0,0,65,3,51,21, +35,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,51,21,1,33,19,33,3,149,59,162,181,42,144,45,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,160,253,98,1,35,61,254,219,3,144, +254,69,130,254,173,1,83,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,0,1,0,105,255,50,4,71,6,83,0,3,0,0,87,39,1,23,241,136,3,88,134,206,60,6,229,66,0,1,0,105,255,50,4,71, +6,83,0,3,0,0,83,55,1,7,105,134,3,88,136,6,17,66,249,27,60,0,0,1,0,188,254,94,3,225,4,29,0,6,0,0,65,39,1,33,53,33,21,1,227,152,1,231,253,138,3,37,254,94,51,4,252,144,133,0,0,2,1,211, +0,0,2,223,5,119,0,3,0,15,0,0,65,19,35,19,19,50,22,21,20,6,35,34,38,53,52,54,2,160,26,194,24,72,56,79,79,56,56,77,77,3,148,252,108,3,148,1,227,78,56,55,78,78,55,56,78,0,0,2,0,210,255,230, +4,0,5,119,0,11,0,40,0,0,65,50,22,21,20,6,35,34,38,53,52,54,19,21,20,14,3,21,20,22,51,50,54,55,23,6,6,35,34,38,38,53,52,62,3,53,53,2,135,57,79,79,57,56,76,76,148,71,106,106,71,135,101,71, +151,62,119,87,212,121,122,177,95,73,107,108,72,5,119,78,56,55,78,78,55,56,78,254,35,82,97,128,90,77,90,65,86,93,69,77,88,103,95,88,141,79,96,120,84,80,106,84,70,0,255,255,1,181,0,93,2,249,4,114,6,6,3,226, +0,116,255,255,0,97,0,117,4,79,4,53,6,6,3,235,0,176,0,1,0,146,255,63,4,30,6,70,0,3,0,0,83,55,1,7,146,66,3,74,68,6,37,33,249,22,29,0,0,1,0,105,255,50,4,71,6,83,0,3,0,0,83,55, +1,7,105,134,3,88,136,6,17,66,249,27,60,0,0,2,1,181,0,137,2,249,4,158,0,11,0,24,0,0,65,52,54,51,50,22,21,20,6,35,34,38,17,52,54,54,51,50,22,21,20,6,35,34,38,1,181,93,68,70,93,93,70,68, +93,42,74,45,70,93,93,70,68,93,1,44,65,96,96,65,68,95,95,3,21,46,72,43,94,67,66,97,97,0,255,255,1,185,253,170,2,229,1,210,6,7,4,59,0,0,254,126,255,255,1,201,253,170,2,245,1,210,6,7,4,60,0,0, +254,126,0,1,0,249,254,232,3,85,6,144,0,19,0,0,65,20,30,2,23,7,38,2,2,53,52,18,18,55,23,14,3,1,169,54,106,161,107,88,162,231,123,123,231,162,88,108,161,106,53,2,188,156,247,205,185,95,92,133,1,22,1,86, +227,228,1,86,1,22,132,92,96,185,203,247,0,1,1,91,254,232,3,183,6,144,0,19,0,0,65,52,46,2,39,55,22,18,18,21,20,2,2,7,39,62,3,3,7,53,106,161,108,88,163,230,123,123,230,163,88,107,161,106,54,2,188,157, +247,203,185,96,92,132,254,234,254,170,228,227,254,170,254,234,133,92,95,185,205,247,0,1,0,235,254,241,3,135,6,135,0,40,0,0,65,21,34,6,6,23,19,22,6,6,7,30,2,7,3,6,22,22,51,21,34,46,2,55,19,54,38,38, +35,53,50,54,54,39,3,38,62,2,3,135,73,119,65,5,42,9,38,89,69,70,90,36,9,42,5,64,120,73,84,154,118,60,10,40,8,41,135,134,134,135,41,8,40,10,60,117,155,6,135,132,29,70,61,254,102,84,110,62,13,12,59,109, +89,254,102,62,70,28,132,29,70,121,92,1,124,69,94,49,134,48,94,68,1,126,92,121,70,29,0,1,1,41,254,241,3,197,6,135,0,40,0,0,65,50,30,2,7,3,6,22,22,51,21,34,6,6,23,19,22,14,2,35,53,50,54,54, +39,3,38,54,54,55,46,2,55,19,54,38,38,35,1,41,84,154,118,61,11,40,8,51,136,123,122,137,51,8,40,10,60,117,155,84,73,119,66,6,42,9,38,99,81,78,99,40,8,42,6,66,118,74,6,135,29,70,121,92,254,130,68,94, +48,134,49,94,69,254,132,92,121,70,29,132,28,70,62,1,154,89,109,58,11,13,64,110,84,1,154,61,70,29,0,1,1,112,255,25,3,101,6,95,0,7,0,0,69,17,33,21,33,17,33,21,1,112,1,245,254,170,1,86,231,7,70,145, +249,218,143,0,0,1,1,75,255,25,3,64,6,95,0,7,0,0,65,17,33,53,33,17,33,53,3,64,254,11,1,86,254,170,6,95,248,186,142,6,39,145,0,1,2,56,0,0,4,45,6,95,0,5,0,0,97,17,33,21,33,17,2,56, +1,245,254,170,6,95,145,250,50,0,0,1,0,131,255,25,2,120,5,206,0,5,0,0,65,17,33,53,33,17,2,120,254,11,1,86,5,206,249,75,142,6,39,0,255,255,0,200,0,0,3,232,5,97,4,71,4,12,4,176,0,0,192,0, +64,0,0,1,0,200,0,0,3,232,5,97,0,5,0,0,83,1,1,33,1,1,200,1,44,254,212,1,244,1,44,254,212,5,97,253,79,253,80,2,176,2,177,0,255,255,1,185,1,162,2,229,5,202,6,7,4,59,0,0,2,118,255,255, +1,201,1,162,2,245,5,202,6,7,4,60,0,0,2,118,255,255,0,249,254,212,3,85,6,124,6,6,4,3,0,236,255,255,1,91,254,212,3,183,6,124,6,6,4,4,0,236,255,255,0,235,254,221,3,135,6,115,6,6,4,5,0,236, +255,255,1,41,254,221,3,197,6,115,6,6,4,6,0,236,255,255,1,112,255,5,3,101,6,75,6,6,4,7,0,236,255,255,1,75,255,5,3,64,6,75,6,6,4,8,0,236,255,255,2,56,0,0,4,45,6,95,6,6,4,9,0,0, +255,255,0,131,255,25,2,120,5,206,6,6,4,10,0,0,0,1,0,199,2,41,3,233,2,187,0,3,0,0,83,53,33,21,199,3,34,2,41,146,146,0,0,1,1,32,2,41,3,144,2,187,0,3,0,0,65,53,33,21,1,32,2,112, +2,41,146,146,0,1,0,65,2,41,4,111,2,187,0,3,0,0,83,53,33,21,65,4,46,2,41,146,146,0,0,1,0,0,2,41,4,176,2,187,0,3,0,0,81,53,33,21,4,176,2,41,146,146,255,255,0,65,2,121,4,111,3,11, +6,6,4,28,0,80,0,1,0,71,2,40,4,105,2,185,0,3,0,0,83,53,33,21,71,4,34,2,40,145,145,0,255,255,0,0,2,41,4,176,2,187,6,6,4,29,0,0,255,255,0,0,2,41,4,176,2,187,6,6,4,29,0,0, +0,1,0,100,254,149,4,76,255,40,0,3,0,0,83,53,33,21,100,3,232,254,149,147,147,0,0,2,0,100,254,82,4,76,0,0,0,3,0,7,0,0,97,21,33,53,1,21,33,53,4,76,252,24,3,232,252,24,158,158,254,240,158,158, +255,255,0,199,2,121,3,233,3,11,6,6,4,26,0,80,255,255,1,32,2,121,3,144,3,11,6,6,4,27,0,80,255,255,0,65,2,121,4,111,3,11,6,6,4,28,0,80,255,255,0,0,2,121,4,176,3,11,6,6,4,29,0,80, +255,255,0,199,1,217,3,233,2,107,6,6,4,26,0,176,0,1,1,177,254,148,2,253,1,3,0,14,0,0,101,52,54,51,50,22,21,20,6,7,3,35,19,38,38,1,205,91,61,62,90,14,23,165,130,81,24,29,113,62,84,84,62,28, +56,48,254,167,1,111,18,58,0,2,0,219,254,148,3,211,1,3,0,14,0,29,0,0,119,52,54,51,50,22,21,20,6,7,3,35,19,38,38,37,52,54,51,50,22,21,20,6,7,3,35,19,38,38,247,91,61,62,90,14,23,165,130,81, +24,29,1,174,91,61,63,87,14,21,164,131,81,24,29,113,62,84,84,62,28,56,48,254,167,1,111,18,58,34,62,84,84,62,28,59,45,254,167,1,111,18,58,0,0,2,0,219,3,187,3,213,6,42,0,14,0,29,0,0,65,20,6,35, +34,38,53,52,54,55,19,51,3,22,22,5,20,6,35,34,38,53,52,54,55,19,51,3,22,22,2,9,89,63,64,86,12,23,162,133,82,25,29,1,176,91,61,62,88,12,23,165,130,81,24,29,4,77,62,84,84,62,25,59,48,1,89,254, +145,17,59,34,62,84,84,62,25,59,48,1,89,254,145,17,59,0,0,2,0,217,3,185,3,213,6,40,0,14,0,29,0,0,83,52,54,51,50,22,21,20,6,7,3,35,19,38,38,37,52,54,51,50,22,21,20,6,7,3,35,19,38,38, +245,91,61,62,90,16,24,162,130,79,23,28,1,176,91,61,63,89,14,23,164,131,81,24,29,5,149,62,85,85,62,27,55,49,254,167,1,111,18,58,33,62,85,85,62,27,55,49,254,167,1,111,18,58,0,1,1,179,3,187,2,253,6,42, +0,14,0,0,65,20,6,35,34,38,53,52,54,55,19,51,3,22,22,2,225,89,63,63,87,12,23,165,130,82,25,29,4,77,62,84,84,62,25,59,48,1,89,254,145,17,59,0,0,1,1,177,3,187,2,253,6,42,0,14,0,0,65,52, +54,51,50,22,21,20,6,7,3,35,19,38,38,1,205,92,60,63,89,14,23,165,130,82,25,29,5,152,61,85,85,61,29,54,49,254,167,1,111,17,59,0,0,2,0,165,0,110,4,9,4,41,0,6,0,13,0,0,101,7,1,53,1,23, +1,1,7,1,53,1,23,1,2,105,101,254,161,1,95,101,254,242,2,174,101,254,159,1,97,101,254,242,175,65,1,159,122,1,162,65,254,99,254,100,65,1,159,122,1,162,65,254,99,0,0,2,0,165,0,110,4,9,4,41,0,6,0,13, +0,0,65,1,55,1,21,1,39,3,1,55,1,21,1,39,3,81,254,242,101,1,97,254,159,101,144,254,242,101,1,95,254,161,101,2,75,1,157,65,254,94,122,254,97,65,1,156,1,157,65,254,94,122,254,97,65,0,0,1,1,121,0,110, +3,55,4,41,0,6,0,0,101,7,1,53,1,23,1,3,55,100,254,166,1,90,100,254,245,173,63,1,159,122,1,162,63,254,97,0,0,1,1,121,0,110,3,55,4,41,0,6,0,0,65,1,55,1,21,1,39,2,132,254,245,100,1,90, +254,166,100,2,75,1,159,63,254,94,122,254,97,63,0,2,1,71,3,189,3,105,5,197,0,3,0,7,0,0,65,3,51,3,51,3,51,3,1,103,32,211,31,186,30,210,32,3,189,2,8,253,248,2,8,253,248,0,0,1,1,239,3,189, +2,193,5,197,0,3,0,0,65,3,51,3,2,14,31,210,31,3,189,2,8,253,248,0,255,255,0,165,0,200,4,9,4,131,6,6,4,49,0,90,255,255,0,165,0,200,4,9,4,131,6,6,4,50,0,90,255,255,1,121,0,200,3,55, +4,131,6,6,4,51,0,90,255,255,1,121,0,200,3,55,4,131,6,6,4,52,0,90,0,1,1,185,255,44,2,229,3,84,0,17,0,0,65,20,22,22,23,7,46,2,53,52,54,54,55,23,14,2,2,73,32,69,55,92,61,94,53,53, +94,61,92,55,69,32,1,63,105,151,137,84,54,79,151,179,122,123,180,151,79,54,84,137,151,0,0,1,1,201,255,44,2,245,3,84,0,17,0,0,65,52,38,38,39,55,30,2,21,20,6,6,7,39,62,2,2,101,32,69,55,92,62,93, +53,53,93,62,92,55,69,32,1,63,107,151,137,84,54,79,151,180,123,122,179,151,79,54,84,137,151,0,0,2,252,176,2,41,3,80,2,187,0,3,0,7,0,0,83,53,33,21,33,53,33,21,87,2,249,249,96,2,249,2,41,146,146,146, +146,0,0,3,248,2,2,41,3,78,2,187,0,3,0,7,0,11,0,0,65,53,33,21,51,53,33,21,51,53,33,21,248,2,3,93,154,3,94,154,3,93,2,41,146,146,146,146,146,146,0,1,252,73,1,200,3,185,3,33,0,30,0,0, +65,23,14,2,35,34,46,2,35,34,14,2,35,33,53,33,62,3,51,50,30,2,51,50,54,3,65,120,29,84,122,89,70,103,83,81,47,47,64,57,74,56,252,126,3,99,59,75,62,77,62,75,105,82,76,46,62,98,3,3,62,57,117,79, +60,80,60,31,41,31,146,1,31,40,30,60,80,60,98,0,0,2,252,89,254,237,2,73,6,139,0,41,0,45,0,0,65,33,21,33,34,6,21,19,22,6,7,30,2,21,17,20,22,51,33,21,33,34,38,38,53,17,52,46,2,35,53,50, +62,2,53,19,62,2,33,17,35,17,254,245,2,41,253,215,109,101,1,1,85,103,70,82,35,100,109,2,41,253,215,112,164,88,20,61,122,101,101,121,62,20,2,1,87,162,3,196,151,6,139,130,64,92,254,92,125,125,19,12,59,109,89,254, +96,93,66,131,53,136,123,1,128,51,79,54,28,134,28,52,79,51,1,141,124,130,47,248,98,7,158,0,0,2,253,136,255,25,2,72,6,95,0,7,0,11,0,0,69,17,33,21,33,17,33,21,1,17,35,17,253,136,3,147,253,12,2,244, +1,45,150,231,7,70,145,249,218,143,7,70,248,186,7,70,0,3,252,155,255,25,3,206,6,95,0,27,0,31,0,39,0,0,65,3,51,21,35,3,35,19,33,3,35,19,33,53,33,19,33,53,33,19,51,3,33,19,51,3,51,21,1,33, +19,33,1,17,33,53,33,17,33,53,3,29,59,162,181,42,144,45,254,221,44,144,45,253,167,2,106,61,253,89,2,184,44,144,48,1,38,44,144,47,160,253,98,1,35,61,254,219,253,37,254,11,1,86,254,170,3,144,254,69,130,254,173,1, +83,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,2,207,248,186,142,6,39,145,0,2,252,185,1,132,3,183,3,104,0,3,0,19,0,0,67,53,33,21,5,34,38,38,53,52,54,54,51,50,22,22,21,20, +6,6,73,4,0,249,245,70,109,64,64,109,70,70,110,63,63,110,2,41,146,146,165,63,111,69,70,109,62,63,110,70,69,110,62,0,255,255,253,231,255,233,2,23,1,73,4,39,3,224,252,64,0,0,0,7,3,224,255,16,0,0,255,255, +249,217,255,233,1,121,1,73,4,39,3,224,251,82,0,0,0,39,3,224,254,114,0,0,0,7,3,224,248,50,0,0,0,4,249,15,255,233,3,21,3,116,0,3,0,7,0,23,0,39,0,0,65,21,33,53,1,21,33,53,1,52,54,54, +51,50,22,22,21,20,6,6,35,34,38,38,37,52,54,54,51,50,22,22,21,20,6,6,35,34,38,38,3,21,252,169,3,87,252,169,249,81,46,79,50,51,80,46,46,80,51,50,79,46,3,132,46,79,50,51,80,46,46,80,51,50,79,46, +3,116,145,145,254,133,146,146,254,161,49,79,47,47,79,49,49,81,47,47,81,49,49,79,47,47,79,49,49,81,47,47,81,0,255,255,249,195,255,233,2,114,4,164,4,39,4,196,254,112,0,0,0,7,4,68,251,220,0,0,0,3,253,75, +255,233,2,181,5,119,0,11,0,40,0,52,0,0,101,50,22,21,20,6,35,34,38,53,52,54,1,50,22,22,21,20,14,3,21,21,35,53,52,62,3,53,52,38,35,34,6,7,39,54,54,19,50,22,21,20,6,35,34,38,53,52,54,253, +208,58,77,77,58,56,77,77,3,147,123,177,94,72,107,108,73,169,71,106,106,72,136,101,71,150,62,120,88,211,75,58,78,78,58,56,76,76,245,78,55,56,79,79,56,55,78,4,130,88,141,79,96,121,83,79,106,83,69,79,97,128,90,77, +90,66,85,93,69,77,88,103,95,251,126,78,55,56,79,79,56,55,78,0,0,3,252,183,1,103,3,221,3,116,0,3,0,7,0,23,0,0,65,21,33,53,1,21,33,53,5,34,38,38,53,52,54,54,51,50,22,22,21,20,6,6,3,221, +251,173,4,83,251,173,254,32,70,109,64,64,109,70,70,110,63,63,110,3,116,145,145,254,133,146,146,121,63,111,69,70,109,63,64,110,70,69,110,62,255,255,253,205,255,233,2,49,3,254,4,39,3,226,255,56,0,0,0,7,3,226,252,24, +0,0,255,255,249,69,255,233,2,9,3,254,4,39,3,226,247,144,0,0,0,39,3,226,251,80,0,0,0,7,3,226,255,16,0,0,0,6,248,71,0,79,3,112,4,100,0,3,0,7,0,19,0,32,0,44,0,57,0,0,65,21,33,53, +1,21,33,53,1,52,54,51,50,22,21,20,6,35,34,38,17,52,54,54,51,50,22,21,20,6,35,34,38,1,52,54,51,50,22,21,20,6,35,34,38,17,52,54,54,51,50,22,21,20,6,35,34,38,3,112,250,228,5,28,250,228,253,19, +93,68,70,93,93,70,68,93,42,74,45,70,93,93,70,68,93,252,224,93,68,70,93,93,70,68,93,42,74,45,70,93,93,70,68,93,3,116,145,145,254,133,146,146,254,250,65,95,95,65,69,95,95,3,22,45,73,42,93,67,67,96,96,253, +114,65,95,95,65,69,95,95,3,22,45,73,42,93,67,67,96,96,0,4,253,0,0,213,3,221,4,5,0,3,0,7,0,19,0,33,0,0,65,21,33,53,1,21,33,53,5,52,54,51,50,22,21,20,6,35,34,38,17,52,54,54,51,50, +22,22,21,20,6,35,34,38,3,221,251,173,4,83,251,173,253,118,92,69,70,92,92,70,69,92,42,73,46,47,73,42,92,70,69,92,3,116,145,145,254,133,146,146,129,65,96,96,65,68,95,95,2,48,45,73,43,43,73,45,67,96,96,0, +255,255,253,175,254,152,2,49,3,254,4,39,3,227,252,24,0,0,0,7,3,227,255,56,0,0,255,255,254,17,255,233,1,237,5,97,4,39,3,229,252,64,0,0,0,7,3,229,255,16,0,0,0,5,248,213,255,233,2,123,5,97,0,11, +0,15,0,27,0,31,0,43,0,0,101,50,22,21,20,6,35,34,38,53,52,54,1,3,35,3,19,50,22,21,20,6,35,34,38,53,52,54,1,3,35,3,19,50,22,21,20,6,35,34,38,53,52,54,1,244,58,77,77,58,56,77,77,247, +249,17,151,20,97,58,77,77,58,57,76,76,4,224,17,151,20,97,58,77,77,58,57,76,76,245,78,55,56,79,79,56,55,78,4,108,252,101,3,155,251,148,78,55,56,79,79,56,55,78,4,108,252,101,3,155,251,148,78,55,56,79,79,56, +55,78,0,3,252,35,255,77,3,221,5,162,0,3,0,7,0,11,0,0,69,39,1,23,1,21,33,53,1,21,33,53,254,117,134,3,160,130,1,204,248,70,7,186,248,70,179,67,6,18,65,254,19,145,145,254,133,146,146,0,0,4,247,115, +255,77,3,221,5,162,0,3,0,7,0,11,0,15,0,0,69,39,1,23,1,21,33,53,1,21,33,53,1,21,33,53,252,29,134,3,160,130,4,36,243,150,12,106,243,150,12,106,243,150,179,67,6,18,65,254,211,145,145,253,9,146,146,1, +123,145,145,0,0,3,253,97,255,233,2,125,5,119,0,11,0,40,0,52,0,0,101,50,22,21,20,6,35,34,38,53,52,54,1,50,22,22,21,20,14,3,21,21,35,53,52,62,3,53,52,38,35,34,6,7,39,54,54,19,50,22,21,20, +6,35,34,38,53,52,54,1,246,58,77,77,58,56,77,77,253,71,123,177,94,72,107,108,73,169,71,106,106,72,136,101,71,150,62,120,88,211,75,58,78,78,58,56,76,76,245,78,55,56,79,79,56,55,78,4,130,88,141,79,96,121,83,79, +106,83,69,79,97,128,90,77,90,66,85,93,69,77,88,103,95,251,126,78,55,56,79,79,56,55,78,0,0,4,252,203,255,233,3,25,5,119,0,31,0,43,0,72,0,84,0,0,65,50,22,22,21,20,14,4,21,21,35,53,52,62,3,53, +52,38,35,34,14,2,7,55,54,54,19,50,22,21,20,6,35,34,38,53,52,54,1,50,22,22,21,20,14,3,21,21,35,53,52,62,3,53,52,38,35,34,6,7,39,54,54,19,50,22,21,20,6,35,34,38,53,52,54,1,143,123,177,94, +52,82,92,81,53,169,71,106,106,72,136,101,25,83,108,127,70,10,88,211,75,58,78,78,58,56,76,76,253,70,123,177,94,72,107,108,73,169,71,106,106,72,136,101,71,150,62,120,88,211,75,58,78,78,58,56,76,76,5,119,88,141,79,80, +107,76,63,71,98,73,69,79,97,126,88,77,92,68,85,93,15,57,121,106,241,103,95,251,126,78,55,56,79,79,56,55,78,4,130,88,141,79,96,121,83,79,106,83,69,79,97,128,90,77,90,66,85,93,69,77,88,103,95,251,126,78,55,56, +79,79,56,55,78,0,0,4,252,103,255,233,3,121,5,119,0,3,0,7,0,36,0,48,0,0,65,21,33,55,1,21,33,53,3,50,22,22,21,20,14,3,21,21,35,53,52,62,3,53,52,38,35,34,6,7,39,54,54,19,50,22,21,20, +6,35,34,38,53,52,54,3,121,251,217,177,3,118,251,88,198,123,177,94,72,107,108,73,169,71,106,106,72,136,101,71,150,62,120,88,211,75,58,78,78,58,56,76,76,3,116,145,145,254,133,146,146,3,126,88,141,79,96,121,83,79,106,83, +69,79,97,128,90,77,90,66,85,93,69,77,88,103,95,251,126,78,55,56,79,79,56,55,78,0,255,255,251,227,0,197,4,29,4,133,4,39,3,235,251,130,0,0,0,6,3,235,206,0,255,255,247,201,0,197,3,135,5,177,4,39,3,235, +251,80,1,44,0,39,3,235,247,104,0,0,0,7,3,235,255,56,0,0,0,2,251,168,0,9,3,158,4,238,0,6,0,21,0,0,83,1,21,1,53,1,1,37,51,3,37,23,5,1,7,1,1,39,1,37,55,5,76,3,82,252,174,2, +194,253,62,253,105,178,20,1,234,51,254,17,1,75,147,254,218,254,246,151,1,49,254,5,60,1,232,4,214,253,243,172,253,236,181,1,180,1,179,201,253,249,176,170,138,254,116,114,1,177,254,91,104,1,138,138,169,178,255,255,251,249,255,50, +3,161,6,83,4,39,3,235,251,152,0,48,0,7,3,238,255,90,0,0,0,3,252,50,254,232,3,85,6,144,0,27,0,31,0,51,0,0,67,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3, +33,21,1,33,19,33,5,20,30,2,23,7,38,2,2,53,52,18,18,55,23,14,3,163,59,2,145,253,92,42,144,45,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,2,69,251,189,1,35,61,254,219,3,254,54,106,161, +107,88,162,231,123,123,231,162,88,108,161,106,53,3,144,254,69,130,254,173,1,83,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,212,156,247,205,185,95,92,133,1,22,1,86,227,228,1,86,1,22,132,92,96, +185,203,247,0,0,3,252,50,254,241,3,135,6,135,0,27,0,31,0,72,0,0,67,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,33,21,1,33,19,33,1,21,34,6,6,23,19,22,6,6, +7,30,2,7,3,6,22,22,51,21,34,46,2,55,19,54,38,38,35,53,50,54,54,39,3,38,62,2,163,59,3,49,252,188,42,144,45,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,2,229,251,29,1,35,61,254,219, +5,220,73,119,65,5,42,9,38,89,69,70,90,36,9,42,5,64,120,73,84,154,118,60,10,40,8,41,135,134,134,135,41,8,40,10,60,117,155,3,144,254,69,130,254,173,1,83,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178, +131,254,69,1,187,2,247,132,29,70,61,254,102,84,110,62,13,12,59,109,89,254,102,62,70,28,132,29,70,121,92,1,124,69,94,49,134,48,94,68,1,126,92,121,70,29,0,3,252,50,255,25,3,101,6,95,0,27,0,31,0,39,0,0, +67,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,33,21,1,33,19,33,1,17,33,21,33,17,33,21,163,59,2,145,253,92,42,144,45,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38, +44,144,47,2,69,251,189,1,35,61,254,219,3,197,1,245,254,170,1,86,3,144,254,69,130,254,173,1,83,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,251,137,7,70,145,249,218,143,0,4,252,130,0,0, +3,85,5,97,0,3,0,7,0,35,0,39,0,0,65,33,3,33,7,33,3,33,1,3,51,21,35,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,51,21,1,33,19,33,2,79,1,6,46,254,250,34,1,6, +46,254,250,253,220,59,162,181,42,144,45,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,160,253,98,1,35,61,254,219,4,73,254,192,248,254,192,2,191,254,69,130,254,173,1,83,254,173,1,83,130,1,187,131,1,78,254, +178,1,78,254,178,131,254,69,1,187,0,4,252,130,0,0,2,212,5,97,0,3,0,7,0,35,0,39,0,0,65,35,19,51,3,35,19,51,1,3,51,21,35,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3, +51,21,1,33,19,33,2,92,183,120,183,164,223,38,223,253,87,59,162,181,42,144,45,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,160,253,98,1,35,61,254,219,1,215,3,138,250,159,1,1,2,143,254,69,130,254,173, +1,83,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,0,0,4,252,50,255,233,3,225,5,119,0,27,0,31,0,65,0,77,0,0,67,3,51,21,35,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19, +51,3,33,19,51,3,51,23,1,33,19,33,1,50,22,22,21,20,14,4,21,21,35,53,52,62,3,53,52,38,35,34,14,2,7,39,62,3,19,50,22,21,20,6,35,34,38,53,52,54,163,59,162,181,42,144,45,254,221,44,144,45,158,175, +61,162,179,44,144,48,1,38,44,144,47,251,106,252,157,1,35,61,254,219,4,172,123,177,94,52,82,92,81,53,169,71,106,106,72,136,101,35,105,112,94,25,106,32,115,142,145,14,58,78,78,58,56,76,76,3,144,254,69,130,254,173,1,83, +254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,1,231,88,141,79,80,107,76,63,71,98,73,69,79,97,126,88,77,92,68,85,93,27,72,138,110,131,104,137,82,33,251,126,78,55,56,79,79,56,55,78,0,4, +251,189,0,0,3,201,5,97,0,27,0,31,0,35,0,39,0,0,65,3,51,21,35,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,51,21,1,33,19,33,37,21,33,53,1,21,33,53,254,209,35,162,181,46, +144,48,254,222,48,144,49,159,176,36,162,179,65,144,68,1,37,65,144,68,160,253,123,1,35,36,254,220,6,170,252,101,3,105,252,102,3,2,254,247,129,254,136,1,120,254,136,1,120,129,1,9,131,1,220,254,36,1,220,254,36,131,254,247, +1,9,110,130,130,254,157,129,129,0,0,2,252,50,254,149,4,76,5,97,0,29,0,33,0,0,69,33,21,33,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,51,21,35,3,51,21,35,37,33,19,33,254,201,5,131, +249,219,91,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,160,177,59,162,181,254,97,1,35,61,254,219,216,147,2,190,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,130,130,1,187,0,3,247,130, +254,149,3,169,6,144,0,29,0,33,0,54,0,0,69,33,23,33,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,51,21,35,3,51,21,35,37,33,19,33,5,6,18,22,22,23,7,46,2,2,39,38,18,18,55,23, +14,3,250,25,9,4,62,246,28,91,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,160,177,59,162,181,254,97,1,35,61,254,219,8,174,4,75,142,190,109,75,124,220,169,99,1,2,123,233,162,88,108,157,103,55,216,147, +2,190,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,130,130,1,187,212,166,254,232,238,204,91,84,90,210,255,1,57,195,228,1,86,1,22,132,92,96,185,203,247,255,255,252,89,255,50,3,217,6,83,4,39,3,238, +251,240,0,0,0,6,3,235,138,48,0,2,252,129,255,50,4,2,6,83,0,6,0,10,0,0,67,1,21,1,39,9,2,39,1,23,43,4,45,253,9,91,2,194,252,18,253,133,136,3,88,134,5,94,253,107,172,254,37,124,1,180,2,109, +250,83,60,6,229,66,255,255,252,29,255,50,3,227,6,83,4,39,3,238,251,180,0,0,0,6,3,238,156,0,255,255,247,209,255,50,3,127,6,83,4,39,3,238,255,56,0,0,0,39,3,238,247,104,0,0,0,7,3,238,251,80,0,0, +0,1,252,245,0,0,3,11,5,97,0,6,0,0,83,1,35,1,1,35,1,111,2,156,182,253,171,253,170,181,2,156,5,97,250,159,4,200,251,56,5,97,255,255,252,245,0,0,3,11,5,97,4,71,4,103,0,0,5,97,64,0,192,0, +255,255,1,185,2,16,2,229,6,56,6,7,4,59,0,0,2,228,255,255,1,201,2,15,2,245,6,56,6,7,4,60,0,0,2,227,0,1,255,236,2,40,4,196,2,188,0,3,0,0,67,53,33,21,20,4,216,2,40,148,148,0,0,1, +0,249,2,40,4,196,2,188,0,3,0,0,83,53,33,21,249,3,203,2,40,148,148,0,255,255,255,236,2,40,3,183,2,188,4,71,4,108,4,176,0,0,192,0,64,0,0,6,255,236,0,213,4,196,4,5,0,11,0,25,0,29,0,33, +0,37,0,41,0,0,65,52,54,51,50,22,21,20,6,35,34,38,17,52,54,54,51,50,22,22,21,20,6,35,34,38,5,53,51,21,3,53,51,21,1,53,51,21,3,53,51,21,1,183,92,69,70,92,92,70,69,92,42,73,46,46,74,42, +92,70,69,92,254,53,179,179,179,3,114,179,179,179,1,120,65,96,96,65,68,95,95,2,48,45,73,43,43,73,45,67,96,96,58,146,146,254,132,146,146,1,124,146,146,254,132,146,146,0,0,6,255,236,255,233,4,196,5,97,0,3,0,7, +0,11,0,15,0,19,0,31,0,0,67,53,51,21,3,53,51,21,1,53,51,21,3,53,51,21,1,3,35,3,19,50,22,21,20,6,35,34,38,53,52,54,20,171,171,171,3,130,171,171,171,253,237,17,151,20,97,58,77,77,58,57,76,76, +2,231,146,146,254,132,146,146,1,124,146,146,254,132,146,146,3,246,252,101,3,155,251,148,78,55,56,79,79,56,55,78,0,2,255,236,0,0,4,70,5,97,0,27,0,31,0,0,65,3,51,21,35,3,35,19,33,3,35,19,33,53,33,19, +33,53,33,19,51,3,33,19,51,3,51,21,1,33,19,33,3,149,59,162,181,42,144,45,254,221,44,144,45,254,228,1,45,61,254,150,1,123,44,144,48,1,38,44,144,47,160,253,98,1,35,61,254,219,3,144,254,69,130,254,173,1,83,254, +173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,0,2,255,236,0,0,4,196,5,97,0,27,0,31,0,0,65,3,33,21,33,3,35,19,33,3,35,19,33,53,33,19,33,53,33,19,51,3,33,19,51,3,33,21, +1,33,19,33,3,149,59,1,106,254,131,42,144,45,254,221,44,144,45,254,228,1,45,61,254,150,1,123,44,144,48,1,38,44,144,47,1,30,252,228,1,35,61,254,219,3,144,254,69,130,254,173,1,83,254,173,1,83,130,1,187,131,1,78, +254,178,1,78,254,178,131,254,69,1,187,0,0,2,0,106,0,0,4,196,5,97,0,27,0,31,0,0,65,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,51,19,51,3,33,19,51,3,33,21,1,33,19,33,3,149,59,1, +106,254,131,42,144,45,254,221,44,144,45,158,175,61,162,179,44,144,48,1,38,44,144,47,1,30,252,228,1,35,61,254,219,3,144,254,69,130,254,173,1,83,254,173,1,83,130,1,187,131,1,78,254,178,1,78,254,178,131,254,69,1,187,0, +0,3,255,236,255,77,4,105,5,162,0,3,0,7,0,11,0,0,67,53,33,21,1,53,33,21,1,39,1,23,20,2,211,253,45,1,244,254,237,134,3,160,130,2,231,146,146,254,132,146,146,253,226,67,6,18,65,0,0,3,255,236,255,77, +4,196,5,162,0,3,0,7,0,11,0,0,67,53,33,21,1,53,33,21,1,39,1,23,20,4,216,251,40,4,216,252,9,134,3,160,130,2,231,146,146,254,132,146,146,253,226,67,6,18,65,0,0,3,0,71,255,77,4,196,5,162,0,3, +0,7,0,11,0,0,65,53,33,21,1,53,33,21,1,39,1,23,2,199,1,253,253,29,2,227,252,9,134,3,160,130,2,231,146,146,254,132,146,146,253,226,67,6,18,65,0,4,251,60,255,77,3,122,5,162,0,3,0,7,0,11,0,15, +0,0,65,53,33,21,1,53,33,21,1,39,1,23,3,39,1,23,251,60,3,194,252,62,2,227,254,236,134,3,160,130,201,134,3,160,130,2,231,146,146,254,132,146,146,253,226,67,6,18,65,249,236,67,6,18,65,0,0,6,251,60,255,77, +4,196,5,162,0,3,0,7,0,11,0,15,0,19,0,23,0,0,65,53,33,21,1,53,33,21,1,53,33,21,1,53,33,21,1,39,1,23,3,39,1,23,251,60,3,194,252,62,2,227,3,186,2,235,252,46,3,210,248,71,134,3,160,130, +201,134,3,160,130,2,231,146,146,254,132,146,146,1,124,146,146,254,132,146,146,253,226,67,6,18,65,249,236,67,6,18,65,0,0,4,252,133,255,77,4,196,5,162,0,3,0,7,0,11,0,15,0,0,65,53,33,21,1,53,33,21,1,39, +1,23,1,39,1,23,1,217,2,235,252,46,3,210,251,26,134,3,160,130,249,145,134,3,160,130,2,231,146,146,254,132,146,146,253,226,67,6,18,65,249,236,67,6,18,65,0,1,255,236,254,149,4,76,255,40,0,3,0,0,67,53,33,21, +20,4,96,254,149,147,147,0,0,1,255,236,254,149,4,196,255,40,0,3,0,0,67,53,33,21,20,4,216,254,149,147,147,0,0,1,0,100,254,149,4,196,255,40,0,3,0,0,83,53,33,21,100,4,96,254,149,147,147,0,0,3,253,55, +255,2,2,201,5,237,0,3,0,31,0,59,0,0,71,39,1,23,3,34,46,2,35,34,6,6,7,39,62,2,51,50,30,2,51,50,54,54,55,23,14,2,3,34,46,2,35,34,6,6,7,39,62,2,51,50,30,2,51,50,54,54,55,23, +14,2,172,147,1,239,142,19,88,154,139,126,60,68,130,101,26,120,30,124,182,115,85,152,140,129,61,68,111,83,26,120,29,108,164,113,88,154,139,126,60,68,130,101,26,120,30,124,182,115,85,152,140,129,61,68,111,83,26,120,29,108,164,254, +30,6,205,29,251,21,68,87,67,44,77,48,58,57,117,79,67,88,67,56,87,48,55,58,129,91,1,188,67,88,67,45,77,48,58,58,116,80,67,89,67,56,88,48,55,59,129,90,0,5,252,35,255,77,3,221,5,162,0,3,0,7,0,11, +0,15,0,19,0,0,65,21,33,55,1,21,33,55,3,7,33,53,1,7,33,53,1,39,1,23,3,221,252,114,96,3,46,252,114,96,254,96,252,210,3,142,96,252,210,2,82,134,3,160,130,3,121,146,146,254,132,146,146,1,124,146,146,254, +132,146,146,253,80,67,6,18,65,0,0,7,247,115,255,77,3,221,5,162,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,0,69,39,1,23,1,21,33,53,1,21,33,53,1,21,33,53,1,21,33,53,1,21,33,53,1,21,33,53, +252,29,134,3,160,130,251,115,252,71,3,185,252,71,8,17,252,72,3,184,252,72,8,17,252,71,3,185,252,71,179,67,6,18,65,254,24,146,146,254,132,146,146,1,124,146,146,254,132,146,146,1,124,146,146,254,132,146,146,0,0,1,1,108, +254,251,3,103,6,126,0,6,0,0,69,7,1,53,1,23,1,3,103,105,254,110,1,146,105,254,184,226,35,3,132,122,3,133,36,252,99,0,255,255,1,73,254,251,3,68,6,126,4,71,4,127,4,176,0,0,192,0,64,0,255,255,1,170, +1,250,3,10,3,90,4,6,3,233,2,0,255,255,1,168,254,152,3,10,3,254,4,6,3,227,17,0,0,1,0,212,254,205,3,220,5,86,0,32,0,0,65,17,22,22,23,7,38,38,35,34,6,21,20,22,51,50,54,55,23,6,6,7, +17,35,17,38,2,53,52,54,54,55,17,2,234,64,121,57,84,66,108,57,131,148,150,129,59,109,66,81,56,122,64,150,190,194,86,173,127,5,86,254,212,7,49,46,112,49,34,204,209,211,189,39,50,119,48,48,9,254,218,1,40,24,1,27, +226,144,232,148,18,1,46,0,0,2,0,69,0,147,4,107,4,195,0,35,0,47,0,0,83,23,54,54,51,50,22,23,55,23,7,22,22,21,20,6,7,23,7,39,6,6,35,34,38,39,7,39,55,38,38,53,52,54,55,39,5,34,6,21, +20,22,51,50,54,53,52,38,177,178,51,125,71,70,124,49,178,108,174,34,40,42,34,176,108,180,49,122,70,71,125,51,178,108,178,33,39,38,32,176,2,21,126,131,131,126,126,129,129,4,195,180,32,36,33,35,178,108,176,49,127,73,75,127, +51,174,109,177,33,33,33,33,178,108,178,51,126,74,73,125,49,180,140,153,134,135,152,152,135,134,153,0,0,3,0,138,254,206,4,51,6,161,0,36,0,42,0,49,0,0,65,17,22,22,23,7,38,38,39,17,30,2,21,20,6,6,7,17, +35,17,38,38,39,55,22,22,23,17,38,38,53,52,54,54,55,17,19,17,54,53,52,38,3,6,6,21,20,22,23,2,179,120,186,62,103,58,132,75,101,175,108,86,171,127,135,142,209,67,100,63,157,98,175,191,81,163,122,135,203,89,249,82, +105,77,110,6,161,254,211,13,90,58,106,54,65,9,254,56,33,104,162,123,95,167,115,17,254,221,1,29,9,114,65,111,64,85,8,2,42,58,183,139,81,147,102,11,1,45,251,211,254,14,41,206,84,120,2,160,14,97,84,70,98,45,0,3, +0,252,254,113,3,177,5,97,0,3,0,32,0,35,0,0,83,1,51,1,1,17,52,54,51,50,22,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,35,34,6,21,17,3,33,3,252,1,22,138,1,21,253,164,139,125,135,135, +55,113,88,59,98,32,3,22,86,54,81,63,72,66,80,53,55,1,108,181,2,87,3,10,252,246,252,26,2,84,164,170,179,162,91,156,93,46,50,113,51,57,121,118,132,111,124,128,253,201,4,62,2,58,0,1,0,71,255,233,4,58,5,119, +0,39,0,0,65,50,22,23,7,38,38,35,34,6,7,33,7,33,21,33,7,33,22,22,51,50,54,55,21,6,6,35,34,2,39,35,55,51,55,35,55,51,54,36,2,250,104,149,67,85,55,113,60,130,172,29,1,235,29,254,37,1,180,28, +254,111,24,157,146,93,145,44,49,146,93,209,252,35,186,28,144,3,175,28,162,45,1,15,5,119,45,45,122,36,32,161,189,116,186,118,189,175,63,39,174,30,42,1,6,246,118,186,116,240,254,0,0,1,0,215,254,91,3,215,5,218,0,33, +0,0,65,50,22,23,7,38,38,35,34,6,21,21,33,7,35,17,20,14,2,7,39,62,2,53,17,35,53,51,53,52,54,54,2,226,74,108,63,56,50,93,41,87,73,1,3,21,238,36,73,117,82,60,69,90,43,168,168,74,144,5,218,26, +29,123,23,17,77,78,152,132,252,182,118,160,108,78,36,120,33,72,127,115,3,107,132,148,87,133,77,0,0,3,0,127,0,0,4,95,5,97,0,13,0,17,0,21,0,0,97,17,51,17,51,50,54,54,55,23,14,2,35,1,39,1,23,5, +39,1,23,1,33,174,127,98,145,111,44,131,40,135,209,151,254,102,47,2,150,50,253,108,52,2,152,50,5,97,251,55,48,113,99,53,113,161,85,1,107,106,1,54,108,27,111,1,51,108,0,4,0,127,0,0,4,101,5,97,0,11,0,15, +0,19,0,30,0,0,97,17,33,50,4,21,20,6,6,35,35,17,37,53,33,21,1,53,33,21,39,51,50,54,54,53,52,38,38,35,35,1,22,1,59,247,1,29,137,240,155,142,254,188,2,164,253,92,1,86,18,158,96,149,85,84,147,93, +164,5,97,207,217,162,196,88,254,5,238,117,117,1,13,132,132,132,54,135,123,107,126,55,0,4,0,167,0,0,4,41,5,97,0,20,0,24,0,30,0,34,0,0,83,53,51,50,54,53,52,38,38,35,35,55,51,23,30,2,21,20,6,7, +3,53,33,21,1,53,33,21,33,35,3,1,35,1,189,223,148,158,67,146,118,220,22,202,250,88,117,60,241,236,240,3,108,252,148,3,108,254,49,16,15,1,153,209,254,136,2,47,141,124,151,94,120,58,130,88,11,82,130,85,201,195,26,1, +144,117,117,1,48,114,116,253,115,253,160,2,75,0,0,1,0,149,0,0,4,27,5,119,0,34,0,0,65,50,22,23,7,38,38,35,34,6,21,21,33,21,33,21,20,6,7,33,7,33,53,62,2,53,17,35,53,51,17,52,54,54,2,181, +108,183,67,114,50,115,73,107,111,1,158,254,98,45,78,2,165,20,252,158,80,68,16,164,164,91,170,5,119,80,92,86,62,55,123,119,241,117,248,82,141,44,143,136,26,77,102,61,1,0,117,1,0,106,166,96,0,1,0,79,0,0,4,97, +5,97,0,23,0,0,65,1,51,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,51,1,51,1,51,1,4,97,254,124,239,254,228,1,28,254,228,177,254,232,1,24,254,232,233,254,127,190,1,77,8,1,77,5,97,253,82,118,171,117, +254,227,1,29,117,171,118,2,174,253,135,2,121,0,0,3,0,87,254,206,4,49,6,161,0,45,0,49,0,53,0,0,65,20,6,6,35,34,38,39,55,22,22,51,50,54,54,53,52,38,38,39,46,2,53,52,54,54,51,50,22,23,7,38, +38,35,34,6,6,21,20,22,22,23,30,2,1,17,35,17,19,17,35,19,4,49,118,224,161,151,245,87,103,72,186,125,84,146,90,52,132,118,136,199,109,114,201,131,143,211,86,102,74,170,88,75,125,75,64,152,131,107,183,112,254,140,155,155, +155,1,1,125,118,183,103,92,84,116,67,79,55,113,87,67,94,73,35,40,101,148,109,103,160,91,81,76,113,66,59,45,89,69,59,86,71,39,31,93,159,4,160,254,154,1,102,249,132,254,169,1,87,0,0,2,1,115,0,95,3,121,4,124, +0,3,0,7,0,0,65,53,33,21,1,17,35,17,1,191,1,186,254,138,144,2,36,146,146,2,88,251,227,4,29,0,255,255,0,144,1,21,4,34,4,80,4,71,4,246,0,0,5,94,64,0,192,0,255,255,1,167,1,250,3,7,3,90, +6,6,3,233,0,0,255,255,1,26,1,21,3,178,3,205,4,71,4,162,4,176,0,0,192,0,64,0,255,255,2,11,253,168,2,165,8,232,6,6,4,217,0,0,0,1,0,35,1,112,4,141,3,219,0,3,0,0,83,39,1,23,97,62, +4,46,60,1,112,107,2,0,107,0,0,4,0,159,255,99,4,89,5,143,0,3,0,7,0,11,0,15,0,0,65,23,1,39,3,53,33,21,1,17,35,17,35,17,35,17,3,243,102,254,96,103,35,2,18,254,49,144,179,144,5,143,26,249, +238,26,2,167,146,146,2,88,251,227,4,29,251,227,4,29,0,3,0,171,255,99,4,65,5,143,0,3,0,7,0,11,0,0,65,23,1,39,3,53,33,21,1,17,35,17,3,19,102,254,96,103,123,3,74,252,250,144,5,143,26,249,238,26, +2,167,146,146,2,88,251,227,4,29,0,4,0,59,0,95,4,165,4,124,0,3,0,7,0,11,0,15,0,0,65,53,33,21,1,17,35,17,35,17,35,17,1,53,33,21,1,203,2,218,253,105,144,179,144,1,144,2,218,2,227,145,145,1, +153,251,227,4,29,251,227,4,29,252,235,146,146,0,0,2,0,49,0,177,4,65,4,49,0,3,0,25,0,0,83,33,21,33,39,52,54,54,51,33,21,33,34,6,6,21,20,22,22,51,33,21,33,34,38,38,118,3,203,252,53,69,122,205, +125,2,76,253,180,84,140,83,83,140,84,2,76,253,180,125,205,122,2,178,131,66,126,203,119,131,88,145,84,84,145,88,131,119,204,0,0,2,0,254,1,21,3,150,3,205,0,3,0,23,0,0,65,33,21,33,39,52,54,54,51,33,21,33, +34,6,21,20,22,51,33,21,33,34,38,38,1,60,2,90,253,166,62,92,161,100,1,55,254,201,89,118,118,89,1,55,254,201,100,161,92,2,178,131,66,101,157,90,131,128,89,89,128,131,90,158,255,255,1,109,255,19,3,65,0,129,6,7, +6,122,0,0,254,126,255,255,1,109,3,11,3,65,4,121,6,7,6,122,0,0,2,118,0,3,0,211,0,171,3,221,4,52,0,3,0,7,0,11,0,0,65,21,33,53,1,21,33,53,1,21,33,53,3,221,252,246,3,10,252,246,3,10, +252,246,4,52,145,145,253,9,146,146,1,123,145,145,255,255,0,149,0,0,3,181,5,97,4,71,0,24,4,176,0,0,192,0,64,0,0,3,0,159,0,95,4,65,4,124,0,3,0,7,0,11,0,0,65,53,33,21,1,17,35,17,35,17, +35,17,2,47,2,18,254,49,144,179,144,2,36,146,146,2,88,251,227,4,29,251,227,4,29,0,255,255,0,41,0,0,4,135,5,97,4,71,4,211,0,0,5,97,64,0,192,0,0,1,0,155,254,88,2,154,7,208,0,16,0,0,65,17, +20,6,6,35,34,38,39,55,22,22,51,50,54,53,17,2,154,68,125,87,75,96,60,54,50,76,40,63,66,7,208,247,157,93,123,61,26,27,125,22,16,72,66,8,98,0,0,1,1,248,252,24,4,21,6,165,0,15,0,0,65,50,22,23, +7,38,38,35,34,6,21,17,35,17,52,54,3,31,75,108,63,54,51,88,43,84,59,162,159,6,165,23,29,125,22,18,81,74,246,151,9,106,148,143,0,1,2,11,254,241,3,161,8,232,0,11,0,0,65,17,20,22,51,21,34,46,2,53, +17,2,165,142,110,84,147,112,63,8,232,247,45,93,67,132,28,71,120,93,8,191,0,1,0,220,253,168,2,165,8,232,0,23,0,0,65,17,20,6,7,30,2,21,17,35,17,52,46,2,35,53,50,62,2,53,17,2,165,83,103,70,82,34, +154,21,61,121,100,101,120,61,21,8,232,250,225,126,124,19,12,59,109,89,251,249,3,253,51,79,54,28,134,28,52,79,51,5,23,0,0,1,2,11,253,168,3,162,6,135,0,11,0,0,65,21,34,6,21,17,35,17,52,62,2,3,162,110, +143,154,64,111,148,6,135,132,68,92,248,69,7,167,92,121,70,29,255,255,2,11,253,168,2,165,8,232,6,6,4,217,0,0,0,1,2,11,255,25,3,254,8,232,0,5,0,0,69,17,51,17,33,21,2,11,154,1,89,231,9,207,246,192, +143,0,0,1,2,11,253,168,3,254,6,95,0,5,0,0,65,17,33,21,33,17,2,11,1,243,254,167,253,168,8,183,145,247,218,0,255,255,1,111,255,135,3,65,0,4,6,7,6,121,0,0,254,126,255,255,1,111,3,127,3,65,3,252, +6,7,6,121,0,0,2,118,0,3,1,115,0,95,3,121,4,124,0,3,0,7,0,11,0,0,65,53,33,21,1,17,35,17,19,53,33,21,1,191,1,186,254,138,144,76,1,186,2,227,145,145,1,153,251,227,4,29,252,235,146,146,0,5, +0,59,255,99,4,165,5,143,0,3,0,7,0,11,0,15,0,19,0,0,65,23,1,39,3,53,33,21,1,17,35,17,35,17,35,17,1,53,33,21,3,212,103,254,95,103,104,2,218,253,105,144,179,144,1,144,2,218,5,143,26,249,238,26, +3,102,145,145,1,153,251,227,4,29,251,227,4,29,252,235,146,146,0,3,0,49,255,12,4,65,5,248,0,3,0,25,0,29,0,0,69,39,1,23,1,52,54,54,51,33,21,33,34,6,6,21,20,22,22,51,33,21,33,34,38,38,19,33, +21,33,1,188,147,1,239,142,252,139,122,205,125,2,76,253,180,84,140,83,83,140,84,2,76,253,180,125,205,122,62,3,209,252,47,244,31,6,205,30,252,206,126,203,119,131,89,144,84,85,144,88,131,119,204,254,86,129,0,3,0,111,255,12, +4,127,5,248,0,3,0,25,0,29,0,0,69,39,1,23,19,20,6,6,35,33,53,33,50,54,54,53,52,38,38,35,33,53,33,50,22,22,3,21,33,53,1,188,147,1,239,142,217,122,205,125,253,180,2,76,84,140,83,83,140,84,253,180, +2,76,125,205,122,62,252,47,244,31,6,205,30,252,206,125,204,119,131,88,144,85,84,145,88,131,119,203,253,91,129,129,0,3,0,71,255,77,4,127,5,162,0,3,0,7,0,29,0,0,87,39,1,23,3,21,33,53,5,20,6,6,35,33, +53,33,50,54,54,53,52,38,38,35,33,53,33,50,22,22,205,134,3,160,130,47,252,53,4,16,122,205,125,253,180,2,76,84,140,83,83,140,84,253,180,2,76,125,205,122,179,67,6,18,65,253,81,131,131,65,125,204,119,131,88,145,84,84, +145,88,131,119,203,0,0,3,0,49,255,77,4,105,5,162,0,3,0,7,0,29,0,0,87,39,1,23,1,33,21,33,39,52,54,54,51,33,21,33,34,6,6,21,20,22,22,51,33,21,33,34,38,38,205,134,3,160,130,252,13,3,203,252, +53,69,122,205,125,2,76,253,180,84,140,83,83,140,84,2,76,253,180,125,205,122,179,67,6,18,65,253,81,131,66,126,203,119,131,88,145,84,84,145,88,131,119,204,0,4,0,211,255,99,3,221,5,143,0,3,0,7,0,11,0,15,0,0, +65,23,1,39,1,21,33,53,1,21,33,53,1,21,33,53,2,245,103,254,95,103,2,137,252,246,3,10,252,246,3,10,252,246,5,143,26,249,238,26,4,183,145,145,253,9,146,146,1,123,145,145,0,2,0,49,255,77,4,105,5,162,0,3, +0,25,0,0,87,39,1,23,1,52,54,54,51,33,21,33,34,6,6,21,20,22,22,51,33,21,33,34,38,38,205,134,3,160,130,251,200,122,205,125,2,76,253,180,84,140,83,83,140,84,2,76,253,180,125,205,122,179,67,6,18,65,253,16, +126,203,119,131,88,145,84,84,145,88,131,119,204,0,0,2,0,71,255,77,4,127,5,162,0,3,0,25,0,0,87,39,1,23,19,20,6,6,35,33,53,33,50,54,54,53,52,38,38,35,33,53,33,50,22,22,205,134,3,160,130,22,122,205, +125,253,180,2,76,84,140,83,83,140,84,253,180,2,76,125,205,122,179,67,6,18,65,253,16,125,204,119,131,88,145,84,84,145,88,131,119,203,0,4,0,171,255,99,4,65,5,143,0,3,0,7,0,11,0,15,0,0,65,23,1,39,3,53, +33,21,1,17,35,17,19,53,33,21,3,12,103,254,95,103,116,3,74,252,250,144,76,3,74,5,143,26,249,238,26,3,102,145,145,1,153,251,227,4,29,252,235,146,146,0,0,1,0,131,0,155,4,45,4,67,0,11,0,0,65,17,33,21, +33,17,35,17,33,53,33,17,2,164,1,137,254,119,157,254,124,1,132,4,67,254,113,141,254,116,1,140,141,1,143,0,0,1,0,231,2,37,3,201,2,189,0,3,0,0,65,21,33,53,3,201,253,30,2,189,152,152,0,1,0,250,1,8, +3,182,3,199,0,11,0,0,65,23,7,23,7,39,7,39,55,39,55,23,3,77,105,245,245,105,245,245,105,245,245,105,245,3,199,108,245,245,105,245,245,105,245,245,108,248,0,3,0,231,0,97,3,201,4,125,0,3,0,15,0,27,0,0, +65,21,33,53,1,50,22,21,20,6,35,34,38,53,52,54,19,50,22,21,20,6,35,34,38,53,52,54,3,201,253,30,1,113,56,79,79,56,56,79,79,56,56,79,79,56,56,79,79,2,183,143,143,254,182,77,55,57,79,79,57,55,77,3, +16,77,55,57,76,76,57,55,77,0,0,2,0,211,1,103,3,221,3,116,0,3,0,7,0,0,65,21,33,53,1,21,33,53,3,221,252,246,3,10,252,246,3,116,145,145,254,133,146,146,0,3,0,211,0,57,3,221,4,164,0,4,0,8, +0,12,0,0,65,23,1,39,1,33,21,33,53,1,21,33,53,3,104,93,253,129,95,1,205,1,41,252,246,3,10,252,246,4,164,50,251,199,53,3,6,145,145,254,133,146,146,0,0,1,0,176,0,66,4,2,4,164,0,6,0,0,65,1, +21,1,39,1,1,1,1,3,1,253,9,91,2,194,253,62,4,164,254,37,172,254,37,124,1,180,1,179,0,1,0,176,0,66,4,2,4,164,0,6,0,0,65,23,1,1,7,1,53,3,177,81,253,62,2,194,90,253,8,4,164,129,254,79, +254,75,123,1,219,172,0,2,0,213,0,0,3,218,4,71,0,6,0,10,0,0,65,1,21,1,39,9,2,21,33,53,1,25,2,192,253,64,68,2,129,253,127,3,5,253,30,4,71,254,189,179,254,204,136,1,4,1,16,252,219,148,148,0, +0,2,0,211,0,0,3,217,4,71,0,6,0,10,0,0,65,23,1,5,7,1,53,1,21,33,53,3,149,68,253,127,2,129,68,253,64,2,224,253,30,4,71,138,254,236,254,142,1,52,179,253,144,148,148,0,0,2,0,231,0,0,3,201, +4,51,0,11,0,15,0,0,65,17,33,21,33,17,35,17,33,53,33,17,1,21,33,53,2,169,1,32,254,224,162,254,224,1,32,1,194,253,30,4,51,254,214,141,254,201,1,55,141,1,42,252,95,146,146,0,0,2,0,190,1,61,3,242, +3,173,0,25,0,51,0,0,65,50,30,2,51,50,54,55,23,14,2,35,34,46,2,35,34,6,7,39,62,2,19,50,30,2,51,50,54,55,23,14,2,35,34,46,2,35,34,6,7,39,62,2,1,195,60,88,70,61,31,48,62,24,115,19, +68,102,72,59,89,70,61,31,48,62,24,115,20,68,103,70,60,88,70,61,31,48,62,24,115,19,68,102,72,59,89,70,61,31,48,62,24,115,20,68,103,2,51,34,45,34,60,41,60,38,81,55,34,44,34,60,42,60,39,82,55,1,122,34, +45,35,60,42,61,38,81,55,34,44,33,59,42,61,39,81,56,0,0,1,0,87,1,200,4,89,3,33,0,25,0,0,65,50,30,2,51,50,54,55,23,14,2,35,34,46,2,35,34,6,7,39,62,2,1,155,75,105,82,76,46,62,98,38, +120,29,84,122,89,70,103,83,81,47,65,94,39,120,30,82,123,3,33,60,80,60,98,72,62,57,117,79,60,80,60,97,72,59,59,118,78,0,0,1,0,231,1,13,3,201,2,183,0,5,0,0,65,17,35,17,33,53,3,201,154,253,184,2, +183,254,86,1,27,143,0,1,0,147,4,30,4,29,6,143,0,6,0,0,65,1,35,1,1,35,1,2,163,1,122,183,254,240,254,241,180,1,122,6,143,253,143,1,218,254,38,2,113,0,0,3,255,243,0,237,4,187,4,1,0,29,0,43, +0,56,0,0,65,50,22,22,21,20,6,6,35,34,38,39,14,2,35,34,38,38,53,52,54,54,51,50,22,23,62,2,5,34,6,21,20,22,51,50,54,54,55,46,2,5,34,6,6,7,30,2,51,50,17,52,38,3,137,112,134,60,59,132, +107,109,147,56,33,84,113,78,112,135,59,60,132,106,109,144,59,35,84,112,253,237,70,73,71,72,58,81,60,27,22,58,83,2,29,58,81,60,27,23,56,84,63,143,71,4,1,106,178,111,111,178,104,131,131,73,119,70,106,179,110,111,178,104, +132,129,72,118,71,136,126,131,129,128,81,127,68,48,110,80,3,80,126,69,47,112,79,1,1,130,126,0,0,3,0,51,254,251,4,125,5,28,0,19,0,35,0,47,0,0,69,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,39,50, +54,54,53,52,38,38,35,34,6,6,21,20,22,22,1,23,3,7,1,7,3,39,19,55,1,55,2,87,113,199,151,85,85,151,199,113,114,200,151,85,85,151,200,113,102,168,100,94,166,110,109,166,95,95,166,1,29,141,84,41,254,248,10,92, +140,90,34,1,10,17,22,84,152,199,114,114,199,151,84,84,151,199,114,114,199,152,84,138,111,187,113,113,187,111,111,187,113,113,187,111,4,168,41,254,254,90,252,193,64,254,227,42,1,25,66,3,67,87,0,1,0,132,0,85,4,44,4,29, +0,6,0,0,65,1,35,1,1,35,1,2,190,1,110,159,254,203,254,202,158,1,108,4,29,252,56,3,70,252,186,3,200,0,255,255,0,132,0,85,4,44,4,29,4,71,4,206,0,0,4,114,64,0,192,0,0,1,0,147,0,85,4,29, +4,125,0,23,0,0,65,50,30,2,21,17,35,17,52,38,38,35,34,6,6,21,17,35,17,52,62,2,2,88,94,164,124,71,146,83,140,84,84,140,83,146,71,124,164,4,125,70,125,163,95,253,157,2,99,85,139,83,83,139,85,253,157,2, +99,95,163,125,70,0,255,255,0,147,0,36,4,29,4,75,4,71,4,208,0,0,4,161,64,0,192,0,0,1,0,155,254,88,4,21,6,165,0,28,0,0,65,50,22,23,7,38,38,35,34,6,21,17,20,6,6,35,34,38,39,55,22,22, +51,50,54,53,17,52,54,3,31,75,108,63,54,51,88,43,84,59,68,125,87,75,96,60,54,50,76,40,63,66,159,6,165,23,29,125,22,18,81,74,249,236,93,123,61,26,27,125,22,16,72,66,6,20,148,143,255,255,0,41,0,0,4,135, +5,97,6,6,2,62,0,0,0,1,0,54,254,88,4,122,5,97,0,11,0,0,65,21,35,17,7,17,33,17,7,17,35,53,4,122,174,166,254,104,167,177,5,97,142,249,154,21,6,123,249,154,21,6,123,142,0,1,0,201,0,0,3,227, +5,97,0,12,0,0,65,21,33,1,21,1,33,21,33,53,1,1,53,3,227,253,172,1,140,254,116,2,84,252,230,1,194,254,62,5,97,146,254,34,123,254,28,146,147,2,28,2,31,147,0,1,0,58,0,0,5,109,6,197,0,8,0,0, +65,21,33,1,35,1,55,1,1,5,109,254,146,254,70,190,254,179,146,1,21,1,168,6,197,144,249,203,3,145,50,252,240,6,18,0,0,1,0,177,254,88,3,255,4,29,0,30,0,0,65,17,20,22,23,7,38,38,39,6,6,35,34,38, +39,22,22,21,17,7,17,51,17,20,22,22,51,50,54,55,17,3,199,36,20,159,16,27,5,47,156,79,80,89,38,7,11,168,168,22,76,79,95,137,45,4,29,253,50,103,171,61,23,26,105,38,77,92,45,55,53,89,32,254,206,21,5,197, +253,178,105,152,81,97,63,3,0,0,0,2,0,178,255,233,3,255,5,113,0,23,0,37,0,0,65,22,4,22,18,21,20,6,6,35,34,38,38,53,52,54,54,51,50,22,23,38,0,39,1,34,6,21,20,22,51,50,54,54,55,53,38,38, +1,73,182,1,7,169,80,103,191,132,113,190,116,102,173,104,97,147,46,12,254,220,253,1,32,97,132,134,110,82,116,62,1,64,130,5,113,50,141,205,254,227,195,156,244,140,105,199,138,132,197,110,90,67,211,1,30,68,253,227,152,144,146,169, +86,175,132,47,89,82,0,1,2,11,253,168,2,165,8,232,0,3,0,0,65,17,35,17,2,165,154,8,232,244,192,11,64,0,0,1,2,11,254,232,4,92,8,232,0,11,0,0,65,20,18,22,23,7,38,2,2,53,17,51,2,165,101,195, +143,88,162,226,117,154,2,188,208,254,208,250,126,92,133,1,22,1,86,227,6,44,0,1,2,11,253,168,4,92,6,144,0,12,0,0,65,17,35,17,52,18,18,55,23,14,3,2,165,154,117,226,162,88,108,164,111,56,2,188,250,236,5,20, +228,1,86,1,22,132,92,96,185,203,247,0,255,255,2,11,253,168,2,165,8,232,4,71,4,217,4,176,0,0,192,0,64,0,255,255,0,84,254,232,2,165,8,232,4,71,4,218,4,176,0,0,192,0,64,0,255,255,0,84,253,168,2,165, +6,144,4,71,4,219,4,176,0,0,192,0,64,0,0,5,0,37,255,216,4,141,5,134,0,3,0,15,0,27,0,43,0,59,0,0,65,23,1,39,1,34,6,21,20,22,51,50,54,53,52,38,1,34,6,21,20,22,51,50,54,53,52,38, +39,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,1,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,3,241,108,252,77,105,3,39,59,82,80,61,60,79,79,253,168,59,82,80,61,60,79,79,60,94,130,69,69,130,94,93, +132,70,70,132,2,121,94,130,69,69,130,94,93,132,70,70,132,5,134,70,250,152,70,1,225,95,105,97,108,98,107,108,92,3,0,98,102,98,107,98,107,108,92,120,88,146,86,84,148,91,91,148,84,87,145,88,253,1,89,146,86,85,147,91, +91,147,85,87,146,88,0,7,0,37,255,231,4,138,5,119,0,3,0,19,0,31,0,47,0,59,0,75,0,87,0,0,65,23,1,39,5,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,39,50,22,21,20,6,35,34,38,53,52,54, +5,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,39,50,22,21,20,6,35,34,38,53,52,54,1,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,39,50,22,21,20,6,35,34,38,53,52,54,4,79,48,251,216,50,1,58, +52,55,19,18,55,53,53,54,17,17,54,53,111,148,148,111,113,149,149,2,155,54,55,20,20,56,53,52,53,19,19,53,52,110,147,147,110,113,151,151,254,73,54,54,18,18,55,53,53,52,19,19,52,53,110,147,147,110,113,151,151,4,33,113, +254,94,113,225,48,77,43,42,81,52,51,80,44,42,77,49,103,148,123,126,145,145,126,125,146,103,48,77,43,42,81,52,51,80,44,42,77,49,103,148,123,126,145,145,126,125,146,3,12,47,77,44,42,80,52,50,80,44,42,77,49,102,146,124, +126,144,144,126,125,145,255,255,1,109,254,218,3,67,0,188,6,7,6,120,0,0,254,126,255,255,1,109,2,210,3,67,4,180,6,7,6,120,0,0,2,118,255,255,1,181,0,137,2,249,4,158,6,6,4,0,0,0,0,2,0,49,0,0, +4,65,4,104,0,3,0,25,0,0,119,33,21,33,3,52,54,54,51,33,21,33,34,6,6,21,20,22,22,51,33,21,33,34,38,38,111,3,209,252,47,62,122,205,125,2,76,253,180,84,140,83,83,140,84,2,76,253,180,125,205,122,129,129, +2,168,126,203,119,131,88,145,84,85,144,88,131,119,204,0,255,255,0,111,0,0,4,127,4,104,4,71,4,228,4,176,0,0,192,0,64,0,0,1,0,231,1,13,3,201,2,183,0,5,0,0,65,21,33,17,35,17,3,201,253,184,154,2, +183,143,254,229,1,170,255,255,1,15,254,241,2,165,8,232,4,71,4,171,4,176,0,0,192,0,64,0,255,255,2,11,253,168,3,212,8,232,4,71,4,172,4,176,0,0,192,0,64,0,255,255,1,14,253,168,2,165,6,135,4,71,4,173, +4,176,0,0,192,0,64,0,255,255,2,11,253,168,2,165,8,232,4,71,4,174,4,176,0,0,192,0,64,0,255,255,0,178,255,25,2,165,8,232,4,71,4,175,4,176,0,0,192,0,64,0,255,255,0,178,253,168,2,165,6,95,4,71, +4,176,4,176,0,0,192,0,64,0,0,2,0,171,0,95,4,65,4,124,0,3,0,7,0,0,83,53,33,21,1,17,35,17,247,3,74,252,250,144,2,36,146,146,2,88,251,227,4,29,0,1,0,49,0,177,4,65,4,49,0,21,0,0, +83,52,54,54,51,33,21,33,34,6,6,21,20,22,22,51,33,21,33,34,38,38,49,122,205,125,2,76,253,180,84,140,83,83,140,84,2,76,253,180,125,205,122,2,113,126,203,119,131,88,145,84,84,145,88,131,119,204,0,3,0,49,255,90, +4,65,4,204,0,3,0,7,0,29,0,0,119,33,21,33,5,39,19,23,1,52,54,54,51,33,21,33,34,6,6,21,20,22,22,51,33,21,33,34,38,38,111,3,209,252,47,1,183,135,240,130,253,32,122,205,125,2,76,253,180,84,140,83, +83,140,84,2,76,253,180,125,205,122,129,129,166,68,1,137,64,2,37,126,203,119,131,88,145,84,85,144,88,131,119,204,255,255,0,111,0,177,4,127,4,49,4,71,4,161,4,176,0,0,192,0,64,0,255,255,0,111,0,177,4,127,4,49, +4,71,4,238,4,176,0,0,192,0,64,0,0,3,0,111,255,90,4,127,4,204,0,3,0,7,0,29,0,0,119,33,21,33,5,39,19,23,1,20,6,6,35,33,53,33,50,54,54,53,52,38,38,35,33,53,33,50,22,22,111,3,209,252, +47,1,183,135,240,130,1,110,122,205,125,253,180,2,76,84,140,83,83,140,84,253,180,2,76,125,205,122,129,129,166,68,1,137,64,2,37,125,204,119,131,88,144,85,84,145,88,131,119,203,0,2,0,74,0,136,4,102,4,31,0,3,0,7, +0,0,83,53,33,21,37,17,35,17,74,4,28,254,58,144,3,141,146,146,20,252,231,3,25,0,255,255,0,111,0,95,4,5,4,124,4,71,4,237,4,176,0,0,192,0,64,0,0,2,0,149,255,7,3,181,6,154,0,3,0,15,0,0, +69,39,1,23,3,33,39,33,17,33,53,33,17,33,53,33,1,139,144,1,189,144,65,253,180,20,3,14,252,224,2,114,254,2,1,254,249,34,7,113,38,254,95,142,250,159,139,1,233,143,0,3,0,144,1,14,4,34,4,73,0,11,0,23, +0,35,0,0,65,50,22,21,20,6,35,34,38,53,52,54,1,50,22,21,20,6,35,34,38,53,52,54,1,50,22,21,20,6,35,34,38,53,52,54,1,21,58,77,77,58,56,77,77,1,123,58,77,77,58,56,77,77,1,123,58,77,77,58, +56,77,77,2,26,77,55,56,80,80,56,55,77,2,47,77,55,56,80,80,56,55,77,253,209,77,55,56,80,80,56,55,77,0,0,4,0,59,0,95,4,165,4,124,0,3,0,7,0,11,0,15,0,0,65,53,33,21,1,17,35,17,33,17, +35,17,33,17,35,17,2,247,1,174,254,149,144,254,33,144,1,200,144,2,36,146,146,2,88,251,227,4,29,251,227,4,29,251,227,4,29,0,0,3,0,171,0,95,4,65,4,124,0,3,0,7,0,11,0,0,83,53,33,21,1,17,35,17, +19,53,33,21,247,3,74,252,250,144,76,3,74,2,227,145,145,1,153,251,227,4,29,252,235,146,146,0,255,255,0,41,0,0,4,135,5,97,4,71,0,1,0,0,5,97,64,0,192,0,255,255,0,74,0,105,4,102,4,0,4,71,4,243, +0,0,4,136,64,0,192,0,255,255,255,243,1,61,4,187,4,81,6,6,4,204,0,80,0,1,0,131,0,55,4,58,4,173,0,6,0,0,83,1,21,1,53,1,1,131,3,183,252,73,3,24,252,232,4,173,254,26,170,254,26,163,1,152, +1,151,255,255,0,118,0,55,4,45,4,173,4,71,4,252,4,176,0,0,192,0,64,0,255,255,0,131,0,75,4,45,3,243,6,6,4,189,0,176,0,1,255,231,0,0,4,201,5,55,0,14,0,0,65,1,7,1,38,38,39,17,35,17, +6,6,7,1,39,2,88,2,113,101,254,190,34,60,25,166,25,60,35,254,191,101,5,55,253,210,113,1,39,30,63,47,251,181,4,75,46,65,29,254,217,113,0,1,0,78,0,156,4,98,4,177,0,14,0,0,119,39,1,6,6,39,37,55, +5,19,7,3,38,54,55,191,113,2,251,64,84,62,254,134,8,3,49,44,161,25,3,6,13,156,113,3,1,12,4,3,20,156,44,252,189,9,1,154,45,98,60,0,0,1,0,45,0,49,4,131,4,243,0,15,0,0,73,2,39,1,54,54, +55,33,53,33,46,2,39,1,2,99,2,32,253,224,124,1,29,29,63,37,252,168,3,87,28,37,35,28,254,227,4,243,253,159,253,159,106,1,58,32,59,24,148,19,29,37,30,1,58,0,0,1,0,78,0,85,4,98,4,106,0,14,0,0, +83,1,38,38,55,19,23,3,5,39,37,54,22,23,1,191,2,249,13,6,3,25,161,44,252,207,8,1,122,62,84,64,253,5,4,106,252,254,60,98,46,1,153,9,252,189,44,156,20,3,4,12,3,1,0,1,255,231,255,184,4,201,4,239, +0,14,0,0,65,17,54,54,55,1,23,1,1,55,1,22,22,23,17,2,171,25,60,34,1,66,101,253,143,253,143,101,1,65,35,60,25,4,239,251,180,47,65,29,1,39,113,253,210,2,46,113,254,218,30,64,48,4,76,0,0,1,0,78, +0,85,4,98,4,106,0,14,0,0,65,23,1,54,54,23,5,7,37,3,55,19,22,6,7,3,241,113,253,5,64,84,62,1,122,8,252,207,44,161,25,3,6,13,4,106,113,252,255,12,4,3,20,156,44,3,67,9,254,103,46,98,60,0, +0,1,0,45,0,49,4,131,4,243,0,15,0,0,65,23,1,14,2,7,33,21,33,22,22,23,1,7,1,2,77,124,254,227,27,36,36,29,3,87,252,168,37,63,29,1,29,124,253,224,4,243,106,254,198,30,37,29,19,148,24,59,32,254, +198,106,2,97,0,1,0,78,0,156,4,98,4,177,0,14,0,0,101,1,22,22,7,3,39,19,37,23,5,6,38,39,1,3,241,253,7,13,6,3,25,161,44,3,49,8,254,134,62,84,64,2,251,156,3,2,60,98,45,254,102,9,3,67, +44,156,20,3,4,12,252,255,0,1,255,107,0,103,5,69,4,187,0,27,0,0,65,1,39,19,54,54,55,33,22,22,23,19,7,1,1,23,3,14,2,7,33,46,2,39,3,55,5,69,254,23,125,231,27,65,36,252,36,36,63,29,237,124, +254,16,1,240,126,239,27,37,35,29,3,220,28,36,36,28,234,125,2,146,253,213,106,1,4,32,59,24,24,59,32,254,252,106,2,43,2,41,106,254,254,30,37,29,19,19,29,37,30,1,2,106,0,1,255,231,254,141,4,201,6,195,0,25, +0,0,65,1,7,1,38,38,39,17,54,54,55,1,23,1,1,55,1,22,22,23,17,6,6,7,1,39,2,88,2,113,101,254,190,34,60,25,25,60,34,1,66,101,253,143,253,143,101,1,65,35,60,25,25,60,35,254,191,101,6,195,253,210, +114,1,39,30,64,47,249,162,47,65,28,1,40,114,253,210,2,46,114,254,217,29,65,47,6,94,48,64,29,254,217,114,255,255,0,44,0,110,4,124,4,118,4,71,5,17,4,176,0,0,192,0,64,0,0,2,0,52,0,110,4,132,4,118, +0,3,0,10,0,0,65,51,17,35,9,2,17,33,53,33,3,231,157,157,253,218,2,3,253,251,254,117,1,139,4,118,251,248,3,179,254,81,254,81,1,101,148,0,0,2,0,57,255,195,4,127,4,74,0,21,0,24,0,0,83,5,50,54, +54,53,52,38,38,35,35,53,51,50,22,22,21,20,6,6,35,33,1,17,1,238,1,251,69,116,69,69,116,69,150,149,113,184,110,110,184,113,254,6,1,83,253,248,1,177,1,70,117,70,70,116,68,155,110,185,113,113,185,109,1,238,252,186, +1,163,255,255,0,58,0,0,4,73,5,154,4,71,5,21,0,0,5,94,64,0,192,0,255,255,0,103,0,0,4,118,5,154,4,15,5,21,4,176,5,94,192,0,0,2,0,58,255,196,4,73,5,94,0,5,0,8,0,0,65,5,17,51, +17,33,1,17,1,1,58,2,98,173,252,241,1,8,253,248,1,175,1,3,176,251,194,1,234,252,186,1,163,0,255,255,0,103,255,196,4,118,5,94,4,71,5,21,4,176,0,0,192,0,64,0,255,255,0,140,255,238,7,114,5,114,4,71, +5,24,9,96,0,0,192,0,64,0,0,2,1,238,255,238,8,212,5,114,0,5,0,39,0,0,65,23,1,1,55,1,7,53,52,46,2,35,34,14,2,21,20,30,2,51,21,34,36,38,2,53,52,54,54,36,51,50,30,2,21,21,8,105, +107,254,83,254,67,104,1,84,81,85,152,199,113,114,199,151,86,86,151,199,114,146,255,0,194,110,110,194,1,0,146,147,255,194,110,3,12,113,254,111,1,145,113,254,209,27,238,113,199,152,85,85,152,199,113,114,199,151,86,156,110,194,1,0, +146,147,255,194,110,110,194,255,147,238,0,2,0,0,255,232,4,176,6,128,0,12,0,19,0,0,65,1,33,17,20,6,35,33,34,38,53,17,33,1,1,51,17,33,17,51,2,88,2,88,254,174,55,45,254,188,45,55,254,174,2,88,254,130, +214,1,80,214,6,128,253,172,252,32,45,55,55,45,3,224,1,212,254,134,251,186,4,70,0,2,255,176,0,26,5,0,4,202,0,12,0,19,0,0,73,2,17,33,34,38,53,17,52,54,51,33,55,21,33,17,33,21,1,2,172,2,84,253, +172,253,104,45,55,55,45,2,152,90,253,2,2,254,1,122,4,202,253,168,253,168,1,96,55,45,1,40,45,55,134,222,254,192,222,1,126,0,0,2,0,0,255,68,4,176,5,220,0,12,0,19,0,0,65,50,22,21,17,33,1,1,33,17, +52,54,51,5,33,17,35,1,1,35,2,250,45,55,1,82,253,168,253,168,1,82,55,45,1,74,254,176,214,1,126,1,126,214,5,220,55,45,252,32,253,172,2,84,3,224,45,55,88,251,186,254,134,1,122,0,0,2,255,176,0,26,5,0, +4,202,0,12,0,19,0,0,65,17,33,50,22,21,17,20,6,35,33,17,9,3,53,33,17,33,2,4,2,152,45,55,55,45,253,104,253,172,1,250,254,134,1,122,2,254,253,2,4,202,254,160,55,45,254,216,45,55,254,160,2,88,1,126, +254,130,254,130,222,1,64,0,0,1,0,38,2,130,4,138,4,236,0,5,0,0,65,1,55,1,1,23,2,88,253,206,101,1,205,1,205,101,2,130,1,249,113,254,110,1,146,113,0,3,255,181,2,193,4,251,5,50,0,3,0,7,0,14, +0,0,67,33,21,33,37,33,21,33,39,1,35,1,1,35,1,75,1,164,254,92,3,162,1,164,254,92,180,1,122,183,254,240,254,241,180,1,122,5,39,138,138,138,149,253,143,1,219,254,37,2,113,0,0,1,0,0,255,232,4,176,6,128, +0,12,0,0,65,1,33,17,20,6,35,33,34,38,53,17,33,2,88,2,88,254,174,55,45,254,188,45,55,254,174,6,128,253,172,252,32,45,55,55,45,3,224,0,0,1,0,0,255,68,4,176,5,220,0,12,0,0,65,50,22,21,17,33, +1,1,33,17,52,54,51,2,250,45,55,1,82,253,168,253,168,1,82,55,45,5,220,55,45,252,32,253,172,2,84,3,224,45,55,0,0,1,255,176,0,26,5,0,4,202,0,12,0,0,65,17,33,50,22,21,17,20,6,35,33,17,1,2, +4,2,152,45,55,55,45,253,104,253,172,4,202,254,160,55,45,254,216,45,55,254,160,2,88,0,0,5,255,220,0,0,4,210,5,55,0,5,0,9,0,13,0,17,0,21,0,0,65,1,7,1,1,39,55,51,17,35,19,51,17,35,19,51, +17,35,19,51,17,35,2,88,2,122,97,253,229,253,233,99,191,142,142,252,138,138,248,138,138,248,142,142,5,55,253,205,113,1,233,254,23,113,155,252,97,4,121,251,135,4,121,251,135,3,159,252,97,0,255,255,255,220,255,163,4,210,4,218, +4,71,5,34,0,0,4,218,64,0,192,0,0,4,0,59,255,246,9,37,4,238,0,19,0,35,0,39,0,55,0,0,69,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,39,50,54,54,53,52,38,38,35,34,6,6,21,20,22,22, +19,51,17,35,9,2,39,1,54,54,55,33,53,33,46,2,39,1,3,160,132,231,175,99,99,175,231,132,132,230,175,99,99,175,230,132,133,218,129,129,218,133,133,217,130,130,217,54,158,158,3,180,2,32,253,224,125,1,30,29,63,36,248,21, +7,235,29,36,36,27,254,226,10,99,175,230,132,132,230,175,99,99,175,230,132,132,230,175,99,156,130,217,133,133,218,129,129,218,133,133,217,130,4,23,251,146,4,152,253,159,253,159,106,1,58,32,59,24,148,19,29,37,30,1,58,0,255,255, +0,59,0,17,9,37,4,211,4,71,5,38,9,96,0,0,192,0,64,0,0,1,0,59,0,17,9,37,4,211,0,15,0,0,73,2,39,1,54,54,55,33,53,33,46,2,39,1,7,5,2,32,253,224,125,1,30,29,63,36,248,21,7,235, +29,36,36,27,254,226,4,211,253,159,253,159,106,1,58,32,59,24,148,19,29,37,30,1,58,0,0,1,0,59,0,17,9,37,4,211,0,27,0,0,73,2,39,1,54,54,55,33,22,22,23,1,7,1,1,23,1,14,2,7,33,46,2,39, +1,7,5,2,32,253,224,125,1,30,29,63,36,249,20,36,63,29,1,30,125,253,224,2,32,125,254,226,27,36,36,29,6,236,29,36,36,27,254,226,4,211,253,159,253,159,106,1,58,32,59,24,24,59,32,254,198,106,2,97,2,97,106,254, +198,30,37,29,19,19,29,37,30,1,58,0,255,255,0,59,0,17,9,37,4,211,4,71,5,41,9,96,0,0,192,0,64,0,0,3,0,59,0,17,9,37,4,211,0,3,0,7,0,23,0,0,83,33,21,33,21,33,21,33,9,2,39,55, +54,54,63,2,39,39,38,38,39,39,59,7,220,248,36,7,220,248,36,6,202,2,32,253,224,125,126,23,55,45,103,107,107,103,45,55,23,126,3,121,146,234,146,3,104,253,159,253,159,106,136,27,52,25,146,117,117,146,25,53,26,136,0,4, +0,145,0,17,8,208,4,211,0,3,0,7,0,23,0,39,0,0,65,21,33,53,1,21,33,53,9,2,39,55,54,54,63,2,39,39,38,38,39,39,37,23,7,6,6,15,2,23,23,22,22,23,23,7,1,7,205,249,198,6,58,249,198,5, +29,2,32,253,224,125,126,23,55,45,103,107,107,103,45,55,23,126,252,126,124,125,23,55,45,103,107,107,103,45,55,23,125,124,253,224,3,121,146,146,254,132,146,146,2,214,253,159,253,159,106,136,27,52,25,146,117,117,146,25,53,26,136,106, +106,136,26,53,25,146,117,117,146,25,52,27,136,106,2,97,255,255,0,59,0,17,9,37,4,211,4,71,5,44,9,96,0,0,192,0,64,0,0,2,0,59,0,17,9,37,4,211,0,3,0,19,0,0,83,51,17,35,9,2,39,1,54,54, +55,33,53,33,46,2,39,1,59,156,156,6,202,2,32,253,224,125,1,30,29,63,36,248,21,7,235,29,36,36,27,254,226,4,69,252,90,4,52,253,159,253,159,106,1,58,32,59,24,148,19,29,37,30,1,58,255,255,0,59,0,17,9,37, +4,211,4,71,5,46,9,96,0,0,192,0,64,0,0,4,0,59,0,17,9,37,4,211,0,3,0,7,0,11,0,27,0,0,83,51,17,35,17,33,21,33,21,33,21,33,9,2,39,55,54,54,63,2,39,39,38,38,39,39,59,156,156,7, +220,248,36,7,220,248,36,6,202,2,32,253,224,125,126,23,55,45,103,107,107,103,45,55,23,126,4,70,252,93,2,214,146,234,146,3,104,253,159,253,159,106,136,27,52,25,146,117,117,146,25,53,26,136,0,2,0,59,0,17,9,51,4,211, +0,17,0,30,0,0,83,37,23,55,23,55,23,55,33,21,33,7,39,7,39,7,39,33,9,2,39,1,54,54,55,53,38,38,39,1,59,1,168,103,205,206,205,206,103,2,188,253,129,164,206,205,206,205,164,254,149,6,216,2,32,253,224,124, +1,29,41,50,37,37,50,41,254,227,2,188,1,103,205,205,205,205,103,149,164,205,205,205,205,164,2,171,253,159,253,159,106,1,58,44,48,23,148,23,48,44,1,58,0,1,255,176,0,26,5,0,4,202,0,12,0,0,73,2,17,33,34,38, +53,17,52,54,51,33,2,172,2,84,253,172,253,104,45,55,55,45,2,152,4,202,253,168,253,168,1,96,55,45,1,40,45,55,0,1,0,0,253,168,4,176,254,212,0,3,0,0,65,17,33,17,4,176,251,80,254,212,254,212,1,44,0,1, +0,0,253,168,4,176,0,0,0,3,0,0,97,17,33,17,4,176,251,80,253,168,2,88,0,1,0,0,253,168,4,176,1,44,0,3,0,0,65,17,33,17,4,176,251,80,1,44,252,124,3,132,0,1,0,0,253,168,4,176,2,88,0,3, +0,0,65,17,33,17,4,176,251,80,2,88,251,80,4,176,0,1,0,0,253,168,4,176,3,132,0,3,0,0,65,17,33,17,4,176,251,80,3,132,250,36,5,220,0,1,0,0,253,168,4,176,4,176,0,3,0,0,65,17,33,17,4,176, +251,80,4,176,248,248,7,8,0,1,0,0,253,168,4,176,5,220,0,3,0,0,65,17,33,17,4,176,251,80,5,220,247,204,8,52,0,1,0,0,253,168,4,176,7,8,0,3,0,0,65,17,33,17,4,176,251,80,7,8,246,160,9,96, +0,1,0,0,2,88,4,176,7,8,0,3,0,0,65,17,33,17,4,176,251,80,7,8,251,80,4,176,0,1,0,0,5,220,4,176,7,8,0,3,0,0,65,17,33,17,4,176,251,80,7,8,254,212,1,44,0,1,0,0,253,168,0,150, +7,8,0,3,0,0,83,17,35,17,150,150,7,8,246,160,9,96,0,1,0,0,253,168,1,44,7,8,0,3,0,0,65,17,33,17,1,44,254,212,7,8,246,160,9,96,0,1,0,0,253,168,1,194,7,8,0,3,0,0,65,17,33,17, +1,194,254,62,7,8,246,160,9,96,0,1,0,0,253,168,2,88,7,8,0,3,0,0,65,17,33,17,2,88,253,168,7,8,246,160,9,96,0,1,0,0,253,168,2,238,7,8,0,3,0,0,65,17,33,17,2,238,253,18,7,8,246,160, +9,96,0,1,0,0,253,168,3,132,7,8,0,3,0,0,65,17,33,17,3,132,252,124,7,8,246,160,9,96,0,1,0,0,253,168,4,26,7,8,0,3,0,0,65,17,33,17,4,26,251,230,7,8,246,160,9,96,0,1,2,88,253,168, +4,176,7,8,0,3,0,0,65,17,33,17,4,176,253,168,7,8,246,160,9,96,0,1,4,26,253,168,4,176,7,8,0,3,0,0,65,17,35,17,4,176,150,7,8,246,160,9,96,0,0,1,0,0,253,168,2,88,2,88,0,3,0,0, +65,17,33,17,2,88,253,168,2,88,251,80,4,176,0,1,2,88,253,168,4,176,2,88,0,3,0,0,65,17,33,17,4,176,253,168,2,88,251,80,4,176,0,1,0,0,2,88,2,88,7,8,0,3,0,0,65,17,33,17,2,88,253,168, +7,8,251,80,4,176,0,1,0,0,253,168,4,176,7,8,0,5,0,0,65,17,33,17,33,17,2,88,2,88,251,80,7,8,251,80,251,80,9,96,0,1,0,0,253,168,4,176,7,8,0,7,0,0,65,17,33,17,33,17,33,17,2,88, +2,88,253,168,253,168,7,8,251,82,251,78,4,176,4,176,0,1,0,0,253,168,4,176,7,8,0,5,0,0,65,17,33,17,33,17,4,176,253,168,253,168,7,8,251,80,251,80,9,96,0,1,0,0,253,168,4,176,7,8,0,5,0,0, +65,17,33,17,33,17,4,176,253,168,253,168,7,8,246,160,4,176,4,176,0,1,2,88,2,88,4,176,7,8,0,3,0,0,65,17,33,17,4,176,253,168,7,8,251,80,4,176,0,2,0,0,253,168,4,176,7,8,0,3,0,7,0,0, +65,17,33,17,1,17,33,17,2,88,253,168,4,176,253,168,2,88,251,80,4,176,4,176,251,82,4,174,0,1,0,0,253,168,4,176,7,8,0,5,0,0,65,17,33,17,33,17,4,176,251,80,2,88,7,8,246,160,4,176,4,176,0,48, +0,100,253,168,4,176,6,114,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111, +0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147,0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0,187,0,191,0,0,65,21,35,53,1,21,35,53,33,21,35,53,3,21,35,53,1,21,35,53,3,21, +35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21, +35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21, +35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,4,176,100,252,124,100,1,44,100,100,100,1,244,100,100,100,1,244,100,254,12,100, +1,244,100,100,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100, +1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,100,100,2,188,100,100,100,100,100,1,244,100,100,100,6,114,150,150,247,204,150,150,150,150,1,44,150,150,254,212,150,150,1, +44,150,150,254,212,150,150,2,88,150,150,254,212,150,150,1,44,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3, +132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254, +212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,1,44,150,150,253,168,150,150,1,44,150,150,1,44,150,150,254,212,150,150,1,44,150,150,0,0,96,0,0,253,168,4,176,7,8,0,3,0,7,0,11,0,15,0,19, +0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147, +0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0,187,0,191,0,195,0,199,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235,0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,15,1,19, +1,23,1,27,1,31,1,35,1,39,1,43,1,47,1,51,1,55,1,59,1,63,1,67,1,71,1,75,1,79,1,83,1,87,1,91,1,95,1,99,1,103,1,107,1,111,1,115,1,119,1,123,1,127,0,0,65,21,35,53,1,21,35,53, +33,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53, +1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53, +1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,55,21,35,53,1,21,35,53, +33,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53, +1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53, +1,21,35,53,3,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,1,21,35,53,3,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,3,21,35,53,1,21,35,53,3,21,35,53,4,176,100,252,124,100,1,44, +100,100,100,1,244,100,100,100,1,244,100,254,12,100,1,244,100,100,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100, +2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,100,100,2,188,100,100,100,100,100,1,244,100,100,100,200,100,252,124,100, +1,44,100,100,100,1,244,100,100,100,1,244,100,254,12,100,1,244,100,100,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1, +244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,254,12,100,1,244,100,2,188,100,253,68,100,2,188,100,100,100,100,100,2,188,100,100,100,100,100,1,244,100,100,100,6,114,150, +150,247,204,150,150,150,150,1,44,150,150,254,212,150,150,1,44,150,150,254,212,150,150,2,88,150,150,254,212,150,150,1,44,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1, +44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3, +132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,1,44,150,150,253,168,150,150,1,44,150,150,1,44,150,150,254,212,150,150,1,44,150,150,150,150,150,247,204, +150,150,150,150,1,44,150,150,254,212,150,150,1,44,150,150,254,212,150,150,2,88,150,150,254,212,150,150,1,44,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150, +2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150, +253,168,150,150,1,44,150,150,2,88,150,150,254,212,150,150,253,168,150,150,3,132,150,150,253,168,150,150,1,44,150,150,1,44,150,150,253,168,150,150,1,44,150,150,1,44,150,150,254,212,150,150,1,44,150,150,0,36,0,0,253,168,4,176, +7,8,0,53,0,57,0,61,0,65,0,69,0,73,0,77,0,81,0,85,0,89,0,93,0,97,0,101,0,105,0,109,0,113,0,117,0,121,0,125,0,129,0,133,0,137,0,141,0,145,0,149,0,153,0,157,0,161,0,165,0,169,0,173, +0,177,0,181,0,185,0,189,0,193,0,0,65,21,35,21,51,21,35,21,51,21,35,21,51,21,35,21,51,21,35,21,51,21,35,21,51,21,35,21,51,21,35,21,35,53,35,21,35,53,35,21,35,53,35,21,35,53,35,21,35,53,35,21, +35,17,19,35,21,51,55,35,21,51,3,35,21,51,5,35,21,51,3,35,21,51,5,35,21,51,1,35,21,51,5,35,21,51,3,35,21,51,1,35,21,51,3,35,21,51,1,35,21,51,5,35,21,51,3,35,21,51,1,35,21,51,3,35, +21,51,1,35,21,51,5,35,21,51,3,35,21,51,1,35,21,51,3,35,21,51,1,35,21,51,5,35,21,51,3,35,21,51,1,35,21,51,3,35,21,51,1,35,21,51,5,35,21,51,3,35,21,51,1,35,21,51,3,35,21,51,3,35, +21,51,5,35,21,51,3,35,21,51,55,35,21,51,4,176,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,200,100,100,200,100,100,200,100,100,1,144,100,100,200,100,100,1,144,100,100,253,168, +100,100,1,144,100,100,200,100,100,2,88,100,100,200,100,100,253,168,100,100,1,144,100,100,200,100,100,2,88,100,100,200,100,100,253,168,100,100,1,144,100,100,200,100,100,2,88,100,100,200,100,100,253,168,100,100,1,144,100,100,200,100,100,2, +88,100,100,200,100,100,253,168,100,100,1,144,100,100,200,100,100,2,88,100,100,200,100,100,200,100,100,1,144,100,100,200,100,100,200,100,100,7,8,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150, +150,9,96,248,98,150,150,150,1,194,150,150,150,1,194,150,150,150,2,238,150,150,150,1,194,150,254,62,150,1,194,150,2,238,150,150,150,1,194,150,254,62,150,1,194,150,2,238,150,150,150,1,194,150,254,62,150,1,194,150,2,238,150,150, +150,1,194,150,254,62,150,1,194,150,2,238,150,150,150,1,194,150,254,62,150,1,194,150,1,194,150,150,150,1,194,150,150,150,0,1,0,60,0,0,4,116,4,56,0,19,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2, +2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,0,0,2,0,60,0,0,4,116,4,56,0,19,0,35,0,0,65,50,30,2,21,20,14,2,35,34,46,2, +53,52,62,2,23,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,105,172,103,103,172,105,104,173,103,103,173,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112, +195,149,84,160,103,173,104,105,172,103,103,172,105,104,173,103,0,2,0,60,0,0,4,116,4,56,0,19,0,35,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38, +2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,105,172,103,103,172,105,104,173,103,103,173,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,160,103,173,104,105,172,103,103,172,105,104,173,103,0,2,0,60, +0,0,4,116,4,56,0,19,0,28,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,17,50,54,54,53,52,38,38,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,104,173,103,103,173,4,56,84,149, +195,112,112,196,149,83,83,149,196,112,112,195,149,84,160,253,8,103,172,105,104,173,103,0,0,2,0,60,0,0,4,116,4,56,0,19,0,28,0,0,65,50,30,2,21,20,6,6,7,35,34,46,2,53,52,62,2,23,34,6,6,21,20,22, +22,51,2,88,112,195,149,84,139,235,144,22,112,196,149,83,83,149,196,112,105,172,103,103,172,105,4,56,84,149,195,112,147,240,147,6,83,149,196,112,112,195,149,84,160,103,173,104,105,172,103,0,0,2,0,60,0,0,4,116,4,56,0,19, +0,28,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,34,6,6,21,33,52,38,38,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,105,172,103,2,248,103,173,4,56,84,149,195,112,112,196,149,83, +83,149,196,112,112,195,149,84,160,103,173,104,104,173,103,0,0,2,0,60,0,0,4,116,4,56,0,19,0,28,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,1,33,20,22,22,51,50,54,54,2,88,112,195,149,84,84, +149,195,112,112,196,149,83,83,149,196,1,236,253,8,103,172,105,104,173,103,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,253,228,105,172,103,103,172,0,0,1,0,60,0,0,2,88,4,56,0,10,0,0,65,17,34,46, +2,53,52,62,2,2,88,112,196,149,83,83,149,196,4,56,251,200,83,149,196,112,112,195,149,84,0,1,2,88,0,0,4,116,4,56,0,10,0,0,65,50,30,2,21,20,14,2,35,2,88,112,195,149,84,84,149,195,112,4,56,84,149,195, +112,112,196,149,83,0,0,2,0,60,0,0,4,116,4,56,0,19,0,25,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,34,6,6,21,33,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,105,172, +103,1,124,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,160,103,173,104,0,0,3,0,60,0,0,4,116,4,56,0,19,0,33,0,38,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,17,33,30, +2,51,50,54,54,53,52,38,38,39,6,6,7,33,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,192,254,60,19,106,155,92,104,173,103,79,136,245,109,159,24,1,36,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112, +195,149,84,170,254,62,86,136,78,103,172,105,90,155,107,20,24,160,108,0,0,3,0,60,0,0,4,116,4,56,0,19,0,24,0,38,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,19,33,22,22,23,19,34,6,6,7, +33,17,62,2,53,52,38,38,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,32,254,220,24,159,109,80,91,155,107,19,1,196,85,136,79,103,173,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,253,148,109, +160,23,2,240,79,136,85,254,60,19,107,155,91,104,173,103,0,3,0,60,0,0,4,116,4,56,0,19,0,33,0,38,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,34,6,6,21,20,22,22,23,17,33,46,2,1, +33,17,54,54,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,105,172,103,78,136,86,1,194,18,107,155,1,24,254,222,108,158,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,160,103,173,104,92,155,106, +19,1,196,85,136,79,254,52,254,220,23,160,0,3,0,60,0,0,4,116,4,56,0,19,0,33,0,38,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,14,2,21,20,22,22,51,50,54,54,55,33,19,17,33,38,38, +2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,32,86,136,78,103,172,105,90,155,107,18,254,62,160,1,36,24,160,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,170,18,107,155,90,105,172,103,78,136,86, +1,194,254,222,108,158,0,3,0,60,0,0,4,116,4,56,0,19,0,35,0,50,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,7,50,22,22,21,20,6,6, +35,34,38,53,52,54,54,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,105,172,103,103,172,105,104,173,103,103,173,104,60,100,60,60,100,60,91,129,59,100,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149, +84,160,103,173,104,105,172,103,103,172,105,104,173,103,160,60,100,60,61,100,59,129,91,60,100,60,0,4,0,60,0,0,4,116,4,56,0,19,0,35,0,50,0,62,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,23,34, +6,6,21,20,22,22,51,50,54,54,53,52,38,38,7,50,22,22,21,20,6,6,35,34,38,53,52,54,54,23,34,6,21,20,22,51,50,54,53,52,38,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,112,105,172,103,103,172, +105,104,173,103,103,173,104,60,100,60,60,100,60,91,129,59,100,61,25,35,35,25,24,36,36,4,56,84,149,195,112,112,196,149,83,83,149,196,112,112,195,149,84,160,103,173,104,105,172,103,103,172,105,104,173,103,160,60,100,60,61,100,59,129, +91,60,100,60,160,36,24,25,35,35,25,24,36,0,0,3,0,60,0,0,4,116,4,56,0,3,0,19,0,35,0,0,65,17,33,17,5,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,7,50,22,22,21,20,6,6,35,34,38,38, +53,52,54,54,4,116,251,200,2,28,127,209,124,124,209,127,126,209,125,125,209,126,82,136,82,82,136,82,83,136,81,81,136,4,56,251,200,4,56,80,125,209,126,127,209,124,124,209,127,126,209,125,160,82,136,82,83,136,81,81,136,83,82,136, +82,0,0,2,0,60,2,28,4,116,4,56,0,12,0,21,0,0,65,17,35,52,38,38,35,34,6,6,21,35,17,5,50,22,22,21,33,52,54,54,4,116,80,125,209,126,127,209,124,80,2,28,82,136,82,253,168,81,136,4,56,253,228,126, +209,125,125,209,126,2,28,240,82,136,82,82,136,82,0,2,0,60,0,0,4,116,2,28,0,12,0,21,0,0,65,17,33,17,51,20,22,22,51,50,54,54,53,35,20,6,6,35,34,38,38,53,4,116,251,200,80,124,209,127,126,209,125,160, +82,136,82,83,136,81,2,28,253,228,2,28,127,209,124,124,209,127,83,136,81,81,136,83,0,1,0,60,2,28,4,116,4,56,0,19,0,0,65,50,30,2,21,35,52,38,38,35,34,6,6,21,35,52,62,2,2,88,112,195,149,84,160,103, +173,104,105,172,103,160,83,149,196,4,56,84,149,195,112,104,173,103,103,173,104,112,195,149,84,0,0,1,0,60,0,0,4,116,2,28,0,19,0,0,65,20,14,2,35,34,46,2,53,51,20,22,22,51,50,54,54,53,4,116,84,149,195,112, +112,196,149,83,160,103,172,105,104,173,103,2,28,112,196,149,83,83,149,196,112,105,172,103,103,172,105,0,0,1,0,60,2,28,2,88,4,56,0,10,0,0,65,21,34,6,6,21,35,52,62,2,2,88,105,172,103,160,83,149,196,4,56,160, +103,173,104,112,195,149,84,0,0,1,2,88,2,28,4,116,4,56,0,10,0,0,65,50,30,2,21,35,52,38,38,35,2,88,112,195,149,84,160,103,173,104,4,56,84,149,195,112,104,173,103,0,0,1,2,88,0,0,4,116,2,28,0,10, +0,0,65,20,14,2,35,53,50,54,54,53,4,116,84,149,195,112,104,173,103,2,28,112,196,149,83,160,103,172,105,0,0,1,0,60,0,0,2,88,2,28,0,10,0,0,83,20,22,22,51,21,34,46,2,53,220,103,172,105,112,196,149,83, +2,28,105,172,103,160,83,149,196,112,0,1,0,60,0,0,4,116,4,56,0,3,0,0,73,3,2,88,2,28,253,228,253,228,4,56,253,228,253,228,2,28,0,2,0,60,0,0,4,116,4,56,0,3,0,7,0,0,73,7,2,88,2,28, +253,228,253,228,2,28,254,198,1,58,1,56,4,56,253,228,253,228,2,28,1,56,254,200,254,198,1,58,0,2,0,134,0,0,4,42,5,97,0,5,0,11,0,0,73,2,35,1,1,23,35,1,1,51,1,2,186,1,112,254,144,197,254,145, +1,111,103,8,254,228,1,28,8,1,28,5,97,253,81,253,78,2,175,2,178,130,253,208,253,211,2,45,0,1,1,28,0,0,3,86,4,56,0,3,0,0,65,17,33,17,3,86,253,198,4,56,251,200,4,56,0,1,0,60,0,0,4,116, +2,28,0,3,0,0,65,17,33,17,4,116,251,200,2,28,253,228,2,28,0,2,0,60,0,0,4,116,2,28,0,3,0,7,0,0,65,17,33,17,5,33,21,33,4,116,251,200,3,152,253,8,2,248,2,28,253,228,2,28,160,220,0,2, +1,28,0,0,3,86,4,56,0,3,0,7,0,0,65,17,33,17,5,35,17,51,3,86,253,198,1,154,250,250,4,56,251,200,4,56,160,253,8,0,0,1,2,8,252,24,4,186,3,12,0,5,0,0,65,21,33,17,35,17,4,186,253,238, +160,3,12,160,249,172,6,244,0,1,2,8,2,108,4,186,7,208,0,5,0,0,65,17,33,21,33,17,2,168,2,18,253,78,7,208,251,60,160,5,100,0,0,1,255,246,252,24,2,168,3,12,0,5,0,0,65,17,35,17,33,53,2,168, +160,253,238,3,12,249,12,6,84,160,0,1,255,246,2,108,2,168,7,208,0,5,0,0,65,17,33,53,33,17,2,168,253,78,2,18,7,208,250,156,160,4,196,0,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,21,33,17, +35,17,33,53,33,17,2,168,2,18,253,238,160,253,238,2,18,7,208,251,60,160,249,172,6,84,160,4,196,0,0,1,255,246,252,24,4,186,3,12,0,7,0,0,65,21,33,17,35,17,33,53,4,186,253,238,160,253,238,3,12,160,249,172, +6,84,160,0,0,1,255,246,2,108,4,186,7,208,0,7,0,0,65,17,33,21,33,53,33,17,2,168,2,18,251,60,2,18,7,208,251,60,160,160,4,196,0,1,2,8,252,24,4,186,7,208,0,7,0,0,65,17,33,21,33,17,35,17, +2,168,2,18,253,238,160,7,208,251,60,160,249,172,11,184,0,1,255,246,252,24,2,168,7,208,0,7,0,0,65,17,35,17,33,53,33,17,2,168,160,253,238,2,18,7,208,244,72,6,84,160,4,196,0,1,255,246,2,108,4,186,3,12, +0,3,0,0,65,21,33,53,4,186,251,60,3,12,160,160,0,1,2,8,252,24,2,168,7,208,0,3,0,0,65,17,35,17,2,168,160,7,208,244,72,11,184,0,0,1,255,246,252,24,2,168,7,208,0,11,0,0,65,17,35,17,33,53, +33,53,33,53,33,17,2,168,160,253,238,2,18,253,238,2,18,7,208,244,72,5,180,160,160,160,4,36,0,2,255,246,252,24,3,72,7,208,0,7,0,11,0,0,65,17,35,17,33,53,33,17,33,17,35,17,2,8,160,254,142,1,114,1, +224,160,7,208,244,72,6,84,160,4,196,244,72,11,184,0,0,1,255,246,252,24,3,72,3,12,0,9,0,0,65,17,35,17,35,17,35,17,33,53,3,72,160,160,160,254,142,3,12,249,12,6,84,249,172,6,84,160,0,1,255,246,252,24, +2,168,3,172,0,9,0,0,65,17,35,17,33,53,33,53,33,53,2,168,160,253,238,2,18,253,238,3,172,248,108,5,180,160,160,160,0,3,255,246,252,24,3,72,7,208,0,5,0,9,0,15,0,0,65,17,35,17,33,53,1,17,35,17, +35,17,33,53,33,17,2,8,160,254,142,3,82,160,160,253,238,1,114,2,108,249,172,5,180,160,5,100,244,72,11,184,251,60,160,4,36,0,0,2,1,104,252,24,3,72,7,208,0,3,0,7,0,0,65,17,35,17,35,17,35,17,3,72, +160,160,160,7,208,244,72,11,184,244,72,11,184,0,0,2,255,246,252,24,3,72,3,172,0,5,0,11,0,0,65,17,35,17,33,53,1,17,35,17,33,53,3,72,160,253,78,2,18,160,254,142,3,172,248,108,6,244,160,254,192,249,172,5, +180,160,0,2,255,246,1,204,3,72,7,208,0,5,0,11,0,0,65,17,33,53,33,17,35,17,33,53,33,17,3,72,252,174,2,178,160,253,238,1,114,7,208,249,252,160,5,100,251,60,160,4,36,0,0,1,255,246,2,108,3,72,7,208, +0,9,0,0,65,17,33,53,33,17,51,17,51,17,3,72,252,174,1,114,160,160,7,208,250,156,160,4,196,251,60,4,196,0,0,1,255,246,1,204,2,168,7,208,0,9,0,0,65,17,33,53,33,53,33,53,33,17,2,168,253,78,2,18, +253,238,2,18,7,208,249,252,160,160,160,4,36,0,0,1,2,8,252,24,4,186,7,208,0,11,0,0,65,17,33,21,33,21,33,21,33,17,35,17,2,168,2,18,253,238,2,18,253,238,160,7,208,251,220,160,160,160,250,76,11,184,0,2, +1,104,252,24,4,186,7,208,0,7,0,11,0,0,65,17,33,21,33,17,35,17,35,17,35,17,3,72,1,114,254,142,160,160,160,7,208,251,60,160,249,172,11,184,244,72,11,184,0,2,1,104,1,204,4,186,7,208,0,5,0,11,0,0, +65,17,33,21,33,17,33,17,33,21,33,17,2,8,2,178,252,174,1,224,1,114,253,238,7,208,250,156,160,6,4,251,220,160,4,196,0,2,1,104,252,24,4,186,3,172,0,5,0,11,0,0,65,21,33,17,35,17,1,21,33,17,35,17, +4,186,253,78,160,3,82,254,142,160,3,172,160,249,12,7,148,254,192,160,250,76,6,84,0,3,255,246,1,204,4,186,7,208,0,5,0,9,0,15,0,0,65,17,33,21,33,17,1,21,33,53,1,17,33,53,33,17,3,72,1,114,253,238, +2,18,251,60,2,18,253,238,1,114,7,208,251,220,160,4,196,250,156,160,160,5,100,251,60,160,4,36,0,3,255,246,252,24,4,186,3,172,0,5,0,11,0,15,0,0,65,21,33,17,35,17,35,17,35,17,33,53,1,21,33,53,4,186, +254,142,160,160,160,254,142,4,196,251,60,2,108,160,250,76,6,84,249,172,5,180,160,1,64,160,160,0,0,3,1,104,252,24,4,186,7,208,0,5,0,9,0,15,0,0,65,21,33,17,35,17,3,17,35,17,33,17,33,21,33,17,4,186, +254,142,160,160,160,1,224,1,114,253,238,2,108,160,250,76,6,84,5,100,244,72,11,184,251,220,160,4,196,0,0,2,255,246,1,204,4,186,3,172,0,3,0,7,0,0,65,21,33,53,1,21,33,53,4,186,251,60,4,196,251,60,3,172, +160,160,254,192,160,160,0,4,255,246,252,24,4,186,7,208,0,5,0,11,0,17,0,23,0,0,65,21,33,17,35,17,35,17,35,17,33,53,1,17,33,53,33,17,33,17,33,21,33,17,4,186,254,142,160,160,160,254,142,2,18,253,238,1, +114,1,224,1,114,253,238,2,108,160,250,76,6,84,249,172,5,180,160,5,100,251,60,160,4,36,251,220,160,4,196,0,0,2,255,246,1,204,4,186,7,208,0,7,0,11,0,0,65,17,33,21,33,53,33,17,1,21,33,53,2,168,2,18, +251,60,2,18,2,178,251,60,7,208,251,220,160,160,4,36,250,156,160,160,0,1,255,246,2,108,4,186,7,208,0,11,0,0,65,17,33,21,33,53,33,17,51,17,51,17,3,72,1,114,251,60,1,114,160,160,7,208,251,60,160,160,4,196, +251,60,4,196,0,2,255,246,252,24,4,186,3,172,0,7,0,11,0,0,65,21,33,17,35,17,33,53,1,21,33,53,4,186,253,238,160,253,238,4,196,251,60,2,108,160,250,76,5,180,160,1,64,160,160,0,0,1,255,246,252,24,4,186, +3,12,0,11,0,0,65,21,33,17,35,17,35,17,35,17,33,53,4,186,254,142,160,160,160,254,142,3,12,160,249,172,6,84,249,172,6,84,160,0,0,1,1,104,2,108,4,186,7,208,0,9,0,0,65,17,33,21,33,17,51,17,51,17, +3,72,1,114,252,174,160,160,7,208,251,60,160,5,100,251,60,4,196,0,0,1,2,8,1,204,4,186,7,208,0,9,0,0,65,17,33,21,33,21,33,21,33,17,2,168,2,18,253,238,2,18,253,78,7,208,251,220,160,160,160,6,4,0, +0,1,2,8,252,24,4,186,3,172,0,9,0,0,65,21,33,21,33,21,33,17,35,17,4,186,253,238,2,18,253,238,160,3,172,160,160,160,250,76,7,148,0,1,1,104,252,24,4,186,3,12,0,9,0,0,65,21,33,17,35,17,35,17, +35,17,4,186,254,142,160,160,160,3,12,160,249,172,6,84,249,172,6,244,0,1,255,246,252,24,4,186,7,208,0,19,0,0,65,17,33,21,33,17,35,17,35,17,35,17,33,53,33,17,51,17,51,17,3,72,1,114,254,142,160,160,160,254, +142,1,114,160,160,7,208,251,60,160,249,172,6,84,249,172,6,84,160,4,196,251,60,4,196,0,0,1,255,246,252,24,4,186,7,208,0,19,0,0,65,17,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,17,2,168,2,18, +253,238,2,18,253,238,160,253,238,2,18,253,238,2,18,7,208,251,220,160,160,160,250,76,5,180,160,160,160,4,36,0,0,1,0,60,0,0,4,116,4,56,0,3,0,0,65,17,33,17,4,116,251,200,4,56,251,200,4,56,0,2,0,60, +0,0,4,116,4,56,0,3,0,7,0,0,65,17,33,17,5,33,17,33,4,116,251,200,3,152,253,8,2,248,4,56,251,200,4,56,160,253,8,0,0,2,0,60,0,0,4,116,4,56,0,19,0,39,0,0,65,50,30,2,21,20,14,2, +35,34,46,2,53,52,62,2,23,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,2,88,172,213,114,41,41,114,213,172,172,214,113,41,41,113,214,172,121,151,79,29,29,79,151,121,121,150,80,29,29,80,150,4,56,41,114,213,172,172, +214,113,41,41,113,214,172,172,213,114,41,160,29,80,150,121,121,151,79,29,29,79,151,121,121,150,80,29,0,3,0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,0,65,17,33,17,5,33,17,33,3,17,33,17,4,116,251,200,3,152, +253,8,2,248,160,254,72,4,56,251,200,4,56,160,253,8,2,88,254,72,1,184,0,4,0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,15,0,0,65,17,33,17,5,33,17,33,19,21,33,53,1,21,33,53,4,116,251,200,3,152, +253,8,2,248,87,252,102,3,154,252,102,4,56,251,200,4,56,160,253,8,2,96,152,152,254,208,152,152,0,4,0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,15,0,0,65,17,33,17,5,33,17,33,7,35,17,51,1,35,17,51, +4,116,251,200,3,152,253,8,2,248,152,152,152,254,208,152,152,4,56,251,200,4,56,160,253,8,81,3,154,252,102,3,154,0,0,6,0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,15,0,19,0,23,0,0,65,17,33,17,5,33, +17,33,7,35,17,51,1,35,17,51,5,21,33,53,1,21,33,53,4,116,251,200,3,152,253,8,2,248,152,152,152,254,208,152,152,2,31,252,102,3,154,252,102,4,56,251,200,4,56,160,253,8,81,3,154,252,102,3,154,233,152,152,254,208, +152,152,0,5,0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,15,0,19,0,0,65,17,33,17,5,33,17,33,55,7,1,55,1,35,1,53,5,21,1,51,4,116,251,200,3,152,253,8,2,248,86,108,252,202,107,2,36,216,254,25, +4,1,253,65,216,4,56,251,200,4,56,160,253,8,23,108,3,54,108,252,47,1,232,214,165,215,2,190,0,5,0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,15,0,19,0,0,65,17,33,17,5,33,17,33,37,1,23,1,23,1, +21,9,2,51,1,4,116,251,200,3,152,253,8,2,248,252,179,3,55,107,252,202,167,2,191,254,25,253,230,1,231,216,253,65,4,56,251,200,4,56,160,253,8,23,3,54,108,252,202,47,2,190,214,254,24,2,25,1,231,253,66,0,0,8, +0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,0,65,17,33,17,5,33,17,33,37,1,23,1,23,1,21,9,2,51,1,5,7,1,55,1,35,1,53,5,21,1,51,4,116,251,200,3,152,253, +8,2,248,252,179,3,55,107,252,202,167,2,191,254,25,253,230,1,231,216,253,65,3,210,108,252,202,107,2,36,216,254,25,4,1,253,65,216,4,56,251,200,4,56,160,253,8,23,3,54,108,252,202,47,2,190,214,254,24,2,25,1,231,253, +66,167,108,3,54,108,252,47,1,232,214,165,215,2,190,0,0,1,1,28,0,0,3,86,2,28,0,3,0,0,65,17,33,17,3,86,253,198,2,28,253,228,2,28,0,2,1,28,0,0,3,86,2,28,0,3,0,7,0,0,65,17,33,17, +5,35,21,51,3,86,253,198,1,154,250,250,2,28,253,228,2,28,160,220,0,2,0,60,0,0,4,116,4,56,0,3,0,7,0,0,65,17,33,17,5,33,17,33,4,116,251,200,3,152,254,132,1,124,4,56,251,200,4,56,160,253,8,0, +0,2,0,60,0,0,4,116,4,56,0,3,0,7,0,0,65,17,33,17,5,33,17,33,4,116,251,200,2,28,254,132,1,124,4,56,251,200,4,56,160,253,8,0,0,2,0,60,0,0,4,116,4,56,0,3,0,6,0,0,65,17,33,17, +5,1,33,4,116,251,200,3,152,253,8,2,248,4,56,251,200,4,56,160,253,8,0,2,0,60,0,0,4,116,4,56,0,3,0,6,0,0,65,17,33,17,5,33,17,4,116,251,200,3,152,253,8,4,56,251,200,4,56,160,253,8,0,3, +0,60,0,0,4,116,4,56,0,3,0,7,0,11,0,0,65,17,33,17,5,33,17,33,1,33,17,33,4,116,251,200,1,204,254,212,1,44,1,204,254,212,1,44,4,56,251,200,4,56,160,253,8,2,248,253,8,0,0,3,0,60,0,0, +4,116,4,56,0,3,0,9,0,13,0,0,65,17,33,17,5,33,17,33,17,33,1,33,17,33,4,116,251,200,3,152,254,212,254,52,2,248,254,52,254,212,1,44,4,56,251,200,4,56,160,254,52,254,212,2,248,254,212,0,0,3,0,60, +0,0,4,116,4,56,0,3,0,7,0,13,0,0,65,17,33,17,1,33,17,33,1,33,17,33,17,33,4,116,251,200,1,204,254,212,1,44,1,204,253,8,1,204,1,44,4,56,251,200,4,56,253,148,254,212,2,248,254,212,254,52,0,3, +0,60,0,0,4,116,4,56,0,3,0,9,0,13,0,0,65,17,33,17,5,33,17,33,17,33,21,33,17,33,4,116,251,200,3,152,253,8,1,44,1,204,254,212,1,44,4,56,251,200,4,56,160,253,8,1,204,160,254,212,0,3,0,60, +0,0,4,116,4,56,0,3,0,9,0,13,0,0,65,17,33,17,5,33,17,33,17,33,1,33,17,33,4,116,251,200,1,204,254,212,2,248,254,52,1,204,254,212,1,44,4,56,251,200,4,56,160,253,8,1,44,1,204,254,212,0,0,1, +0,60,0,0,4,116,4,56,0,2,0,0,65,1,33,2,88,2,28,251,200,4,56,251,200,0,255,255,0,60,0,0,4,116,4,56,6,6,5,178,0,0,0,1,0,60,0,0,4,116,4,56,0,2,0,0,73,2,4,116,253,228,253,228, +4,56,251,200,4,56,255,255,0,60,0,0,4,116,4,56,6,6,5,179,0,0,0,1,0,60,0,0,4,116,4,56,0,2,0,0,83,1,1,60,4,56,251,200,4,56,253,228,253,228,0,1,0,60,0,0,4,116,4,56,0,2,0,0, +65,17,1,4,116,251,200,4,56,251,200,2,28,0,0,1,0,60,0,0,4,116,4,56,0,2,0,0,65,17,1,4,116,251,200,4,56,251,200,4,56,0,0,1,0,60,0,0,4,116,4,56,0,2,0,0,65,17,33,4,116,251,200,4, +56,251,200,0,0,1,0,60,0,0,4,116,4,56,0,2,0,0,83,1,33,60,4,56,251,200,4,56,251,200,0,1,0,60,0,0,4,116,4,56,0,2,0,0,65,1,17,4,116,251,200,4,56,251,200,4,56,0,0,1,255,246,252,24, +4,186,3,12,0,7,0,0,65,21,33,17,33,17,33,53,4,186,254,142,254,32,254,142,3,12,160,249,172,6,84,160,0,1,255,246,252,24,3,72,3,12,0,5,0,0,65,17,33,17,33,53,3,72,254,32,254,142,3,12,249,12,6,84, +160,0,0,1,255,246,252,24,3,72,7,208,0,9,0,0,65,17,51,17,33,17,33,53,33,17,2,168,160,254,32,254,142,2,18,7,208,251,60,249,12,6,84,160,4,196,0,1,1,104,252,24,4,186,3,12,0,5,0,0,65,21,33,17, +33,17,4,186,254,142,254,32,3,12,160,249,172,6,244,0,0,1,1,104,252,24,4,186,7,208,0,9,0,0,65,17,33,21,33,17,33,17,51,17,2,168,2,18,254,142,254,32,160,7,208,251,60,160,249,172,6,244,4,196,0,1,255,246, +252,24,4,186,7,208,0,11,0,0,65,17,33,21,33,17,33,17,33,53,33,17,2,168,2,18,254,142,254,32,254,142,2,18,7,208,251,60,160,249,172,6,84,160,4,196,0,1,255,246,252,24,4,186,3,172,0,7,0,0,65,17,33,17, +35,17,33,17,4,186,253,238,160,253,238,3,172,254,32,250,76,5,180,1,224,0,0,1,255,246,252,24,2,168,3,172,0,5,0,0,65,17,35,17,33,17,2,168,160,253,238,3,172,248,108,5,180,1,224,0,0,1,255,246,252,24,3,72, +7,208,0,9,0,0,65,17,35,17,35,17,33,17,33,17,3,72,160,160,253,238,1,114,7,208,249,252,250,76,5,180,1,224,4,36,0,1,2,8,252,24,4,186,3,172,0,5,0,0,65,17,33,17,35,17,4,186,253,238,160,3,172,254, +32,250,76,7,148,0,0,1,1,104,252,24,4,186,7,208,0,9,0,0,65,17,33,17,33,17,35,17,35,17,3,72,1,114,253,238,160,160,7,208,251,220,254,32,250,76,5,180,6,4,0,1,255,246,252,24,4,186,7,208,0,11,0,0, +65,17,33,17,33,17,35,17,33,17,33,17,3,72,1,114,253,238,160,253,238,1,114,7,208,251,220,254,32,250,76,5,180,1,224,4,36,0,0,2,0,80,1,204,4,96,3,172,0,3,0,7,0,0,65,17,33,17,35,17,33,17,4,96, +254,72,160,254,72,3,172,254,32,1,224,254,32,1,224,0,0,2,1,104,254,152,3,72,7,248,0,3,0,7,0,0,65,17,33,17,1,17,33,17,3,72,254,32,1,224,254,32,2,88,252,64,3,192,5,160,252,64,3,192,0,1,1,104, +252,24,3,72,3,12,0,3,0,0,65,17,33,17,3,72,254,32,3,12,249,12,6,244,0,1,255,246,252,24,4,186,3,172,0,7,0,0,65,17,33,17,33,17,33,17,4,186,254,142,254,32,254,142,3,172,254,32,250,76,5,180,1,224, +0,1,255,246,252,24,3,72,3,172,0,5,0,0,65,17,33,17,33,17,3,72,254,32,254,142,3,172,248,108,5,180,1,224,0,1,1,104,252,24,4,186,3,172,0,5,0,0,65,17,33,17,33,17,4,186,254,142,254,32,3,172,254,32, +250,76,7,148,0,1,255,246,1,204,4,186,3,172,0,3,0,0,65,17,33,17,4,186,251,60,3,172,254,32,1,224,0,1,255,246,1,204,2,168,3,172,0,3,0,0,65,17,33,17,2,168,253,78,3,172,254,32,1,224,0,1,255,246, +1,204,4,186,3,172,0,7,0,0,65,21,33,21,33,21,33,17,2,168,2,18,253,238,253,78,3,172,160,160,160,1,224,0,0,4,0,75,1,204,4,101,3,172,0,3,0,7,0,11,0,15,0,0,65,51,17,35,1,51,17,35,1,51, +17,35,1,51,17,35,1,119,150,150,1,44,150,150,253,168,150,150,3,132,150,150,3,172,254,32,1,224,254,32,1,224,254,32,1,224,254,32,0,4,1,104,253,248,3,72,8,72,0,3,0,7,0,11,0,15,0,0,101,33,17,33,17,33, +17,33,17,33,17,33,17,33,17,33,1,104,1,224,254,32,1,224,254,32,1,224,254,32,1,224,254,32,20,253,228,4,216,253,228,4,216,253,228,4,216,253,228,0,0,1,2,8,1,204,4,186,3,172,0,3,0,0,65,17,33,17,4,186, +253,78,3,172,254,32,1,224,0,3,0,80,1,204,4,96,3,172,0,3,0,7,0,11,0,0,65,17,35,17,33,17,35,17,33,17,35,17,1,64,240,2,128,240,2,128,240,3,172,254,32,1,224,254,32,1,224,254,32,1,224,0,0,3, +1,104,253,248,3,72,8,152,0,3,0,7,0,11,0,0,65,33,17,33,17,33,17,33,17,33,17,33,1,104,1,224,254,32,1,224,254,32,1,224,254,32,1,24,252,224,6,224,252,224,6,224,252,224,0,1,1,104,2,108,3,72,7,208, +0,3,0,0,65,17,33,17,3,72,254,32,7,208,250,156,5,100,0,1,255,246,1,204,4,186,7,208,0,7,0,0,65,17,33,17,33,17,33,17,3,72,1,114,251,60,1,114,7,208,251,220,254,32,1,224,4,36,0,1,255,246,1,204, +3,72,7,208,0,5,0,0,65,17,33,17,33,17,3,72,252,174,1,114,7,208,249,252,1,224,4,36,0,1,1,104,252,24,3,72,7,208,0,7,0,0,65,17,35,17,35,17,35,17,3,72,160,160,160,7,208,250,156,249,172,6,84,5, +100,0,0,1,1,104,1,204,4,186,7,208,0,5,0,0,65,17,33,17,33,17,3,72,1,114,252,174,7,208,251,220,254,32,6,4,0,1,1,104,252,24,3,72,7,208,0,3,0,0,65,17,33,17,3,72,254,32,7,208,244,72,11,184, +0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,17,33,17,33,17,33,17,33,17,3,72,1,114,254,142,254,32,254,142,1,114,7,208,251,220,254,32,250,76,5,180,1,224,4,36,0,1,255,246,252,24,3,72,7,208,0,7, +0,0,65,17,33,17,33,17,33,17,3,72,254,32,254,142,1,114,7,208,244,72,5,180,1,224,4,36,0,1,1,104,252,24,4,186,7,208,0,7,0,0,65,17,33,17,33,17,33,17,3,72,1,114,254,142,254,32,7,208,251,220,254,32, +250,76,11,184,0,1,255,246,252,24,4,186,7,208,0,13,0,0,65,17,51,21,33,21,33,17,33,17,33,17,33,17,2,168,160,1,114,254,142,254,32,254,142,2,18,7,208,251,220,160,160,249,172,5,180,1,224,4,36,0,0,1,255,246, +252,24,4,186,3,172,0,9,0,0,65,21,33,21,33,17,35,17,33,17,2,168,2,18,253,238,160,253,238,3,172,160,160,249,172,5,180,1,224,0,0,1,255,246,1,204,4,186,7,208,0,9,0,0,65,17,33,21,33,21,33,17,33,17, +2,168,2,18,253,238,253,78,2,18,7,208,251,60,160,160,1,224,4,36,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,21,33,17,35,17,33,17,33,17,2,168,2,18,253,238,160,253,238,2,18,7,208,251,60,160,249,172, +5,180,1,224,4,36,0,1,255,246,252,24,4,186,3,172,0,9,0,0,65,17,33,17,33,17,33,53,33,53,4,186,254,142,254,32,254,142,1,114,3,172,254,32,250,76,6,84,160,160,0,1,255,246,1,204,4,186,7,208,0,9,0,0, +65,17,33,17,33,53,33,53,33,17,3,72,1,114,252,174,254,142,1,114,7,208,251,220,254,32,160,160,4,196,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,17,33,17,33,17,33,53,33,17,3,72,1,114,254,142,254,32, +254,142,1,114,7,208,251,220,254,32,250,76,6,84,160,4,196,0,0,1,255,246,252,24,4,186,7,208,0,13,0,0,65,17,33,21,33,21,35,17,35,17,33,17,33,17,3,72,1,114,254,142,160,160,253,238,1,114,7,208,251,60,160,160, +250,76,5,180,1,224,4,36,255,255,255,181,253,133,4,251,7,45,6,38,5,228,0,0,0,6,5,229,0,0,255,255,255,186,253,133,4,251,7,45,4,71,5,229,4,176,0,0,192,0,64,0,0,1,255,181,253,133,4,246,7,45,0,3, +0,0,65,23,1,39,4,102,144,251,80,145,7,45,71,246,159,72,0,2,0,80,2,108,4,96,3,12,0,3,0,7,0,0,65,21,33,53,35,21,33,53,4,96,254,72,160,254,72,3,12,160,160,160,160,0,0,2,2,8,253,248,2,168, +8,152,0,3,0,7,0,0,65,17,35,17,19,17,35,17,2,168,160,160,160,2,248,251,0,5,0,5,160,251,0,5,0,0,0,1,2,8,252,24,2,168,3,12,0,3,0,0,65,17,35,17,2,168,160,3,12,249,12,6,244,0,0,1, +255,246,2,108,2,168,3,12,0,3,0,0,65,21,33,53,2,168,253,78,3,12,160,160,0,1,255,246,1,204,4,186,3,172,0,7,0,0,65,17,33,53,33,53,33,53,4,186,253,78,253,238,2,18,3,172,254,32,160,160,160,0,0,4, +0,75,2,108,4,101,3,12,0,3,0,7,0,11,0,15,0,0,65,51,21,35,37,51,21,35,37,51,21,35,37,51,21,35,1,119,150,150,1,44,150,150,253,168,150,150,3,132,150,150,3,12,160,160,160,160,160,160,160,0,0,4,2,8, +253,248,2,168,8,72,0,3,0,7,0,11,0,15,0,0,101,51,17,35,17,51,17,35,17,51,17,35,17,51,17,35,2,8,160,160,160,160,160,160,160,160,20,253,228,4,216,253,228,4,216,253,228,4,216,253,228,0,0,1,2,8,2,108, +4,186,3,12,0,3,0,0,65,21,33,53,4,186,253,78,3,12,160,160,0,3,0,80,2,108,4,96,3,12,0,3,0,7,0,11,0,0,65,21,35,53,33,21,35,53,33,21,35,53,1,64,240,2,128,240,2,128,240,3,12,160,160,160, +160,160,160,0,0,3,2,8,253,248,2,168,8,152,0,3,0,7,0,11,0,0,65,51,17,35,17,51,17,35,17,51,17,35,2,8,160,160,160,160,160,160,1,24,252,224,6,224,252,224,6,224,252,224,0,1,2,8,2,108,2,168,7,208, +0,3,0,0,65,17,35,17,2,168,160,7,208,250,156,5,100,0,0,1,1,104,252,24,3,72,7,208,0,7,0,0,65,17,51,17,33,17,51,17,2,168,160,254,32,160,7,208,251,60,249,12,6,244,4,196,0,1,255,246,252,24,4,186, +7,208,0,13,0,0,65,17,33,17,33,17,33,17,33,53,33,53,51,17,2,168,2,18,254,142,254,32,254,142,1,114,160,7,208,251,220,254,32,250,76,6,84,160,160,4,36,0,0,1,255,246,252,24,4,186,3,172,0,9,0,0,65,17, +33,17,35,17,33,53,33,53,4,186,253,238,160,253,238,2,18,3,172,254,32,250,76,6,84,160,160,0,0,1,255,246,1,204,4,186,7,208,0,9,0,0,65,17,33,17,33,53,33,53,33,17,2,168,2,18,253,78,253,238,2,18,7,208, +251,220,254,32,160,160,4,196,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,17,33,17,35,17,33,53,33,17,2,168,2,18,253,238,160,253,238,2,18,7,208,251,220,254,32,250,76,6,84,160,4,196,0,1,255,246,252,24, +4,186,3,172,0,9,0,0,65,21,33,21,33,17,33,17,33,17,3,72,1,114,254,142,254,32,254,142,3,172,160,160,249,172,5,180,1,224,0,1,255,246,1,204,4,186,7,208,0,9,0,0,65,17,33,21,33,21,33,17,33,17,3,72, +1,114,254,142,252,174,1,114,7,208,251,60,160,160,1,224,4,36,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,21,33,17,33,17,33,17,33,17,3,72,1,114,254,142,254,32,254,142,1,114,7,208,251,60,160,249,172,5, +180,1,224,4,36,0,0,1,255,246,252,24,4,186,7,208,0,13,0,0,65,17,33,17,33,17,35,17,35,53,33,53,33,17,3,72,1,114,253,238,160,160,254,142,1,114,7,208,251,220,254,32,250,76,5,180,160,160,4,196,0,1,255,246, +252,24,4,186,7,208,0,11,0,0,65,17,33,21,33,17,35,17,33,53,33,17,3,72,1,114,253,238,160,253,238,1,114,7,208,251,60,160,249,172,6,84,160,4,196,0,0,1,255,246,2,108,4,186,7,208,0,7,0,0,65,17,33,21, +33,53,33,17,3,72,1,114,251,60,1,114,7,208,251,60,160,160,4,196,0,1,255,246,252,24,3,72,7,208,0,9,0,0,65,17,35,17,35,17,33,53,33,17,3,72,160,160,253,238,1,114,7,208,250,156,249,172,6,84,160,4,196,0, +0,1,255,246,2,108,3,72,7,208,0,5,0,0,65,17,33,53,33,17,3,72,252,174,1,114,7,208,250,156,160,4,196,0,0,1,1,104,252,24,4,186,7,208,0,9,0,0,65,17,33,21,33,17,35,17,35,17,3,72,1,114,253,238, +160,160,7,208,251,60,160,249,172,6,84,5,100,0,0,1,1,104,2,108,4,186,7,208,0,5,0,0,65,17,33,21,33,17,3,72,1,114,252,174,7,208,251,60,160,5,100,0,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17, +33,17,33,17,33,17,33,17,33,17,2,168,2,18,254,142,254,32,254,142,2,18,7,208,251,220,254,32,250,76,5,180,1,224,4,36,0,1,255,246,1,204,4,186,7,208,0,7,0,0,65,17,33,17,33,17,33,17,2,168,2,18,251,60, +2,18,7,208,251,220,254,32,1,224,4,36,0,1,255,246,252,24,3,72,7,208,0,9,0,0,65,17,51,17,33,17,33,17,33,17,2,168,160,254,32,254,142,2,18,7,208,251,220,248,108,5,180,1,224,4,36,0,0,1,255,246,1,204, +2,168,7,208,0,5,0,0,65,17,33,17,33,17,2,168,253,78,2,18,7,208,249,252,1,224,4,36,0,1,1,104,252,24,4,186,7,208,0,9,0,0,65,17,33,17,33,17,33,17,51,17,2,168,2,18,254,142,254,32,160,7,208,251, +220,254,32,250,76,7,148,4,36,0,0,1,2,8,1,204,4,186,7,208,0,5,0,0,65,17,33,17,33,17,2,168,2,18,253,78,7,208,251,220,254,32,6,4,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,21,33,17, +33,17,33,53,33,17,3,72,1,114,254,142,254,32,254,142,1,114,7,208,251,60,160,249,172,6,84,160,4,196,0,1,255,246,252,24,3,72,7,208,0,7,0,0,65,17,33,17,33,53,33,17,3,72,254,32,254,142,1,114,7,208,244,72, +6,84,160,4,196,0,0,1,1,104,252,24,4,186,7,208,0,7,0,0,65,17,33,21,33,17,33,17,3,72,1,114,254,142,254,32,7,208,251,60,160,249,172,11,184,0,0,1,255,246,252,24,4,186,7,208,0,11,0,0,65,17,33,17, +33,17,35,17,33,17,33,17,2,168,2,18,253,238,160,253,238,2,18,7,208,251,220,254,32,250,76,5,180,1,224,4,36,0,0,1,255,246,252,24,2,168,7,208,0,7,0,0,65,17,35,17,33,17,33,17,2,168,160,253,238,2,18,7, +208,244,72,5,180,1,224,4,36,0,0,1,2,8,252,24,4,186,7,208,0,7,0,0,65,17,33,17,33,17,35,17,2,168,2,18,253,238,160,7,208,251,220,254,32,250,76,11,184,0,0,1,2,8,252,24,4,186,3,12,0,14,0,0, +65,21,35,34,6,6,21,17,35,17,52,62,2,51,4,186,150,104,173,103,160,84,149,195,112,3,12,160,103,173,104,251,40,4,216,112,195,149,84,0,0,1,255,246,252,24,2,168,3,12,0,14,0,0,83,50,30,2,21,17,35,17,52,38, +38,35,35,53,140,112,195,149,84,160,103,173,104,150,3,12,84,149,195,112,251,40,4,216,104,173,103,160,0,1,255,246,2,108,2,168,9,96,0,14,0,0,67,53,51,50,54,54,53,17,51,17,20,14,2,35,10,150,104,173,103,160,84,149, +195,112,2,108,160,103,173,104,4,216,251,40,112,195,149,84,0,1,2,8,2,108,4,186,9,96,0,14,0,0,65,34,46,2,53,17,51,17,20,22,22,51,51,21,4,36,112,195,149,84,160,103,173,104,150,2,108,84,149,195,112,4,216,251, +40,104,173,103,160,0,0,2,0,65,0,5,4,111,4,51,0,3,0,7,0,0,65,17,33,17,5,33,17,33,4,111,251,210,3,138,253,26,2,230,4,51,251,210,4,46,144,252,242,0,0,3,0,65,0,5,4,111,5,1,0,6,0,10, +0,14,0,0,65,19,51,1,35,3,51,1,17,33,17,5,33,17,33,2,78,249,174,254,186,193,177,175,2,131,251,210,3,138,253,26,2,230,1,229,3,28,252,38,1,218,1,50,251,210,4,46,144,252,242,0,0,3,0,65,0,5,4,111, +4,51,0,11,0,15,0,19,0,0,65,23,7,23,7,39,7,39,55,39,55,23,1,17,33,17,5,33,17,33,3,73,110,242,242,110,241,245,110,246,246,110,245,2,23,251,210,3,138,253,26,2,230,3,127,110,241,245,110,246,246,110,245,241, +110,242,1,166,251,210,4,46,144,252,242,0,0,8,0,0,0,46,4,176,4,54,0,20,0,41,0,61,0,71,0,83,0,104,0,116,0,136,0,0,65,50,22,22,21,20,6,7,21,7,7,33,39,39,53,38,38,53,52,54,54,3,23,7, +6,6,35,34,38,53,52,55,39,34,38,53,52,54,51,50,22,23,3,50,22,23,23,21,39,6,35,34,38,53,52,54,55,55,38,53,52,54,5,34,6,7,21,55,23,53,38,38,39,34,6,21,20,22,51,50,54,53,52,38,1,23,54,54, +51,50,22,21,20,6,35,7,22,21,20,6,35,34,38,39,39,3,34,6,21,20,22,51,50,54,53,52,38,37,50,22,21,20,7,23,22,22,21,20,6,35,34,39,7,53,55,54,54,2,90,92,146,84,26,30,52,86,254,254,86,50,31,27, +85,146,177,52,140,6,29,33,24,28,10,26,27,43,31,25,20,40,34,68,39,32,7,56,102,60,38,19,35,38,28,26,16,22,1,248,16,43,11,70,68,10,41,165,31,47,47,31,35,45,45,1,127,142,35,42,19,26,28,41,27,28,12,30, +24,33,29,6,138,72,34,46,46,34,32,48,48,1,46,23,21,16,26,27,37,34,18,38,62,102,56,8,32,4,54,80,138,88,48,108,48,104,36,150,150,36,104,48,108,48,88,138,80,253,34,84,86,51,77,34,22,13,27,48,33,25,21,29, +15,17,1,212,75,41,32,110,42,38,22,22,26,32,4,54,19,27,17,31,174,60,30,58,14,14,58,30,60,164,45,35,33,49,49,33,35,45,254,132,78,17,15,29,21,25,33,48,24,16,22,34,77,51,86,1,208,45,35,33,49,49,33,35, +45,10,31,17,27,19,54,4,32,26,22,22,38,34,102,32,41,75,0,3,0,161,0,171,4,15,4,52,0,3,0,7,0,11,0,0,65,21,33,53,1,21,33,53,1,21,33,53,4,15,252,146,3,110,252,146,3,110,252,146,4,52,145,145, +253,9,146,146,1,123,145,145,0,4,0,161,0,171,4,15,4,52,0,3,0,7,0,11,0,15,0,0,65,21,33,53,1,21,33,53,1,21,33,53,1,21,33,53,1,244,254,173,3,110,252,146,3,110,252,146,3,110,254,173,4,52,145,145, +253,9,146,146,1,123,145,145,1,124,145,145,0,4,0,161,0,171,4,15,4,52,0,3,0,7,0,11,0,15,0,0,65,21,33,53,1,21,33,53,1,21,33,53,33,21,33,53,4,15,252,146,3,110,252,146,1,83,254,173,3,110,254,173, +4,52,145,145,253,9,146,146,1,123,145,145,145,145,0,5,0,161,0,171,4,15,4,52,0,3,0,7,0,11,0,15,0,19,0,0,65,21,33,53,1,21,33,53,1,21,33,53,33,21,33,53,1,21,33,53,1,244,254,173,3,110,252,146, +1,83,254,173,3,110,254,173,1,83,254,173,4,52,145,145,253,9,146,146,1,123,145,145,145,145,1,124,145,145,0,4,0,161,0,171,4,15,4,52,0,3,0,7,0,11,0,15,0,0,65,21,33,53,1,21,33,53,1,21,33,53,1,21, +33,53,4,15,252,146,1,83,254,173,3,110,252,146,3,110,254,173,4,52,145,145,253,9,146,146,1,123,145,145,254,132,145,145,0,5,0,161,0,171,4,15,4,52,0,3,0,7,0,11,0,15,0,19,0,0,65,21,33,53,1,21,33,53, +1,21,33,53,1,21,33,53,1,21,33,53,1,244,254,173,1,83,254,173,3,110,252,146,3,110,254,173,1,83,254,173,4,52,145,145,253,9,146,146,1,123,145,145,1,124,145,145,253,9,146,146,0,5,0,161,0,171,4,15,4,52,0,3, +0,7,0,11,0,15,0,19,0,0,65,21,33,53,1,21,33,53,1,21,33,53,5,21,33,53,1,21,33,53,4,15,252,146,1,83,254,173,1,83,254,173,3,110,254,173,1,83,254,173,4,52,145,145,253,9,146,146,1,123,145,145,1,144, +144,254,134,146,146,0,0,6,0,161,0,171,4,15,4,52,0,3,0,7,0,11,0,15,0,19,0,23,0,0,65,21,33,53,1,21,33,53,1,21,33,53,5,21,33,53,1,21,33,53,1,21,33,53,1,244,254,173,1,83,254,173,1,83, +254,173,3,110,254,173,1,83,254,173,1,83,254,173,4,52,145,145,253,9,146,146,1,123,145,145,1,144,144,254,134,146,146,2,247,145,145,0,0,5,0,60,0,0,4,116,4,54,0,19,0,35,0,47,0,63,0,75,0,0,65,50,30,2, +21,20,14,2,35,34,46,2,53,52,62,2,1,35,38,38,35,34,6,7,35,62,2,51,50,22,22,1,50,22,21,20,6,35,34,38,53,52,54,55,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,23,50,22,21,20,6,35,34,38, +53,52,54,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,1,142,88,19,93,86,85,93,20,88,9,76,122,79,79,122,76,254,71,42,54,54,42,42,54,54,206,120,191,111,111,191,120,118,191,113,113,191,38,42,54,54,42,42, +54,54,4,54,83,148,195,112,112,196,149,83,83,149,196,112,112,195,148,83,252,218,78,100,100,78,73,122,73,73,122,1,181,52,38,40,54,54,40,38,52,192,119,197,118,120,198,118,118,198,120,118,197,119,192,52,38,40,54,54,40,38,52,0, +0,5,0,60,0,0,4,116,4,54,0,19,0,35,0,47,0,63,0,75,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,1,14,2,35,34,38,38,39,51,22,22,51,50,54,55,1,50,22,21,20,6,35,34,38,53,52, +54,55,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,23,50,22,21,20,6,35,34,38,53,52,54,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,1,142,9,76,122,79,79,122,76,9,88,20,93,85,86,93,19,254, +150,42,54,54,42,42,54,54,206,120,191,111,111,191,120,118,191,113,113,191,38,42,54,54,42,42,54,54,4,54,83,148,195,112,112,196,149,83,83,149,196,112,112,195,148,83,253,170,73,122,73,73,122,73,78,100,100,78,1,46,52,38,40,54, +54,40,38,52,192,119,197,118,120,198,118,118,198,120,118,197,119,192,52,38,40,54,54,40,38,52,0,4,0,60,0,0,4,116,4,54,0,19,0,35,0,47,0,59,0,0,65,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,1,35, +6,6,35,34,38,39,35,30,2,51,50,54,54,1,34,6,21,20,22,51,50,54,53,52,38,33,34,6,21,20,22,51,50,54,53,52,38,2,88,112,195,149,84,84,149,195,112,112,196,149,83,83,149,196,1,150,86,19,103,86,85,103,20,86, +9,80,126,79,79,126,80,254,53,42,54,54,42,42,54,54,1,42,42,54,54,42,42,54,54,4,54,83,148,195,112,112,196,149,83,83,149,196,112,112,195,148,83,253,160,78,100,100,78,73,121,72,72,121,1,139,52,38,40,54,54,40,38,52, +52,38,40,54,54,40,38,52,0,2,0,60,0,0,4,116,4,30,0,42,0,54,0,0,65,21,22,22,23,55,23,7,22,23,51,21,35,6,7,23,7,39,6,7,21,35,53,38,39,7,39,55,38,38,39,35,53,51,54,55,39,55,23,54, +54,55,53,19,34,6,21,20,22,51,50,54,53,52,38,2,136,38,68,30,162,72,162,50,12,222,222,12,46,158,72,158,63,77,96,81,59,158,72,158,21,31,6,222,222,12,48,160,72,160,30,69,39,48,96,122,122,96,96,124,124,4,30,214, +4,29,21,164,72,160,62,82,94,80,58,156,72,160,42,12,220,220,12,42,160,72,156,30,69,39,94,80,64,160,72,164,21,29,4,214,254,210,128,96,96,126,126,96,96,128,0,2,1,22,0,0,3,152,4,54,0,24,0,36,0,0,65,50, +22,22,21,20,6,7,21,51,21,35,21,35,53,35,53,51,53,38,38,53,52,54,54,23,34,6,21,20,22,51,50,54,53,52,38,2,86,89,146,87,156,116,192,192,96,192,192,117,157,86,145,89,96,122,122,96,96,124,124,4,54,84,143,89, +121,168,17,166,80,210,210,80,164,17,170,121,89,143,84,92,128,96,96,126,126,96,96,128,0,2,0,120,0,0,4,56,3,206,0,31,0,43,0,0,65,5,19,7,39,38,55,39,1,22,22,21,20,6,6,35,34,38,38,53,52,54,54,51, +50,22,23,1,39,6,39,39,3,34,6,21,20,22,51,50,54,53,52,38,2,118,1,172,22,88,10,3,9,4,254,216,35,39,87,146,89,89,145,86,86,145,89,48,89,37,1,48,2,44,50,200,182,96,122,122,96,96,124,124,3,206,22,254, +84,4,198,49,47,2,254,210,42,103,59,89,140,81,81,140,89,89,143,84,27,23,1,46,4,3,3,8,254,156,128,96,96,126,126,96,96,128,0,1,0,140,0,0,4,36,4,54,0,24,0,0,65,30,2,21,20,6,35,34,39,19,33,23, +33,55,33,19,6,35,34,38,53,52,54,54,2,88,142,206,112,106,90,148,80,32,1,56,80,252,104,80,1,56,32,80,148,90,106,112,206,4,54,131,203,176,90,96,114,132,254,242,130,130,1,14,132,114,96,90,176,203,0,1,0,140,0,0, +4,36,4,54,0,40,0,0,65,50,22,21,20,6,7,54,54,51,50,22,21,20,6,35,34,39,19,33,23,33,55,33,19,6,35,34,38,53,52,54,51,50,22,23,38,38,53,52,54,2,88,108,132,67,41,39,50,45,96,98,118,90,139,77, +32,1,56,80,252,104,80,1,56,32,80,136,90,118,98,96,45,50,39,40,68,132,4,54,94,96,81,90,33,17,11,124,110,93,117,132,254,242,130,130,1,14,132,117,93,110,124,11,17,33,90,81,96,94,0,1,0,100,0,0,4,76,4,54, +0,19,0,0,65,50,22,21,20,2,2,7,38,2,2,53,52,54,51,50,22,23,54,54,3,100,110,122,133,227,140,140,227,133,123,109,104,119,45,45,120,4,54,147,101,117,254,255,254,222,166,166,1,33,1,1,118,101,147,106,98,98,106,0, +0,1,0,208,255,232,3,224,4,54,0,3,0,0,73,3,2,88,1,136,254,120,254,120,4,54,253,222,253,212,2,44,0,1,0,143,0,0,4,80,5,97,0,6,0,0,101,1,51,1,35,1,51,2,43,1,120,173,254,60,193,254,196,175, +191,4,162,250,159,3,100,0,255,255,0,14,1,194,4,163,3,152,4,47,0,1,0,0,1,202,21,31,0,47,0,14,1,144,1,202,21,31,0,15,0,56,3,32,1,202,21,31,255,255,0,59,0,0,4,117,5,97,4,71,6,91,0,0, +5,97,64,0,192,0,255,255,1,8,1,194,3,186,3,152,4,47,0,13,0,200,1,202,21,31,0,15,0,90,2,88,1,202,21,31,0,2,0,19,255,75,4,147,5,119,0,51,0,66,0,0,65,50,30,3,21,20,2,6,35,34,46,2, +55,35,14,2,35,34,38,38,53,16,54,51,50,22,23,17,20,22,22,51,50,62,2,53,52,46,2,35,34,6,7,39,54,36,19,34,6,21,20,22,22,51,50,54,54,55,17,38,38,2,55,155,213,135,73,28,47,126,121,62,90,58,26,1, +8,18,67,108,80,109,133,60,208,184,70,128,84,38,64,39,47,52,22,4,32,90,170,138,97,229,128,96,134,1,25,25,137,100,29,70,60,70,81,43,12,31,61,5,119,93,162,213,239,123,252,254,179,165,60,91,97,36,46,89,59,118,208,132, +1,5,255,30,45,253,177,108,113,42,94,168,223,128,143,249,188,106,71,113,112,117,101,253,128,198,194,98,149,85,64,83,29,2,6,16,14,0,0,2,0,107,255,233,4,123,5,117,0,37,0,50,0,0,65,50,22,23,7,38,38,35,34,6, +21,20,22,22,51,33,21,35,17,14,2,35,34,38,38,53,52,54,55,53,46,2,53,52,54,54,1,35,34,6,6,21,20,22,22,51,50,54,55,2,46,90,162,82,101,51,109,75,105,106,66,112,68,2,44,179,30,105,164,116,156,197,93,163, +151,91,105,45,92,170,1,117,248,104,130,61,59,125,101,84,133,41,5,117,58,90,92,58,56,113,89,61,105,64,132,253,224,39,86,61,120,189,103,155,198,31,6,21,89,117,62,89,149,91,253,78,97,143,72,72,130,80,55,51,0,1,0,85, +254,88,4,89,5,97,0,15,0,0,65,17,7,17,35,17,7,17,46,2,53,52,54,54,51,4,89,154,225,154,164,221,110,115,226,167,5,97,249,13,22,6,125,249,153,22,3,233,1,107,180,109,112,183,108,0,0,2,0,212,255,117,3,217, +5,119,0,53,0,67,0,0,65,50,22,23,7,38,38,35,34,6,21,20,22,22,23,22,22,21,20,6,7,22,22,21,20,6,6,35,34,38,39,55,22,22,51,50,54,53,52,38,38,39,38,38,53,52,54,55,38,38,53,52,54,54,3,6, +6,21,20,22,22,23,54,54,53,52,38,38,2,121,110,159,66,81,59,121,84,85,106,39,107,101,163,143,94,66,54,65,99,173,113,110,169,65,82,59,127,84,85,116,40,106,101,163,146,96,66,56,63,103,172,53,46,50,55,149,138,46,50,55, +148,5,119,59,48,115,41,45,78,64,45,62,55,34,54,134,118,81,129,40,41,106,71,90,131,69,61,49,113,42,44,75,66,46,61,54,33,55,134,119,81,128,41,41,107,68,91,131,70,253,202,38,91,42,58,67,61,51,38,91,44,55,66,63, +0,3,0,59,0,249,4,117,5,213,0,15,0,42,0,58,0,0,65,50,22,18,21,20,2,6,35,34,38,2,53,52,18,54,23,50,22,23,7,38,38,35,34,6,21,20,22,51,50,54,55,23,6,6,35,34,38,53,52,54,54,55,34,6, +6,21,20,22,22,51,50,54,54,53,52,38,38,2,90,172,240,127,127,240,172,172,243,128,128,243,179,77,104,53,71,39,78,40,79,109,104,84,54,83,35,66,42,116,84,142,185,90,149,79,145,191,95,95,191,145,144,191,94,95,190,5,213,167, +254,229,172,172,254,229,167,167,1,27,172,172,1,27,167,242,39,39,96,32,28,123,141,133,126,38,32,97,36,57,195,184,124,168,86,142,140,237,145,144,237,139,139,237,144,145,237,140,0,4,0,93,1,222,4,81,5,213,0,16,0,32,0,45, +0,53,0,0,65,50,22,22,21,20,6,6,35,34,38,38,53,52,62,2,23,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38,7,50,21,20,6,7,23,35,39,35,21,35,17,23,35,21,51,50,54,53,52,2,88,140,230,135,135,230, +140,140,231,136,78,140,184,105,115,183,105,105,183,115,115,181,105,105,181,144,246,77,57,172,132,152,56,114,173,59,63,58,64,5,213,138,231,141,140,229,136,136,229,140,106,184,141,79,94,112,189,115,114,187,111,111,187,114,115,189,112,127,169,64, +78,16,236,217,217,2,51,87,172,41,49,82,0,1,0,25,2,85,4,135,5,97,0,26,0,0,65,19,35,3,38,38,55,35,3,35,3,35,22,6,7,3,35,19,35,17,35,17,35,53,33,19,19,4,105,30,122,20,1,2,1,6,92,131, +115,6,3,1,2,17,115,28,213,125,198,2,212,104,86,5,97,252,244,1,206,47,101,50,253,182,2,74,47,101,47,254,47,2,156,253,100,2,156,112,253,206,2,50,0,2,0,131,3,103,3,12,5,218,0,15,0,29,0,0,65,50,22,22, +21,20,6,6,35,34,38,38,53,52,54,54,23,34,6,6,21,20,22,22,51,50,54,53,52,38,1,199,84,148,93,93,148,84,82,148,94,94,148,82,45,82,51,51,82,45,70,108,108,5,218,73,140,100,100,141,73,74,140,102,99,139,73,119, +41,85,66,67,87,42,95,99,98,96,0,3,0,59,0,146,4,117,4,204,0,3,0,19,0,35,0,0,119,1,23,1,1,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,23,34,6,6,21,20,22,22,51,50,54,54,53,52,38,38, +59,3,222,92,252,34,1,193,127,206,124,124,206,127,127,206,123,122,207,127,88,143,86,86,143,88,87,144,86,86,144,238,3,222,92,252,34,3,230,124,207,126,127,207,123,123,207,127,126,207,124,140,86,144,87,88,143,86,86,143,88,87,144,86, +0,1,2,13,253,168,2,163,7,8,0,3,0,0,65,17,35,17,2,163,150,7,8,246,160,9,96,0,0,2,2,12,255,53,2,162,6,77,0,3,0,7,0,0,65,17,35,17,19,17,35,17,2,162,150,150,150,6,77,253,58,2,198,251, +174,253,58,2,198,0,0,1,0,173,255,233,3,199,5,218,0,38,0,0,69,34,38,53,17,52,54,51,50,22,21,20,14,2,15,2,39,55,62,2,53,52,35,34,6,21,17,20,22,51,50,54,55,23,6,6,2,181,140,170,169,152,124,139, +58,121,188,129,98,134,66,218,153,179,77,105,82,66,98,76,47,86,43,46,43,127,23,155,137,3,32,209,220,145,112,95,178,171,172,91,66,105,86,174,123,197,189,112,132,151,157,252,216,78,65,20,17,123,21,33,0,1,0,181,0,0,3,251, +5,73,0,11,0,0,65,17,33,21,33,17,35,17,33,53,33,17,2,169,1,82,254,174,162,254,174,1,82,5,73,254,200,142,252,125,3,131,142,1,56,0,0,1,0,181,0,0,3,251,5,73,0,19,0,0,65,17,33,21,33,17,33,21, +33,17,35,17,33,53,33,17,33,53,33,17,2,169,1,82,254,174,1,82,254,174,162,254,174,1,82,254,174,1,82,5,73,254,184,142,254,92,142,254,191,1,65,142,1,164,142,1,72,0,0,2,0,42,255,232,4,142,5,122,0,25,0,33, +0,0,65,50,22,22,23,17,33,17,22,22,51,50,54,55,51,6,6,35,34,38,38,39,17,62,2,23,34,7,17,33,17,38,38,2,92,181,233,127,21,252,160,53,152,103,138,197,51,98,58,234,194,172,234,136,24,21,127,233,183,196,108,2, +86,46,155,5,122,128,212,126,254,244,253,246,43,51,103,91,115,155,119,205,128,1,252,126,212,128,78,84,254,18,1,236,38,48,0,4,0,56,0,0,4,143,5,122,0,20,0,24,0,40,0,52,0,0,65,17,35,3,35,30,3,21,17,35, +17,51,19,51,52,38,38,53,17,1,21,33,53,19,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,23,34,6,21,20,22,51,50,54,53,52,38,2,93,218,218,8,1,7,8,6,127,220,215,8,11,11,2,163,254,22,244,97,115,49, +50,114,97,97,116,50,51,116,96,60,43,43,60,61,42,44,5,97,250,159,4,153,9,92,138,162,81,253,73,5,97,251,97,11,138,215,125,2,182,251,43,140,140,4,238,110,198,135,130,200,112,109,199,134,130,200,113,115,165,163,165,163,163,165, +163,165,255,255,0,64,1,202,4,130,3,144,4,47,0,13,0,0,1,202,21,31,0,47,0,24,1,144,1,202,21,31,0,15,0,58,3,32,1,202,21,31,0,1,0,100,254,150,4,76,255,144,0,7,0,0,83,53,51,21,33,53,51,21, +100,155,2,178,155,254,150,250,108,108,250,0,0,3,255,211,255,233,4,40,5,218,0,3,0,21,0,35,0,0,83,39,1,23,1,54,54,51,50,22,22,21,20,6,6,35,34,39,7,35,17,55,19,50,54,53,52,38,38,35,34,6,7,17, +22,22,18,63,2,128,60,254,226,58,151,91,141,174,80,96,185,136,183,104,12,147,168,238,132,142,56,111,81,88,133,43,41,125,3,223,107,1,50,107,254,131,76,83,136,247,165,159,249,142,132,109,5,197,21,250,151,204,211,138,183,91,105,64, +253,246,62,74,0,2,255,246,0,184,4,79,5,13,0,26,0,33,0,0,83,30,2,51,50,54,54,53,52,38,38,39,55,30,2,21,20,14,2,35,34,38,38,39,5,1,7,17,33,7,1,240,12,100,155,93,100,165,99,83,141,88,5,126, +202,118,78,138,182,105,130,218,139,12,1,209,254,160,224,2,46,225,1,97,2,128,89,144,84,98,165,101,91,154,102,13,139,13,141,216,129,105,182,138,78,120,204,128,28,1,96,225,2,46,224,254,159,0,255,255,0,42,1,194,4,117,3,152, +4,47,0,14,0,0,1,202,21,31,0,47,0,1,1,144,1,202,21,31,0,15,0,65,3,32,1,202,21,31,255,255,0,242,1,194,3,211,3,152,4,47,0,14,0,200,1,202,21,31,0,15,0,86,2,88,1,202,21,31,0,1,0,38, +2,205,4,138,5,55,0,5,0,0,65,1,7,1,1,39,2,88,2,50,101,254,51,254,51,101,5,55,254,8,114,1,146,254,110,114,255,255,0,55,1,202,4,123,3,144,4,47,0,20,0,0,1,202,21,31,0,47,0,58,1,144,1,202, +21,31,0,15,0,24,3,32,1,202,21,31,255,255,0,55,1,202,4,130,3,144,4,47,0,20,0,0,1,202,21,31,0,47,0,58,3,32,1,202,21,31,0,15,0,24,1,144,1,202,21,31,0,3,0,0,0,0,4,176,5,97,0,3, +0,7,0,11,0,0,115,35,1,51,1,35,1,21,1,53,1,51,204,149,3,175,149,253,125,150,3,78,251,80,2,187,148,5,97,250,159,4,211,217,252,145,218,3,252,0,255,255,0,55,1,194,4,125,3,152,4,47,0,20,0,0,1,202, +21,31,0,47,0,14,1,144,1,202,21,31,0,15,3,148,3,32,1,202,21,31,255,255,0,55,1,194,4,118,3,152,4,47,0,20,0,0,1,202,21,31,0,47,0,14,1,144,1,202,21,31,0,15,3,145,3,32,1,202,21,31,255,255, +0,55,1,194,4,107,3,152,4,47,0,20,0,0,1,202,21,31,0,47,0,14,1,144,1,202,21,31,0,15,3,147,3,32,1,202,21,31,255,255,0,55,1,194,4,101,3,152,4,47,0,20,0,0,1,202,21,31,0,47,0,14,1,144, +1,202,21,31,0,15,3,146,3,32,1,202,21,31,0,17,255,98,255,226,5,78,5,214,0,19,0,26,0,36,0,46,0,52,0,62,0,72,0,81,0,89,0,97,0,105,0,114,0,123,0,131,0,141,0,151,0,160,0,0,65,50,4,22, +18,21,20,2,6,4,35,34,36,38,2,53,52,18,54,36,3,6,7,22,22,23,38,3,33,22,22,23,54,54,55,38,38,5,6,6,7,22,22,23,50,22,51,17,33,22,23,54,55,23,17,50,54,51,54,54,55,38,38,1,6,6,7,33, +54,54,55,38,38,1,6,6,7,54,54,55,38,38,1,6,6,7,33,53,38,38,1,33,21,22,22,23,54,54,1,6,7,22,22,23,54,54,1,33,6,6,7,22,23,54,54,1,34,7,6,6,7,22,22,23,5,6,6,7,21,33,38,38, +1,17,54,54,55,38,38,39,38,34,1,6,6,7,22,22,23,33,38,38,1,22,22,23,54,54,55,38,38,2,88,158,1,18,209,117,117,209,254,238,158,157,254,237,209,117,117,209,1,19,193,94,70,68,179,103,117,141,254,252,5,65,54,42, +93,51,21,26,1,121,58,121,59,38,109,69,5,11,6,254,206,6,40,126,134,80,6,13,7,68,109,37,58,123,253,113,54,65,5,1,4,3,26,21,51,93,3,96,33,95,56,104,177,67,34,85,253,73,19,24,3,1,50,66,131,2,73,254, +204,66,134,64,20,23,254,3,210,140,36,83,45,35,94,3,135,254,250,1,26,21,97,87,56,66,253,48,16,6,69,109,38,59,121,58,1,88,64,134,66,1,52,1,23,254,228,59,123,58,37,109,68,7,13,2,0,42,92,50,21,26,1,1, +6,4,66,254,64,56,95,33,45,85,34,67,177,5,214,119,209,254,236,158,157,254,235,209,119,119,209,1,21,157,158,1,20,209,119,251,142,31,47,76,110,24,123,1,249,102,184,78,26,44,18,63,140,207,1,20,17,90,163,75,2,2,136,134, +120,36,6,68,254,144,2,75,163,90,17,20,2,203,76,185,101,74,138,64,18,43,253,19,82,146,60,24,110,76,24,39,2,169,60,126,68,210,3,23,254,204,212,1,23,18,59,128,2,255,52,158,24,39,17,83,146,253,129,73,140,63,35,53, +78,184,3,52,2,73,165,90,15,20,3,24,18,24,2,210,68,126,1,196,254,144,3,19,16,90,165,73,2,254,228,25,43,18,64,138,74,101,185,1,86,61,146,83,17,39,24,77,108,0,255,255,1,27,1,202,3,208,3,144,4,47,0,24, +0,200,1,202,21,31,0,15,0,64,2,88,1,202,21,31,255,255,0,83,1,202,4,151,3,144,4,47,0,24,0,0,1,202,21,31,0,47,0,97,1,144,1,202,21,31,0,15,0,119,3,32,1,202,21,31,255,255,0,83,1,194,4,145, +3,152,4,47,0,24,0,0,1,202,21,31,0,47,0,71,1,144,1,202,21,31,0,15,0,97,3,32,1,202,21,31,255,255,0,83,1,202,4,132,3,144,4,47,0,24,0,0,1,202,21,31,0,47,0,97,1,144,1,202,21,31,0,15, +0,13,3,32,1,202,21,31,255,255,0,83,1,88,4,167,3,152,4,47,0,24,0,0,1,202,21,31,0,47,0,65,1,144,1,202,21,31,0,15,0,85,3,32,1,202,21,31,255,255,0,83,1,194,4,151,3,152,4,47,0,24,0,0, +1,202,21,31,0,47,0,90,1,144,1,202,21,31,0,15,0,14,3,32,1,202,21,31,255,255,1,35,1,194,3,186,3,152,4,47,0,34,0,200,1,202,21,31,0,15,0,90,2,88,1,202,21,31,255,255,1,35,1,202,3,191,3,144, +4,47,0,34,0,200,1,202,21,31,0,15,0,34,2,88,1,202,21,31,255,255,0,230,1,194,3,186,3,152,4,47,0,35,0,200,1,202,21,31,0,15,0,90,2,88,1,202,21,31,0,3,255,208,255,201,4,224,5,157,0,29,0,49, +0,65,0,0,65,51,21,3,37,55,23,7,5,5,23,7,39,37,19,21,35,53,19,5,7,39,55,37,37,39,55,23,5,3,19,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,39,50,54,54,53,52,38,38,35,34,6,6,21,20, +22,22,2,25,125,6,1,89,183,64,185,254,157,1,96,186,63,188,254,173,6,125,7,254,166,182,64,182,1,101,254,151,178,64,181,1,91,7,62,117,204,156,89,89,156,204,117,117,205,156,88,88,156,205,117,125,206,122,122,206,125,124,205,123, +123,205,5,157,227,254,90,218,110,106,112,209,207,113,106,113,214,254,103,236,238,1,152,219,109,106,112,208,213,108,106,108,220,1,163,251,196,89,155,205,117,117,205,156,88,88,156,205,117,117,205,155,89,114,122,206,124,125,205,122,122,205,125,124, +206,122,255,255,0,255,1,202,3,201,3,144,4,47,0,40,0,200,1,202,21,31,0,15,0,97,2,88,1,202,21,31,0,2,0,80,0,0,4,96,4,54,0,4,0,9,0,0,65,1,17,33,17,1,1,17,33,17,2,86,2,10,251,240, +2,6,254,134,2,248,4,54,254,50,253,152,2,104,1,24,254,170,254,88,1,168,0,4,0,0,255,232,4,176,6,128,0,6,0,16,0,20,0,27,0,0,65,1,33,17,33,17,33,1,21,20,6,35,33,34,38,53,53,5,33,21,33,3, +1,51,17,33,17,51,2,88,2,88,254,174,253,244,254,174,3,94,55,45,254,188,45,55,1,174,254,176,1,80,168,254,130,214,1,80,214,6,128,253,172,253,210,2,46,253,10,234,45,55,55,45,234,84,162,5,192,254,134,253,204,2,52,0, +0,2,255,96,0,56,5,80,5,66,0,15,0,27,0,0,65,50,22,21,17,20,6,35,33,34,38,53,17,52,54,51,5,1,1,7,1,1,23,1,1,55,1,1,4,236,45,55,55,45,250,216,45,55,55,45,3,160,254,244,254,244,134,1, +12,254,244,134,1,12,1,12,134,254,244,1,12,5,66,55,45,251,190,45,55,55,45,4,66,45,55,232,254,242,1,14,138,254,246,254,244,134,1,12,254,244,134,1,12,1,10,0,0,2,254,232,0,56,5,80,5,66,0,10,0,22,0,0, +65,50,22,21,17,20,6,35,33,1,1,5,1,1,7,1,1,23,1,1,55,1,1,4,236,45,55,55,45,252,164,253,88,2,168,2,116,254,244,254,244,134,1,12,254,244,134,1,12,1,12,134,254,244,1,12,5,66,55,45,251,190,45,55, +2,136,2,130,232,254,242,1,14,138,254,246,254,244,134,1,12,254,244,134,1,12,1,10,0,2,255,96,0,56,5,200,5,66,0,10,0,22,0,0,73,2,33,34,38,53,17,52,54,51,5,1,1,7,1,1,23,1,1,55,1,1,3,32, +2,168,253,88,252,164,45,55,55,45,3,0,254,244,254,244,134,1,12,254,244,134,1,12,1,12,134,254,244,1,12,5,66,253,126,253,120,55,45,4,66,45,55,232,254,242,1,14,138,254,246,254,244,134,1,12,254,244,134,1,12,1,10,0, +0,4,0,30,255,227,4,146,4,205,0,2,0,12,0,16,0,19,0,0,65,1,33,5,17,20,6,35,33,34,38,53,17,5,33,21,33,1,1,33,2,88,2,58,251,140,4,92,60,45,252,142,45,60,3,207,252,166,3,90,254,83,254,178, +2,156,4,205,253,72,184,254,239,45,60,60,45,1,17,109,155,3,197,254,103,0,0,9,255,106,0,76,5,130,4,242,0,15,0,31,0,47,0,63,0,79,0,95,0,111,0,127,0,150,0,0,65,50,22,21,17,20,6,35,33,34,38,53, +17,52,54,51,1,35,34,6,21,21,20,22,51,51,50,54,53,53,52,38,1,33,34,6,21,21,20,22,51,33,50,54,53,53,52,38,1,35,34,6,21,21,20,22,51,51,50,54,53,53,52,38,1,35,34,6,21,21,20,22,51,51,50,54, +53,53,52,38,3,35,34,6,21,21,20,22,51,51,50,54,53,53,52,38,1,35,34,6,21,21,20,22,51,51,50,54,53,53,52,38,3,35,34,6,21,21,20,22,51,51,50,54,53,53,52,38,33,35,34,6,21,21,20,22,51,50,22,21, +17,20,22,51,51,50,54,53,17,52,38,5,30,45,55,55,45,250,176,45,55,55,45,1,32,148,16,24,24,16,148,17,23,23,3,47,252,152,16,24,24,16,3,104,17,23,23,252,95,148,16,24,24,16,148,17,23,23,1,151,148,16,24,24, +16,148,17,23,23,97,148,16,24,24,16,148,17,23,23,1,151,148,16,24,24,16,148,17,23,23,97,148,16,24,24,16,148,17,23,23,1,129,188,16,24,24,16,17,23,24,16,108,17,23,23,4,242,55,45,252,34,45,55,55,45,3,222,45, +55,254,22,23,17,148,16,24,24,16,148,17,23,254,182,23,17,148,16,24,24,16,148,17,23,2,158,23,17,148,16,24,24,16,148,17,23,254,172,23,17,148,16,24,24,16,148,17,23,1,84,23,17,148,16,24,24,16,148,17,23,254,172,23, +17,148,16,24,24,16,148,17,23,1,84,23,17,148,16,24,24,16,148,17,23,23,17,148,16,24,23,17,254,252,16,24,24,16,1,232,17,23,0,2,0,59,0,0,4,117,5,97,0,7,0,11,0,0,83,33,1,33,21,33,1,33,37,33, +21,33,59,1,147,1,122,1,45,254,108,254,134,254,212,2,183,1,131,254,125,5,97,251,41,138,4,214,139,141,255,255,0,169,254,241,4,7,5,182,4,71,6,93,0,0,4,190,64,0,192,0,0,3,0,169,255,8,4,7,5,205,0,6, +0,10,0,14,0,0,83,1,1,33,17,35,17,1,33,21,33,17,33,21,33,169,1,175,1,175,254,160,158,254,210,2,250,253,6,2,250,253,6,3,202,2,3,253,252,251,63,4,193,253,55,139,1,243,139,0,0,2,255,231,0,81,4,201, +5,45,0,39,0,91,0,0,65,17,20,22,51,50,54,53,52,38,35,33,34,6,21,20,22,51,50,54,53,17,52,38,35,34,6,21,20,22,51,33,50,54,53,52,38,35,34,6,7,52,54,54,51,50,22,22,21,20,6,6,35,33,34,38, +38,53,52,54,54,51,50,22,22,21,17,20,6,6,35,34,38,38,53,52,54,54,51,33,50,22,22,21,20,6,6,35,34,38,38,53,3,71,76,54,55,76,76,55,253,30,55,76,76,55,54,76,76,54,55,76,76,55,2,226,55,76,76,55, +54,76,125,69,116,70,71,116,69,69,116,71,253,30,71,116,69,69,116,71,70,117,68,68,117,70,71,116,69,69,116,71,2,226,71,116,69,69,116,71,70,116,69,4,45,253,36,55,76,76,55,54,76,76,54,55,76,76,55,2,220,55,76,76, +55,54,76,76,54,55,76,76,55,71,116,69,69,116,71,70,116,69,69,116,70,71,116,69,69,116,71,253,36,71,116,69,69,116,71,70,117,68,68,117,70,71,116,69,69,116,71,0,0,2,255,196,0,30,4,236,5,220,0,17,0,26,0,0, +65,50,22,21,17,20,6,35,33,17,1,1,17,51,17,52,54,51,5,33,17,33,53,1,1,53,33,4,136,45,55,55,45,253,144,253,172,2,84,206,55,45,1,70,254,176,254,126,254,134,1,122,2,210,5,220,55,45,252,102,45,55,254,164, +2,84,2,86,254,164,2,12,45,55,88,253,142,222,254,130,254,130,222,0,255,255,1,33,1,202,3,191,3,144,4,47,0,58,0,200,1,202,21,31,0,15,0,34,2,88,1,202,21,31,255,255,0,55,1,202,4,163,3,144,4,47,0,65, +0,0,1,202,21,31,0,47,0,1,1,144,1,202,21,31,0,15,0,56,3,32,1,202,21,31,255,255,0,255,1,202,3,186,3,144,4,47,0,65,0,200,1,202,21,31,0,15,0,58,2,88,1,202,21,31,255,255,0,55,1,194,4,130, +3,144,4,47,0,65,0,0,1,202,21,31,0,47,0,102,1,144,1,202,21,31,0,15,0,58,3,32,1,202,21,31,0,3,0,38,1,131,4,138,5,58,0,3,0,7,0,13,0,0,83,33,21,33,21,33,21,33,37,1,7,1,1,39, +48,4,80,251,176,4,80,251,176,2,40,2,50,101,254,51,254,51,101,5,58,138,150,138,93,254,7,113,1,146,254,110,113,0,0,2,0,38,1,198,4,138,5,58,0,3,0,9,0,0,83,33,21,33,5,1,7,1,1,39,48,4,80,251, +176,2,40,2,50,101,254,51,254,51,101,5,58,138,129,254,8,113,1,145,254,111,113,0,255,255,1,11,1,194,3,186,3,152,4,47,0,86,0,200,1,202,21,31,0,15,0,90,2,88,1,202,21,31,255,255,0,229,1,194,3,160,3,152, +4,47,0,90,0,200,1,202,21,31,0,15,0,43,2,88,1,202,21,31,255,255,0,229,1,194,3,197,3,152,4,47,0,90,0,200,1,202,21,31,0,15,0,71,2,88,1,202,21,31,255,255,0,229,1,194,3,200,3,152,4,47,0,90, +0,200,1,202,21,31,0,15,0,83,2,88,1,202,21,31,255,255,0,29,1,194,4,117,3,152,4,47,0,90,0,0,1,202,21,31,0,47,0,71,1,144,1,202,21,31,0,15,0,40,3,32,1,202,21,31,255,255,0,29,1,194,4,151, +3,152,4,47,0,90,0,0,1,202,21,31,0,47,0,97,1,144,1,202,21,31,0,15,0,119,3,32,1,202,21,31,255,255,0,29,1,194,4,132,3,152,4,47,0,90,0,0,1,202,21,31,0,47,0,102,1,144,1,202,21,31,0,15, +0,13,3,32,1,202,21,31,255,255,0,207,255,233,3,253,5,119,4,71,3,231,4,176,0,0,192,0,64,0,255,255,0,29,1,194,4,117,3,152,4,47,0,90,0,0,1,202,21,31,0,47,0,120,1,144,1,202,21,31,0,15,0,65, +3,32,1,202,21,31,255,255,0,116,255,235,3,249,5,121,4,15,3,147,4,96,5,98,192,0,255,255,0,134,255,235,3,234,5,98,4,15,3,146,4,96,5,98,192,0,255,255,0,248,1,194,3,186,3,152,4,47,0,102,0,200,1,202, +21,31,0,15,0,90,2,88,1,202,21,31,255,255,0,216,1,202,3,201,3,144,4,47,0,113,0,200,1,202,21,31,0,15,0,97,2,88,1,202,21,31,0,3,0,83,255,244,4,250,5,131,0,35,0,48,0,58,0,0,65,50,22,22, +21,20,6,7,1,54,54,55,23,6,6,7,23,7,39,6,6,35,34,38,38,53,52,54,55,46,2,53,52,54,54,23,34,6,21,20,22,22,23,54,54,53,52,38,3,6,6,21,20,22,51,50,54,55,2,2,104,155,86,157,134,1,116,39, +60,23,140,34,84,51,241,122,206,80,210,146,123,193,111,148,130,64,87,44,82,156,111,92,105,29,70,62,114,115,110,145,103,106,160,125,110,156,63,5,131,78,137,87,122,169,79,254,158,80,175,104,43,123,200,84,225,81,196,90,106,91,167,111, +133,183,81,63,105,110,68,86,142,83,116,113,80,47,79,88,62,65,130,83,91,100,253,138,64,143,94,113,138,83,73,0,0,3,0,83,255,244,4,250,5,131,0,27,0,40,0,50,0,0,65,50,22,22,21,20,6,7,1,7,39,6,6,35, +34,38,38,53,52,54,55,46,2,53,52,54,54,23,34,6,21,20,22,22,23,54,54,53,52,38,3,6,6,21,20,22,51,50,54,55,2,2,104,155,86,157,134,2,194,122,206,80,210,146,123,193,111,148,130,64,87,44,82,156,111,92,105,29, +70,62,114,115,110,145,103,106,160,125,110,156,63,5,131,78,137,87,122,169,79,253,98,81,196,90,106,91,167,111,133,183,81,63,105,110,68,86,142,83,116,113,80,47,79,88,62,65,130,83,91,100,253,138,64,143,94,113,138,83,73,0,0,2, +255,253,254,68,4,179,5,113,0,70,0,85,0,0,69,6,46,2,53,35,14,2,35,34,38,38,53,52,54,51,50,22,23,17,20,22,22,51,50,62,2,53,52,2,38,35,34,6,6,2,21,20,18,22,51,50,54,55,23,6,6,35,34,38, +38,2,53,52,18,54,54,51,50,22,22,18,21,20,14,3,1,34,6,6,21,22,22,51,50,54,54,55,17,38,38,3,211,70,75,32,7,7,16,58,93,70,95,113,51,176,161,61,107,73,12,38,36,26,35,19,7,77,193,173,130,172,99,42, +81,193,169,46,127,42,66,64,154,63,166,231,141,65,65,141,231,166,167,230,141,65,13,30,51,77,254,116,79,83,29,1,43,79,60,63,31,10,28,36,95,1,63,91,88,23,39,79,51,103,180,115,227,230,34,39,253,254,62,99,58,84,132,147, +61,242,1,87,183,107,201,254,227,178,240,254,171,180,24,29,132,47,27,130,242,1,80,206,200,1,80,249,138,132,244,254,174,206,72,159,147,119,70,3,57,72,148,113,127,145,47,65,24,1,196,13,4,0,0,1,1,109,0,92,3,67,2,62, +0,11,0,0,65,21,51,21,35,21,35,53,35,53,51,53,2,154,169,169,130,171,171,2,62,180,123,179,179,123,180,0,0,1,1,111,1,9,3,65,1,134,0,3,0,0,65,21,33,53,3,65,254,46,1,134,125,125,0,2,1,109,0,149, +3,65,2,3,0,3,0,7,0,0,65,21,33,53,5,21,33,53,3,65,254,44,1,212,254,44,2,3,126,126,240,126,126,0,0,4,252,31,255,233,4,23,5,117,0,37,0,50,0,88,0,101,0,0,65,50,22,23,7,38,38,35,34,6, +21,20,22,22,51,33,21,33,17,14,2,35,34,38,38,53,52,54,55,53,46,2,53,52,54,54,1,35,34,6,6,21,20,22,22,51,50,54,55,1,50,22,23,7,38,38,35,34,6,21,20,22,22,51,33,21,35,17,14,2,35,34,38,38, +53,52,54,55,53,46,2,53,52,54,54,1,35,34,6,6,21,20,22,22,51,50,54,55,253,226,90,162,82,101,51,109,75,105,106,66,112,68,3,84,254,37,30,105,164,116,156,197,93,163,151,91,105,45,92,170,1,117,248,104,130,61,59,125, +101,84,133,41,2,231,90,162,82,101,51,109,75,105,106,66,112,68,2,44,179,30,105,164,116,156,197,93,163,151,91,105,45,92,170,1,117,248,104,130,61,59,125,101,84,133,41,5,117,58,90,92,58,56,113,89,61,105,64,132,253,224,39,86, +61,120,189,103,155,198,31,6,21,89,117,62,89,149,91,253,78,97,143,72,72,130,80,55,51,4,154,58,90,92,58,56,113,89,61,105,64,132,253,224,39,86,61,120,189,103,155,198,31,6,21,89,117,62,89,149,91,253,78,97,143,72,72,130, +80,55,51,0,255,255,253,183,254,237,3,167,6,139,4,70,4,64,0,0,192,0,64,0,255,255,253,184,255,25,2,120,6,95,4,70,4,65,0,0,192,0,64,0,255,255,254,77,253,168,1,179,7,8,4,39,6,51,252,64,0,0,0,7, +6,51,255,16,0,0,255,255,248,173,253,168,2,163,7,8,4,39,6,51,251,80,0,0,0,39,6,51,246,160,0,0,2,6,6,51,0,0,0,4,245,201,255,77,1,235,5,144,0,3,0,7,0,13,0,16,0,0,65,17,35,17,33,17, +35,17,33,1,21,1,35,17,19,1,1,246,97,152,4,48,152,4,8,4,130,251,126,152,152,3,242,252,14,5,144,249,189,6,67,249,189,6,67,253,57,172,253,48,6,67,250,114,2,112,2,109,0,3,250,23,255,77,2,79,5,144,0,3, +0,9,0,12,0,0,65,17,35,17,33,1,21,1,35,17,19,1,1,250,175,152,3,182,4,130,251,126,152,152,3,242,252,14,5,144,249,189,6,67,253,57,172,253,48,6,67,250,114,2,112,2,109,0,0,2,253,153,255,77,2,179,5,144, +0,5,0,8,0,0,65,1,21,1,35,17,19,1,1,254,49,4,130,251,126,152,152,3,242,252,14,5,144,253,57,172,253,48,6,67,250,114,2,112,2,109,0,4,252,110,254,206,4,2,6,161,0,42,0,50,0,57,0,64,0,0,65,17, +30,2,23,21,46,2,39,17,30,3,21,20,14,2,7,21,35,53,6,38,38,39,53,30,2,55,17,38,38,53,52,54,54,55,17,19,17,62,2,53,52,38,3,6,6,21,20,22,23,1,1,21,1,55,1,1,254,203,81,172,164,68,120,181, +134,50,76,152,128,78,65,118,158,93,135,86,138,146,100,118,161,126,65,175,191,81,163,122,135,67,115,70,138,249,82,105,77,110,2,108,3,82,253,27,44,2,41,253,62,6,161,254,220,8,46,69,44,177,77,87,42,6,254,40,25,76,108,145, +92,95,159,121,76,13,197,191,3,19,56,52,180,70,66,17,3,2,124,58,183,139,81,150,107,12,1,36,251,211,253,188,14,66,125,100,81,147,2,175,14,112,84,70,98,45,1,137,253,243,172,254,45,217,1,79,1,179,0,1,252,55,0,155, +3,201,4,67,0,19,0,0,65,17,35,17,33,53,33,17,51,17,33,17,51,17,33,21,33,17,35,17,254,88,157,254,124,1,132,157,3,75,157,1,137,254,119,157,2,39,254,116,1,140,141,1,143,254,113,1,143,254,113,141,254,116,1,140, +0,1,247,235,0,155,3,101,4,67,0,27,0,0,65,17,35,17,33,17,35,17,33,53,33,17,51,17,33,17,51,17,33,17,51,17,33,21,33,17,35,17,253,244,157,252,181,157,254,124,1,132,157,3,75,157,3,75,157,1,137,254,119,157, +2,39,254,116,1,140,254,116,1,140,141,1,143,254,113,1,143,254,113,1,143,254,113,141,254,116,1,140,0,2,251,211,0,9,3,158,4,214,0,6,0,18,0,0,83,1,21,1,53,1,1,37,17,33,21,33,17,35,17,33,53,33,17,76, +3,82,252,174,2,194,253,62,254,12,1,237,254,19,157,254,24,1,232,4,214,253,243,172,253,236,181,1,180,1,179,130,254,13,141,254,16,1,240,141,1,243,0,2,252,35,1,103,3,221,3,116,0,3,0,7,0,0,65,21,33,53,1,21, +33,53,3,221,248,70,7,186,248,70,3,116,145,145,254,133,146,146,0,3,247,115,0,171,3,221,4,52,0,3,0,7,0,11,0,0,65,21,33,53,1,21,33,53,1,21,33,53,3,221,243,150,12,106,243,150,12,106,243,150,4,52,145,145, +253,9,146,146,1,123,145,145,0,3,253,191,255,65,2,104,5,129,0,3,0,7,0,12,0,0,65,1,23,1,3,1,23,1,3,55,1,21,39,253,191,4,73,59,251,184,23,4,73,59,251,183,96,60,4,72,59,1,153,1,225,130,254,25, +254,184,1,225,130,254,25,5,184,136,254,24,161,31,0,2,251,255,0,89,3,158,4,139,0,6,0,13,0,0,83,1,21,1,39,1,1,37,1,21,1,39,1,1,42,3,116,252,141,68,3,25,252,231,252,91,3,116,252,141,68,3,25,252, +231,4,139,254,60,170,254,60,129,1,152,1,151,130,254,60,170,254,60,129,1,152,1,151,0,3,247,179,0,89,3,58,4,139,0,6,0,13,0,20,0,0,67,1,21,1,39,1,1,37,1,21,1,39,1,1,37,1,21,1,39,1,1,58, +3,116,252,141,68,3,25,252,231,252,91,3,116,252,141,68,3,25,252,231,252,91,3,116,252,141,68,3,25,252,231,4,139,254,60,170,254,60,129,1,152,1,151,130,254,60,170,254,60,129,1,152,1,151,130,254,60,170,254,60,129,1,152,1, +151,0,0,4,242,29,255,233,3,183,5,97,0,15,0,19,0,23,0,35,0,0,65,23,1,14,2,7,33,21,33,22,22,23,1,7,1,5,53,33,21,1,3,35,3,19,50,22,21,20,6,35,34,38,53,52,54,244,61,124,254,227,27,36, +36,29,2,91,253,164,37,63,29,1,29,124,253,224,5,188,11,222,243,66,17,151,20,97,58,77,77,58,57,76,76,4,211,106,254,198,30,37,29,19,148,24,59,32,254,198,106,2,97,74,148,148,3,57,252,101,3,155,251,148,78,55,56,79, +79,56,55,78,0,2,252,100,0,9,4,88,4,238,0,6,0,21,0,0,67,21,1,1,21,1,53,1,51,3,37,23,5,1,7,1,1,39,1,37,55,5,74,253,62,2,194,252,174,5,57,178,20,1,234,51,254,17,1,75,147,254,218,254, +246,151,1,49,254,5,60,1,232,4,214,179,254,79,254,75,180,2,20,172,2,37,253,249,176,170,138,254,116,114,1,177,254,91,104,1,138,138,169,178,0,3,248,24,0,9,3,58,4,238,0,6,0,13,0,28,0,0,65,21,1,1,21,1, +53,1,1,21,1,53,1,1,37,51,3,37,23,5,1,7,1,1,39,1,37,55,5,251,106,253,62,2,194,252,174,7,208,3,82,252,174,2,194,253,62,253,105,178,20,1,234,51,254,17,1,75,147,254,218,254,246,151,1,49,254,5,60,1, +232,4,214,179,254,79,254,75,180,2,20,172,2,13,253,243,172,253,236,181,1,180,1,179,201,253,249,176,170,138,254,116,114,1,177,254,91,104,1,138,138,169,178,0,255,255,253,77,255,77,2,103,5,144,4,70,6,130,0,0,192,0,64,0, +255,255,249,1,255,77,1,57,5,144,4,71,6,129,251,80,0,0,192,0,64,0,255,255,244,181,255,77,0,215,5,144,4,71,6,128,246,160,0,0,192,0,64,0,0,3,248,224,255,53,2,114,5,167,0,6,0,13,0,17,0,0,65,21, +1,1,21,1,53,1,1,21,1,53,1,1,3,17,35,17,252,119,252,249,3,7,252,105,5,247,3,155,252,101,3,11,252,245,228,150,5,1,178,254,35,254,33,179,2,61,172,2,56,253,200,172,253,192,182,1,223,1,222,1,87,249,142,6, +114,0,0,4,252,60,254,206,3,208,6,161,0,42,0,50,0,57,0,64,0,0,65,17,30,2,23,21,46,2,39,17,30,3,21,20,14,2,7,21,35,53,6,38,38,39,53,30,2,55,17,38,38,53,52,54,54,55,17,19,17,62,2,53, +52,38,3,6,6,21,20,22,23,1,7,1,1,21,1,53,1,235,81,172,164,68,120,181,134,50,76,152,128,78,65,118,158,93,135,86,138,146,100,118,161,126,65,175,191,81,162,123,135,67,115,70,138,249,82,105,77,110,253,215,30,253,175,2, +194,252,174,6,161,254,220,8,46,69,44,177,77,87,42,6,254,40,25,76,108,145,92,95,159,121,76,13,197,191,3,19,56,52,180,70,66,17,3,2,124,58,183,139,81,150,107,12,1,36,251,211,253,188,14,66,125,100,81,147,2,175,14,112, +84,70,98,45,1,86,198,254,149,254,75,180,2,20,172,0,0,5,248,84,254,206,3,58,6,161,0,42,0,50,0,57,0,64,0,71,0,0,65,17,30,2,23,21,46,2,39,17,30,3,21,20,14,2,7,21,35,53,6,38,38,39,53,30, +2,55,17,38,38,53,52,54,54,55,17,19,17,62,2,53,52,38,3,6,6,21,20,22,23,1,7,1,1,21,1,53,1,1,21,1,55,1,1,254,3,81,172,164,68,120,181,134,50,76,152,128,78,65,118,158,93,135,86,138,146,100,118,161, +126,65,175,191,81,163,122,135,67,115,70,138,249,82,105,77,110,253,215,30,253,175,2,194,252,174,7,148,3,82,253,27,44,2,41,253,62,6,161,254,220,8,46,69,44,177,77,87,42,6,254,40,25,76,108,145,92,95,159,121,76,13,197,191, +3,19,56,52,180,70,66,17,3,2,124,58,183,139,81,150,107,12,1,36,251,211,253,188,14,66,125,100,81,147,2,175,14,112,84,70,98,45,1,86,198,254,149,254,75,180,2,20,172,2,13,253,243,172,254,45,217,1,79,1,179,0,0,2, +252,100,0,9,4,45,4,214,0,6,0,18,0,0,67,21,1,1,21,1,53,1,17,33,21,33,17,35,17,33,53,33,17,74,253,62,2,194,252,174,5,220,1,237,254,19,157,254,24,1,232,4,214,179,254,79,254,75,180,2,20,172,1,222, +254,13,141,254,16,1,240,141,1,243,0,3,248,24,0,9,3,58,4,214,0,6,0,13,0,25,0,0,65,21,1,1,21,1,53,1,1,21,1,53,1,1,37,17,33,21,33,17,35,17,33,53,33,17,251,106,253,62,2,194,252,174,7,208, +3,82,252,174,2,194,253,62,254,12,1,237,254,19,157,254,24,1,232,4,214,179,254,79,254,75,180,2,20,172,2,13,253,243,172,253,236,181,1,180,1,179,130,254,13,141,254,16,1,240,141,1,243,0,255,255,253,152,255,65,2,65,5,129, +4,70,6,137,0,0,192,0,64,0,0,2,252,100,255,219,3,158,5,5,0,5,0,9,0,0,81,1,21,1,1,53,9,3,3,158,252,98,252,100,3,156,3,14,252,242,252,244,5,5,253,196,172,253,190,2,66,172,253,197,1,228,1,224, +254,32,255,255,252,98,0,89,4,1,4,139,4,70,6,138,0,0,192,0,64,0,255,255,248,22,0,89,3,157,4,139,4,71,6,139,251,80,0,0,192,0,64,0,255,255,252,134,0,17,3,83,4,211,4,15,6,162,0,0,4,228,192,0, +255,255,248,24,0,66,3,58,4,164,4,39,4,196,247,104,0,0,0,39,4,195,255,56,0,0,0,7,6,163,253,168,0,0,255,255,246,228,0,17,3,247,4,211,4,71,6,164,251,80,0,0,192,0,64,0,0,2,252,0,254,215,3,127, +6,83,0,6,0,10,0,0,67,23,1,1,7,1,53,1,39,1,23,255,81,253,62,3,199,90,252,3,3,253,136,3,132,134,4,164,129,254,79,253,171,123,2,123,172,252,14,61,7,63,66,0,0,3,248,24,254,215,3,58,6,83,0,6, +0,13,0,17,0,0,67,1,21,1,39,1,1,5,23,1,1,7,1,53,1,39,1,23,243,4,45,253,9,91,2,194,252,18,252,93,81,253,62,3,199,90,252,3,3,253,136,3,132,134,5,94,253,107,172,254,37,124,1,180,2,109,59,129, +254,79,253,171,123,2,123,172,252,14,61,7,63,66,255,255,252,71,1,195,3,183,3,28,4,15,4,63,0,0,4,228,192,0,0,2,251,167,255,75,4,147,5,119,0,88,0,103,0,0,65,50,30,3,21,20,2,6,35,34,46,2,55,35, +14,2,35,34,38,38,53,16,54,51,50,22,23,17,20,22,22,51,50,62,2,53,52,46,2,35,34,14,2,7,14,2,7,14,2,35,34,46,2,35,34,6,7,39,62,2,51,50,30,2,51,50,54,55,62,3,55,62,3,19,17,38,38,35, +34,6,21,20,22,22,51,50,54,54,2,55,155,213,135,73,28,47,126,121,62,90,58,26,1,8,18,67,108,80,109,133,60,208,184,70,128,84,38,64,39,47,52,22,4,32,90,170,138,26,114,139,132,44,54,77,52,18,30,83,122,89,70,103, +83,81,47,65,94,39,120,30,82,123,89,75,105,82,76,46,62,97,39,14,40,53,71,43,54,157,166,140,56,31,61,36,137,100,29,70,60,70,81,43,5,119,93,162,213,239,123,252,254,179,165,60,91,97,36,46,89,59,118,208,132,1,5,255, +30,45,253,177,108,113,42,94,168,223,128,143,249,188,106,7,27,58,52,64,162,140,34,57,117,79,60,80,60,97,72,59,59,118,78,60,80,60,98,72,24,101,128,131,54,69,77,36,8,251,92,2,6,16,14,198,194,98,149,85,64,83,0,2, +252,173,0,17,3,122,4,211,0,44,0,57,0,0,65,22,22,51,50,62,3,51,50,30,3,51,50,62,3,23,21,14,4,35,34,46,3,35,34,14,3,35,34,38,38,39,9,2,39,1,54,54,55,53,38,38,39,1,253,60,34,106,54,41, +63,60,71,97,68,69,96,71,60,63,41,41,60,58,70,100,72,51,70,58,64,90,68,69,96,71,60,63,41,41,63,60,71,96,69,73,140,104,20,4,173,2,32,253,224,124,1,29,41,50,37,37,50,41,254,227,2,245,67,95,40,60,60,40, +40,60,60,40,35,52,50,33,2,161,5,36,48,46,30,43,63,63,43,40,60,60,40,79,110,49,2,36,253,159,253,159,106,1,58,44,48,23,148,23,48,44,1,58,0,1,252,129,1,200,3,127,3,33,0,45,0,0,65,23,14,2,35,34, +46,2,35,34,14,2,35,34,46,2,35,34,6,7,39,62,2,51,50,30,2,51,50,62,2,51,50,30,2,51,50,54,3,7,120,29,84,122,89,70,103,83,81,47,47,80,81,101,71,70,103,83,81,47,65,94,39,120,30,82,123,89,75,105, +82,76,46,46,75,79,104,76,75,105,82,76,46,62,98,3,3,62,57,117,79,60,80,60,60,80,60,60,80,60,97,72,59,59,118,78,60,80,60,60,80,60,60,80,60,98,0,2,247,89,0,17,4,108,4,211,0,92,0,105,0,0,65,50, +62,3,23,21,14,4,35,34,46,3,35,34,14,3,35,34,46,3,35,34,14,3,35,34,46,3,35,34,14,3,35,34,38,38,39,55,22,22,51,50,62,3,51,50,30,3,51,50,62,3,51,50,30,3,51,50,62,3,51,50,30,3,19,1, +1,39,1,54,54,55,53,38,38,39,1,2,10,40,61,56,70,97,71,49,68,57,64,89,68,69,97,70,60,64,40,41,63,60,71,96,69,68,96,71,61,64,40,42,63,60,71,95,69,69,97,70,60,64,40,41,63,60,71,96,69,73,140,104, +20,143,34,104,56,41,62,61,70,97,69,69,96,71,60,63,41,40,64,59,72,96,69,68,96,71,61,63,41,41,62,61,70,97,69,68,97,71,60,63,107,2,32,253,224,124,1,29,41,50,37,37,50,41,254,227,2,83,35,52,50,33,2,166, +4,36,45,45,30,43,63,63,43,40,60,60,40,36,53,53,36,39,56,57,38,43,63,63,43,40,60,60,40,79,110,49,70,67,95,40,60,60,40,40,60,60,40,40,60,60,40,40,60,60,40,40,60,60,40,40,60,60,40,2,128,253,159,253, +159,106,1,58,44,48,23,148,23,48,44,1,58,0,0,2,252,71,1,103,3,121,5,239,0,8,0,12,0,0,67,33,21,33,1,1,35,1,51,1,53,33,21,41,3,162,251,250,254,151,254,241,180,1,122,150,1,28,4,6,3,116,145,2, +117,254,38,2,113,251,120,146,146,0,255,255,251,172,255,216,4,86,5,134,4,39,4,223,251,135,0,0,0,6,4,223,201,0,255,255,1,109,3,60,3,67,5,30,6,7,6,120,0,0,2,224,255,255,1,111,3,233,3,65,4,102,6,7, +6,121,0,0,2,224,255,255,1,109,3,117,3,65,4,227,6,7,6,122,0,0,2,224,0,6,251,60,255,53,4,196,5,167,0,3,0,7,0,11,0,15,0,19,0,23,0,0,65,53,33,21,1,53,33,21,1,53,33,21,1,53,33,21, +1,17,35,17,33,17,35,17,1,4,3,192,252,64,3,192,246,120,3,192,252,64,3,192,2,103,151,254,106,151,2,231,146,146,254,132,146,146,1,124,146,146,254,132,146,146,4,60,249,142,6,114,249,142,6,114,0,3,255,236,255,53,4,196, +5,167,0,3,0,7,0,11,0,0,67,53,33,21,1,53,33,21,1,17,35,17,20,4,216,251,40,4,216,253,223,150,2,231,146,146,254,132,146,146,4,60,249,142,6,114,255,255,251,60,255,53,1,97,5,167,4,70,6,173,0,0,192,0, +64,0,0,4,254,159,255,53,4,196,5,167,0,3,0,7,0,11,0,15,0,0,65,53,33,21,1,53,33,21,1,17,35,17,33,17,35,17,1,17,3,179,252,77,3,179,252,159,151,254,106,151,2,231,146,146,254,132,146,146,4,60,249,142, +6,114,249,142,6,114,0,4,251,60,255,53,4,196,5,167,0,3,0,7,0,11,0,15,0,0,65,21,33,53,33,21,33,53,1,17,35,17,33,17,35,17,4,196,252,77,253,222,252,77,6,39,151,254,106,151,2,188,148,148,148,148,2,235, +249,142,6,114,249,142,6,114,0,2,255,236,255,53,4,196,5,167,0,3,0,7,0,0,67,33,21,33,1,17,35,17,20,4,216,251,40,2,183,150,2,188,148,3,127,249,142,6,114,0,255,255,251,60,255,53,1,97,5,167,4,70,6,177, +0,0,192,0,64,0,0,3,254,159,255,53,4,196,5,167,0,3,0,7,0,11,0,0,65,21,33,53,19,17,35,17,33,17,35,17,4,196,252,77,82,151,254,106,151,2,188,148,148,2,235,249,142,6,114,249,142,6,114,0,255,255,255,236, +255,53,2,163,5,167,4,71,6,179,4,176,0,0,192,0,64,0,0,3,2,13,255,53,4,196,5,167,0,3,0,7,0,11,0,0,65,53,33,21,1,53,33,21,1,17,35,17,2,88,2,108,253,148,2,108,253,223,150,2,231,146,146,254, +132,146,146,4,60,249,142,6,114,0,255,255,255,236,255,53,2,163,5,167,4,71,6,181,4,176,0,0,192,0,64,0,0,2,2,13,255,53,4,196,5,167,0,3,0,7,0,0,65,53,33,21,1,17,35,17,2,88,2,108,253,223,150,2, +40,148,148,3,127,249,142,6,114,0,0,2,255,236,254,149,4,196,5,167,0,3,0,7,0,0,67,53,33,21,1,51,17,35,20,4,216,253,72,150,150,254,149,147,147,7,18,249,52,0,0,2,255,236,1,107,4,196,3,121,0,3,0,7, +0,0,67,53,33,21,1,53,33,21,20,4,216,251,40,4,216,2,231,146,146,254,132,146,146,0,0,2,255,236,1,107,3,183,3,121,0,3,0,7,0,0,67,53,33,21,1,53,33,21,20,3,203,252,53,3,203,2,231,146,146,254,132,146, +146,0,0,2,0,249,1,107,4,196,3,121,0,3,0,7,0,0,83,53,33,21,1,53,33,21,249,3,203,252,53,3,203,2,231,146,146,254,132,146,146,0,0,7,251,60,0,17,4,196,4,211,0,3,0,7,0,11,0,15,0,31,0,35, +0,39,0,0,65,53,33,21,1,53,33,21,1,21,33,53,1,21,33,53,9,2,39,55,54,54,63,2,39,39,38,38,39,39,1,35,1,55,1,1,39,1,251,60,4,60,251,196,4,60,5,76,252,189,3,67,252,189,252,242,2,32,253,224, +125,126,23,55,45,103,107,107,103,45,55,23,126,4,61,213,254,161,124,1,184,254,72,124,1,95,2,231,146,146,254,132,146,146,2,14,146,146,254,132,146,146,2,214,253,159,253,159,106,136,27,52,25,146,117,117,146,25,53,26,136,254,126,1, +130,106,253,42,254,20,106,1,130,0,0,3,255,236,0,17,4,196,4,211,0,3,0,7,0,23,0,0,65,21,33,53,1,21,33,53,9,2,39,55,54,54,63,2,39,39,38,38,39,39,4,196,251,40,4,216,251,40,1,237,2,32,253,224, +125,125,24,54,46,102,108,108,102,46,54,24,125,3,121,146,146,254,132,146,146,2,214,253,159,253,159,106,136,27,52,25,146,117,117,146,25,53,26,136,0,4,251,60,0,17,3,187,4,211,0,3,0,7,0,23,0,29,0,0,65,53,33,21, +1,53,33,21,9,2,39,55,54,54,63,2,39,39,38,38,39,39,37,1,1,39,1,1,251,60,5,92,250,164,5,92,254,251,2,32,253,224,125,126,23,55,45,103,107,107,103,45,55,23,126,2,133,2,32,253,224,124,1,202,254,54,2,231, +146,146,254,132,146,146,3,104,253,159,253,159,106,136,27,52,25,146,117,117,146,25,53,26,136,106,253,159,253,159,106,1,247,1,247,0,0,5,252,111,0,17,4,196,4,211,0,3,0,7,0,13,0,17,0,21,0,0,65,21,33,53,1,21, +33,53,9,2,39,9,2,35,1,55,1,1,39,1,4,196,251,44,4,212,251,44,252,251,2,32,253,224,124,1,202,254,54,4,59,213,254,160,125,1,184,254,72,125,1,96,3,121,146,146,254,132,146,146,2,214,253,159,253,159,106,1,247,1, +247,254,126,1,130,106,253,42,254,20,106,1,130,0,0,4,1,31,0,17,4,196,4,211,0,3,0,7,0,11,0,15,0,0,65,21,33,53,1,21,33,53,55,35,1,55,1,1,39,1,4,196,253,220,2,36,253,220,179,213,254,161,124,1, +184,254,72,124,1,95,3,121,146,146,254,132,146,146,234,1,130,106,253,42,254,20,106,1,130,0,0,3,255,236,0,17,3,187,4,211,0,3,0,7,0,23,0,0,67,53,33,21,1,53,33,21,9,2,39,55,54,54,63,2,39,39,38,38, +39,39,20,2,188,253,68,2,188,254,243,2,32,253,224,124,125,23,55,45,103,107,107,103,45,55,23,125,2,231,146,146,254,132,146,146,3,104,253,159,253,159,106,136,27,52,25,146,117,117,146,25,53,26,136,0,0,4,251,60,0,17,4,196, +4,211,0,3,0,7,0,13,0,26,0,0,67,33,53,33,33,21,33,53,9,2,39,1,1,37,1,1,39,1,54,54,55,53,38,38,39,1,65,251,125,4,131,5,5,253,97,254,107,2,32,253,224,125,1,203,254,53,254,29,2,32,253,224, +124,1,29,41,50,37,37,50,41,254,227,2,40,148,148,148,2,23,253,159,253,159,106,1,247,1,247,106,253,159,253,159,106,1,58,44,48,23,148,23,48,44,1,58,0,2,255,236,0,17,4,196,4,211,0,3,0,16,0,0,67,33,21,33, +9,2,39,1,54,54,55,53,38,38,39,1,20,4,216,251,40,1,175,2,32,253,224,124,1,29,41,50,37,37,50,41,254,227,2,188,148,2,171,253,159,253,159,106,1,58,44,48,23,148,23,48,44,1,58,0,0,3,251,60,0,17,3,187, +4,211,0,3,0,9,0,22,0,0,83,33,53,33,19,1,1,39,1,1,37,1,1,39,1,54,54,55,53,38,38,39,1,200,250,116,5,140,211,2,32,253,224,124,1,202,254,54,254,29,2,32,253,224,125,1,30,41,49,37,37,49,41,254, +226,2,40,148,2,23,253,159,253,159,106,1,247,1,247,106,253,159,253,159,106,1,58,44,48,23,148,23,48,44,1,58,0,3,252,111,0,17,4,196,4,211,0,3,0,9,0,15,0,0,65,33,53,33,9,2,39,1,1,37,1,1,39,1, +1,4,196,252,22,3,234,248,39,2,32,253,224,124,1,202,254,54,2,218,2,32,253,224,124,1,202,254,54,2,40,148,2,23,253,159,253,159,106,1,247,1,247,106,253,159,253,159,106,1,247,1,247,0,0,2,1,31,0,17,4,196,4,211, +0,3,0,9,0,0,65,33,53,33,9,2,39,1,1,4,196,254,65,1,191,252,215,2,32,253,224,124,1,202,254,54,2,40,148,2,23,253,159,253,159,106,1,247,1,247,0,2,255,236,0,17,3,187,4,211,0,3,0,16,0,0,65,33, +53,33,9,2,39,1,54,54,55,53,38,38,39,1,3,32,252,204,3,52,254,123,2,32,253,224,124,1,29,41,50,37,37,50,41,254,227,2,40,148,2,23,253,159,253,159,106,1,58,44,48,23,148,23,48,44,1,58,255,255,251,60,0,17, +4,196,4,211,4,70,6,186,0,0,192,0,64,0,255,255,255,236,0,17,4,196,4,211,4,71,6,187,4,176,0,0,192,0,64,0,255,255,251,60,0,17,3,145,4,211,4,70,6,189,0,0,192,0,64,0,255,255,252,69,0,17,4,196, +4,211,4,70,6,188,0,0,192,0,64,0,255,255,255,236,0,17,3,145,4,211,4,71,6,190,4,176,0,0,192,0,64,0,255,255,0,245,0,17,4,196,4,211,4,71,6,191,4,176,0,0,192,0,64,0,255,255,251,60,0,17,4,196, +4,211,4,70,6,192,0,0,192,0,64,0,255,255,255,236,0,17,4,196,4,211,4,71,6,193,4,176,0,0,192,0,64,0,255,255,251,60,0,17,3,145,4,211,4,70,6,195,0,0,192,0,64,0,255,255,252,69,0,17,4,196,4,211, +4,70,6,194,0,0,192,0,64,0,255,255,255,236,0,17,3,145,4,211,4,71,6,196,4,176,0,0,192,0,64,0,255,255,0,245,0,17,4,196,4,211,4,71,6,197,4,176,0,0,192,0,64,0,0,3,253,191,255,131,2,67,5,16, +0,3,0,8,0,12,0,0,65,1,23,1,3,55,1,21,39,19,21,33,53,253,191,4,73,59,251,184,60,60,4,72,59,59,251,151,1,40,1,225,130,254,25,3,232,136,254,25,162,32,253,112,148,148,255,255,253,189,255,131,2,65,5,16, +4,70,6,210,0,0,192,0,64,0,0,3,252,114,254,206,4,2,6,161,0,55,0,59,0,63,0,0,65,21,1,55,1,38,36,46,2,35,34,6,6,21,20,22,22,23,30,2,21,20,6,6,35,34,38,39,55,22,22,51,50,54,54,53, +52,38,38,39,46,2,53,52,54,54,51,50,30,3,4,1,17,35,17,19,17,35,17,4,2,253,51,42,2,19,238,254,174,244,188,173,99,76,124,75,63,153,131,107,183,111,118,224,161,150,245,87,103,71,186,126,83,146,90,52,131,119,135,200, +108,113,201,132,103,180,176,200,246,1,62,251,165,155,155,155,3,5,172,254,119,207,1,15,141,197,128,73,29,45,89,69,59,86,71,39,31,93,159,132,118,183,103,92,84,116,67,79,55,113,87,67,94,73,35,40,101,148,109,103,160,91,23,55, +93,138,191,3,30,254,154,1,102,249,132,254,169,1,87,0,0,3,252,0,254,206,3,105,6,161,0,56,0,60,0,64,0,0,101,50,54,54,53,52,38,38,39,46,2,53,52,54,54,51,50,22,23,7,38,38,35,34,6,6,21,20,22,22, +23,30,2,21,20,6,6,35,34,46,2,36,36,39,53,1,7,1,22,4,30,3,19,17,35,17,19,17,35,19,1,117,84,146,90,52,132,118,136,199,109,114,201,131,143,211,86,102,74,170,88,75,125,75,64,152,131,107,183,112,118,224,161,73, +129,144,186,254,254,254,153,245,2,240,21,253,181,231,1,80,238,167,123,102,184,155,155,155,1,123,55,113,87,67,95,72,35,40,101,148,109,103,160,91,81,76,113,66,59,45,89,69,59,87,71,38,31,93,159,132,118,183,103,10,36,79,138,211, +150,172,1,154,183,254,198,133,188,123,73,35,11,6,38,254,154,1,102,249,132,254,169,1,87,0,0,3,248,24,254,206,3,58,6,161,0,3,0,7,0,74,0,0,65,17,35,17,19,17,35,19,19,34,6,6,21,20,22,22,23,30,2,21, +20,6,6,35,34,46,2,36,36,39,53,1,7,1,22,4,30,3,51,50,54,54,53,52,38,38,39,46,2,53,52,54,54,51,50,30,3,4,23,21,1,55,1,38,36,46,2,254,13,155,155,155,1,52,75,125,75,64,152,131,107,183,112,118, +225,160,73,129,144,186,254,254,254,153,245,2,255,17,253,162,231,1,80,238,167,123,102,56,84,146,90,52,132,118,136,199,109,114,201,131,111,195,191,207,242,1,43,188,253,51,44,2,17,194,254,208,247,216,208,6,161,254,154,1,102,249,132,254, +169,1,87,4,193,45,89,69,59,87,71,38,31,93,159,132,118,183,103,10,36,79,138,211,150,172,1,159,179,254,189,133,188,123,73,35,11,55,113,87,67,95,72,35,40,101,148,109,103,160,91,29,62,99,139,182,115,172,254,115,216,1,10,114, +183,137,90,44,0,2,253,55,0,229,2,201,4,13,0,27,0,55,0,0,101,34,46,2,35,34,6,6,7,39,62,2,51,50,30,2,51,50,54,54,55,23,14,2,3,34,46,2,35,34,6,6,7,39,62,2,51,50,30,2,51,50,54,54, +55,23,14,2,1,43,88,154,139,126,60,68,130,101,26,120,30,124,182,115,85,152,140,129,61,68,111,83,26,120,29,108,164,113,88,154,139,126,60,68,130,101,26,120,30,124,182,115,85,152,140,129,61,68,111,83,26,120,29,108,164,229,68,87, +67,44,77,48,58,57,117,79,67,88,67,56,87,48,55,58,129,91,1,188,67,88,67,45,77,48,58,58,116,80,67,89,67,56,88,48,55,59,129,90,0,4,252,35,1,107,3,221,3,121,0,3,0,7,0,11,0,15,0,0,65,21,33,53, +1,21,33,53,3,21,33,53,1,21,33,53,3,221,252,114,3,142,252,114,158,252,114,3,142,252,114,3,121,146,146,254,132,146,146,1,124,146,146,254,132,146,146,0,0,6,247,115,1,107,3,221,3,121,0,3,0,7,0,11,0,15,0,19, +0,23,0,0,65,21,33,53,1,21,33,53,1,21,33,53,1,21,33,53,1,21,33,53,1,21,33,53,251,44,252,71,3,185,252,71,8,17,252,72,3,184,252,72,8,17,252,71,3,185,252,71,3,121,146,146,254,132,146,146,1,124,146,146, +254,132,146,146,1,124,146,146,254,132,146,146,0,1,0,218,255,232,3,164,4,30,0,27,0,0,65,23,22,22,21,20,6,7,39,52,38,39,39,17,20,6,6,35,34,38,53,52,54,51,50,22,23,17,2,164,94,90,72,21,15,58,48,68, +46,63,112,73,97,113,145,105,35,55,22,4,30,62,60,106,80,45,79,32,24,119,114,43,30,253,4,40,83,57,71,69,75,105,14,12,3,16,0,1,0,48,255,232,4,48,4,130,0,31,0,0,65,17,20,6,6,35,34,38,53,52,54,51, +50,22,23,17,5,17,20,6,6,35,34,38,53,52,54,51,50,22,23,17,4,48,63,112,73,97,113,145,105,35,55,22,254,42,63,112,73,97,113,145,105,35,55,22,4,130,252,126,40,83,57,71,69,75,105,14,12,2,110,118,253,50,40,83, +57,71,69,75,105,14,12,2,200,0,255,255,0,183,255,233,4,9,4,51,6,6,1,212,0,0,255,255,1,165,3,89,3,11,5,97,6,6,6,226,0,0,255,255,1,165,254,246,3,11,0,254,4,15,6,226,4,176,4,87,192,0,0,1, +1,205,4,37,2,183,5,218,0,14,0,0,65,50,22,21,20,6,7,7,35,55,38,38,53,52,54,2,75,45,63,19,32,83,100,60,19,27,66,5,218,61,46,25,60,69,176,240,19,44,27,46,61,0,255,255,1,20,3,89,3,156,5,97, +4,39,6,226,255,111,0,0,0,7,6,226,0,145,0,0,0,1,1,74,5,87,3,100,5,215,0,3,0,0,65,33,53,33,3,100,253,230,2,26,5,87,128,0,0,1,1,165,3,89,3,11,5,97,0,3,0,0,65,19,51,3,1,165, +170,188,229,3,89,2,8,253,248,0,255,255,1,27,5,17,3,147,5,231,4,6,6,246,0,0,255,255,1,223,4,177,2,211,5,159,4,6,6,247,2,149,0,1,1,106,5,0,3,65,6,58,0,3,0,0,65,5,7,37,1,183,1,138, +53,254,94,6,58,224,90,170,0,1,1,119,5,0,3,77,6,58,0,3,0,0,65,23,5,39,2,255,78,254,94,52,6,58,144,170,90,0,255,255,1,19,4,137,3,157,6,28,4,6,6,250,0,149,0,1,1,17,4,173,3,158,5,217, +0,6,0,0,65,5,7,39,7,39,37,2,145,1,13,73,253,251,76,1,15,5,217,215,85,160,160,85,215,0,0,1,1,17,4,139,3,158,5,183,0,6,0,0,65,23,5,35,37,55,23,3,85,73,254,243,113,254,241,76,251,5,183,86, +214,214,86,162,0,1,1,45,4,147,3,131,5,155,0,15,0,0,65,34,38,38,39,55,22,22,51,50,54,55,23,14,2,2,83,76,128,82,8,116,21,87,70,73,94,21,116,8,85,131,4,147,59,108,72,25,59,75,75,59,25,72,108,59, +255,255,1,122,4,106,3,54,6,3,4,6,6,254,0,149,255,255,1,18,5,37,3,163,6,7,4,6,6,255,2,0,255,255,1,76,4,221,3,102,5,93,4,6,7,0,2,149,0,1,0,172,4,221,4,6,5,93,0,3,0,0,65,33, +53,33,4,6,252,166,3,90,4,221,128,0,255,255,1,19,4,244,3,157,6,135,4,71,6,250,4,176,0,0,192,0,64,0,255,255,2,0,4,71,2,232,5,246,4,7,6,242,0,29,6,131,255,255,1,134,4,71,2,110,5,246,4,71, +6,242,4,81,6,131,192,0,64,0,0,1,1,227,253,196,2,203,255,115,0,14,0,0,69,50,22,21,20,6,7,7,35,55,38,38,53,52,54,2,95,45,63,14,16,100,102,58,19,24,63,141,61,46,26,49,35,214,234,16,47,27,46,61, +255,255,1,119,254,12,3,60,0,9,4,6,7,1,2,233,0,1,0,255,2,43,3,174,2,177,0,3,0,0,65,33,53,33,3,174,253,81,2,175,2,43,134,0,0,1,255,206,2,43,4,229,2,177,0,3,0,0,65,33,53,33,4,229, +250,233,5,23,2,43,134,0,0,2,1,27,5,17,3,147,5,231,0,11,0,23,0,0,65,34,38,53,52,54,51,50,22,21,20,6,33,34,38,53,52,54,51,50,22,21,20,6,1,137,48,62,62,48,45,63,63,1,111,46,62,62,46,47, +63,63,5,17,60,46,47,61,61,47,46,60,60,46,47,61,61,47,46,60,0,1,1,221,5,29,2,209,6,10,0,11,0,0,65,50,22,21,20,6,35,34,38,53,52,54,2,86,55,68,68,55,54,67,67,6,10,68,49,51,69,69,51,49, +68,0,0,1,1,113,4,220,3,60,6,37,0,3,0,0,65,37,55,5,3,5,254,108,90,1,113,4,220,186,143,236,0,1,1,119,5,0,3,77,6,58,0,3,0,0,65,23,5,39,2,255,78,254,94,52,6,58,144,170,90,0,0,2, +1,19,4,244,3,157,6,135,0,3,0,7,0,0,65,19,23,3,55,19,23,3,1,19,155,149,194,218,176,146,216,5,44,1,91,70,254,184,51,1,91,77,254,186,0,1,1,18,4,234,3,159,6,43,0,6,0,0,65,39,37,51,5,7, +39,1,98,80,1,15,113,1,13,76,249,4,234,83,238,238,83,181,0,1,1,18,4,234,3,159,6,43,0,6,0,0,65,23,5,35,37,55,23,3,83,76,254,243,113,254,241,80,248,6,43,84,237,237,84,182,0,1,1,45,4,236,3,129, +6,21,0,15,0,0,65,34,38,38,39,55,22,22,51,50,54,55,23,14,2,2,83,90,126,70,8,116,21,87,70,73,92,21,116,8,73,128,4,236,85,125,61,26,75,93,93,75,26,61,125,85,0,2,1,122,4,214,3,54,6,111,0,15, +0,27,0,0,65,50,22,22,21,20,6,6,35,34,38,38,53,52,54,54,23,34,6,21,20,22,51,50,54,53,52,38,2,88,65,100,57,57,100,65,64,101,57,57,101,64,49,59,59,49,51,57,57,6,111,55,93,58,56,93,54,54,93,56, +58,93,55,92,61,53,52,61,61,52,53,61,0,1,1,15,5,37,3,161,6,7,0,21,0,0,65,34,38,38,35,34,6,7,39,54,54,51,50,22,22,51,50,54,55,23,6,6,2,205,53,77,66,37,34,48,24,107,35,106,73,56,75,64, +37,30,49,27,106,39,108,5,37,48,49,47,46,54,71,97,48,48,43,45,54,83,81,0,0,1,1,74,5,72,3,100,5,200,0,3,0,0,65,33,53,33,3,100,253,230,2,26,5,72,128,0,0,1,1,116,254,35,3,57,0,32,0,22, +0,0,65,52,38,35,55,51,21,22,22,21,20,6,6,35,34,38,39,55,22,22,51,50,54,2,169,93,81,18,115,99,86,68,111,65,60,110,39,54,28,74,33,53,67,254,231,54,32,227,146,8,99,60,66,87,43,26,23,97,15,17,37,0, +0,1,1,147,254,53,3,35,0,61,0,21,0,0,101,23,14,2,21,20,22,51,50,54,55,7,6,6,35,34,38,53,52,54,54,3,9,26,103,107,38,50,62,32,55,37,18,30,57,39,114,130,78,165,61,61,45,78,71,35,45,51,7,7, +134,6,8,114,83,70,119,96,0,1,1,252,3,253,2,198,5,115,0,3,0,0,65,23,3,39,2,45,153,107,95,5,115,18,254,156,14,0,255,255,1,227,253,196,2,203,255,115,4,6,6,242,0,0,255,255,1,26,6,0,3,146,6,214, +4,7,6,246,255,255,0,239,255,255,1,220,6,12,2,208,6,250,4,7,6,247,255,255,0,239,0,1,1,111,5,231,3,62,7,27,0,3,0,0,65,5,7,37,1,205,1,113,51,254,100,7,27,218,90,164,0,1,1,107,5,231,3,67, +7,20,0,3,0,0,65,23,5,39,2,247,76,254,85,45,7,20,144,157,90,0,255,255,1,18,5,227,3,156,7,118,4,7,6,250,255,255,0,239,0,1,1,18,5,241,3,159,7,29,0,6,0,0,65,5,7,39,7,39,37,2,146,1, +13,74,253,251,75,1,15,7,29,215,85,160,160,85,215,0,0,1,1,18,5,229,3,159,7,17,0,6,0,0,65,23,5,35,37,55,23,3,85,74,254,243,113,254,241,75,251,7,17,85,215,215,85,161,0,1,1,47,5,237,3,131,6,245, +0,15,0,0,65,34,38,38,39,55,22,22,51,50,54,55,23,14,2,2,86,76,129,82,8,116,21,87,71,70,94,21,116,8,85,131,5,237,60,107,72,25,59,74,74,59,25,72,107,60,255,255,1,121,5,197,3,53,7,94,4,7,6,254, +255,255,0,239,255,255,1,15,6,20,3,160,6,247,4,7,6,255,255,255,0,239,255,255,1,73,6,55,3,99,6,183,4,7,7,0,255,255,0,239,255,255,1,116,254,35,3,57,0,32,6,6,7,1,0,0,0,1,1,173,4,129,3,2, +6,7,0,3,0,0,65,23,1,39,2,127,131,254,254,83,6,7,87,254,209,51,0,1,1,173,5,175,3,5,7,37,0,3,0,0,65,23,1,39,2,129,132,254,251,83,7,37,86,254,224,52,255,255,1,15,5,37,3,161,6,7,4,6, +6,236,254,0,0,1,1,138,254,135,3,40,255,179,0,14,0,0,65,34,38,53,53,51,21,20,51,50,54,55,23,6,6,2,101,103,116,150,85,36,49,27,67,31,94,254,135,113,92,95,92,84,18,16,88,24,46,0,0,1,1,219,4,168, +2,215,6,79,0,3,0,0,65,23,3,39,2,37,178,131,121,6,79,32,254,121,21,0,0,1,1,207,3,217,2,225,5,130,0,3,0,0,65,23,3,39,2,25,200,143,131,5,130,33,254,120,21,0,0,3,1,30,4,229,3,144,7,35, +0,3,0,15,0,27,0,0,65,23,3,39,7,50,22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,2,83,180,120,118,140,45,63,63,45,47,64,64,1,195,48,63,63,48,45,63,63,7,35,36,254,176,20, +4,63,46,45,64,64,45,46,63,63,46,45,64,64,45,46,63,0,255,255,1,227,4,155,2,203,6,75,4,7,6,242,0,0,6,216,255,255,1,227,4,157,2,203,6,76,4,7,6,242,0,0,6,217,0,1,1,229,4,155,2,205,6,75, +0,14,0,0,65,50,22,21,20,6,7,23,35,39,38,38,53,52,54,2,81,46,63,24,19,58,102,100,16,14,63,6,75,61,46,27,47,16,235,215,35,49,26,46,61,0,0,2,1,63,4,125,3,95,6,60,0,3,0,18,0,0,65,19, +7,3,39,50,22,21,20,6,7,7,35,55,38,38,53,52,54,3,0,95,113,136,171,45,63,14,16,99,103,59,20,24,63,6,49,254,107,31,1,141,50,61,46,26,49,35,214,234,16,47,27,46,61,0,0,2,1,68,4,125,3,95,6,60, +0,3,0,18,0,0,65,19,7,3,39,50,22,21,20,6,7,23,35,39,38,38,53,52,54,3,0,95,113,136,182,46,63,24,20,59,103,99,16,14,63,6,49,254,107,31,1,141,50,61,46,27,47,16,234,214,35,49,26,46,61,0,0,2, +1,63,4,125,3,82,6,60,0,3,0,18,0,0,65,23,3,39,3,50,22,21,20,6,7,7,35,55,38,38,53,52,54,2,184,154,136,113,158,45,63,14,16,99,103,59,20,24,63,6,49,39,254,115,31,1,160,61,46,26,49,35,214,234, +16,47,27,46,61,0,0,2,1,65,4,125,3,82,6,62,0,3,0,18,0,0,65,23,3,39,3,50,22,21,20,6,7,23,35,39,38,38,53,52,54,2,184,154,136,113,171,45,64,24,20,59,103,99,16,15,63,6,49,39,254,115,31,1, +162,61,47,26,47,16,235,214,35,50,25,47,61,0,0,2,1,18,4,129,3,164,6,182,0,13,0,35,0,0,65,55,38,53,52,54,51,50,22,21,20,6,7,7,19,34,38,38,35,34,6,7,39,54,54,51,50,22,22,51,50,54,55,23, +6,6,2,5,39,61,63,47,48,62,22,36,40,102,52,77,66,37,34,48,24,107,34,106,74,55,76,64,37,30,49,27,106,39,109,4,129,124,37,61,47,61,61,47,23,63,66,70,1,83,48,49,47,46,54,70,98,48,48,43,45,54,83,81, +0,2,1,13,4,131,3,159,6,184,0,13,0,35,0,0,65,35,39,38,38,53,52,54,51,50,22,21,20,7,55,34,38,38,35,34,6,7,39,54,54,51,50,22,22,51,50,54,55,23,6,6,2,169,101,39,36,22,62,47,47,64,62,73, +52,77,66,37,34,48,24,107,34,106,74,55,76,64,37,30,49,27,106,39,109,4,131,70,66,63,24,46,61,61,46,61,38,215,48,49,47,46,54,70,98,48,48,43,45,54,83,81,0,3,1,27,4,229,3,146,6,237,0,11,0,23,0,27, +0,0,65,50,22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,19,19,7,37,3,36,47,63,63,47,46,63,63,254,148,46,63,63,46,47,64,64,90,233,71,254,246,5,191,63,46,45,64,64,45,46,63,63, +46,45,64,64,45,46,63,1,46,254,228,66,248,0,0,3,1,30,4,229,3,149,6,237,0,11,0,23,0,27,0,0,65,50,22,21,20,6,35,34,38,53,52,54,33,50,22,21,20,6,35,34,38,53,52,54,19,23,5,39,1,140,46,63, +63,46,47,63,63,1,201,47,64,64,47,46,63,63,9,104,254,246,71,5,191,63,46,45,64,64,45,46,63,63,46,45,64,64,45,46,63,1,46,102,248,66,0,3,1,21,4,215,3,167,6,243,0,11,0,23,0,45,0,0,65,34,38,53, +52,54,51,50,22,21,20,6,33,34,38,53,52,54,51,50,22,21,20,6,3,34,38,38,35,34,6,7,39,54,54,51,50,22,22,51,50,54,55,23,6,6,1,146,47,63,63,47,45,63,63,1,111,45,63,63,45,48,62,62,139,53,77,66, +37,34,48,24,107,35,106,73,56,75,64,37,30,49,27,106,39,108,4,215,61,45,47,61,61,47,45,61,61,45,47,61,61,47,45,61,1,57,48,49,47,46,54,71,98,48,49,43,45,53,84,81,255,255,1,106,5,0,3,65,6,58,4,6, +6,229,0,0,0,1,1,210,3,217,2,227,5,130,0,3,0,0,65,19,7,3,2,153,74,130,143,5,130,254,108,21,1,136,255,255,1,119,5,0,3,77,6,58,4,6,6,230,0,0,255,255,1,207,3,217,2,225,5,130,6,6,7,22, +0,0,255,255,1,15,5,37,3,161,6,7,4,6,6,236,254,0,0,5,0,84,255,30,9,80,5,238,0,124,1,110,1,142,1,164,1,174,0,0,83,54,54,55,62,2,51,50,30,2,51,54,54,51,50,22,22,21,20,6,49,48,22,23, +30,2,23,30,2,23,22,22,21,20,14,2,7,6,6,35,34,39,14,2,35,34,38,39,38,38,35,34,6,7,14,2,7,6,6,7,22,22,21,6,6,35,34,38,38,39,46,2,49,55,48,38,39,39,54,54,55,6,6,7,39,54,54,55, +7,39,54,54,55,7,39,54,54,55,52,14,2,7,39,62,2,55,6,6,7,39,62,2,55,5,37,54,54,55,23,6,6,21,20,23,7,38,38,39,35,6,6,7,7,39,7,6,6,21,20,22,23,30,2,21,20,6,6,21,20,22,49,48, +54,54,55,23,14,2,7,23,55,23,7,30,2,51,53,38,38,39,55,30,2,49,48,54,55,46,2,39,55,30,2,51,54,54,53,55,52,38,53,6,6,7,39,52,54,54,55,53,39,46,3,53,23,30,2,23,62,3,55,30,2,23,54,54, +49,46,3,39,38,38,39,35,6,21,20,22,23,7,38,38,39,46,3,53,52,54,55,51,23,23,54,54,53,52,38,39,39,55,23,30,3,23,30,2,49,48,54,53,52,38,35,34,6,21,20,22,23,35,38,38,53,52,54,54,53,38,38,39, +38,38,39,7,23,7,34,38,53,52,54,54,55,55,38,35,34,6,6,21,20,22,23,35,46,2,49,39,55,62,3,51,50,23,51,38,38,35,34,6,7,39,54,54,55,39,38,38,35,34,14,2,7,5,54,54,55,53,39,55,48,54,54,51, +53,39,55,48,22,22,23,7,6,6,7,21,23,7,48,38,38,35,34,6,49,39,62,2,51,50,22,49,7,7,6,6,21,20,23,35,38,38,53,6,6,49,5,7,6,6,35,34,38,39,55,23,132,35,142,97,85,201,226,122,38,105,107,82, +14,15,94,57,84,94,38,6,90,90,101,176,118,15,3,5,4,2,5,13,26,39,39,14,9,20,9,34,12,21,72,73,24,21,53,32,46,134,54,42,78,24,74,70,32,16,6,27,9,8,12,10,72,44,50,159,190,97,87,127,70,104,53,15, +4,17,54,31,51,78,27,8,11,47,22,150,8,26,87,37,234,6,29,100,63,51,77,82,32,6,32,94,87,23,69,151,60,6,39,130,133,42,254,218,1,230,30,54,30,2,58,66,14,8,27,25,8,4,4,8,2,10,20,4,1,3,38,18, +15,54,43,27,27,6,52,66,20,8,14,88,100,32,12,172,6,128,82,199,186,61,18,51,15,8,19,58,45,21,9,27,59,45,7,8,18,67,67,18,8,6,34,2,19,83,24,12,47,61,22,78,5,40,47,34,20,25,84,114,69,20,90,102, +77,7,35,117,106,20,29,65,25,40,57,103,89,88,99,23,6,2,55,25,2,19,67,18,7,51,59,43,22,6,10,10,38,5,31,27,9,106,6,100,65,160,165,152,58,57,117,80,18,14,14,6,10,3,1,12,18,44,29,29,19,146,101,96, +141,59,8,88,4,139,147,34,42,12,4,4,28,20,56,42,18,22,24,32,38,16,154,4,21,94,117,112,38,50,26,10,9,40,41,76,184,72,12,3,30,13,2,33,136,69,87,143,107,65,10,1,86,27,96,49,62,2,50,63,21,54,2,52, +73,33,2,19,52,9,54,6,47,69,32,66,92,142,7,41,95,89,36,44,10,102,1,25,6,12,21,55,31,53,3,78,10,15,29,14,40,73,41,36,106,3,204,35,129,76,67,142,97,27,36,27,5,23,77,96,27,19,27,81,39,43,61,59, +41,9,54,60,19,48,49,17,10,74,87,69,6,4,2,6,17,47,36,8,6,9,39,42,12,39,76,103,80,33,89,14,18,52,6,1,7,19,57,58,51,117,82,56,3,1,14,21,38,21,16,36,14,16,38,81,25,104,14,78,110,34,120,16, +65,128,57,1,23,36,39,15,16,54,95,68,13,25,55,24,14,50,117,104,31,74,178,9,12,3,10,42,138,80,55,45,8,20,65,21,15,49,14,2,32,2,10,21,9,57,103,30,25,68,68,25,28,46,46,28,19,11,1,4,3,8,21,51, +47,15,10,38,10,76,68,88,42,4,20,81,31,8,14,38,28,37,19,20,64,66,22,6,14,39,29,21,47,18,52,2,1,1,1,38,21,2,39,60,42,13,10,32,3,43,66,74,34,6,29,71,57,9,1,18,25,21,3,19,45,36,4,3, +37,21,17,12,28,32,32,67,37,6,8,36,53,23,8,2,12,4,4,26,51,81,58,50,91,19,110,64,6,63,27,17,42,9,120,6,42,54,118,107,79,14,15,19,10,52,36,27,63,15,23,9,22,15,21,63,22,19,31,30,18,26,54,36, +33,84,49,2,106,10,75,49,26,31,16,3,8,4,15,40,39,18,46,26,19,57,44,26,10,8,37,40,29,16,15,43,60,26,2,23,37,10,8,12,34,68,96,87,19,188,24,43,9,6,34,8,9,9,4,68,8,21,44,35,8,4,8,2, +8,98,6,9,9,12,188,24,83,67,10,14,52,3,69,50,25,27,15,54,57,10,48,120,16,6,4,37,33,2,40,0,0,4,1,246,255,108,8,246,5,130,0,241,1,17,1,39,1,49,0,0,65,62,3,51,50,22,23,23,6,6,7,23, +54,54,51,50,22,23,35,38,35,34,14,2,7,7,23,48,22,22,23,51,38,38,53,52,54,54,51,50,23,7,14,2,21,20,22,51,55,39,55,22,22,23,22,22,23,20,6,6,21,20,22,23,51,38,38,53,52,54,51,50,22,21,20,6, +49,48,38,38,39,46,3,39,39,7,23,22,22,21,20,6,7,39,39,35,6,6,21,20,30,2,23,22,22,23,55,38,38,53,52,55,51,22,22,23,30,3,23,48,6,7,46,2,39,14,3,7,46,2,39,39,20,30,2,23,23,21,14,2, +21,23,54,54,55,20,22,21,7,20,6,7,34,38,38,39,7,30,2,23,6,6,49,48,38,38,39,7,22,22,23,21,34,38,38,39,55,39,7,39,62,2,55,39,14,2,49,48,38,53,52,54,54,53,52,38,38,39,38,38,53,52,54,55, +55,23,55,54,54,55,51,22,22,23,55,38,53,52,54,55,39,6,6,7,5,48,54,51,50,22,22,49,55,39,53,54,54,55,55,46,2,49,7,23,21,34,6,6,49,7,23,21,6,6,7,39,48,54,55,20,22,23,51,38,53,52,54,63, +2,48,38,35,34,6,6,7,5,39,7,22,22,51,50,54,55,55,2,104,10,65,107,143,87,69,136,33,2,13,30,3,12,72,184,76,41,40,9,10,26,50,38,112,117,94,21,4,154,16,38,32,24,22,18,42,56,20,28,4,4,12,42,34, +147,139,4,88,8,59,141,96,101,146,19,29,29,44,18,12,1,3,10,6,14,14,18,80,117,57,58,152,165,160,65,100,6,106,9,27,31,5,38,10,10,6,22,43,59,51,7,18,67,19,2,25,55,2,6,23,99,88,89,103,57,40,25,65, +29,20,106,117,35,7,77,102,90,20,69,114,84,25,20,34,47,40,5,78,22,61,47,12,24,83,19,2,34,6,8,18,67,67,18,8,7,45,59,27,9,21,45,58,19,8,15,51,18,61,186,199,82,128,6,172,12,32,100,88,14,8,20,66, +52,6,27,27,43,54,15,18,38,3,1,4,20,10,2,8,4,4,8,25,27,8,14,66,58,2,30,54,30,1,94,92,66,32,69,47,6,54,9,52,19,2,33,73,52,2,54,21,63,50,2,62,49,96,27,122,53,31,55,21,12,6,25,1, +102,10,44,36,89,95,41,7,3,6,106,36,41,73,40,14,29,15,10,4,116,19,87,96,68,34,12,8,10,37,23,2,26,60,43,15,16,29,40,37,8,10,26,44,57,19,26,46,18,39,40,15,4,8,3,16,31,26,49,75,10,106,2,49, +84,33,36,54,26,18,30,31,19,22,63,21,15,22,9,23,15,63,27,36,52,10,19,15,14,79,107,118,54,42,6,120,9,42,17,27,63,6,64,110,19,91,50,58,81,51,26,4,4,12,2,8,23,53,36,8,6,37,67,32,32,28,12,17, +21,37,3,4,36,45,19,3,21,25,18,1,9,57,71,29,6,34,74,66,43,3,32,10,13,42,60,39,2,21,38,1,1,1,2,52,18,47,21,29,39,14,6,22,66,64,20,19,37,28,38,14,8,31,81,20,4,42,88,68,76,10,38,10, +15,47,51,21,8,3,4,1,11,19,28,46,46,28,25,68,68,25,30,103,57,9,21,10,2,32,2,14,49,15,21,65,20,8,45,55,80,138,42,10,3,12,9,188,12,9,9,6,98,8,2,8,4,8,35,44,21,8,68,4,9,9,8,34, +6,9,43,24,174,48,10,57,54,15,27,25,50,69,3,52,14,10,67,83,24,122,40,2,33,37,4,6,16,0,0,9,5,230,1,180,8,206,4,146,0,9,0,17,0,26,0,35,0,46,0,55,0,64,0,75,0,86,0,0,65,52,54,55, +50,22,23,7,48,38,5,51,50,21,20,6,6,49,39,48,22,23,6,6,7,38,38,39,22,22,49,48,6,7,48,54,23,52,51,50,22,23,20,6,7,38,38,37,50,22,23,6,6,49,48,54,3,6,21,20,23,38,39,50,22,1,52,54, +55,22,23,6,6,49,48,38,3,6,6,35,34,38,39,54,53,53,22,6,192,5,7,15,31,4,60,2,1,224,32,14,20,20,170,37,19,1,27,20,3,5,80,20,32,36,18,2,162,12,5,32,3,37,9,3,3,254,202,12,29,3,7,41, +1,243,30,4,31,3,14,30,1,76,7,1,23,15,9,35,2,218,10,18,8,9,15,8,26,22,2,104,11,20,9,18,6,44,18,94,12,8,31,25,106,5,5,6,39,15,17,53,20,3,7,49,5,58,46,14,6,2,9,38,3,12,17,123, +11,9,7,39,54,2,46,11,31,6,8,25,37,1,253,171,8,7,1,4,12,12,36,45,2,3,1,3,3,1,10,28,12,19,0,14,253,218,255,30,6,214,5,238,0,124,1,110,1,142,1,164,1,174,1,184,1,193,1,201,1,210,1,221, +1,230,1,241,1,250,2,5,0,0,65,54,54,55,62,2,51,50,30,2,51,54,54,51,50,22,22,21,20,6,49,48,22,23,30,2,23,30,2,23,22,22,21,20,14,2,7,6,6,35,34,39,14,2,35,34,38,39,38,38,35,34,6,7, +14,2,7,6,6,7,22,22,21,6,6,35,34,38,38,39,46,2,49,55,48,38,39,39,54,54,55,6,6,7,39,54,54,55,7,39,54,54,55,7,39,54,54,55,52,14,2,7,39,62,2,55,6,6,7,39,62,2,55,5,37,54,54,55, +23,6,6,21,20,23,7,38,38,39,35,6,6,7,7,39,7,6,6,21,20,22,23,30,2,21,20,6,6,21,20,22,49,48,54,54,55,23,14,2,7,23,55,23,7,30,2,51,53,38,38,39,55,30,2,49,48,54,55,46,2,39,55,30, +2,51,54,54,53,55,52,38,53,6,6,7,39,52,54,54,55,53,39,46,3,53,23,30,2,23,62,3,55,30,2,23,54,54,49,46,3,39,38,38,39,35,6,21,20,22,23,7,38,38,39,46,3,53,52,54,55,51,23,23,54,54,53,52, +38,39,39,55,23,30,3,23,30,2,49,48,54,53,52,38,35,34,6,21,20,22,23,35,38,38,53,52,54,54,53,38,38,39,38,38,39,7,23,7,34,38,53,52,54,54,55,55,38,35,34,6,6,21,20,22,23,35,46,2,49,39,55,62, +3,51,50,23,51,38,38,35,34,6,7,39,54,54,55,39,38,38,35,34,14,2,7,5,54,54,55,53,39,55,48,54,54,51,53,39,55,48,22,22,23,7,6,6,7,21,23,7,48,38,38,35,34,6,49,39,62,2,51,50,22,49,7,7, +6,6,21,20,23,35,38,38,53,6,6,49,5,7,6,6,35,34,38,39,55,23,19,20,22,49,55,38,38,35,6,6,5,48,22,23,54,54,55,38,38,23,48,54,54,53,52,35,35,39,20,6,49,54,54,49,48,38,23,20,22,23,54,54, +53,38,38,35,34,37,6,6,49,48,54,55,38,38,23,20,22,49,48,54,55,38,39,6,6,1,38,38,35,22,23,38,53,52,23,38,39,21,20,7,22,22,51,50,54,254,10,35,142,97,85,201,226,122,38,105,107,82,14,15,94,57,84,94, +38,6,90,90,101,176,118,15,3,5,4,2,5,13,26,39,39,14,9,20,9,34,12,21,71,74,24,21,53,32,46,134,54,42,78,24,74,70,32,16,6,27,9,8,12,10,72,44,50,159,190,97,87,127,70,104,53,15,4,17,54,31,51,78, +27,8,11,47,22,150,8,26,87,37,234,6,29,100,63,51,77,82,32,6,32,94,87,23,69,151,60,6,39,131,132,42,254,218,1,230,30,54,30,2,58,66,14,8,27,25,8,4,4,8,2,10,20,4,1,3,38,18,15,54,43,27,27,6, +52,66,20,8,14,88,100,32,12,172,6,128,82,199,186,61,18,51,15,8,19,58,45,21,9,27,59,45,7,8,18,67,67,18,8,6,34,2,19,83,24,12,47,61,22,78,5,40,47,34,20,25,84,114,69,20,90,102,77,7,35,117,106,20, +29,65,25,40,57,103,89,88,99,23,6,2,55,25,2,19,67,18,7,51,59,43,22,6,10,10,38,5,31,27,9,106,6,100,65,160,165,152,58,57,117,80,18,14,14,6,10,3,1,12,18,44,29,29,19,146,101,96,141,59,8,88,4,139, +147,34,42,12,4,4,28,20,56,42,18,22,24,32,38,16,154,4,21,94,117,112,38,50,26,10,9,40,41,76,184,72,12,3,30,13,2,33,136,69,87,143,107,65,10,1,86,27,96,49,62,2,50,63,21,54,2,52,73,33,2,19,52,9, +54,6,47,69,32,66,92,142,7,41,95,89,36,44,10,102,1,25,6,12,21,55,31,53,3,78,10,15,29,14,40,73,41,36,106,126,2,60,4,31,15,7,5,1,60,5,3,20,27,1,19,37,170,20,20,14,32,244,2,18,36,32,142,3, +3,9,37,3,32,5,12,254,202,3,1,41,7,3,29,58,2,35,9,15,23,1,7,254,196,16,30,14,3,31,4,128,20,22,26,8,15,9,8,18,3,204,35,129,76,67,142,97,27,36,27,5,23,77,96,27,19,27,81,39,43,61,59,41, +9,54,60,19,48,49,17,10,74,87,69,6,4,2,6,17,47,36,8,6,9,39,42,12,39,76,103,80,33,89,14,18,52,6,1,7,19,57,58,51,117,82,56,3,1,14,21,38,21,16,36,14,16,38,81,25,104,14,78,110,34,120,16,65, +128,57,1,23,36,39,15,16,54,95,68,13,25,55,24,14,50,117,104,31,74,178,9,12,3,10,42,138,80,55,45,8,20,65,21,15,49,14,2,32,2,10,21,9,57,103,30,25,68,68,25,28,46,46,28,19,11,1,4,3,8,21,51,47, +15,10,38,10,76,68,88,42,4,20,81,31,8,14,38,28,37,19,20,64,66,22,6,14,39,29,21,47,18,52,2,1,1,1,38,21,2,39,60,42,13,10,32,3,43,66,74,34,6,29,71,57,9,1,18,25,21,3,19,45,36,4,3,37, +21,17,12,28,32,32,67,37,6,8,36,53,23,8,2,12,4,4,26,51,81,58,50,91,19,110,64,6,63,27,17,42,9,120,6,42,54,118,107,79,14,15,19,10,52,36,27,63,15,23,9,22,15,21,63,22,19,31,30,18,26,54,36,33, +84,49,2,106,10,75,49,26,31,16,3,8,4,15,40,39,18,46,26,19,57,44,26,10,8,37,40,29,16,15,43,60,26,2,23,37,10,8,12,34,68,96,87,19,188,24,43,9,6,34,8,9,9,4,68,8,21,44,35,8,4,8,2,8, +98,6,9,9,12,188,24,83,67,10,14,52,3,69,50,25,27,15,54,57,10,48,120,16,6,4,37,33,2,40,254,116,10,18,44,6,18,9,20,85,53,17,15,39,6,5,5,106,25,31,8,12,50,6,58,5,49,7,49,15,17,12,3,38, +9,2,6,94,12,54,39,7,9,11,46,3,45,36,12,12,4,1,7,2,72,5,1,37,25,8,6,31,69,31,19,12,28,10,1,3,3,0,0,3,0,147,253,168,5,129,7,8,0,3,0,28,0,34,0,0,65,17,7,17,1,37,62,2, +53,17,51,17,20,14,2,7,7,14,2,21,17,35,17,52,54,54,1,1,39,1,1,7,1,67,170,1,54,1,18,58,44,8,170,15,51,102,86,198,65,112,71,170,66,140,2,67,254,97,62,1,221,1,221,63,7,8,251,24,98,5,74,250, +39,138,30,88,118,71,1,191,254,21,88,129,97,84,43,100,34,63,103,93,254,42,1,232,116,142,102,3,121,254,246,99,1,141,254,115,99,0,0,2,1,73,255,156,3,95,6,80,0,5,0,22,0,0,65,51,17,33,7,33,23,30,2,21, +17,35,17,51,19,38,38,53,17,51,17,35,1,73,143,1,133,12,253,248,124,2,9,7,132,202,206,3,15,134,204,6,80,253,93,125,236,23,101,128,64,254,148,3,32,253,88,36,173,109,1,106,252,224,0,5,0,2,255,148,4,174,6,64, +0,37,0,45,0,61,0,73,0,77,0,0,65,35,34,6,7,6,6,21,17,20,22,23,22,22,51,33,50,54,55,54,54,53,17,52,38,39,38,38,35,35,17,52,38,35,35,34,6,21,19,17,52,51,51,50,21,17,1,20,6,35,33,34, +38,53,17,52,54,51,33,50,22,21,1,34,38,53,52,54,55,22,22,21,20,6,39,51,21,35,1,62,94,46,80,30,30,36,36,30,30,80,46,2,238,47,81,30,30,36,36,30,30,81,47,92,140,114,56,114,140,151,119,24,119,1,64,52, +37,253,42,36,51,51,36,2,214,37,52,254,61,60,89,89,60,61,86,86,136,152,152,3,116,36,30,30,79,47,253,220,46,80,30,30,36,36,30,30,80,46,2,36,47,79,30,30,36,1,206,114,140,140,114,254,50,1,215,118,118,254,41,253, +5,36,51,51,36,2,22,36,51,51,36,254,198,87,62,61,80,6,6,80,61,62,87,54,249,0,0,1,0,0,253,168,3,232,7,8,0,2,0,0,81,1,1,3,232,252,24,7,8,251,80,251,80,0,0,1,0,0,253,168,4,152,7,8, +0,5,0,0,83,1,1,35,1,1,189,3,219,252,37,189,3,212,252,44,7,8,251,80,251,80,4,176,4,176,255,255,0,200,253,168,4,176,7,8,4,71,7,48,4,176,0,0,192,0,64,0,255,255,0,24,253,168,4,176,7,8,4,71, +7,49,4,176,0,0,192,0,64,0,0,1,1,47,5,13,3,131,6,8,0,15,0,0,65,34,38,38,39,55,22,22,51,50,54,55,23,14,2,2,86,76,129,82,8,116,22,86,71,70,94,21,116,8,85,130,5,13,52,100,74,25,65,55, +55,65,25,74,100,52,255,255,1,44,6,9,3,128,7,4,4,7,7,52,255,254,0,252, +}; +gb_read_only s8_t main_font = s8_array_lit(main_font_data); diff --git a/src/scratch/scratch.html b/src/scratch/scratch.html new file mode 100644 index 0000000..514a418 --- /dev/null +++ b/src/scratch/scratch.html @@ -0,0 +1,255 @@ + + + + +Canvas + + + + +
+

Hello world (html)

+
+ + + + \ No newline at end of file diff --git a/src/scratch/scratch_main.c b/src/scratch/scratch_main.c new file mode 100644 index 0000000..21cbf1b --- /dev/null +++ b/src/scratch/scratch_main.c @@ -0,0 +1,112 @@ +#include "core/core.h" +#include "core/core.c" + +#define STB_TRUETYPE_IMPLEMENTATION +#define STBTT_ifloor(x) ((int)f64_floor(x)) +#define STBTT_iceil(x) ((int)f64_ceil(x)) +#define STBTT_sqrt(x) (f64_sqrt(x)) +#define STBTT_fmod(x,y) (f64_mod(x,y)) +#define STBTT_pow(x,y) (f64_pow(x,y)) +#define STBTT_cos(x) (f64_cos(x)) +#define STBTT_acos(x) (f64_acos(x)) +#define STBTT_fabs(x) (f64_abs(x)) +#define STBTT_malloc(x,u) ((void)u,ma_push_size(&tcx->temp,x)) +#define STBTT_free(x,u) ((void)x,(void)u) +#define STBTT_assert(x) assert(x) +#define STBTT_strlen(x) str_len(x) +#define STBTT_memcpy memory_copy +#define STBTT_memset memory_set + +#include "vendor/stb/stb_truetype.h" +#include "fira_code.c" + +typedef struct glyph_t glyph_t; +struct glyph_t { + u8 *data; + i32 width, height; + i32 xoff, yoff; + i32 left_side_bearing, xadvance; +}; + +typedef struct font_t font_t; +struct font_t { + glyph_t glyphs[96]; + i32 ascent, descent, line_gap, size; + f32 scale; +}; + +typedef struct bitmap_t bitmap_t; +struct bitmap_t { + u32 *data; + i32 x, y; +}; + +fn_wasm_export void init(void) { + os_core_init(); +} + +fn v2i32_t draw_string(bitmap_t *canvas, font_t *font, int ix, int iy, b32 draw, char *string) { + i32 xiter = 0; + v2i32_t R = {0}; + for (char *it = string; *it; it += 1) { + glyph_t *g = font->glyphs + (*it - ' '); + + i32 curr_xiter = xiter; + xiter += g->xadvance * font->scale; + + i32 x0 = curr_xiter + g->xoff + ix; + i32 y0 = g->yoff + font->ascent*font->scale + iy; + i32 x1 = g->width + x0; + i32 y1 = g->height + y0; + + i32 cx0 = CLAMP(x0, 0, canvas->x); + i32 cy0 = CLAMP(y0, 0, canvas->y); + i32 cx1 = CLAMP(x1, 0, canvas->x); + i32 cy1 = CLAMP(y1, 0, canvas->y); + + R.x = xiter; + R.y = MAX(R.y, g->height); + + if (!draw || (cx0 >= cx1 || cy0 >= cy1)) { + continue; + } + + i32 sx_off = cx0 - x0; + i32 sy_off = cy0 - y0; + + i32 sy = sy_off; + for (i32 y = cy0; y < cy1; y += 1) { + i32 sx = sx_off; + for (i32 x = cx0; x < cx1; x += 1) { + canvas->data[x + y * canvas->x] = g->data[sx + sy * g->width] << 24; + sx += 1; + } + sy += 1; + } + } + return R; +} + +fn_wasm_export u32 *update(i32 width, i32 height, f32 dpr) { + gb font_t font = {0}; + font.size = (i32)(130.f * dpr); + stbtt_fontinfo stb_font; + int rc = stbtt_InitFont(&stb_font, main_font_data, stbtt_GetFontOffsetForIndex(main_font_data,0)); + assert_expr(rc != 0); + + font.scale = stbtt_ScaleForPixelHeight(&stb_font, (f32)font.size); + stbtt_GetFontVMetrics(&stb_font, &font.ascent, &font.descent, &font.line_gap); + for (int c = ' '; c < '~'; c += 1) { + glyph_t *glyph = font.glyphs + (c - ' '); + u8 *temp_data = (u8 *)stbtt_GetCodepointBitmap(&stb_font, 0, font.scale, c, &glyph->width, &glyph->height, &glyph->xoff, &glyph->yoff); + glyph->data = ma_push_array_copy(&tcx->perm, temp_data, glyph->width*glyph->height); + stbtt_GetCodepointHMetrics(&stb_font, c, &glyph->xadvance, &glyph->left_side_bearing); + } + + ma_set0(&tcx->temp); + u32 *pixels = ma_push_array(&tcx->temp, u32, width * height); + bitmap_t canvas = {pixels, width, height}; + v2i32_t size = draw_string(&canvas, &font, 200, 500, false, "Hello world (stb)"); + draw_string(&canvas, &font, (width-size.x)/2, height - size.y*2, true, "Hello world (stb)"); + return pixels; +} diff --git a/src/testing/testing_main.c b/src/testing/testing_main.c new file mode 100644 index 0000000..733fbdd --- /dev/null +++ b/src/testing/testing_main.c @@ -0,0 +1,181 @@ +#include "core/core.h" +#include "os/os.h" + +#include "core/core.c" +#include "os/os.c" + +fn void os_test(void) { + ma_temp_t scratch = ma_begin_scratch(); + + os_date_t local_time = os_local_time(); + os_date_t universal_time = os_universal_time(); + unused(universal_time); unused(local_time); + // debugf("OS local_time = %S | universal_time = %S", os_format_date(&tcx->temp, local_time), os_format_date(&tcx->temp, universal_time)); + + s8_t exe_dir = os_exe_dir(&tcx->temp); + assert(exe_dir.str[exe_dir.len - 1] != '/'); + s8_t exe = os_exe(&tcx->temp); + s8_t cwd = os_cwd(&tcx->temp); + assert(cwd.str[cwd.len - 1] != '/'); + assert(os_is_dir(exe_dir)); + assert(os_is_file(exe)); + assert(os_is_dir(cwd)); + assert(os_exists(exe_dir)); + assert(os_exists(exe)); + assert(os_exists(cwd)); + assert(os_is_abs(exe_dir)); + assert(os_is_abs(exe)); + assert(os_is_abs(cwd)); + assert(!os_is_abs(s8("../path/"))); + + s8_t file = os_read(&tcx->temp, s8("../.gitignore")); + assert(file.str != 0); + assert(file.len != 0); + + // TEST os_copy + { + b32 a = os_copy(s8("../.gitignore"), s8(".gitignore_copy_test"), true); + assert(a); + + s8_t gitignore_copy = os_read(scratch.arena, s8(".gitignore_copy_test")); + s8_t gitignore = os_read(scratch.arena, s8("../.gitignore")); + assert(s8_are_equal(gitignore, gitignore_copy)); + os_delete(s8(".gitignore_copy_test")); + } + + // TEST os_iter + { + b32 found_gitignore = false; + b32 found_src = false; + for (os_iter_t *iter = os_iter(scratch.arena, s8("../")); iter->is_valid; os_advance(iter)) { + assert(os_is_abs(iter->abs)); + assert(!os_is_abs(iter->rel)); + if (s8_ends_with(iter->rel, s8(".gitignore"))) { + found_gitignore = true; + assert(os_is_file(iter->rel)); + } + if (s8_ends_with(iter->rel, s8("src"))) { + found_src = true; + assert(os_is_dir(iter->rel)); + } + + if (os_is_dir(iter->abs)) { + assert(iter->abs.str[iter->abs.len - 1] != '/'); + } + } + assert(found_src); + assert(found_gitignore); + } + +#if PLATFORM_WINDOWS + s8_t path = os_appdata(scratch.arena, s8("testing")); + assert(path.str[path.len - 1] != '/'); + assert(s8_starts_with(path, s8("C:/"))); + assert(s8_ends_with(path, s8("/testing"))); +#endif + ma_end_scratch(scratch); +} + +fn void test_s8(void) { + ma_arena_t *arena = ma_create(ma_default_reserve_size); + + { + ma_temp_t temp = ma_begin_temp(arena); + sb8_t *sb = &(sb8_t){arena}; + + s8_t memes = s8("memes"); + sb8_printf(sb, "%S", memes); + assert(sb->first == sb->last); + assert(sb->first->len == 5); + assert(s8_are_equal(sb->first->string, memes)); + + sb8_printf(sb, "%S", s8("things are going fine")); + s8_t string = sb8_merge(temp.arena, sb); + assert(s8_are_equal(string, s8("memesthings are going fine"))); + + ma_end_temp(temp); + } + + { + s8_t str = s8("thing|another|"); + sb8_t sb = s8_split(arena, str, s8("|"), s8_split_none); + + assert(s8_are_equal(sb.first->string, s8("thing"))); + assert(s8_are_equal(sb.first->next->string, s8("another"))); + assert(sb.first->next->next == NULL); + } + + { + s8_t str = s8("thing|another|"); + sb8_t sb = s8_split(arena, str, s8("|"), s8_split_inclusive); + + assert(s8_are_equal(sb.first->string, s8("thing"))); + assert(s8_are_equal(sb.first->next->string, s8("|"))); + assert(s8_are_equal(sb.first->next->next->string, s8("another"))); + assert(s8_are_equal(sb.first->next->next->next->string, s8("|"))); + assert(sb.first->next->next->next->next == NULL); + } + + { + s8_t str = s8("aabaaBaa"); + sb8_t sb = s8_split(arena, str, s8("b"), s8_split_inclusive | s8_split_ignore_case); + + assert(s8_are_equal(sb.first->string, s8("aa"))); + assert(s8_are_equal(sb.first->next->string, s8("b"))); + assert(s8_are_equal(sb.first->next->next->string, s8("aa"))); + assert(s8_are_equal(sb.first->next->next->next->string, s8("B"))); + assert(s8_are_equal(sb.first->next->next->next->next->string, s8("aa"))); + assert(sb.first->next->next->next->next->next == NULL); + } + + { + s8_t str = s8("aabaaBaa"); + sb8_t sb = s8_split(arena, str, s8("b"), s8_split_inclusive); + + assert(s8_are_equal(sb.first->string, s8("aa"))); + assert(s8_are_equal(sb.first->next->string, s8("b"))); + assert(s8_are_equal(sb.first->next->next->string, s8("aaBaa"))); + } + + { + s8_t s = s8("0123456789"); + assert(s8_are_equal(s8_slice(s, 0, 4), s8("0123"))); + assert(s8_are_equal(s8_slice(s, -2, -1), s8("89"))); + assert(s8_are_equal(s8_slice(s, -2, 10), s8("89"))); + assert(s8_are_equal(s8_slice(s, 8, 10), s8("89"))); + } + + { + s8_t s = s8(" a \n"); + s = s8_trim(s); + assert(s8_are_equal(s, s8("a"))); + } + + { + s8_t s = s8("C:/memes/the_thing.c"); + s8_t ss = s8_get_name_no_ext(s); + assert(s8_are_equal(ss, s8("the_thing"))); + } + + { + s8_t s = s8_printf(arena, "%d%Sv%s", 32, s8("|"), ">"); + assert(s8_are_equal(s, s8("32|v>"))); + } + + { + s8_t s0 = s8("0123456789"); + s8_t s1 = s8_cut_start(&s0, 2); + assert(s8_are_equal(s0, s8("23456789"))); + assert(s8_are_equal(s1, s8("01"))); + } + + ma_destroy(arena); +} + +int main() { + os_core_init(); + test_s8(); + os_test(); + debugf("Testing OK"); + return 0; +}